code-server es el proyecto de Coder que ejecuta VS Code en un servidor y lo sirve como aplicación web, de modo que puedes programar desde cualquier navegador con el código, las herramientas y la potencia de cálculo del servidor. En este tutorial instalarás code-server en Ubuntu 24.04 como servicio de tu usuario, lo publicarás detrás de Nginx en un subdominio con HTTPS de Let's Encrypt y gestionarás extensiones desde la terminal.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 2 GB de RAM y 2 vCPU. Las extensiones de lenguaje (TypeScript, Python) consumen bastante memoria.
  • Un usuario no root con privilegios sudo. code-server se ejecuta con los permisos de este usuario, así que tendrá acceso a sus ficheros y a una terminal.
  • Un dominio con un registro DNS A (y AAAA si usas IPv6) que apunte a la IP del servidor. En la guía se usa code.your_domain.
  • UFW activo con SSH permitido.

Paso 1: Instalar code-server

Coder publica un script de instalación que en Ubuntu descarga el paquete .deb de la última versión desde GitHub y lo instala con dpkg. Descárgalo para poder revisarlo antes de ejecutarlo:

curl -fsSL https://code-server.dev/install.sh -o install-code-server.sh
less install-code-server.sh

La opción --dry-run muestra los comandos que ejecutaría sin cambiar nada:

sh install-code-server.sh --dry-run
Ubuntu 24.04.3 LTS
Installing v4.104.1 of the amd64 deb package from GitHub.

+ mkdir -p ~/.cache/code-server
+ curl -#fL -o ~/.cache/code-server/code-server_4.104.1_amd64.deb.incomplete -C - https://github.com/coder/code-server/releases/download/v4.104.1/code-server_4.104.1_amd64.deb
...
+ sudo dpkg -i ~/.cache/code-server/code-server_4.104.1_amd64.deb

Si todo es correcto, ejecútalo:

sh install-code-server.sh

Comprueba la versión instalada:

code-server --version
4.104.1 5c8b5c3a1d... with Code 1.104.1

El número de versión que veas será probablemente distinto.

Paso 2: Arrancar code-server como servicio

El paquete incluye la unidad de systemd [email protected], que ejecuta code-server con el usuario indicado tras la @. Actívala para tu usuario:

sudo systemctl enable --now code-server@$USER

En el primer arranque, code-server crea su configuración en ~/.config/code-server/config.yaml con una contraseña aleatoria. Comprueba que el servicio está en marcha:

sudo systemctl status code-server@$USER
● code-server@your_user.service - code-server
     Loaded: loaded (/usr/lib/systemd/system/[email protected]; enabled; preset: enabled)
     Active: active (running) since Thu 2026-09-25 11:02:10 UTC; 5s ago

Por defecto solo escucha en 127.0.0.1:8080, así que todavía no es accesible desde fuera. Compruébalo:

curl -sI http://127.0.0.1:8080 | head -n 1
HTTP/1.1 302 Found

La redirección 302 lleva a la página de inicio de sesión: code-server está respondiendo.

Paso 3: Configurar la contraseña

Abre el fichero de configuración:

nano ~/.config/code-server/config.yaml

Deja el enlace en localhost, porque Nginx será quien reciba las conexiones externas, y sustituye la contraseña generada por una tuya. Usa your_strong_password solo como marcador: pon una contraseña larga y única:

bind-addr: 127.0.0.1:8080
auth: password
password: your_strong_password
cert: false

cert: false desactiva el TLS propio de code-server, ya que el cifrado lo hará Nginx. El fichero contiene la contraseña en claro, así que limita sus permisos y reinicia el servicio:

chmod 600 ~/.config/code-server/config.yaml
sudo systemctl restart code-server@$USER

Paso 4: Publicar code-server con Nginx y HTTPS

Instala Nginx y Certbot con su plugin para Nginx:

sudo apt update
sudo apt install nginx certbot python3-certbot-nginx

Permite HTTP y HTTPS en el cortafuegos. El perfil Nginx Full abre los puertos 80 y 443:

sudo ufw allow 'Nginx Full'

Crea el bloque de servidor para el subdominio:

