// DevOps

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:

  1. Seguridad (SSL/TLS): Manejará las solicitudes HTTPS, cifrando el tráfico entre el usuario y su servidor.
  2. 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.
  3. 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.

  1. Actualice los paquetes:

    sudo apt update && sudo apt upgrade -y
    
  2. Compruebe las versiones de Docker:

    docker --version
    docker compose version
    

    Si los comandos devolvieron versiones, todo está bien. Si no — deberá instalarlos según la documentación oficial.

  3. Cree el directorio para el proyecto: Guardaremos todos los archivos en un solo lugar.

    mkdir ~/n8n-project
    cd ~/n8n-project
    
  4. Cree 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 carpeta n8n-data de 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) llamada host_n8n. Se activará si alguien visita n8n.ВАШ_ДОМЕН.com.
  • use_backend n8n_backend...: Si la regla se cumple, HAProxy envía la solicitud al n8n_backend.
  • backend n8n_backend: Esta es la descripción de nuestra aplicación. server n8n n8n:5678 check le indica a HAProxy: «Envía el tráfico al contenedor llamado n8n en su puerto 5678». El nombre n8n aquí es el nombre del servicio en docker-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.

  1. Arranque Docker Compose:

    cd ~/n8n-project
    docker compose up -d
    

    La opción -d ejecuta los contenedores en segundo plano. Verifique que todo funcione:

    docker compose ps
    

    Debería ver dos contenedores en ejecución: n8n y haproxy.

  2. Instale acme.sh:

    curl [https://get.acme.sh](https://get.acme.sh) | sh
    source ~/.bashrc
    
  3. Emita el certificado: Este comando le indicará a Let’s Encrypt que verifique su dominio. acme.sh creará 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/
    
  4. Instale el certificado para HAProxy: HAProxy requiere que la clave y el certificado estén en un solo archivo. acme.sh puede 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 archivo custom.pem y reinicia HAProxy de forma suave.


Paso 5: Activar HTTPS en HAProxy

¡El certificado está obtenido! Solo falta indicarle a HAProxy que lo use.

  1. Abra ~/n8n-project/haproxy/haproxy.cfg y 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 check
    
  2. Reinicie 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:

  1. Un candado en la barra de direcciones — eso significa que su conexión SSL funciona.
  2. 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.sh añadió automáticamente una tarea en cron. 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!

// Reviews

Reseñas relacionadas

// Contact

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema