Bandera: Русский Русский Bandera: English English

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!

Reseñas relacionadas

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Publicaciones relacionadas