sudo nano /etc/nginx/sites-available/code-server
server {
    listen 80;
    listen [::]:80;
    server_name code.your_domain;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
    }
}

Las cabeceras Upgrade y Connection son imprescindibles: el editor se comunica con el servidor por WebSocket y, sin ellas, la página carga pero el editor se queda desconectado.

Activa el sitio, valida la sintaxis y recarga Nginx:

sudo ln -s /etc/nginx/sites-available/code-server /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Solicita el certificado. Certbot valida el dominio por HTTP, añade la configuración TLS al bloque de servidor y crea la redirección de HTTP a HTTPS:

sudo certbot --nginx -d code.your_domain
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/code.your_domain/fullchain.pem
...
Successfully deployed certificate for code.your_domain to /etc/nginx/sites-enabled/code-server
Congratulations! You have successfully enabled HTTPS on https://code.your_domain

La renovación es automática mediante el temporizador certbot.timer. Puedes simularla con:

sudo certbot renew --dry-run

Abre https://code.your_domain en el navegador, introduce la contraseña del paso 3 y verás el editor. Abre una terminal integrada con Ctrl+` para confirmar que la conexión WebSocket funciona.

Paso 5: Restringir el acceso por IP (opcional)

Si siempre te conectas desde las mismas direcciones (la oficina o una VPN), limitar el acceso en Nginx elimina la exposición de la página de inicio de sesión al resto de Internet. Edita el sitio, que ahora incluye también el bloque HTTPS que añadió Certbot:

sudo nano /etc/nginx/sites-available/code-server

Añade las reglas allow y deny dentro del bloque location / del servidor que escucha en el puerto 443. Sustituye 203.0.113.10 por tu IP pública:

    location / {
        allow 203.0.113.10;
        deny all;

        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
    }

Valida y recarga:

sudo nginx -t
sudo systemctl reload nginx

Desde otra IP, Nginx responderá ahora con 403 Forbidden.

Paso 6: Instalar extensiones

code-server no puede usar el Marketplace de Microsoft por su licencia, y en su lugar usa Open VSX, donde están la mayoría de extensiones de código abierto. Puedes instalarlas desde el panel de extensiones del editor o desde la terminal del servidor:

code-server --install-extension ms-python.python
code-server --install-extension esbenp.prettier-vscode

Lista las extensiones instaladas para comprobarlo:

code-server --list-extensions
esbenp.prettier-vscode
ms-python.debugpy
ms-python.python

Si una extensión no está en Open VSX pero su autor publica un fichero .vsix (por ejemplo en las releases de GitHub), descárgalo e instálalo por ruta:

code-server --install-extension ~/descargas/extension.vsix

Las extensiones se guardan en ~/.local/share/code-server/extensions y no hace falta reiniciar el servicio; basta con recargar la ventana del navegador.

Solución de problemas

La página carga pero aparece "WebSocket close with status code 1006". Nginx no está reenviando las cabeceras de WebSocket. Revisa que proxy_set_header Upgrade y Connection estén en el bloque de servidor del puerto 443, ejecuta sudo nginx -t y recarga.

Nginx devuelve 502 Bad Gateway. code-server no está en marcha o escucha en otro puerto. Revisa el servicio y el puerto:

sudo journalctl -u code-server@$USER -n 30 --no-pager
sudo ss -tlnp | grep 8080

Certbot falla con Timeout during connect. El registro DNS aún no apunta al servidor o el puerto 80 está cerrado. Comprueba la resolución con dig +short code.your_domain y que sudo ufw status incluye Nginx Full.

Una extensión no aparece al buscarla. No está publicada en Open VSX. Búscala en https://open-vsx.org o instala su .vsix como se indica en el paso 6.

Conclusión

Ya tienes VS Code funcionando en el navegador sobre tu servidor Ubuntu 24.04, con code-server como servicio de systemd, Nginx como proxy inverso con HTTPS de Let's Encrypt y la opción de restringir el acceso por IP. Como siguientes pasos, puedes instalar los lenguajes y herramientas de tus proyectos directamente en el servidor, añadir una VPN como WireGuard para no exponer el editor a Internet o actualizar code-server volviendo a ejecutar el script de instalación, que sustituye el paquete por la última versión.