Microsoft Visual Studio Code (VS Code) è uno degli editor di codice più popolari al mondo e un progetto open-source sviluppato da Microsoft. Questa IDE è stata utilizzata come base per altri software (come Cursor) e, grazie all’utilizzo di un container, è possibile eseguire VS Code su una macchina virtuale (VM), rendendolo privato e sempre accessibile direttamente tramite browser. Questo offre i seguenti vantaggi:

  • Always On: ideale per modifiche rapide al codice senza dover configurare l’editor su ogni dispositivo locale.
  • Resource Friendly: richiede pochissime risorse e può essere ospitato su server privati, NAS o anche un Raspberry Pi.
  • Isolato: Docker fornisce un ambiente isolato, consentendo di eseguire più istanze contemporaneamente. Se la VM ospitante condivide la GPU (ad esempio tramite configurazioni aggiuntive come NVIDIA Docker runtime), è possibile sfruttarne la potenza direttamente dal browser.
  • Multi Device: l’ambiente è accessibile da qualsiasi dispositivo (PC, tablet, Chromebook, iPad, ecc.), sfruttando le risorse della macchina ospitante senza dipendere dalle limitazioni hardware del client. Questa configurazione è particolarmente utile per chi lavora in mobilità o desidera un workflow centralizzato, evitando di dover sincronizzare configurazioni e estensioni su più macchine.

Processo di Installazione

Dopo aver installato Docker Engine all’interno del nostro sistema, sarà necessario creare gli elementi che permettono di procedere con l’installazione. Per farlo occorre creare due file: il docker-compose.yaml, che contiene tutte le istruzioni necessarie per generare e configurare il container, e il file .env, che contiene le variabili da utilizzare (come le nostre credenziali).

Creiamo il File Docker Compose

Il codice del docker-compose.yaml installa un’istanza di VS Code in un container, utilizzando un’immagine gestita e mantenuta da LinuxServer.io, configurata con una serie di impostazioni base e variabili utili alla gestione del servizio. Analizzando il codice, possiamo vedere che:

  • il container è configurato per riavviarsi automaticamente in caso di errore
  • al suo interno sono inserite le variabili relative alle password di accesso e di gestione
  • per rendere i dati persistenti, viene montato un volume ./vscode all’interno del container nella directory /config, e allo stesso tempo viene fornito l’accesso alla cartella di lavoro (utile per trasferire file senza problemi)
  • per interagire con il servizio, questo viene esposto tramite la porta 8443 (la stessa utilizzata internamente dal servizio nell’immagine per compatibilità HTTPS)
yaml
services:
  code-server:
    image: lscr.io/linuxserver/code-server:latest
    container_name: code-server
    restart: unless-stopped
    environment:
      TZ: Europe/Rome
      PUID: 1000
      PGID: 1000
      SUDO_PASSWORD: ${VSCODE_PASSWORD_SUDO}
      PROXY_DOMAIN: ${INTERNAL_DOMAIN}
      PASSWORD: ${VSCODE_PASSWORD}
      DEFAULT_WORKSPACE: /config/workspace
    volumes:
      - ./vscode:/config
      - ./workspace:/config/workspace
    ports:
      - "8443:8443"

Definiamo le Variabili (.env)

Per migliorare la sicurezza (e non solo), è buona prassi non inserire le password o le variabili direttamente nel file docker-compose, ma è sempre consigliato inserire queste variabili nel file di configurazione, che in questo caso è il file .env, che deve essere creato nella stessa location del docker-compose.yaml. Qui sotto possiamo trovare un esempio delle variabili che possono essere utilizzate per gestire la creazione del container.

bash
VSCODE_PASSWORD_SUDO=5up3r_P4s5w0rd_Adm1n
VSCODE_PASSWORD=5up3r_P4s5w0rd_Us3r
INTERNAL_DOMAIN=code.dominio.xx

Nota sulla sicurezza

Sostituire i valori di esempio con password sicure generate casualmente. Per una maggiore sicurezza in produzione, considerare l’uso della variabile HASHED_PASSWORD documentata nell’immagine LinuxServer.io.

Configurazione dell’Ambiente di Sviluppo

Una volta completata l’installazione, per rendere l’ambiente effettivamente funzionale sarà necessario procedere con una serie di configurazioni, così da renderlo attivo e pronto all’uso. Il container appena attivato dopo l’installazione deve essere considerato come una base pulita da personalizzare in base alle proprie esigenze, quali ad esempio preferenze personali, plugin e linguaggi di programmazione utilizzati.

