tva
← Artículos

Autoalojar n8n en Hetzner Cloud: tutorial completo de configuración con Docker

La automatización de flujos de trabajo se ha vuelto esencial para las empresas modernas, pero las soluciones SaaS pueden resultar costosas a medida que crecen los equipos. Le mostraremos cómo configurar su propia instancia de n8n en Hetzner Cloud por unos 6 euros al mes más los costos de dominio (a octubre de 2026), con flujos de trabajo ilimitados y control completo sobre su plataforma de automatización.

Qué va a configurar

Al finalizar este tutorial, tendrá:

  • Una instalación de n8n completamente funcional con HTTPS
  • Certificados SSL automáticos mediante Let's Encrypt
  • Integración de correo electrónico para cuentas de usuario
  • Inicio automático después de reinicios del servidor
  • Una base sólida para uso profesional que puede reforzar para producción

Costo mensual: 5,99 euros (servidor CX23, sin IVA, incluida una dirección IPv4 primaria, a octubre de 2026) + costos de dominio

Requisitos previos

  • Nombre de dominio que apunte a la IP de su servidor
  • Conocimientos básicos de línea de comandos
  • Cuenta en Hetzner Cloud

Paso 1: configuración del servidor

Crear el servidor en Hetzner Cloud

  1. Inicie sesión en la consola de Hetzner Cloud
  2. Cree un nuevo proyecto
  3. Añada un servidor con estas especificaciones:
    • Imagen: Ubuntu 24.04 LTS
    • Tipo: CX23 (2 vCPU, 4 GB de RAM, 40 GB de disco); Hetzner retiró el CX11 para nuevos pedidos en septiembre de 2024 y la disponibilidad de los planes optimizados en costos varía según la ubicación
    • Ubicación: Elija la más cercana a sus usuarios
    • Clave SSH: Añada su clave pública

Configuración inicial del servidor

Conéctese a su servidor:

ssh root@YOUR_SERVER_IP

Actualice el sistema:

apt update && apt upgrade -y

Paso 2: instalar Docker

Instale Docker y Docker Compose:

# Install dependencies
apt install apt-transport-https ca-certificates curl software-properties-common gnupg -y

# Add Docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Create Docker network for our services
docker network create proxy

Verifique la instalación de Docker:

docker --version
docker compose version

Paso 3: configurar el proxy inverso Traefik

Cree la estructura de directorios:

mkdir -p /opt/traefik/data
cd /opt/traefik

Cree el archivo de configuración de Traefik:

nano /opt/traefik/data/traefik.yml

Añada esta configuración:

api:
  dashboard: false

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]  # Change this!
      storage: acme.json
      httpChallenge:
        entryPoint: http

Cree el archivo acme.json para los certificados SSL:

touch /opt/traefik/data/acme.json
chmod 600 /opt/traefik/data/acme.json

Cree el archivo de Docker Compose para Traefik:

nano /opt/traefik/docker-compose.yml

Añada esta configuración:

version: '3'

services:
  traefik:
    image: traefik:v3.4
    container_name: traefik
    restart: always
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/etc/traefik/traefik.yml
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"

networks:
  proxy:
    external: true

Paso 4: configurar la retransmisión SMTP (opcional pero recomendada)

Cree el directorio del servidor de correo:

mkdir -p /opt/mailserver
cd /opt/mailserver

Cree el archivo de Docker Compose:

nano /opt/mailserver/docker-compose.yml

Añada esta configuración:

version: '3'

services:
  mailserver:
    image: bytemark/smtp
    restart: always
    networks:
      - proxy
    environment:
      - RELAY_HOST=smtp.gmail.com  # Change to your SMTP provider
      - RELAY_PORT=587
      - [email protected]  # Change this
      - RELAY_PASSWORD=your-app-password     # Change this
      - MAILNAME=mail.yourdomain.com         # Change this

networks:
  proxy:
    external: true

Nota: n8n accede al relay a través de la red compartida proxy, por lo que el relay no publica ningún puerto. Los puertos publicados por Docker eluden las reglas de UFW, así que añada uno solo si otro host debe enviar correo a través del relay. MAILNAME define el nombre de host de correo del relay. Para Gmail, necesitará:

  1. Habilitar la autenticación de dos factores
  2. Generar una contraseña de aplicación
  3. Usar la contraseña de aplicación (no su contraseña habitual)

Paso 5: configurar n8n

Cree el directorio de n8n. El contenedor de n8n se ejecuta con el usuario node (UID 1000), así que asegúrese de que ese usuario pueda escribir en la carpeta data montada mediante bind mount, por ejemplo con mkdir -p /opt/n8n/data && chown -R 1000:1000 /opt/n8n/data:

