Code-Server mit Docker installieren: VS Code aus dem Browser¶
Veröffentlicht am 3. Oktober 2026 · Geschätzte Lesezeit: 6 Minuten
Code-Server ist VS Code auf einem entfernten Rechner, den du über den Browser bedienst. Damit kannst du auf jedem Gerät mit Internetverbindung – vom Tablet über das Chromebook bis zum Thin Client – entwickeln, ohne lokal Tools installieren zu müssen. Die Rechenlast liegt auf dem Server. Die Einrichtung dauert ungefähr 20 Minuten.
Voraussetzungen
- Ein Linux-Server mit Docker und Docker Compose
- Ein freier TCP-Port
8443im Heimnetz - Die IP-Adresse des Docker-Servers
- Zugriff auf die Kommandozeile des Servers
1. Benutzer-ID und Gruppen-ID ermitteln¶
Code-Server verwendet die Berechtigungen deines Host-Benutzers, damit Dateien im Workspace die richtigen Besitzer erhalten. Ermittle deine IDs mit diesen Befehlen:
Die Ausgaben sehen zum Beispiel so aus:
Notiere beide Werte (meistens 1000). Du brauchst sie in Schritt 3 für die Platzhalter PUID und PGID.
2. Projektordner anlegen¶
Erstelle einen eigenen Ordner für Code-Server und wechsle hinein:
Das Verzeichnis config nimmt später die VS-Code-Einstellungen, Extensions und persönlichen Daten auf. Der Ordner projects wird der Arbeitsbereich (Workspace).
3. Compose-Datei anlegen¶
Lege im Ordner ~/code-server eine Datei namens compose.yaml mit diesem Inhalt an:
services:
code-server:
image: lscr.io/linuxserver/code-server:latest
container_name: code-server
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
- PASSWORD=<dein-sicheres-passwort>
- SUDO_PASSWORD=<dein-sicheres-sudo-passwort>
- DEFAULT_WORKSPACE=/config/workspace
volumes:
- ./config:/config
- ./projects:/config/workspace
ports:
- "8443:8443"
restart: unless-stopped
Bedeutung der einzelnen Zeilen:
| Abschnitt | Erklärung |
|---|---|
image: |
Das offizielle LinuxServer.io-Image mit Code-Server |
PUID=1000 / PGID=1000 |
Ersetze beide Werte durch die Ausgabe von id -u beziehungsweise id -g |
TZ=Europe/Berlin |
Ersetze durch deine Zeitzone (Liste unter Wikipedia: tz database) |
PASSWORD=<dein-sicheres-passwort> |
WebUI-Passwort – unbedingt ändern. Ersetze <dein-sicheres-passwort> durch ein starkes Passwort. Ist der Wert leer, gibt es keinen Login-Schutz |
SUDO_PASSWORD=<dein-sicheres-sudo-passwort> |
Sudo-Passwort für Terminal-Befehle im Container. Ersetze <dein-sicheres-sudo-passwort> durch ein zweites, anderes Passwort. Optional, aber empfohlen |
DEFAULT_WORKSPACE= |
Ordner, den Code-Server nach dem Login öffnet |
./config:/config |
Speichert Einstellungen, Extensions und SSH-Schlüssel dauerhaft |
./projects:/config/workspace |
Dein Arbeitsbereich mit den Projektdateien |
"8443:8443" |
Der Port der Weboberfläche (links: Host-Port, rechts: Container-Port) |
restart: unless-stopped |
Startet den Container nach einem Neustart des Servers automatisch |
Der Port 8443 heißt nur so, bietet aber normales HTTP und kein HTTPS. Für den Zugriff aus dem Internet brauchst du einen Reverse Proxy mit eigener HTTPS-Verschlüsselung.
4. Container starten¶
Starte Code-Server im Projektordner:
Prüfe anschließend den Status:
In der Spalte STATUS sollte Up erscheinen. Falls der Container nicht startet, zeigen die Protokollzeilen meist die Ursache:
5. Weboberfläche öffnen und einrichten¶
Öffne auf einem Gerät im gleichen Heimnetz diese Adresse:
Ersetze <deine-server-ip> durch die IP-Adresse deines Docker-Servers, zum Beispiel 192.168.1.50.
Du siehst jetzt die Login-Seite von Code-Server. Gib das Passwort aus der compose.yaml ein (das unter PASSWORD).
Passwort wird nicht übernommen?
Wenn du das Passwort nachträglich in der compose.yaml ändern möchtest, verwende docker compose up -d (nicht docker compose restart), damit die neuen Umgebungsvariablen geladen werden.
6. Terminal testen¶
Öffne in der geöffneten VS-Code-Oberfläche das integrierte Terminal mit ++ctrl+shift+backtick++. Führe dort aus:
Die aktuelle Versionsnummer wird angezeigt. Teste auch, ob du mit dem Sudo-Passwort Administratorrechte bekommst:
Nach Eingabe des SUDO_PASSWORD sollte root erscheinen.
7. Erste Extension installieren¶
Code-Server verwendet den offenen Open VSX-Extension-Marktplatz statt dem Microsoft-Marketplace. Nicht alle Extensions aus dem offiziellen VS-Code-Marketplace sind dort verfügbar – zum Beispiel fehlt GitHub Copilot. Installiere eine Extension im Terminal des Containers:
Nach erfolgreicher Installation erscheint die Extension im Bereich Erweiterungen der Oberfläche.
.vsix-Datei manuell installieren
Fehlt eine Extension im Open-VSX-Katalog, lade die .vsix-Datei von der Projektseite herunter und installiere sie im Container-Terminal mit code-server --install-extension <dateiname>.vsix. Ersetze <dateiname> durch den tatsächlichen Dateinamen der heruntergeladenen Extension.
8. Workspace prüfen¶
Im Explorer der VS-Code-Oberfläche sollte der Inhalt deines lokalen Ordners ~/code-server/projects sichtbar sein. Lege testweise eine neue Datei an:
Die Datei erscheint in der Dateiliste. Lösche sie nach dem Test:
9. Git-Konfiguration einrichten¶
Lege deine Git-Identität im Container fest, damit Commits korrekt signiert werden:
SSH-Schlüssel für den Zugriff auf private Repositories legst du im Ordner ~/code-server/config/.ssh auf dem Host ab. Der Container übernimmt sie automatisch, weil /config als Volume gemountet ist. Setze die richtigen Berechtigungen:
10. Backup und Rückweg¶
Sichere die Compose-Datei und den Config-Ordner regelmäßig. So erstellst du ein komprimiertes Archiv:
docker compose stop
tar -czf ../code-server-backup-$(date +%F).tar.gz compose.yaml config projects
docker compose start
Das Archiv liegt eine Ebene über dem Arbeitsordner und trägt das aktuelle Datum im Namen.
Zum vollständigen Entfernen von Code-Server:
Alle Projekte im Ordner projects sind dann ebenfalls weg. Sichere sie vorher, wenn du sie behalten möchtest.
11. Aktualisieren¶
Lade zuerst das aktuelle Image:
Erstelle den Container mit dem neuen Image neu:
Deine Einstellungen, Extensions und Projekte bleiben erhalten, weil sie im config- und projects-Volume liegen.
12. Typische Fehler beheben¶
- Die Seite lädt nicht: Prüfe mit
docker compose ps, ob der Container läuft. Kontrolliere die Firewall des Servers (sudo ufw status). Der Port 8443 muss freigegeben sein. - Berechtigungsprobleme bei Dateien: Die Werte für
PUIDundPGIDin dercompose.yamlstimmen nicht mit dem Host-Benutzer überein. Korrigiere sie und führedocker compose up -daus. - Passwort wird nicht akzeptiert: Der Container wurde nur neugestartet (
docker compose restart) und hat die neuen Umgebungsvariablen nicht geladen. Stattdessendocker compose up -dverwenden. - Terminal im Browser öffnet nicht: Ein Reverse Proxy unterstützt keine WebSockets. Setze beim Proxy die Header
UpgradeundConnectionkorrekt. - Extension nicht gefunden: Nicht jede Extension ist im Open-VSX-Katalog verfügbar. Installiere sie als
.vsix-Datei oder verwende eine Alternative. - Port 8443 ist bereits belegt: Ändere den Host-Port, zum Beispiel auf
"8444:8443".
13. Sicherheitshinweise¶
Code-Server nicht direkt ins Internet stellen
Der Port 8443 verwendet normales HTTP ohne Verschlüsselung. Leite ihn nicht direkt im Router weiter. Für den Zugriff von unterwegs verwendest du ein VPN (WireGuard, Tailscale) oder einen Reverse Proxy mit HTTPS und vorgeschalteter Authentifizierung.
- Verwende ein starkes, einmaliges Passwort für
PASSWORDundSUDO_PASSWORD. - Gib Port
8443nur im Heimnetz frei. Binde ihn notfalls an die IP des Servers:"<deine-server-ip>:8443:8443". - SSH-Schlüssel im
config/.ssh-Ordner liegen unverschlüsselt auf der Festplatte. Schütze sie mit einem Passphrase.
14. Quellen¶
- LinuxServer.io Docker-Dokumentation für Code-Server [1]
- Docker Hub – linuxserver/code-server [3]
- GitHub – linuxserver/docker-code-server [5]
- GitHub – coder/code-server (Upstream) [6]
- Offizielle Coder-Installationsdokumentation [2]
- Selfhosting.sh – Code-Server-Anleitung (englisch) [4]
Fertig¶
Code-Server ist nun unter http://<deine-server-ip>:8443 im Heimnetz erreichbar. Öffne die Oberfläche, melde dich mit dem Passwort an und erstelle im Terminal eine neue Python-Datei. Schreibst du print("Hello Code-Server") und führst sie aus (++f5++), funktioniert die gesamte Entwicklungsumgebung aus dem Browser.