Nota sull’accesso iniziale: Avviare il container con docker compose up -d, quindi aprire il browser all’indirizzo https://<IP_DEL_SERVER>:8443 e inserire la PASSWORD definita nel file .env. Per certificati self-signed, accettare l’eccezione di sicurezza nel browser.

In questo esempio ci concentreremo su un’installazione tipo che serve per iniziare a programmare in Python, sulla configurazione di una connessione Git e sulla creazione di un ambiente virtuale dedicato allo sviluppo (questo è un esempio, ognuno può eseguire le personalizzazioni che ritiene più coerenti con le proprie necessità). Un aspetto importante è che tutte le configurazioni devono essere eseguite all’interno del terminale del container, a cui si può accedere tramite il terminale integrato di VS Code (apribile dal menu Terminals > New Terminal).

Installazione di Python

Il container installato si basa su Debian/Ubuntu, quindi il codice qui sotto provvederà automaticamente ad aggiornare il sistema, installare Python (opzionale se già presente), installare Pip (necessario per gestire le librerie) e installare il gestore di ambienti virtuali (necessario per eseguire gli applicativi).

bash
sudo apt-get update
sudo apt-get -y install python3-pip
sudo apt-get -y install python3-venv

Attenzione alla Versione di Python

Il codice sopra considera l’installazione dell’applicativo per la versione 3.12 di Python, quindi sarà necessario installare la versione corretta, corrispondente alla versione installata in locale, se diversa.

Dopo aver completato le installazioni, sarà necessario attivare l’ambiente virtuale tramite il terminale utilizzando il codice sotto, che creerà un ambiente venv insieme alla sua cartella dove saranno installate tutte le librerie e le dipendenze necessarie. Per mantenere l’ambiente e le installazioni persistenti, eseguire lo script nella cartella di lavoro /config/workspace.

bash
python3 -m venv .venv

Successivamente, per poterci lavorare sarà necessario attivarlo. Una volta fatto, si potranno installare librerie ed eseguire gli sviluppi. Esempio: pip install --upgrade pip seguito da pip install <nome_libreria>.

bash
source .venv/bin/activate

Configurazione di Git

Un altro strumento obbligatorio per ogni programmatore è Git, che possiamo utilizzare per salvare e versionare i nostri codici. Per poter scaricare senza dover inserire le credenziali ad ogni operazione, è necessario prima creare una chiave SSH da installare nel sistema e che poi può essere condivisa e installata nel nostro account (es. GitLab o GitHub). Per creare una chiave possiamo utilizzare il comando qui di seguito.

bash
ssh-keygen -t rsa -b 4096 -C "mario.rossi@miodominio.cc"

Una volta completata l’operazione, sarà necessario estrarre la chiave pubblica e inserirla nella sezione SSH Keys della piattaforma Git (es. GitLab o GitHub) per gestire la connessione. Questo consentirà di riconoscere l’utente e le sue credenziali, permettendo la sincronizzazione dei dati. A tal fine, copiamo il codice sottostante per poterlo utilizzare. Per garantire la persistenza della chiave (non salvata di default in una directory montata), copiarla in /config/.ssh e impostare i permessi corretti:

bash
cat ~/.ssh/id_rsa.pub
cp ~/.ssh/id_rsa* /config/.ssh/
chmod 600 /config/.ssh/id_rsa
ssh-add /config/.ssh/id_rsa

Una volta stabilita e verificata la connessione, è necessario configurare l’ambiente locale con i dati specifici, indicando le informazioni del proprio utente (qui sotto un esempio).

bash
git config --global user.name "Mario Rossi"
git config --global user.email "mario.rossi@miodominio.cc"

Una volta completata la configurazione, è possibile scaricare la repository, installarla e iniziare a lavorarci. A tal fine, possiamo utilizzare il codice fornito dalla piattaforma stessa.

bash
git clone git@gitlab.com:username/repository.git

Troubleshooting & Consigli

  • Certificati self-signed: Accettare l’eccezione nel browser o configurare un proxy reverse (es. con Nginx) per HTTPS valido.
  • Persistenza dati: Verificare che i volumi ./vscode e ./workspace siano creati e montati correttamente.
  • Aggiornamenti: Per aggiornare l’immagine, eseguire docker compose pull e docker compose up -d.
  • Per una configurazione in produzione, privilegiare HTTPS e password hashed.