Instalando n8n en Docker con HAProxy: Guía clara para principiantes
Publicado el 02.07.2025
¡Hola, amigos! Hoy nos sumergiremos en el mundo de la automatización y desplegaremos n8n — una potente herramienta para crear flujos de trabajo. Lo instalaremos en Docker, y como «puerta» a Internet utilizaremos el confiable proxy inverso HAProxy.
Esta guía está creada especialmente para principiantes. Iremos paso a paso, explicando cada comando, para que no solo lo hagan, sino que también entiendan cómo funciona todo.
¿Por qué necesitamos HAProxy?
Podríamos simplemente abrir los puertos de n8n a Internet, ¿no? Sí, pero eso es inseguro e incómodo. HAProxy actuará como guardián y despachador:
- Seguridad (SSL/TLS): Manejará las solicitudes HTTPS, cifrando el tráfico entre el usuario y su servidor.
- Punto de entrada único: Todas las solicitudes a su dominio llegarán a HAProxy, y este decidirá a qué aplicación reenviarlas. Es útil si desea añadir otros servicios en el mismo servidor.
- Flexibilidad: HAProxy es una herramienta extremadamente poderosa, y aprendiendo a usarla ahora podrá configurar en el futuro reglas complejas y balanceo de carga.
¿Qué necesitaremos? ✅
- Servidor con Ubuntu/Debian: Cualquier servidor virtual o dedicado sirve.
- Docker y Docker Compose instalados: Este será nuestro entorno de trabajo principal.
- Nombre de dominio: Debe apuntar a la dirección IP de su servidor (mediante un registro A en la configuración DNS).
- Acceso SSH al servidor con privilegios
sudo.
Paso 1: Preparar el servidor y la estructura del proyecto
Primero asegurémonos de que el sistema esté actualizado y creemos las carpetas para nuestro proyecto.
Actualice los paquetes:
sudo apt update && sudo apt upgrade -yCompruebe las versiones de Docker:
docker --version docker compose versionSi los comandos devolvieron versiones, todo está bien. Si no — deberá instalarlos según la documentación oficial.
Cree el directorio para el proyecto: Guardaremos todos los archivos en un solo lugar.
mkdir ~/n8n-project cd ~/n8n-projectCree subdirectorios: Uno para los datos de n8n y otro para la configuración de HAProxy.
mkdir -p ./n8n-data mkdir -p ./haproxy
Paso 2: Crear el archivo docker-compose.yml
Este es el archivo principal que describe cómo Docker debe ejecutar nuestras aplicaciones (servicios). Cree el archivo docker-compose.yml en la carpeta ~/n8n-project y agregue este código.
⚠️ Importante: Reemplace n8n.ВАШ_ДОМЕН.com, ВАШ_ЛОГИН y ВАШ_СУПЕР_ПАРОЛЬ por sus datos reales.
version: '3.8'
services:
n8n:
image: n8nio/n8n
container_name: n8n
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678" # Abrimos el puerto solo para HAProxy dentro del servidor
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=ВАШ_ЛОГИН # 👈 Reemplace
- N8N_BASIC_AUTH_PASSWORD=ВАШ_СУПЕР_ПАРОЛЬ # 👈 Reemplace
- WEBHOOK_URL=https://n8n.ВАШ_[ДОМЕН.com/](https://ДОМЕН.com/)
- N8N_HOST=n8n.ВАШ_ДОМЕН.com # 👈 Reemplace
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
volumes:
- ./n8n-data:/home/node/.n8n # Montamos la carpeta para almacenar los datos de n8n
networks:
- n8n_network
haproxy:
image: haproxy:2.8 # Usamos la imagen oficial
container_name: haproxy
restart: unless-stopped
ports:
- "80:80" # Para HTTP y obtención del certificado
- "443:443" # Para HTTPS
volumes:
- ./haproxy:/usr/local/etc/haproxy:ro # :ro significa "solo lectura"
networks:
- n8n_network
depends_on: # Ejecutamos HAProxy solo después de n8n
- n8n
networks:
n8n_network:
driver: bridge
💡 Puntos clave:
ports: - "127.0.0.1:5678:5678": Hicimos que el puerto de n8n sea accesible solo dentro del servidor. Nadie desde el exterior podrá conectarse directamente; solo a través de HAProxy.volumes: - ./n8n-data:/home/node/.n8n: Montamos la carpetan8n-datade nuestro servidor dentro del contenedor. Así todos sus flujos de trabajo y configuraciones se guardarán, incluso si el contenedor se elimina o actualiza.
Paso 3: Configurar HAProxy
Ahora configuraremos a nuestro «guardián». Cree el archivo haproxy.cfg en la carpeta ~/n8n-project/haproxy/ y agregue esta configuración básica.
⚠️ Importante: Por ahora no activaremos SSL/HTTPS. Nuestro objetivo es primero ejecutar todo por HTTP, obtener el certificado y solo después habilitar el cifrado.
global
daemon
log stdout local0
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5s
timeout client 50s
timeout server 50s
frontend http_front
bind *:80
acl host_n8n hdr(host) -i n8n.ВАШ_ДОМЕН.com # 👈 Reemplace
use_backend n8n_backend if host_n8n
backend n8n_backend
server n8n n8n:5678 check
¿Cómo funciona esto?
frontend http_front: Esta es la «cara» de nuestro proxy. Acepta conexiones entrantes en*:80(puerto 80).acl host_n8n...: Se crea una regla (ACL) llamadahost_n8n. Se activará si alguien visitan8n.ВАШ_ДОМЕН.com.use_backend n8n_backend...: Si la regla se cumple, HAProxy envía la solicitud aln8n_backend.backend n8n_backend: Esta es la descripción de nuestra aplicación.server n8n n8n:5678 checkle indica a HAProxy: «Envía el tráfico al contenedor llamadon8nen su puerto5678». El nombren8naquí es el nombre del servicio endocker-compose.yml.
Paso 4: Primer arranque y obtención del certificado SSL
Ahora que la base está lista, arrancaremos los contenedores y obtendremos el preciado certificado SSL de Let’s Encrypt usando la utilidad acme.sh. Usaremos el método más sencillo de verificación — vía HTTP.
Arranque Docker Compose:
cd ~/n8n-project docker compose up -dLa opción
-dejecuta los contenedores en segundo plano. Verifique que todo funcione:docker compose psDebería ver dos contenedores en ejecución:
n8nyhaproxy.Instale acme.sh:
curl [https://get.acme.sh](https://get.acme.sh) | sh source ~/.bashrcEmita el certificado: Este comando le indicará a Let’s Encrypt que verifique su dominio.
acme.shcreará un archivo temporal y Let’s Encrypt intentará leerlo por HTTP. Como nuestro HAProxy ya está escuchando en el puerto 80, todo debería funcionar.# Indicamos a acme.sh dónde colocar los archivos para la verificación sudo mkdir -p /var/www/acme-challenge sudo chown $USER:$USER /var/www/acme-challenge # Solicitamos el certificado ~/.acme.sh/acme.sh --issue -d n8n.ВАШ_ДОМЕН.com --webroot /var/www/acme-challenge/Instale el certificado para HAProxy: HAProxy requiere que la clave y el certificado estén en un solo archivo.
acme.shpuede hacerlo automáticamente y configurar la autoactualización.# Creamos la carpeta para los certificados dentro de la carpeta del proyecto mkdir -p ~/n8n-project/haproxy/certs # Instalamos el certificado con el comando de autoactualización ~/.acme.sh/acme.sh --install-cert -d n8n.ВАШ_ДОМЕН.com \ --key-file ~/n8n-project/haproxy/certs/privkey.pem \ --fullchain-file ~/n8n-project/haproxy/certs/fullchain.pem \ --reloadcmd "cat ~/n8n-project/haproxy/certs/fullchain.pem ~/n8n-project/haproxy/certs/privkey.pem > ~/n8n-project/haproxy/certs/custom.pem && docker compose -f ~/n8n-project/docker-compose.yml restart haproxy"¡Esta es la orden más importante! No solo copia los certificados, sino que también configura
reloadcmd— el comando que se ejecutará cada 60 días aproximadamente para la renovación automática del certificado. Une la clave y el certificado en un solo archivocustom.pemy reinicia HAProxy de forma suave.
Paso 5: Activar HTTPS en HAProxy
¡El certificado está obtenido! Solo falta indicarle a HAProxy que lo use.
Abra
~/n8n-project/haproxy/haproxy.cfgy actualícelo al siguiente contenido:global daemon log stdout local0 # Añadimos ajustes para SSL ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets defaults log global mode http option httplog option dontlognull timeout connect 5s timeout client 50s timeout server 50s frontend http_https_front # Aceptamos conexiones en los puertos 80 y 443 bind *:80 bind *:443 ssl crt /usr/local/etc/haproxy/certs/custom.pem # Redirigimos automáticamente todo de HTTP a HTTPS http-request redirect scheme https unless { ssl_fc } # Verificamos el dominio, como antes acl host_n8n hdr(host) -i n8n.ВАШ_ДОМЕН.com # 👈 Reemplace use_backend n8n_backend if host_n8n backend n8n_backend # Añadimos la cabecera para que n8n sepa que la conexión va por HTTPS http-request set-header X-Forwarded-Proto https if { ssl_fc } server n8n n8n:5678 checkReinicie HAProxy, para aplicar la nueva configuración:
cd ~/n8n-project docker compose restart haproxy
Paso 6: Verificación final
Abra su dominio en el navegador: https://n8n.ВАШ_ДОМЕН.com.
Debería ver:
- Un candado en la barra de direcciones — eso significa que su conexión SSL funciona.
- La ventana de autenticación de n8n. Ingrese el usuario y la contraseña que especificó en
docker-compose.yml.
Si todo es así, ¡felicidades! Ha desplegado n8n con acceso seguro por HTTPS. 🎉
¿Qué sigue? (Mantenimiento)
- Actualizar n8n: Para actualizar n8n a la última versión, basta con ejecutar dos comandos en la carpeta
~/n8n-project:docker compose pull n8n # Descarga la nueva versión de la imagen docker compose up -d # Recrea el contenedor con la nueva versión - Copias de seguridad: Lo más valioso son sus flujos de trabajo. Se almacenan en la carpeta
~/n8n-project/n8n-data. Haga copias de seguridad regularmente. - Renovación automática del certificado:
acme.shañadió automáticamente una tarea encron. El certificado se actualizará sin su intervención.
Espero que esta guía le haya sido útil. ¡Ahora está listo para automatizar el mundo con n8n!
Reseñas relacionadas
Como siempre, rápido y de calidad. Para asuntos con los servidores, me dirijo a Mijaíl.
Vadim_U · Migración de n8n a otro servidor
Cliente habituado14.11.2025 · ⭐ 5/5
¡Como siempre, rápido y de calidad! Para asuntos relacionados con los servidores, me dirijo a Mijaíl.