> La lista completa de artículos está en [llms.txt](https://docs.f3cloud.com/llms.txt). Cada página tiene versión en Markdown, basta con añadir .md a su dirección. Esta página en Markdown: [https://docs.f3cloud.com/es/docker/n8n-installation.md](https://docs.f3cloud.com/es/docker/n8n-installation.md).

# Cómo instalar n8n en un VPS con Docker y HTTPS mediante Caddy

Cómo instalar n8n en un VPS con Docker y HTTPS automático mediante Caddy. Dominio, clave de cifrado, docker-compose, primer acceso, actualización y copia de seguridad. Probado con n8n 2.44.4 en Debian 12.

**n8n** es una plataforma de automatización en la que los flujos se montan con bloques, como en Zapier o Make. En tu propio servidor, n8n no limita el número de ejecuciones, y tus datos y claves de servicios se quedan contigo. En este artículo instalamos n8n en Docker junto con el servidor web **Caddy**, que obtiene por sí solo un certificado HTTPS gratuito. Hemos probado todos los comandos en un servidor de pruebas con Debian 12, y la versión de n8n en el momento de la prueba era la **2.44.4**.

***

## Cómo está montada la instalación

La instalación consta de dos contenedores. En el primero funciona n8n, que escucha en el puerto `5678` solo dentro de Docker y no se expone al exterior. En el segundo funciona Caddy, que acepta conexiones en los puertos 80 y 443, obtiene un certificado de Let's Encrypt para tu dominio y pasa las peticiones a n8n. Este esquema importa por dos motivos. Sin HTTPS no funcionan los webhooks de muchos servicios, como Telegram, y los puertos que Docker publica directamente se saltan el cortafuegos UFW, así que n8n es más seguro detrás de Caddy.

Otro detalle del que pocas veces se habla es la **clave de cifrado**. n8n guarda las contraseñas y los tokens de los servicios conectados cifrados con su propia clave. Si la clave se pierde, por ejemplo al mudarse a otro servidor, habrá que volver a introducir todas las conexiones guardadas. Por eso fijamos la clave nosotros mismos y la guardamos junto al resto de ajustes.

***

## Qué necesitas

* **Un servidor** con Debian 12 o Ubuntu 24.04 y **al menos 2 GB de memoria**. En el servidor de pruebas, n8n ocupó unos 370 MB nada más arrancar, y a un servidor con 1 GB casi no le quedó memoria libre, así que para flujos reales encaja mejor el plan [**DE-RZ9-1**](https://f3cloud.com/es/vps-ai-agents#cloud-vps) o superior. Si aún no tienes servidor, contrátalo con [esta guía](https://docs.f3cloud.com/es/client-area/order-vps.md).
* **Un dominio o subdominio** que apunte a la dirección IP del servidor. Si no tienes dominio, para probar sirve una dirección gratuita del tipo `203-0-113-10.sslip.io`, con guiones en lugar de los puntos de la IP del servidor. Esa dirección apunta sola a esa IP.
* **Una conexión SSH**, por ejemplo con [Termius](https://docs.f3cloud.com/es/vps/termius-connection.md). Los comandos de abajo se ejecutan como `root`.

***

## 1. Apunta el dominio al servidor

En el registrador del dominio, crea un **registro A** para el nombre que quieras, por ejemplo `n8n.example.com`, e indica en él la dirección IP del servidor. Puedes comprobar que funciona desde tu ordenador.

```bash
# Debe mostrar la dirección IP de tu servidor
nslookup n8n.example.com
```

Mientras el registro no apunte al servidor, Caddy no podrá obtener el certificado, así que espera la respuesta correcta. Suele tardar entre unos minutos y una hora.

***

## 2. Instala Docker

```bash
# Instala Docker con el script oficial
curl -fsSL https://get.docker.com | sh

# Comprueba las versiones de Docker y Compose
docker --version && docker compose version
```

***

## 3. Crea la carpeta y el archivo de ajustes

```bash
# Carpeta para n8n
mkdir -p /opt/n8n && cd /opt/n8n

# Archivo de ajustes, la clave de cifrado se genera en el momento
cat > .env <<EOF
DOMAIN=n8n.example.com
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
GENERIC_TIMEZONE=Europe/Madrid
EOF

# Solo root puede leer el archivo
chmod 600 .env
```

Pon tu dominio en lugar de `n8n.example.com`. La variable `GENERIC_TIMEZONE` fija la zona horaria con la que n8n lanza los flujos programados.

> **Guarda el archivo .env.**
>
> Contiene la clave de cifrado. Copia su contenido con `cat /opt/n8n/.env` y guárdalo en un gestor de contraseñas. Sin esta clave, las contraseñas y los tokens guardados en n8n no se pueden recuperar.

***

## 4. Crea el archivo de Caddy

```bash
cat > /opt/n8n/Caddyfile <<'EOF'
{$DOMAIN} {
    reverse_proxy n8n:5678
}
EOF
```

Esa es toda la configuración de Caddy. Toma el dominio del archivo `.env`, obtiene un certificado para él y pasa las peticiones al contenedor `n8n`.

***

## 5. Crea el archivo docker-compose.yml

```bash
cat > /opt/n8n/docker-compose.yml <<'EOF'
services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    environment:
      - DOMAIN=${DOMAIN}
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config

  n8n:
    image: docker.n8n.io/n8nio/n8n:stable
    restart: unless-stopped
    environment:
      - N8N_HOST=${DOMAIN}
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - WEBHOOK_URL=https://${DOMAIN}/
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - TZ=${GENERIC_TIMEZONE}
      - NODE_ENV=production
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  caddy_data:
  caddy_config:
  n8n_data:
EOF
```

Fíjate en algunas líneas.

* La imagen `n8n:stable` apunta a la última versión estable de n8n, en el momento de la prueba era la 2.44.4.
* `WEBHOOK_URL` hace que n8n muestre tu dominio en los webhooks y no `localhost`.
* n8n no tiene línea `ports`, así que desde fuera solo es accesible a través de Caddy.
* Los volúmenes `n8n_data` y `caddy_data` guardan los datos de n8n y los certificados, no se pierden al actualizar los contenedores.

***

## 6. Arranca n8n

```bash
cd /opt/n8n

# Descarga las imágenes y arranca en segundo plano
docker compose up -d

# Mira el registro de n8n, sal con Ctrl+C
docker compose logs -f n8n
```

Al cabo de 20–40 segundos, en el registro aparecerá la línea `Editor is now accessible via` con tu dominio. Eso significa que n8n está listo. En los primeros segundos tras arrancar, la web puede responder con un error 502 mientras n8n aún no acepta conexiones, es normal.

***

## 7. Crea enseguida la cuenta de propietario

Abre `https://tu-dominio` en el navegador. n8n mostrará el formulario **Set up owner account**, donde indicas el correo, el nombre, el apellido y la contraseña. La contraseña debe tener **al menos 8 caracteres**, con un número y una mayúscula.

<figure><img src="https://docs.f3cloud.com/img/n8n-owner-setup.png" alt="Formulario de creación de la cuenta de propietario de n8n" width="300"><figcaption><p>Primer acceso a n8n</p></figcaption></figure>

> **No dejes el registro para luego.**
>
> Mientras no exista la cuenta de propietario, cualquiera puede rellenar este formulario. En nuestro servidor de pruebas, los primeros escáneres de internet llegaron a la nueva dirección a los pocos segundos de emitirse el certificado. Crea la cuenta justo después de arrancar y luego activa la autenticación en dos pasos en los ajustes del perfil.

***

## Cómo actualizar n8n

```bash
cd /opt/n8n

# Descarga las imágenes nuevas y reinicia los contenedores
docker compose pull && docker compose up -d
```

Los datos, los flujos y la clave de cifrado se conservan, porque están en el volumen `n8n_data` y en el archivo `.env`. Antes de pasar a una nueva versión principal, por ejemplo de la 1.x a la 2.x, lee la lista de cambios en la web de n8n y haz una copia de seguridad.

***

## Cómo hacer una copia de seguridad

Todos los datos de n8n están en un volumen de Docker. Este comando lo empaqueta en un archivo en la carpeta `/root`.

```bash
# Archivo del volumen con los datos de n8n
docker run --rm -v n8n_n8n_data:/data -v /root:/backup alpine \
  tar czf /backup/n8n-backup.tar.gz -C /data .
```

Descarga el archivo `/root/n8n-backup.tar.gz` junto con `/opt/n8n/.env`. Sin el archivo `.env`, la copia se puede restaurar, pero las contraseñas guardadas de los servicios no se podrán descifrar. Si la carpeta de instalación no se llama `n8n`, el volumen tendrá otro nombre, que puedes ver con `docker volume ls`.

***

## Si algo no funciona

<details>

<summary>La web responde con un error 502</summary>

Si n8n acaba de arrancar, espera un minuto, todavía se está cargando. Si el error no desaparece, mira el registro con `docker compose logs --tail 50 n8n`. Una causa habitual en servidores con 1 GB de memoria es que a n8n le falta memoria y se reinicia.

</details>

<details>

<summary>No se emite el certificado, el navegador avisa del HTTPS</summary>

Mira el registro de Caddy con `docker compose logs --tail 50 caddy`. Lo más habitual es que el dominio todavía no apunte al servidor o que esté cerrado el puerto 80, por el que Let's Encrypt comprueba el dominio. Revisa el registro A y, si UFW está activo, abre los puertos con `ufw allow 80/tcp && ufw allow 443/tcp`.

</details>

<details>

<summary>En los webhooks aparece localhost</summary>

Significa que n8n no recibió la variable `WEBHOOK_URL`. Comprueba que está en el archivo `docker-compose.yml` y que el dominio del archivo `.env` no tiene erratas, y reinicia los contenedores con `docker compose up -d`.

</details>

<details>

<summary>Tras mudarse a otro servidor dejaron de funcionar las conexiones con los servicios</summary>

El servidor nuevo usa otra clave de cifrado. Copia al servidor nuevo el archivo `.env` antiguo con la `N8N_ENCRYPTION_KEY` original y reinicia n8n.

</details>

***

## Nuestros recursos

**Canal de Telegram:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Web del hosting:** [https://f3cloud.com](https://f3cloud.com/es)
