MCP-server met Docker: het compose-bestand en het updatescript
MCP Self-hosted wordt geleverd als MCP-server met Docker: één container, één image uit de AddoCore-registry en een docker-compose.yml die voor jouw licentie is gegenereerd. Dit artikel loopt dat bestand regel voor regel door, legt uit waarom je het start en bijwerkt met ./mcp-update.sh in plaats van Docker Compose zelf aan te roepen, en wat de poort, de volumes en de geheugenlimiet betekenen voor je host.
Waarom een MCP-server met Docker draaien?
Omdat de host dan alleen Docker met Docker Compose nodig heeft. Node.js en alle tools draaien in de image. Die image is voor elke klant gelijk: hij bevat alle tools, en je licentie bepaalt tijdens runtime welke daarvan laden. Wat jouw MCP-server met Docker van jou maakt, is de configuratie ernaast, vooral het .env-bestand.
Door die scheiding blijven updates van een MCP-server met Docker eenvoudig. Een nieuwe mcp-core-versie is een nieuwe image. Je instellingen, de licentiestatus en eventuele Brain-notities staan in mappen op de host, dus het vervangen van de image laat ze ongemoeid.
Wat staat er in de gegenereerde docker-compose.yml?
Eén service, mcp-core, en verder niets. De download uit Mijn account levert dit bestand mee naast .env, .env.registry en mcp-update.sh:
services:
mcp-core:
image: <AddoCore registry path>:${MCP_VERSION}
container_name: mcp-core
restart: unless-stopped
env_file:
- .env
volumes:
- ./vault:/vault
- ./state:/app/state
- ./logs:/app/logs
ports:
- "127.0.0.1:3200:3200"
deploy:
resources:
limits:
memory: 128M
Regel voor regel doet elke instelling dit voor je MCP-server met Docker:
image: de tag komt uitMCP_VERSION. Docker Compose leest de.envin dezelfde map om${MCP_VERSION}in te vullen, dus de versie staat op één plek.container_name: mcp-core: een vaste naam, zodatdocker logs mcp-coreendocker exec mcp-core npm run refresh-licenseop elke installatie werken.restart: unless-stopped: Docker start de container opnieuw na een crash of een herstart van de host, tenzij je hem zelf hebt gestopt.env_file: dezelfde.envwordt aan de container doorgegeven. Daarin staan de licentiesleutel, het licentie-endpoint, de auth-strategie, het token van je eerste seat en de variabelen voor elke tool op je licentie.volumes,portsendeploy: zie hieronder.
Er is geen tweede service. Geen databasecontainer, geen proxy en geen auto-updater: de image verandert alleen als je het updatescript draait.
Wat staat er in de drie volumes van de MCP-server met Docker?
Alles wat een update moet overleven. De zip bevat de drie lege mappen al, dus de mounts werken bij de eerste start.
./vault:/vault: de markdown-kennisbank van de Brain-add-on. Die blijft leeg als je Brain niet gebruikt../state:/app/state: de licentiecache (.license-cache.json), de instance-id (.instance-id) en, vanaf versie 1.2.0,.picker-secretvoor seats die via de seatkeuze zijn gemaakt. Vanaf 1.2.0 is de cache ondertekend door AddoCore en bevat hij geen seat-tokens; pas deze bestanden niet aan../logs:/app/logs: de serverlogs. Die blijven op je host.
Ga zorgvuldig om met state/. Aan de instance-id daarin herkent AddoCore deze installatie als jouw activatie, en MCP Self-hosted bevat er één. Verwijder je de map, dan genereert de volgende start een nieuwe id, en dat telt als een nieuwe installatie. Je moet de oude dan vrijgeven op het tabblad Geavanceerd van je licentie. Daarom staat de vault in een aparte map: je kunt je notities wissen of verplaatsen zonder de activatie te raken.
Waarom is de MCP-server met Docker gebonden aan 127.0.0.1:3200?
Zodat alleen de host zelf de server kan bereiken. De mapping 127.0.0.1:3200:3200 publiceert de containerpoort alleen op het loopback-adres. Op de host is het MCP-endpoint http://localhost:3200/mcp en de healthcheck http://localhost:3200/health. De Claude Code-plugin in de download staat al op dat adres ingesteld.
Wil je de server vanaf andere machines bereiken, zet er dan een reverse proxy met HTTPS voor. Is poort 3200 op de host al bezet, verander dan het linkergetal van de mapping, bijvoorbeeld 127.0.0.1:3300:3200, en gebruik de nieuwe poort in je Claude-configuratie. De containerkant blijft 3200.
Wat doet de geheugenlimiet van 128 MB voor een MCP-server met Docker?
Die beperkt de container via deploy.resources.limits tot 128 MB geheugen. De server kan niet meer van de host nemen, dus hij draait naast andere services zonder om geheugen te concurreren. Bereikt het proces ooit de limiet, dan stopt Docker het, en de restart-policy unless-stopped start het weer.
Waarom draai je docker compose nooit rechtstreeks?
Omdat de image in een private registry staat, en voor het pullen ervan voor je MCP-server met Docker eerst een login nodig is. ./mcp-update.sh doet de login, de pull, een versie-fallback en de start in één commando:
- Het leest
.env.registryen logt in bijregistry.gitlab.commet--password-stdin, zodat het registry-token nooit in je shellgeschiedenis terechtkomt. - Het pullt de image voor de versie in
MCP_VERSION. - Bestaat die versie niet in de registry, door een typfout of omdat een oude versie is opgeruimd, dan zet het
MCP_VERSION=latestin.enven pullt opnieuw. Elke andere pullfout wordt getoond zoals hij is, en het script stopt. - Het start de container op de achtergrond.
cd /path/to/unzipped-bundle
chmod +x mcp-update.sh
./mcp-update.sh
Draai het vanuit de bundelmap; het leest daar ./.env.registry. De registry-login wordt af en toe vernieuwd. Gebeurt dat, dan krijg je een e-mail met een nieuwe .env.registry als bijlage: vervang het oude bestand en draai het script één keer om de login te bevestigen. De draaiende server blijft tijdens die wissel gewoon werken.
Hoe werk je een MCP-server met Docker bij?
Je draait hetzelfde script opnieuw. Het pullt de versie waar MCP_VERSION naar wijst en herstart de container. Je .env, vault, state en logs staan op de host en worden niet aangeraakt. Standaard is MCP_VERSION vastgezet op de versie in je bundel, dus gewoon opnieuw draaien geeft je diezelfde versie terug. Twee andere opties:
# always the newest release
MCP_VERSION=latest
# pin to a specific version, or roll back
MCP_VERSION=<version number>
Koop je later een add-on, dan verandert er niets op schijf. De tool zit al in de image; de add-on voegt alleen een entitlement toe. Vul de variabelen van de tool in en draai docker exec mcp-core npm run refresh-license, of wacht op de volgende licentiecheck.
Hoe controleer je of je MCP-server met Docker draait?
Lees de logs of roep het health-endpoint aan. Zoek in docker logs -f mcp-core naar de regel HTTP/MCP: http://localhost:3200/mcp en een regel die begint met Check OK, met valid=true en je entitlements. curl http://localhost:3200/health geeft de status, de transports, de auth-strategie, de licentiestatus en de actieve tools terug als JSON. De volledige volgorde staat in MCP Self-hosted installeren.
Een MCP-server met Docker komt neer op één service, drie mappen die je bewaart, een poort die alleen de host kan bereiken en één script voor installaties en updates. Wil je de container liever niet zelf draaien, dan vergelijkt self-hosted vs. gehoste MCP de opties. Anders: neem MCP Self-hosted, draai ./mcp-update.sh en verbind Claude met de server.