Journal-indexDockup / praktijknotitie
Note / self-host-code-server

code-server zelf hosten in 2026: WebSockets, workspaces en toegangsbeheer

Host code-server zelf met de juiste poorten, persistente opslag, HTTPS, secrets, back-ups en controles voor upgrades. Leer hoe je problemen oplost wanneer de proxy WebSockets blokkeert.

Een mislukte code-server-deployment crasht niet altijd. Mogelijk wordt er een loginpagina weergegeven terwijl de proxy WebSockets blokkeert of file ownership het installeren van extensions verhindert. Begin daarom met een end-to-end controle: log in, open een gemounte repository, maak een bestand aan, voer een terminalopdracht uit, installeer een extension en maak opnieuw verbinding met de editor-WebSocket.

Die controle sluit aan bij het beschreven doel van code-server: VS Code die in de browser op een externe machine draait. Ook worden ontbrekende dependencies, verkeerde aannames over de proxy en vluchtige data eerder zichtbaar dan met een uptime-probe.

Waar code-server van afhankelijk is

Trek drie grenzen rond code-server: ingress naar poort 8080, duurzame state en ondersteunende vereisten. De container kan worden vervangen, maar voor de andere twee moeten expliciete verantwoordelijken worden aangewezen. De vereiste voor de lokale runtime is een workspace-mount met uitsluitend de projecten waartoe de editor toegang moet hebben. Test die grens vóór publicatie en opnieuw nadat een container is vervangen.

Het diagram is compleet wanneer een schone client kan inloggen, een gemounte repository kan openen, een bestand kan aanmaken, een terminalopdracht kan uitvoeren, een extension kan installeren en opnieuw verbinding kan maken met de editor-WebSocket. Verzamel timing- en resourcegegevens over het geheugen- en CPU-gebruik van language servers, builds, extension hosts en terminals, niet van de code-server-webshell. Als de transactie mislukt, geeft de eerste grens die zich niet gedraagt zoals gedocumenteerd aan of je routing, lokale capaciteit of een ondersteunende service moet onderzoeken.

Maak van de lokale opdracht een inspecteerbare service

Een launch die op productie lijkt, is bewust saai: benoemde state, een expliciete poort en geen secret in de image.

docker run -d \
  --name code-server \
  --restart unless-stopped \
  -p 127.0.0.1:8080:8080 \
  -v code-server-data:/home/coder \
  -e PASSWORD=replace-with-a-long-random-value \
  codercom/code-server:latest \
  --bind-addr 0.0.0.0:8080 --auth password .

Het voorbeeld is een basis en geen complete ondersteunende stack. Bevestig de lokale vereiste vóór je code-server beschikbaar maakt: een workspace-mount met uitsluitend de projecten waartoe de editor toegang moet hebben. Controleer de effectieve mounts en de listener en probeer vervolgens in te loggen, een gemounte repository te openen, een bestand aan te maken, een terminalopdracht uit te voeren, een extension te installeren en opnieuw verbinding te maken met de editor-WebSocket. Leg de werkende image vast voordat je opnieuw opstart.

Maak de publieke origin ondubbelzinnig

Plaats de editor achter HTTPS en behoud WebSocket-upgrades. Stuur de gekozen hostname door naar containerpoort 8080, geef de oorspronkelijke host en het HTTPS-schema door en publiceer geen tweede directe origin.

Test code-server vanaf een schone externe client. Maak onderscheid tussen een ingress-probleem en de bekende applicatiegrens — de proxy blokkeert WebSockets of file ownership verhindert het installeren van extensions. Een certificaat-, DNS- of 502-fout hoort bij routing; een request dat code-server bereikt en daarna mislukt, hoort bij application state, capaciteit of een ondersteunende vereiste. De handleiding voor TLS met een custom domain behandelt de eerste groep.

Maak een back-up van state die code-server niet kan reconstrueren

Een container-image kan opnieuw worden gedownload; de configuratie, extensions en expliciet gemounte projectdirectories niet. Mount /home/coder vóór de bootstrap, schrijf onschadelijke voorbeelddata en vervang de container om te bewijzen dat dit pad daadwerkelijk persistent is. Inspecteer de effectieve mount in plaats van op een Compose-bestandsnaam te vertrouwen en controleer of de runtimegebruiker kan schrijven waar code-server dat verwacht.

Kies een bewaartermijn en een bestemming buiten de host en oefen vervolgens een herstel uit zonder productie aan te raken. De oefening slaagt alleen wanneer instellingen, extensions en workspacebestanden terugkomen met de juiste ownership en de terminal start onder de bedoelde gebruiker. Combineer bij state die door een database wordt ondersteund storage-snapshots met application-consistente exports, zoals beschreven in point-in-time recovery versus snapshots.

Beveilig code-server na de bootstrap

Voor code-server is het waardevolle aanvalsoppervlak niet noodzakelijk de landingspagina. De belangrijkste fout is dat je de container zonder nadenken toegang geeft tot de Docker-socket of het volledige hostbestandssysteem. Ga dit bewust tegen: mount alleen de bedoelde workspaces, vermijd de Docker-socket van de host en plaats de editor achter zowel HTTPS als sterke authenticatie.

Vervang het voorbeeld van PASSWORD onmiddellijk, sla het buiten de image op en roteer het zoals een beheerderscredential wanneer het wordt blootgesteld. Gebruik een container user zonder elevated privileges wanneer de image dit ondersteunt en mount geen niet-gerelateerde credentials. Pas bij ingress rate- of sizelimieten toe wanneer onbetrouwbaar werk geheugen en CPU kan verbruiken die bedoeld zijn voor language servers, builds, extension hosts en terminals, niet voor de code-server-webshell.

