code-server 2026 selbst hosten: WebSockets, Arbeitsbereiche und Zugriffskontrolle
code-server mit den richtigen Ports, persistentem Speicher, HTTPS, Secrets, Backups und Upgrade-Prüfungen selbst hosten. Erfahre, wie du Probleme behebst, wenn der Proxy WebSockets blockiert.
Eine fehlgeschlagene code-server-Bereitstellung stürzt nicht immer ab. Es kann sein, dass zwar eine Anmeldeseite ausgeliefert wird, der Proxy aber WebSockets blockiert oder Dateiberechtigungen die Installation von Extensions verhindern. Beginne stattdessen mit einer End-to-End-Prüfung: Anmelden, ein eingebundenes Repository öffnen, eine Datei erstellen, einen Terminal-Befehl ausführen, eine Extension installieren und den WebSocket des Editors erneut verbinden.
Diese Prüfung entspricht dem dokumentierten Zweck von code-server: VS Code läuft im Browser auf einem entfernten Rechner. Außerdem werden fehlende Abhängigkeiten, falsche Proxy-Annahmen und flüchtige Daten früher sichtbar, als dies mit einem einfachen Uptime-Probe möglich wäre.
Wovon code-server abhängt
Ziehe drei Grenzen um code-server: den Ingress zu Port 8080, den persistenten Zustand und die unterstützenden Anforderungen. Der Container ist austauschbar, die beiden anderen Bereiche benötigen jedoch klar definierte Zuständigkeiten. Die lokale Laufzeitanforderung ist ein Workspace-Mount, das ausschließlich die Projekte enthält, auf die der Editor zugreifen soll. Teste diese Grenze vor der Veröffentlichung und erneut nach dem Ersetzen eines Containers.
Das Diagramm ist vollständig, wenn sich ein sauberer Client anmelden, ein eingebundenes Repository öffnen, eine Datei erstellen, einen Terminal-Befehl ausführen, eine Extension installieren und den WebSocket des Editors erneut verbinden kann. Erfasse Zeit- und Ressourcendaten für den Speicher- und CPU-Verbrauch von Language-Servern, Builds, Extension Hosts und Terminals statt für die code-server-Web-Shell. Schlägt die Transaktion fehl, zeigt die erste Grenze, die sich nicht wie dokumentiert verhält, ob Routing, lokale Kapazität oder ein unterstützender Dienst untersucht werden muss.
Den lokalen Befehl in einen überprüfbaren Dienst umwandeln
Ein produktionsnaher Start ist bewusst unspektakulär: benannter Zustand, expliziter Port und kein Secret im 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 .
Das Beispiel ist eine Grundlage und kein vollständiger unterstützender Stack. Bestätige die lokale Anforderung vor der Veröffentlichung: ein Workspace-Mount, das ausschließlich die Projekte enthält, auf die der Editor zugreifen soll. Prüfe die tatsächlich aktiven Mounts und den Listener. Versuche anschließend, dich anzumelden, ein eingebundenes Repository zu öffnen, eine Datei zu erstellen, einen Terminal-Befehl auszuführen, eine Extension zu installieren und den WebSocket des Editors erneut zu verbinden. Fixiere das funktionierende Image vor dem nächsten Neustart.
Die öffentliche Origin eindeutig festlegen
Betreibe den Editor hinter HTTPS und erhalte WebSocket-Upgrades. Sende den gewählten Hostnamen an Container-Port 8080, leite den ursprünglichen Host und das HTTPS-Schema weiter und vermeide die Veröffentlichung einer zweiten direkten Origin.
Teste code-server von einem sauberen externen Client aus. Trenne einen Ingress-Fehler von der bekannten Anwendungsgrenze — der Proxy blockiert WebSockets oder Dateiberechtigungen verhindern die Installation von Extensions. Ein Zertifikats-, DNS- oder 502-Fehler gehört zum Routing. Eine Anfrage, die code-server erreicht und erst danach fehlschlägt, gehört zum Anwendungszustand, zur Kapazität oder zu einer unterstützenden Anforderung. Der Leitfaden zu TLS mit benutzerdefinierten Domains behandelt die erste Gruppe.
Den Zustand sichern, den code-server nicht wiederherstellen kann
Ein Container-Image kann erneut heruntergeladen werden; die Konfiguration, Extensions und explizit eingebundenen Projektverzeichnisse jedoch nicht. Binde /home/coder vor dem Bootstrap ein, schreibe harmlose Beispieldaten und ersetze den Container, um zu beweisen, dass dieser Pfad tatsächlich persistent ist. Prüfe den tatsächlich aktiven Mount, statt einem Compose-Dateinamen zu vertrauen, und stelle sicher, dass der Laufzeitbenutzer dort schreiben kann, wo code-server dies erwartet.
Lege Aufbewahrungsfristen und ein Off-Host-Ziel fest und übe anschließend die Wiederherstellung, ohne die Produktion anzufassen. Der Test ist nur dann erfolgreich, wenn Einstellungen, Extensions und Workspace-Dateien mit den richtigen Besitzverhältnissen zurückkehren und das Terminal unter dem vorgesehenen Benutzer startet. Bei datenbankgestütztem Zustand kombinierst du Storage-Snapshots mit anwendungskonsistenten Exporten, wie unter Point-in-Time-Recovery im Vergleich zu Snapshots beschrieben.
code-server nach dem Bootstrap absichern
Bei code-server ist die wertvolle Angriffsfläche nicht unbedingt die Landingpage. Der häufigste Fehler besteht darin, dem Container unbedacht Zugriff auf den Docker-Socket oder das gesamte Host-Dateisystem zu gewähren. Wirke dem gezielt entgegen: Binde nur die vorgesehenen Workspaces ein, vermeide den Docker-Socket des Hosts und betreibe den Editor hinter HTTPS und starker Authentifizierung.
Ersetze das Beispiel-PASSWORD sofort, speichere es außerhalb des Images und rotiere es wie ein Administrator-Credential, falls es offengelegt wurde. Verwende einen unprivilegierten Container-Benutzer, sofern das Image dies unterstützt, und binde keine nicht zugehörigen Credentials ein. Setze am Ingress Rate- oder Größenlimits, wenn nicht vertrauenswürdige Arbeiten den Speicher- und CPU-Verbrauch von Language-Servern, Builds, Extension Hosts und Terminals statt der code-server-Web-Shell erhöhen können.
Einen gesund wirkenden code-server diagnostizieren
Beobachte die Arbeit, die code-server ausführt: den Speicher- und CPU-Verbrauch von Language-Servern, Builds, Extension Hosts und Terminals statt der code-server-Web-Shell. Setze Limits mit ausreichend Reserven für diese Arbeit und vermeide einen Liveness-Probe, der mit ihr konkurriert. Die Prüfung durch den Operator sollte weiterhin regelmäßig versuchen, sich anzumelden, ein eingebundenes Repository zu öffnen, eine Datei zu erstellen, einen Terminal-Befehl auszuführen, eine Extension zu installieren und den WebSocket des Editors erneut zu verbinden.
Behalte bei Updates im Hinterkopf, dass sich die Kompatibilität von Extensions und die Toolchains des Basis-Images ändern können, selbst wenn die code-server-Oberfläche weiterhin startet. Stelle den Kandidaten gegen eine wiederhergestellte Kopie bereit und wiederhole den bekannten Test. Wenn der Proxy WebSockets blockiert oder Dateiberechtigungen die Installation von Extensions verhindern, verwende Laufzeit-Logs und die tatsächliche Netzwerkanfrage, um herauszufinden, welche Annahme sich geändert hat.
Belege sammeln, bevor code-server live geht
Erstelle ein kleines, temporäres code-server-Fixture und behalte es für jedes Release. Das Fixture sollte den tatsächlichen Workflow ausführen: anmelden, ein eingebundenes Repository öffnen, eine Datei erstellen, einen Terminal-Befehl ausführen, eine Extension installieren und den WebSocket des Editors erneut verbinden. Zeichne den Image-Digest, den externen Hostnamen, die Adresse der Abhängigkeit und das erwartete Ergebnis auf, damit ein späterer Operator den Test wiederholen kann, ohne diesen Leitfaden interpretieren zu müssen.
Führe das Fixture dreimal aus. Verwende zuerst die frische Bereitstellung. Ersetze zweitens den Container, ohne den persistenten Zustand anzutasten. Stelle drittens das Backup in einer leeren Umgebung wieder her. Der dritte Durchlauf ist nur dann erfolgreich, wenn Einstellungen, Extensions und Workspace-Dateien mit den richtigen Besitzverhältnissen zurückkehren und das Terminal unter dem vorgesehenen Benutzer startet. Erfasse während jedes Durchlaufs Latenz und Ressourcennutzung im Zusammenhang mit dem Speicher- und CPU-Verbrauch von Language-Servern, Builds, Extension Hosts und Terminals statt der code-server-Web-Shell. Dies wird zur Grundlage für Alerts und nicht zu einem beliebigen CPU-Prozentsatz.
Teste abschließend absichtlich den negativen Pfad: Sende harmlose Eingaben nahe am Ressourcen- oder Formatlimit, das mit dieser Grenze verbunden ist: Der Proxy blockiert WebSockets oder Dateiberechtigungen verhindern die Installation von Extensions. Bestätige, dass code-server sichtbar fehlschlägt, ohne den Zustand zu beschädigen, stelle die korrekte Bedingung wieder her und wiederhole die erfolgreiche Transaktion. Ein Release-Eintrag mit diesen vier Ergebnissen ist ein stärkerer Beleg als Screenshots eines Dashboards oder eine einmalige curl-Antwort.
Wiederholbare Infrastrukturarbeiten zu Dockup verlagern
Dockup kann die austauschbaren Plattformbestandteile übernehmen: Datenverkehr an Port 8080 weiterleiten, Domain und Zertifikat ausstellen, Secrets injizieren, persistenten Speicher anbinden und code-server mit verwalteten oder privat angebundenen Diensten verbinden. Dies ist auf der Dockup-Infrastruktur oder auf einem von dir angebundenen Server möglich.
Die Abnahmearbeit für code-server bleibt explizit. Stelle den Editor nach der One-Click-Bereitstellung hinter HTTPS und erhalte WebSocket-Upgrades. Bestätige die lokale Anforderung — ein Workspace-Mount, das ausschließlich die Projekte enthält, auf die der Editor zugreifen soll — und führe dieses Szenario aus: anmelden, ein eingebundenes Repository öffnen, eine Datei erstellen, einen Terminal-Befehl ausführen, eine Extension installieren und den WebSocket des Editors erneut verbinden. Diese Aufteilung ist beabsichtigt: Dockup beseitigt wiederholte Infrastrukturarbeit, ohne so zu tun, als würden sich Anwendungsrollen, Provider-Credentials oder eine Restore-Policy von selbst festlegen.
Häufig gestellte Fragen
Was benötigt code-server für eine produktive Bereitstellung?
Leite den code-server-Container über eine einzige HTTPS-Origin an Port 8080 weiter. Die lokale Laufzeitanforderung ist ein Workspace-Mount, das ausschließlich die Projekte enthält, auf die der Editor zugreifen soll. Erkläre code-server erst dann für bereit, wenn du dich anmelden, ein eingebundenes Repository öffnen, eine Datei erstellen, einen Terminal-Befehl ausführen, eine Extension installieren und den WebSocket des Editors erneut verbinden kannst.
Welche code-server-Daten gehören in ein Backup?
Mache /home/coder persistent und nimm die Konfiguration, Extensions sowie die explizit eingebundenen Projektverzeichnisse in dasselbe Recovery-Manifest auf. Eine saubere code-server-Wiederherstellung ist nur dann erfolgreich, wenn Einstellungen, Extensions und Workspace-Dateien mit den richtigen Besitzverhältnissen zurückkehren und das Terminal unter dem vorgesehenen Benutzer startet.
Benötigt code-server hinter einem Reverse Proxy HTTPS?
Verwende HTTPS für die öffentliche code-server-Origin und belasse Port 8080 auf der internen Route. Wende die code-server-Einstellung korrekt an: Betreibe den Editor hinter HTTPS und erhalte WebSocket-Upgrades. Bei code-server schützt HTTPS Credentials oder Benutzerinhalte bei der Übertragung und sorgt für ein konsistentes, von der Origin abhängiges Client-Verhalten.
Wie sollte ein code-server-Upgrade getestet werden?
Stelle den aktuellen code-server-Zustand in einer isolierten Bereitstellung wieder her, wende die Kandidatenversion an und wiederhole die Abnahmetransaktion. Achte besonders darauf, dass sich die Kompatibilität von Extensions und die Toolchains des Basis-Images ändern können, selbst wenn die code-server-Oberfläche weiterhin startet. Behalte das vorherige code-server-Image, bis die Grenzen für Datenmigration und Rollback verstanden sind.
