Indice del diarioDockup / nota dal campo
Note / self-host-code-server

Come fare self-hosting di code-server nel 2026: WebSocket, workspace e controllo degli accessi

Fai il self-hosting di code-server con porte corrette, storage persistente, HTTPS, secret, backup e controlli degli aggiornamenti. Scopri come risolvere i problemi causati dal proxy che blocca i WebSocket.

Un deployment di code-server che non funziona non va necessariamente in crash. Potrebbe mostrare la pagina di login mentre il proxy blocca i WebSocket oppure i permessi dei file impediscono l’installazione delle estensioni. Inizia invece con un controllo end-to-end: effettua il login, apri un repository montato, crea un file, esegui un comando nel terminale, installa un’estensione e riconnetti il WebSocket dell’editor.

Questo controllo corrisponde allo scopo documentato di code-server: VS Code eseguito nel browser su una macchina remota. Inoltre, mette in evidenza prima di un semplice uptime probe le dipendenze mancanti, le ipotesi errate sul proxy e i dati effimeri.

Da cosa dipende code-server

Definisci tre confini intorno a code-server: ingresso sulla porta 8080, stato persistente e requisiti di supporto. Il container può essere sostituito, ma gli altri due elementi devono avere owner espliciti. Il requisito del runtime locale è un mount del workspace che contenga solo i progetti che l’editor deve poter raggiungere. Verifica questo confine prima della pubblicazione e di nuovo dopo la sostituzione di un container.

Il diagramma è completo quando un client pulito riesce a effettuare il login, aprire un repository montato, creare un file, eseguire un comando nel terminale, installare un’estensione e riconnettere il WebSocket dell’editor. Raccogli i dati su tempi e risorse relativi a memoria e CPU utilizzate dai language server, dalle build, dagli extension host e dai terminali, non dalla web shell di code-server. Se la transazione fallisce, il primo confine che non si comporta come documentato indica se devi analizzare il routing, la capacità locale o un servizio di supporto.

Trasforma il comando locale in un servizio ispezionabile

Un avvio in stile production è volutamente semplice: stato nominato, porta esplicita e nessun secret nell’immagine.

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 .

L’esempio è una baseline, non uno stack di supporto completo. Conferma il requisito locale prima dell’esposizione: un mount del workspace che contenga solo i progetti che l’editor deve poter raggiungere. Controlla i mount effettivi e il listener, quindi prova a effettuare il login, aprire un repository montato, creare un file, eseguire un comando nel terminale, installare un’estensione e riconnettere il WebSocket dell’editor. Fissa l’immagine funzionante prima del prossimo riavvio.

Rendi univoca l’origine pubblica

Metti l’editor dietro HTTPS e mantieni gli upgrade dei WebSocket. Invia l’hostname scelto alla porta 8080 del container, inoltra l’host originale e lo schema HTTPS ed evita di pubblicare una seconda origine diretta.

Testa code-server da un client esterno pulito. Separa il problema di ingresso dal confine applicativo noto: il proxy blocca i WebSocket oppure i permessi dei file impediscono l’installazione delle estensioni. Un errore di certificato, DNS o 502 riguarda il routing; una richiesta che raggiunge code-server e fallisce in seguito riguarda lo stato dell’applicazione, la capacità o il relativo requisito di supporto. La guida TLS per domini personalizzati illustra il primo gruppo.

Esegui il backup dello stato che code-server non può ricreare

Un’immagine del container può essere scaricata di nuovo; la configurazione, le estensioni e le directory dei progetti montate esplicitamente no. Monta /home/coder prima del bootstrap, scrivi dati di esempio innocui e sostituisci il container per dimostrare che quel percorso è effettivamente persistente. Ispeziona il mount effettivo invece di fidarti del nome di un file Compose e verifica che l’utente del runtime possa scrivere dove code-server si aspetta.

Scegli la retention e una destinazione off-host, quindi prova il ripristino senza toccare la production. La prova è superata solo quando impostazioni, estensioni e file del workspace vengono ripristinati con i permessi corretti e il terminale si avvia con l’utente previsto. Per lo stato basato su database, affianca agli snapshot dello storage export coerenti con l’applicazione, come descritto in recovery point-in-time e snapshot.

Proteggi code-server dopo il bootstrap

Per code-server, la superficie più importante non è necessariamente la landing page. L’errore principale consiste nel concedere con leggerezza al container il socket Docker o l’intero filesystem dell’host. Contrastalo intenzionalmente: monta solo i workspace previsti, evita il socket Docker dell’host e posiziona l’editor dietro HTTPS e autenticazione strong.

Sostituisci immediatamente il PASSWORD di esempio, conservalo fuori dall’immagine e ruotalo come una credenziale amministrativa se viene esposto. Usa un utente non privilegiato nel container quando l’immagine lo supporta e non montare credenziali non correlate. Applica limiti di rate o dimensione all’ingresso, nei punti in cui il lavoro non attendibile può consumare memoria e CPU utilizzate dai language server, dalle build, dagli extension host e dai terminali, invece che dalla web shell di code-server.

Diagnostica un code-server apparentemente sano