mkdir -p /opt/n8n
cd /opt/n8n

Cree el archivo de Docker Compose:

nano /opt/n8n/docker-compose.yml

Añada esta configuración:

version: '3'

services:
  n8n:
    image: n8nio/n8n:1.95.2
    restart: always
    environment:
      - N8N_HOST=n8n.yourdomain.com          # Change this!
      - NODE_ENV=production
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com  # Change this!
      
      # Email configuration
      - N8N_EMAIL_MODE=smtp
      - N8N_SMTP_HOST=mailserver
      - N8N_SMTP_PORT=25
      - N8N_SMTP_SSL=false
      - N8N_SMTP_USER=
      - N8N_SMTP_PASS=
      - [email protected]  # Change this!
      
      # Important fixes for proxy setup
      - N8N_PROXY_HOPS=1
      - N8N_RUNNERS_ENABLED=true
      
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"  # Change this!
      - "traefik.http.routers.n8n.entrypoints=https"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

Paso 6: crear servicios Systemd para inicio automático

Servicio de Traefik

nano /etc/systemd/system/traefik-docker.service

Añada esta configuración:

[Unit]
Description=Traefik Docker Compose
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/traefik
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

Servicio del servidor de correo

nano /etc/systemd/system/mailserver-docker.service

Añada esta configuración:

[Unit]
Description=Mailserver Docker Compose
Requires=docker.service
After=docker.service
Before=n8n-docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mailserver
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

Servicio de n8n

nano /etc/systemd/system/n8n-docker.service

Añada esta configuración:

[Unit]
Description=n8n Docker Compose
Requires=docker.service
After=docker.service traefik-docker.service mailserver-docker.service
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/n8n
ExecStartPre=/bin/bash -c 'until docker container inspect traefik > /dev/null 2>&1; do sleep 2; done'
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
Restart=on-failure
RestartSec=30
TimeoutStartSec=180

[Install]
WantedBy=multi-user.target

Habilitar e iniciar los servicios

# Reload systemd daemon
systemctl daemon-reload

# Enable services to start on boot
systemctl enable traefik-docker.service
systemctl enable mailserver-docker.service
systemctl enable n8n-docker.service

# Start services
systemctl start traefik-docker.service
sleep 10
systemctl start mailserver-docker.service
sleep 10
systemctl start n8n-docker.service

Paso 7: configuración DNS

Haga que su dominio apunte a su servidor:

  1. Acceda a su registrador de dominios o proveedor de DNS
  2. Cree un registro A:
    • Nombre: n8n
    • Tipo: A
    • Valor: YOUR_SERVER_IP
    • TTL: 300 (o el mínimo permitido)

Espere a que se propague el DNS (puede tardar hasta 24 horas, aunque normalmente tarda mucho menos).

Paso 8: probar su instalación

Compruebe si los servicios están en ejecución:

docker ps

Debería ver tres contenedores en ejecución: traefik, mailserver y n8n.

Acceda a su instancia de n8n:

https://n8n.yourdomain.com

Debería ver la página de configuración de n8n a través de HTTPS, con el navegador indicando que el certificado es válido.

Solución de problemas comunes

El certificado SSL no funciona

Revise los registros de Traefik:

docker logs traefik

Causas comunes:

  • El DNS no apunta al servidor
  • El firewall bloquea los puertos 80/443
  • Dominio incorrecto en la configuración

n8n no es accesible

Revise los registros de n8n:

docker logs n8n-n8n-1

Soluciones comunes:

  • Verifique que la configuración del dominio coincida en todos los archivos
  • Compruebe que todos los contenedores estén en la misma red
  • Si los registros muestran ERR_ERL_UNEXPECTED_X_FORWARDED_FOR, compruebe que N8N_PROXY_HOPS=1 esté definido como en la configuración anterior; n8n lo documenta para ejecutarlo detrás de un proxy inverso

El correo electrónico no funciona

Revise los registros del servidor de correo:

docker logs mailserver-mailserver-1

Verifique las credenciales y la configuración SMTP.

Los servicios no inician después del reinicio

Verifique el estado del servicio:

systemctl status traefik-docker.service
systemctl status n8n-docker.service

Reinicie si es necesario:

systemctl restart traefik-docker.service
systemctl restart n8n-docker.service

Mantenimiento y actualizaciones

Mantenimiento regular

Verificaciones semanales:

# Check container status
docker ps

# Check disk space
df -h

# Check logs for errors
docker logs n8n-n8n-1 | grep -i error

Actualizaciones mensuales:

# Update container images
cd /opt/n8n && docker compose pull && docker compose up -d
cd /opt/traefik && docker compose pull && docker compose up -d
cd /opt/mailserver && docker compose pull && docker compose up -d