Diagnose van een ogenschijnlijk gezonde code-server

Observeer het werk dat code-server uitvoert: het geheugen- en CPU-gebruik van language servers, builds, extension hosts en terminals, niet van de code-server-webshell. Stel limieten in met voldoende marge voor dat werk en vermijd een liveness-probe die ermee concurreert. De operatorcontrole moet nog steeds volgens een schema proberen in te loggen, een gemounte repository te openen, een bestand aan te maken, een terminalopdracht uit te voeren, een extension te installeren en opnieuw verbinding te maken met de editor-WebSocket.

Houd er bij updates rekening mee dat compatibiliteit van extensions en toolchains in de base image kan veranderen, ook wanneer de code-server-UI nog steeds start. Deploy de kandidaatversie tegen een herstelde kopie en herhaal de bekende test. Als de proxy WebSockets blokkeert of file ownership het installeren van extensions verhindert, gebruik dan runtime-logs en het daadwerkelijke network request om te bepalen welke aanname is veranderd.

Bewijs dat je moet verzamelen voordat code-server live gaat

Maak een kleine, disposable code-server-fixture en bewaar die voor elke release. De fixture moet de echte workflow doorlopen: inloggen, een gemounte repository openen, een bestand aanmaken, een terminalopdracht uitvoeren, een extension installeren en opnieuw verbinding maken met de editor-WebSocket. Leg de image digest, externe hostname, dependency address en het verwachte resultaat vast, zodat een latere operator de test kan herhalen zonder deze handleiding te hoeven interpreteren.

Voer de fixture drie keer uit. Gebruik eerst de verse deployment. Vervang vervolgens de container zonder de duurzame state aan te raken. Herstel ten slotte de back-up in een lege omgeving. De derde run slaagt alleen wanneer instellingen, extensions en workspacebestanden terugkomen met de juiste ownership en de terminal start onder de bedoelde gebruiker. Leg tijdens elke run latency en resourcegebruik vast rond het geheugen- en CPU-gebruik van language servers, builds, extension hosts en terminals, niet van de code-server-webshell; dit wordt de basis voor alerts in plaats van een willekeurig CPU-percentage.

Test ten slotte bewust het negatieve pad: voer onschadelijke input in die in de buurt komt van de resource- of formatlimiet die bij deze grens hoort: de proxy blokkeert WebSockets of file ownership verhindert het installeren van extensions. Controleer of code-server zichtbaar faalt zonder state te beschadigen, herstel de juiste toestand en herhaal de geslaagde transactie. Een releaserecord met die vier uitkomsten levert sterker bewijs dan screenshots van een dashboard of een eenmalige curl-respons.

Verplaats herhaalbaar infrastructuurwerk naar Dockup

Dockup kan de vervangbare platformonderdelen beheren: verkeer naar poort 8080 routeren, het domein en certificaat uitgeven, secrets injecteren, persistente storage koppelen en code-server verbinden met beheerde of privé gekoppelde services. Dit kan op Dockup-infrastructuur of op een server die je koppelt.

De acceptatiewerkzaamheden voor code-server blijven expliciet. Plaats de editor na de one-click deployment achter HTTPS en behoud WebSocket-upgrades, bevestig de lokale vereiste — een workspace-mount met uitsluitend de projecten waartoe de editor toegang moet hebben — en voer dit scenario uit: log in, open een gemounte repository, maak een bestand aan, voer een terminalopdracht uit, installeer een extension en maak opnieuw verbinding met de editor-WebSocket. Die verdeling is bewust: Dockup neemt repetitieve infrastructuurconfiguratie weg zonder te doen alsof applicatierollen, providercredentials of het restorebeleid vanzelf worden gekozen.

Veelgestelde vragen

Wat heeft code-server nodig voor een productie-deployment?

Routeer de code-server-container op poort 8080 via één HTTPS-origin. De vereiste voor de lokale runtime is een workspace-mount met uitsluitend de projecten waartoe de editor toegang moet hebben. Noem code-server pas gereed wanneer je kunt inloggen, een gemounte repository kunt openen, een bestand kunt aanmaken, een terminalopdracht kunt uitvoeren, een extension kunt installeren en opnieuw verbinding kunt maken met de editor-WebSocket.

Welke code-serverdata hoort in een back-up?

Maak een persistente opslag van /home/coder en neem de configuratie, extensions en expliciet gemounte projectdirectories op in hetzelfde recoverymanifest. Een schone code-server-restore slaagt alleen wanneer instellingen, extensions en workspacebestanden terugkomen met de juiste ownership en de terminal start onder de bedoelde gebruiker.

Heeft code-server HTTPS nodig achter een reverse proxy?

Gebruik HTTPS voor de publieke code-server-origin en houd poort 8080 op de interne route. Pas de code-server-instelling correct toe: plaats de editor achter HTTPS en behoud WebSocket-upgrades. Voor code-server beschermt HTTPS credentials of gebruikerscontent tijdens transport en blijft clientgedrag dat gevoelig is voor de origin consistent.

Hoe test je een code-server-upgrade?

Herstel de huidige code-server-state in een geïsoleerde deployment, pas de kandidaatversie toe en herhaal de acceptatietransactie. Let hier extra op, omdat compatibiliteit van extensions en toolchains in de base image kan veranderen, ook wanneer de code-server-UI nog steeds start. Bewaar de vorige code-server-image totdat de grenzen voor datamigratie en rollback duidelijk zijn.