Osserva il lavoro eseguito da code-server: memoria e CPU utilizzate dai language server, dalle build, dagli extension host e dai terminali, non dalla web shell di code-server. Imposta i limiti lasciando headroom per questo lavoro ed evita un liveness probe che entri in competizione con esso. Il controllo dell’operatore deve comunque tentare, secondo una pianificazione, di effettuare il login, aprire un repository montato, creare un file, eseguire un comando nel terminale, installare un’estensione e riconnettere il WebSocket dell’editor.

Per gli aggiornamenti, ricorda che la compatibilità delle estensioni e le toolchain della base image possono cambiare anche quando l’interfaccia di code-server continua ad avviarsi. Esegui il deployment del candidato su una copia ripristinata e ripeti il test noto. Se il proxy blocca i WebSocket oppure i permessi dei file impediscono l’installazione delle estensioni, usa i log del runtime e la richiesta di rete effettiva per individuare quale ipotesi è cambiata.

Evidenze da raccogliere prima di mettere code-server online

Crea un fixture code-server piccolo e usa-e-getta, quindi conservalo per ogni release. Il fixture deve eseguire il workflow reale: effettuare il login, aprire un repository montato, creare un file, eseguire un comando nel terminale, installare un’estensione e riconnettere il WebSocket dell’editor. Registra il digest dell’immagine, l’hostname esterno, l’indirizzo della dipendenza e il risultato atteso, così un operatore potrà ripetere il test in seguito senza dover interpretare questa guida.

Esegui il fixture tre volte. Per prima cosa, usa il deployment appena creato. In secondo luogo, sostituisci il container senza toccare lo stato persistente. Infine, ripristina il backup in un ambiente vuoto. La terza esecuzione è superata solo quando impostazioni, estensioni e file del workspace vengono ripristinati con i permessi corretti e il terminale si avvia con l’utente previsto. Durante ogni esecuzione, raccogli latenza e utilizzo delle risorse relativi a memoria e CPU utilizzate dai language server, dalle build, dagli extension host e dai terminali, invece che dalla web shell di code-server; questi dati diventano la baseline per gli alert, anziché una percentuale di CPU arbitraria.

Infine, verifica intenzionalmente il percorso negativo: invia input innocuo vicino al limite di risorse o formato associato a questo confine: il proxy blocca i WebSocket oppure i permessi dei file impediscono l’installazione delle estensioni. Conferma che code-server fallisca in modo visibile senza corrompere lo stato, ripristina la condizione corretta e ripeti la transazione riuscita. Un record della release contenente questi quattro risultati costituisce un’evidenza più solida degli screenshot di una dashboard o di una risposta curl eseguita una sola volta.

Sposta il lavoro infrastrutturale ripetibile su Dockup

Dockup può gestire i componenti sostituibili della piattaforma: instradare il traffico verso la porta 8080, rilasciare il dominio e il certificato, iniettare i secret, collegare lo storage persistente e connettere code-server a servizi gestiti o collegati privatamente. Può farlo sull’infrastruttura Dockup o su un server che colleghi.

Il lavoro di acceptance di code-server rimane esplicito. Dopo il deployment one-click, metti l’editor dietro HTTPS e mantieni gli upgrade dei WebSocket, conferma il requisito locale — un mount del workspace che contenga solo i progetti che l’editor deve poter raggiungere — ed esegui questo scenario: effettua il login, apri un repository montato, crea un file, esegui un comando nel terminale, installa un’estensione e riconnetti il WebSocket dell’editor. Questa separazione è intenzionale: Dockup elimina la configurazione infrastrutturale ripetitiva senza fingere che i ruoli applicativi, le credenziali del provider o la policy di ripristino si scelgano da soli.

Domande frequenti

Di cosa ha bisogno code-server per un deployment in production?

Instrada il container code-server sulla porta 8080 attraverso un’unica origine HTTPS. Il requisito del runtime locale è un mount del workspace che contenga solo i progetti che l’editor deve poter raggiungere. Non considerare code-server pronto finché non riesci a effettuare il login, aprire un repository montato, creare un file, eseguire un comando nel terminale, installare un’estensione e riconnettere il WebSocket dell’editor.

Quali dati di code-server devono essere inclusi in un backup?

Rendi persistente /home/coder e includi la configurazione, le estensioni e le directory dei progetti montate esplicitamente nello stesso manifest di recovery. Un ripristino pulito di code-server è superato solo quando impostazioni, estensioni e file del workspace vengono ripristinati con i permessi corretti e il terminale si avvia con l’utente previsto.

code-server richiede HTTPS dietro un reverse proxy?

Usa HTTPS per l’origine pubblica di code-server e mantieni la porta 8080 nel route interno. Applica correttamente l’impostazione di code-server: metti l’editor dietro HTTPS e mantieni gli upgrade dei WebSocket. Per code-server, HTTPS protegge le credenziali o i contenuti degli utenti durante il transito e mantiene coerente il comportamento del client sensibile all’origine.

Come deve essere testato un aggiornamento di code-server?

Ripristina lo stato corrente di code-server in un deployment isolato, applica la versione candidata e ripeti la relativa transazione di acceptance. Presta particolare attenzione, perché la compatibilità delle estensioni e le toolchain della base image possono cambiare anche quando l’interfaccia di code-server continua ad avviarsi. Conserva l’immagine precedente di code-server finché non avrai compreso i confini della migrazione dei dati e del rollback.