n8n en español

Instalar n8n en un VPS Ubuntu con Docker Compose y HTTPS

Actualizado: 2026-11-05. Guía independiente basada en documentación oficial; no probada por nosotros en un servidor propio salvo que se indique lo contrario.

Esta guía monta n8n en un servidor Linux con HTTPS automático usando el ejemplo de la documentación oficial: Docker Compose con Traefik como proxy inverso. Necesitas un dominio propio y un VPS con una IP pública. Si todavía no tienes servidor, lee antes qué plan de Hostinger elegir o la comparativa de hosting.

Aviso de honestidad: no hemos ejecutado este despliegue en un servidor propio. Copiamos la estructura de la documentación oficial (consultada el 2026-11-05) y no añadimos variables que no aparezcan en ella. La documentación habla de una distribución Linux en general; nosotros solo asumimos Ubuntu por ser habitual.

1. Instalar Docker y Docker Compose

Sigue las instrucciones oficiales de Docker para tu distribución y verifica:

docker --version
docker compose version

Opcional, para usar Docker sin sudo (según la documentación):

sudo usermod -aG docker ${USER}
exec sg docker newgrp
groups

2. Configurar el DNS

En el panel de tu dominio crea un registro A con el nombre de tu subdominio (por ejemplo n8n) y como destino la IP del servidor. Sin esto el certificado HTTPS no se podrá emitir.

3. Carpeta del proyecto y archivo .env

mkdir n8n-compose
cd n8n-compose
mkdir local-files

Crear local-files tú mismo asegura propietario y permisos correctos, según la documentación. Después crea el archivo .env con tus valores:

DOMAIN_NAME=example.com
SUBDOMAIN=n8n
GENERIC_TIMEZONE=Europe/Madrid
SSL_EMAIL=tu-correo@example.com
  • DOMAIN_NAME: tu dominio principal.
  • SUBDOMAIN: el subdominio donde vivirá n8n.
  • GENERIC_TIMEZONE: zona horaria para los nodos programados. Si no se define, la documentación indica que el valor por defecto es Nueva York.
  • SSL_EMAIL: correo usado para crear el certificado TLS/SSL.

4. El archivo compose.yaml

Define dos servicios: Traefik (certificados, redirección de HTTP a HTTPS y enrutado, escuchando en los puertos 80 y 443) y n8n (enlazado a 127.0.0.1:5678 y publicado a través de Traefik):

services:
  traefik:
    image: "traefik"
    restart: always
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - traefik_data:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro

  n8n:
    image: n8nio/n8n
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    labels:
      - traefik.enable=true
      - traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
      - traefik.http.routers.n8n.tls=true
      - traefik.http.routers.n8n.entrypoints=web,websecure
      - traefik.http.routers.n8n.tls.certresolver=mytlschallenge
      - traefik.http.middlewares.n8n.headers.SSLRedirect=true
      - traefik.http.middlewares.n8n.headers.STSSeconds=315360000
      - traefik.http.middlewares.n8n.headers.browserXSSFilter=true
      - traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
      - traefik.http.middlewares.n8n.headers.forceSTSHeader=true
      - traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}
      - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
      - traefik.http.middlewares.n8n.headers.STSPreload=true
      - traefik.http.routers.n8n.middlewares=n8n@docker
    environment:
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - N8N_WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - TZ=${GENERIC_TIMEZONE}
      - N8N_RESTRICT_FILE_ACCESS_TO=/files
    volumes:
      - n8n_data:/home/node/.n8n
      - ./local-files:/files

volumes:
  n8n_data:
  traefik_data:

Nota de la documentación: N8N_WEBHOOK_URL requiere n8n 2.30.0 o superior; en versiones anteriores se usa WEBHOOK_URL.

5. Arrancar y parar

sudo docker compose up -d
sudo docker compose stop

Abre https://n8n.example.com (con tu subdominio y dominio). La documentación indica que n8n solo es accesible por HTTPS. Si no conecta, revisa el cortafuegos del servidor y el DNS.

6. Actualizar

La página de Docker Compose no describe la actualización, pero la de instalación con Docker sí incluye este procedimiento para Compose:

cd </ruta/a/tu/carpeta/compose>
docker compose pull
docker compose down
docker compose up -d

La documentación menciona que n8n publica una versión menor casi cada semana y recomienda la versión stable para producción.

7. Qué respaldar

La documentación no da comandos de copia, pero identifica qué contiene cada elemento:

  • Volumen n8n_data: base de datos SQLite y clave de cifrado.
  • Volumen traefik_data: datos de los certificados TLS.
  • Carpeta ./local-files: archivos compartidos con n8n.

Te recomendamos copiar los tres antes de actualizar. El método concreto depende de tu servidor y de tu proveedor, y no lo hemos probado.

Qué elegir si...

Elige tu camino (sin compromiso)

VPS propio

Control total; instalas, actualizas y respaldas tú. Sigue la guía de Docker Compose con HTTPS y descarga los archivos listos.

Ver VPS de Contabo (sitio oficial)

Ver planes VPS en Hostinger (sitio oficial)

n8n Cloud

Lo gestiona n8n; pagas por plan y ejecuciones. Hay prueba gratuita sin tarjeta según su página de precios.

Probar n8n Cloud (sitio oficial)

Antes de decidir: tabla para decidir dónde alojar n8n.

Preguntas frecuentes

¿Por qué no se emite el certificado HTTPS?

Lo más habitual es que el registro DNS tipo A aún no apunte a la IP del servidor, o que los puertos 80 y 443 estén bloqueados por un cortafuegos. La documentación pide revisar precisamente el cortafuegos y el DNS si no puedes conectar.

¿Puedo usar otro proxy distinto de Traefik?

Técnicamente sí, pero esta guía solo reproduce el ejemplo oficial con Traefik y no hemos verificado otras configuraciones, así que no damos pasos para ellas.

¿Qué pasa si mi n8n es anterior a la versión 2.30.0?

La documentación indica que N8N_WEBHOOK_URL requiere la 2.30.0 o superior y que en versiones anteriores se usa WEBHOOK_URL. Si usas la etiqueta por defecto de la imagen, normalmente descargarás la versión actual.

Fuentes

Fecha de consulta de todas las fuentes: 2026-11-05. Si algo ha cambiado, prevalece la fuente oficial. Divulgación de afiliación.