# Clean up old images
docker system prune -f

Hacer copias de seguridad de sus datos

Cree un script de copia de seguridad. La base de datos SQLite predeterminada se copia mientras n8n está en ejecución, por lo que debe detener n8n brevemente o ejecutar la copia en un período de poca actividad para evitar una copia inconsistente. Pruebe una restauración antes de confiar en ella:

nano /opt/backup-n8n.sh

Añada este contenido:

#!/bin/bash
mkdir -p /opt/backups
tar -czf /opt/backups/n8n-backup-$(date +%Y%m%d).tar.gz /opt/n8n/data
find /opt/backups -name "n8n-backup-*.tar.gz" -mtime +30 -delete

Hágalo ejecutable y añádalo a cron:

chmod +x /opt/backup-n8n.sh

# Add to crontab (daily backup at 2 AM)
crontab -e
# Add this line:
0 2 * * * /opt/backup-n8n.sh

Refuerzo de la seguridad

Configurar el firewall

# Install UFW
apt install ufw

# Set defaults
ufw default deny incoming
ufw default allow outgoing

# Allow SSH
ufw allow 22

# Allow HTTP/HTTPS
ufw allow 80
ufw allow 443

# Enable firewall
ufw enable

Asegurar SSH

Edite la configuración de SSH:

nano /etc/ssh/sshd_config

Realice estos cambios:

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

Reinicie SSH:

systemctl restart ssh

Configurar Fail2Ban

apt install fail2ban

# Copy default configuration
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Enable and start
systemctl enable fail2ban
systemctl start fail2ban

Desglose de costos

Costos mensuales:

  • Servidor Hetzner CX23: 5,99 euros (sin IVA, incluida una dirección IPv4 primaria, a octubre de 2026)
  • Dominio (anual, varía): ~10-15 euros/año
  • Total: ~7 euros/mes

Comparación con n8n Cloud:

  • n8n Starter: 20 euros/mes con facturación anual (2.500 ejecuciones, a octubre de 2026)
  • n8n Pro: 50 euros/mes con facturación anual (10.000 ejecuciones)
  • Ahorro: unos 150–520 euros/año

Escalar su configuración

Múltiples instancias de n8n

Puede ejecutar varias instancias aisladas de n8n para distintos equipos:

Cree /opt/n8n-team2/docker-compose.yml:

version: '3'
services:
  n8n-team2:
    image: n8nio/n8n:1.95.2
    restart: always
    environment:
      - N8N_HOST=team2.yourdomain.com
      # ... rest of configuration
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n-team2.rule=Host(`team2.yourdomain.com`)"
      - "traefik.http.routers.n8n-team2.entrypoints=https"
      - "traefik.http.routers.n8n-team2.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n-team2.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

Actualizar los recursos del servidor

Si necesita más capacidad, amplíe los recursos de su servidor de Hetzner:

  • CX33: 4 vCPU, 8 GB de RAM (8,99 euros/mes sin IVA, incluida una dirección IPv4 primaria, a octubre de 2026)
  • CX43: 8 vCPU, 16 GB de RAM (16,49 euros/mes sin IVA, incluida una dirección IPv4 primaria)

Conclusión

Ahora dispone de una instalación de n8n en funcionamiento que cuesta una fracción de las soluciones alojadas y le da control completo. Incluye HTTPS automático, correo electrónico y una gestión sólida de los servicios.

Beneficios clave de este enfoque:

  • Económico: Ahorre cientos de euros al año frente a n8n Cloud
  • Control total: Sin cuotas de ejecuciones; los límites dependen de los recursos de su servidor y de la Sustainable Use License de n8n
  • Privacidad: Los datos de los flujos de trabajo y de sus ejecuciones permanecen en su servidor, excepto los que sus flujos envíen a servicios externos
  • Personalizable: Modifique y amplíe según sea necesario

Hemos utilizado esta configuración en producción. Los ejemplos de n8n y Traefik fijan las versiones de las imágenes; para actualizar, suba esas etiquetas en cada docker-compose.yml antes de ejecutar los comandos de actualización. Para usos críticos para el negocio, pruebe la restauración de sus copias de seguridad y añada monitoreo.

Acerca de tva

tva garantiza una gestión integral de la infraestructura de bases de datos, los entornos en la nube y las cadenas de suministro globales. Nuestro enfoque metódico combina protocolos de seguridad rigurosos con optimización del rendimiento, mientras que los servicios de asesoría estratégica permiten la coordinación precisa tanto de las capacidades digitales como de los activos físicos, manteniendo los más altos estándares de excelencia operativa y cumplimiento normativo en todos los proyectos.

Visite tva.sg para más información sobre nuestros servicios.

Artículos relacionados

Artículos relacionados