code-server auf dem Synology NAS installieren: VS Code im Browser
code-server bringt VS Code vollständig in den Browser – inklusive Terminal, Extensions und IntelliSense. Dieser Artikel zeigt, wie du das linuxserver.io-Image per Compose-Projekt auf deinem Synology NAS einrichtest, PUID/PGID korrekt setzt und deinen Docker-Ordner direkt im Editor bearbeitest.

Wer Compose-Dateien, Shell-Skripte oder Konfigurationen direkt auf dem Synology NAS bearbeiten will, greift meist zu SSH und einem Kommandozeilen-Editor. Mit code-server geht das komfortabler: Das Projekt coder/code-server verpackt VS Code als Webserver, der vollständig im Browser läuft – mit echtem Terminal, Extension-Marketplace, IntelliSense und integrierter Git-Unterstützung. Das linuxserver.io-Image bringt PUID/PGID-Support mit, sodass der Container auf dem NAS mit den richtigen Dateiberechtigungen arbeitet. Das Ergebnis ist eine vollwertige Entwicklungsumgebung, die du vom Browser aus erreichst – ohne lokale IDE, ohne SSH-Konfiguration für jeden Arbeitsplatz.
Voraussetzungen
- Synology NAS mit DSM 7.2 und Intel- oder AMD-CPU (x86-64)
- Container Manager aus dem Package Center installiert
- Mindestens 1 GB freier RAM für den code-server-Container
- SSH-Zugang zum NAS (einmalig zum Ermitteln von PUID und PGID) – Schritt-für-Schritt: SSH auf dem Synology NAS aktivieren und verbinden
- Ordner
/volume1/docker/code-server/configbereits angelegt (File Station oder SSH) – Hintergründe zu Ordnern und Berechtigungen: Docker-Ordner und Berechtigungen auf dem Synology NAS - Optional: synology.me-DDNS oder eigene Domain für HTTPS-Zugriff von außen
Eckdaten auf einen Blick
| Eigenschaft | Wert |
|---|---|
| Image | lscr.io/linuxserver/code-server:latest |
| Aktueller Build | 4.123.0-ls343 (06.06.2026) |
| Image-Größe | 221,6 MB komprimiert |
| Architekturen | x86-64 (amd64), ARM64 |
| Web-Port intern | 8443 (HTTP) |
| Empfohlener Host-Port | 8443:8443 |
| Pflicht-Volume | /volume1/docker/code-server/config:/config |
| Empfohlenes Workspace-Volume | /volume1/docker:/config/workspace/docker |
Umgebungsvariablen
| Variable | Beispielwert | Pflicht? | Bedeutung |
|---|---|---|---|
PUID | 1026 | Ja | User-ID des NAS-Benutzers (per SSH: id) |
PGID | 100 | Ja | Group-ID (typisch 100 = users auf Synology) |
TZ | Europe/Berlin | Empfohlen | Zeitzone des Containers |
PASSWORD | sicheres_passwort | Dringend empfohlen | Web-GUI-Passwort; ohne diesen Wert ist der Zugang offen |
HASHED_PASSWORD | (BCrypt-Hash) | Alternativ zu PASSWORD | Sicherer als Klartext; überschreibt PASSWORD wenn gesetzt |
SUDO_PASSWORD | sudo_passwort | Optional | Gibt dem Terminal sudo-Rechte für Paket-Installation |
SUDO_PASSWORD_HASH | (Hash) | Optional | Gehashtes sudo-Passwort als Alternative |
PROXY_DOMAIN | code.nas.beispiel.de | Optional | Domain für Reverse-Proxy; nur setzen wenn Proxy aktiv |
DEFAULT_WORKSPACE | /config/workspace | Optional | Startordner im Editor-Explorer |
PWA_APPNAME | code-server | Optional | Name beim Installieren als Progressive Web App |
Schritt 1: PUID und PGID ermitteln
Die PUID und PGID sorgen dafür, dass Dateien, die der Container anlegt, dem richtigen NAS-Benutzer gehören – ohne diese Werte entstehen root-eigene Dateien, die du später nicht mehr schreiben kannst. Verbinde dich per SSH mit dem NAS (Anleitung: SSH auf dem Synology NAS aktivieren und verbinden) und führe dann folgenden Befehl aus:
id
Typische Ausgabe auf einem Synology NAS:
uid=1026(deinbenutzer) gid=100(users) groups=100(users),101(administrators)
Notiere uid (hier: 1026) und gid (hier: 100). Diese Werte trägst du in der Compose-Datei als PUID und PGID ein. Verwende nicht die generischen Standardwerte 1000/1000 – auf Synology sind diese fast immer falsch.
Verifizieren: Die Ausgabe von id zeigt eine uid=-Zeile. Werte außerhalb des Bereichs 1000–1100 für PUID sind auf Synology ungewöhnlich – prüfe in DSM unter Systemsteuerung > Benutzer und Gruppe, welcher Benutzer gemeint ist.
Schritt 2: Ordnerstruktur anlegen
Lege die benötigten Verzeichnisse über die File Station oder per SSH an, bevor der Container startet. Erstellt Docker den Ordner selbst, gehört er root – das führt später zu Schreibfehlern.
mkdir -p /volume1/docker/code-server/config
Der Ordnername muss exakt so lauten (alles kleingeschrieben), da Synology-Dateisysteme auf ext4 case-sensitive sind. Den Ordner /volume1/docker selbst brauchst du nicht neu anzulegen – er existiert bereits, wenn du Container Manager verwendest.
Verifizieren: Öffne in der File Station den Pfad docker/code-server/config. Der Ordner muss sichtbar sein und der angezeigte Besitzer sollte dein NAS-Benutzer sein, nicht root. Per SSH: ls -la /volume1/docker/code-server/ sollte config mit deiner uid anzeigen.
Schritt 3: Compose-Datei erstellen und Projekt anlegen
Öffne den Container Manager, wechsle zu Projekt und klicke auf Erstellen. Vergib den Projektnamen code-server und trage folgende Compose-Konfiguration ein. Passe PUID, PGID, PASSWORD und SUDO_PASSWORD auf deine Werte an – eine detaillierte Anleitung zum Anlegen von Projekten findest du unter Container Manager: Docker-Compose-Projekt anlegen, starten und aktualisieren.
services:
code-server:
image: lscr.io/linuxserver/code-server:latest
container_name: code-server
environment:
- PUID=1026
- PGID=100
- TZ=Europe/Berlin
- PASSWORD=sicheres_passwort_aendern
- HASHED_PASSWORD=
- SUDO_PASSWORD=sudo_passwort_aendern
- SUDO_PASSWORD_HASH=
- PROXY_DOMAIN=
- DEFAULT_WORKSPACE=/config/workspace
- PWA_APPNAME=code-server
volumes:
- /volume1/docker/code-server/config:/config
- /volume1/docker:/config/workspace/docker
ports:
- 8443:8443
restart: unless-stopped
Das zweite Volume mountet deinen gesamten Docker-Ordner als /workspace/docker in den Editor – alle Compose-Projekte (Dockge, Gitea, Semaphore usw.) sind dann direkt sichtbar und editierbar. Ist Port 8443 auf deinem NAS bereits belegt, ändere den Host-Port auf 8444 (8444:8443). Die Felder HASHED_PASSWORD und PROXY_DOMAIN bleiben leer, sofern du sie nicht benötigst – leere Werte werden vom Container ignoriert.
Verifizieren: Container Manager zeigt das Projekt code-server in der Projektliste mit Status Wird ausgeführt. Im Protokoll-Tab des Containers erscheinen Zeilen wie [services.d] done. und Server listening on http://0.0.0.0:8443 – erst dann ist der Server bereit.
Schritt 4: Erster Login und Passwort-Verifikation
Öffne im Browser http://<NAS-IP>:8443. Du landest auf dem code-server-Login-Bildschirm. Gib das in PASSWORD gesetzte Passwort ein und bestätige mit Enter.
Nach dem Login siehst du die vertraute VS-Code-Oberfläche im Browser. Im linken Explorer-Panel sollte der Ordner /workspace/docker bereits sichtbar sein – das sind deine Compose-Projekte auf dem NAS.
Wichtig: Wurde PASSWORD leer gelassen oder vergessen, ist die Instanz ohne Authentifizierung erreichbar. Jeder im lokalen Netz könnte dann das Terminal nutzen und auf alle gemounteten Volumes zugreifen. Stoppe in diesem Fall den Container, trage PASSWORD in der Compose-Datei ein und starte das Projekt neu.
Verifizieren: Die VS-Code-Oberfläche öffnet sich fehlerfrei im Browser. Der Explorer zeigt /workspace/docker als Ordner. Öffne eine vorhandene Compose-Datei aus einem Unterprojekt – sie sollte lesbar und editierbar sein.
Schritt 5: Extension installieren und Terminal testen
Extensions werden unter /config/extensions gespeichert und überleben Container-Neustarts sowie Image-Updates, solange das /config-Volume persistent gemountet bleibt.
Klicke links in der Aktivitätsleiste auf das Extensions-Symbol (oder drücke Ctrl+Shift+X). Suche nach einer Extension deiner Wahl, z. B. „YAML" von Red Hat, und klicke auf Install. Die Extension wird direkt in /config/extensions gespeichert.
Öffne danach das integrierte Terminal über Terminal > New Terminal (oder Ctrl+`). Du befindest dich im Container als der per PUID/PGID konfigurierte Benutzer. Prüfe den Zugriff auf dein gemountetes Volume:
ls /config/workspace/docker
Die Ausgabe sollte deine Docker-Projektordner auflisten. Wenn du SUDO_PASSWORD gesetzt hast, teste zusätzlich:
sudo apt-get update
Verifizieren: Die installierte Extension erscheint in der Extensions-Liste als Installed. Im Terminal gibt ls /config/workspace/docker deine Compose-Projektordner aus. Nach einem Container-Neustart ist die Extension noch vorhanden – sie liegt persistent im /config-Volume.
Schritt 6: Synology Reverse Proxy für HTTPS einrichten (optional)
Für den Zugriff von außen oder wenn du HTTPS benötigst, richtest du den Synology Reverse Proxy ein. Gehe in DSM zu Systemsteuerung > Anwendungsportal > Reverse Proxy und erstelle einen neuen Eintrag:
- Quell-Protokoll: HTTPS, Port 443
- Quell-Hostname: deine Domain (z. B.
code.nas.beispiel.de) - Ziel-Protokoll: HTTP
- Ziel-Hostname: localhost, Port 8443
Wichtig: Wechsle im Eintrag auf den Reiter Benutzerdefinierte Kopfzeile und aktiviere die WebSocket-Option. Ohne WebSocket-Unterstützung erscheinen Verbindungsabbrüche und die Fehlermeldung „WebSocket connection failed" in der Browser-Konsole. Trage anschließend in der Compose-Datei den Wert für PROXY_DOMAIN ein (z. B. code.nas.beispiel.de) und starte den Container neu.
Verifizieren: Rufe https://code.nas.beispiel.de im Browser auf. Der Login-Bildschirm erscheint mit gültigem HTTPS-Zertifikat (Schloss-Symbol im Browser). Die Browser-Konsole zeigt keine WebSocket-Fehler.
Troubleshooting / Typische Fehler
- Container startet nicht, Port-Konflikt: Port 8443 ist auf manchen Synology-Modellen durch andere Dienste belegt. Prüfe Container Manager > Protokoll auf
address already in use. Lösung: Host-Port in der Compose-Datei ändern, z. B.8444:8443. - Dateien im Editor nicht schreibbar: PUID/PGID stimmen nicht mit dem tatsächlichen NAS-Benutzer überein. Führe per SSH
idaus und trage die korrekten Werte ein. Prüfe mitls -la /volume1/docker/code-server/, ob der Ordner dem richtigen Benutzer gehört. - „WebSocket connection failed" im Browser: Der Synology Reverse Proxy leitet WebSocket-Verbindungen nicht weiter. Lösung: Im Reverse-Proxy-Eintrag unter Benutzerdefinierte Kopfzeile die WebSocket-Option aktivieren.
- Extensions nach Neustart weg: Das
/config-Volume ist nicht persistent gemountet. Extensions liegen in/config/extensions– das Volume muss im Compose-Eintrag stets vorhanden sein. - Passwort wird abgelehnt: Sonderzeichen im
PASSWORD-Wert können in YAML problematisch sein. Setze den Wert in Anführungszeichen:PASSWORD="mein!Passwort#2026". Alternativ: HASHED_PASSWORD mit BCrypt-Hash verwenden. - sudo: Berechtigung verweigert:
SUDO_PASSWORDwurde nicht gesetzt. Trage einen Wert ein und starte den Container neu. - Workspace-Ordner im Explorer leer: Das zweite Volume wurde nicht korrekt eingetragen oder der Pfad
/volume1/dockerexistiert nicht. Prüfe per SSH mitls /volume1/dockerund korrigiere den Volume-Eintrag. - PROXY_DOMAIN gesetzt, code-server lädt nicht: Eine falsch konfigurierte oder nicht erreichbare Domain kann interne Weiterleitungs-URLs korrumpieren. Entferne den Wert oder setze ihn auf die korrekte, erreichbare Domain.
- Ressourcenengpass auf kleinen NAS-Modellen: code-server benötigt mindestens 1 GB RAM. Auf einem NAS mit 2 GB Gesamt-RAM (z. B. DS220+) kann das andere Container verlangsamen. RAM-Nutzung im Container Manager unter Container > Ressourcen beobachten.
Häufige Fragen
Kann ich code-server ohne Reverse Proxy betreiben?
Ja. Direkt über http://nas-ip:8443 ist code-server ohne HTTPS erreichbar. Für den Einsatz ausschließlich im lokalen Netzwerk ist das akzeptabel – stelle sicher, dass PASSWORD gesetzt ist. Für den Zugriff von außen ist ein Reverse Proxy mit TLS zwingend empfohlen, da andernfalls Passwort und Terminalausgaben im Klartext übertragen werden.
Bleiben installierte Extensions nach einem Image-Update erhalten?
Ja. Alle Extensions liegen unter /config/extensions innerhalb des persistenten /config-Volumes. Solange dieses Volume gemountet bleibt, überleben Extensions sowohl Container-Neustarts als auch das Hochziehen auf eine neue Image-Version über Container Manager > Projekt > Aktion > Neuerstellen.
Wie sichere ich code-server stärker ab als mit einem Klartext-Passwort?
Setze statt PASSWORD den Wert HASHED_PASSWORD auf einen BCrypt-Hash. Einen Hash erzeugst du z. B. mit htpasswd -nB benutzer auf einem Linux-System. Der Hash beginnt mit $2y$ oder $2b$. Zusätzlich kannst du einen Reverse Proxy mit OAuth2-Authentifizierung vorschalten. Das eingebaute Rate-Limiting begrenzt Login-Versuche bereits auf 2 pro Minute und 12 pro Stunde.
Kann ich mehrere code-server-Instanzen betreiben?
Ja. Lege in der Compose-Datei mehrere Services mit unterschiedlichen Container-Namen, Port-Mappings und /config-Volume-Pfaden an – z. B. eine Instanz pro Projekt oder Benutzer. Jede Instanz hat ihre eigenen Extensions, Settings und Workspace-Konfiguration.
Funktioniert die Git-Integration in code-server?
Ja. Git ist im linuxserver.io-Image vorinstalliert. Die eingebaute Source-Control-Ansicht von VS Code funktioniert vollständig. Besonders praktisch: Wenn du eine Gitea-Instanz auf demselben NAS betreibst, erreichst du das Git-Repository direkt aus dem Editor über die interne Docker-IP oder den NAS-Hostnamen.
Wie viel RAM benötigt code-server?
Das offizielle Minimum laut coder.com sind 1 GB RAM. Auf einem NAS mit 2 GB Gesamt-RAM (z. B. DS220+) kann code-server andere Container merklich verlangsamen. Beobachte die RAM-Nutzung im Container Manager unter Container > Ressourcen. Auf Modellen mit 4 GB oder mehr läuft code-server erfahrungsgemäß problemlos neben anderen Diensten.
Fazit
code-server auf dem Synology NAS verwandelt das NAS in eine browser-gestützte Entwicklungsumgebung. Dank des linuxserver.io-Images und PUID/PGID-Support fügt sich der Container sauber in die bestehende NAS-Rechteverwaltung ein – Dateien gehören dem richtigen Benutzer, Extensions bleiben persistent, und der gemountete Docker-Ordner macht alle Compose-Projekte direkt editierbar. Der entscheidende Vorteil gegenüber SSH: Du arbeitest in einer vollwertigen IDE mit Syntax-Highlighting, Git-Integration und Extension-Ökosystem, erreichbar von jedem Browser aus. Wer code-server als Steuerzentrale für seinen Self-Hosting-Stack nutzen will – Compose-Dateien editieren, Skripte schreiben, Git-Commits direkt auf dem NAS – bekommt damit ein mächtiges Werkzeug ohne laufende Cloud-Kosten.
Weiterführende Anleitungen und Quellen
- Dockge auf dem Synology NAS installieren: Docker-Compose-Stacks einfach verwalten – Compose-Projekte visuell verwalten, ideal als Ergänzung zu code-server
- Gitea mit Docker: eigener Git-Server als GitHub-Alternative – Git-Repositories auf dem NAS selbst hosten, direkt aus code-server erreichbar
- Semaphore UI auf dem Synology NAS: Ansible-Automatisierung per Web-GUI – Skripte und Playbooks, die du mit code-server schreibst, direkt ausführen
- Container Manager: Docker-Compose-Projekt anlegen, starten und aktualisieren
Offizielle Dokumentation: LinuxServer.io – docker-code-server | GitHub – linuxserver/docker-code-server | GitHub – coder/code-server (Upstream)