DE

David Espinoza

DevOps / SRE

ES EN
Categorías

Cómo desplegar n8n con Docker Compose, PostgreSQL y Nginx Proxy Manager

Guía completa para montar n8n con Docker Compose usando PostgreSQL como base de datos, Nginx Proxy Manager como proxy inverso, almacenamiento persistente, red externa y buenas prácticas de seguridad.

Docker Docker Compose n8n PostgreSQL Nginx Proxy Manager DevOps
En esta página

Montar n8n con Docker Compose es una forma práctica de tener una plataforma de automatización estable, fácil de mantener y lista para producción.

Qué incluye este despliegue

  • PostgreSQL 15 para la base de datos de n8n.
  • n8n configurado con backend PostgreSQL.
  • Nginx Proxy Manager para publicar por HTTP/HTTPS.
  • Volúmenes persistentes para no perder datos.
  • Red Docker externa para comunicar servicios.
  • Variables de entorno para credenciales y dominios.

Requisitos previos

  • Docker y docker compose instalados.
  • Dominio o subdominio apuntando al servidor.
  • Puertos 80 y 443 disponibles.
  • Carpeta de trabajo para el stack (/opt/stacks/n8n).

Estructura recomendada en el host

mkdir -p /opt/postgres
mkdir -p /opt/n8n/data
mkdir -p /opt/npm/data
mkdir -p /opt/npm/letsencrypt

Crear la red externa

docker network create internal_net

Archivo .env

POSTGRES_USER=n8n
POSTGRES_PASSWORD=coloca_aqui_una_contrasena_segura
POSTGRES_DB=n8n
N8N_DOMAIN=n8n.tudominio.com
NPM_HOST_IP=192.168.0.112

Compose recomendado

services:
  postgres:
    image: postgres:15
    container_name: postgres-n8n
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - /opt/postgres:/var/lib/postgresql/data
    networks:
      - internal_net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: n8nio/n8n:2.7.4
    container_name: n8n
    restart: always
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_HOST: ${N8N_DOMAIN}
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://${N8N_DOMAIN}/
      N8N_EDITOR_BASE_URL: https://${N8N_DOMAIN}
      N8N_DIAGNOSTICS_ENABLED: "false"
      N8N_PUBLIC_API_DISABLED: "true"
      GENERIC_TIMEZONE: America/Costa_Rica
      TZ: America/Costa_Rica
    volumes:
      - /opt/n8n/data:/home/node/.n8n
    networks:
      - internal_net
    depends_on:
      postgres:
        condition: service_healthy

  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "${NPM_HOST_IP}:81:81"
    volumes:
      - /opt/npm/data:/data
      - /opt/npm/letsencrypt:/etc/letsencrypt
    networks:
      - internal_net

networks:
  internal_net:
    external: true

Levantar y validar

cd /opt/stacks/n8n
docker compose up -d
docker compose ps
docker logs postgres-n8n
docker logs n8n
docker logs npm

Configuración de Nginx Proxy Manager

  • Domain Names: dominio de N8N_HOST.
  • Scheme: http.
  • Forward Hostname/IP: n8n.
  • Forward Port: 5678.
  • Activar Websockets.
  • Solicitar SSL y forzar HTTPS.

Buenas prácticas

  • Mantener credenciales fuera de docker-compose.yml.
  • Usar backups periódicos de /opt/postgres y /opt/n8n/data.
  • Restringir el panel :81 por firewall.
  • Evitar latest en entornos críticos.

Comandos de operación

docker compose down
docker compose pull
docker compose up -d

Si vas a actualizar versiones, realiza backup completo antes de aplicar cambios.

Volver a Knowledge Base Mapa de conocimiento Hablar por WhatsApp