About Course
Última actualización: Julio 2025
Configuración: n8n + PostgreSQL + Traefik + SSL automático (Letsencript)
Requisitos Previos
-
✅ Dominio
-
✅ VPS
-
✅ Contraseña ssh root: Ddr3sSk0oL$12
-
✅ Contraseña postgres: Ddr3sSk0oL
-
✅ Contraseña super user: Ddr3sSk0oL
-
✅ Email: tucorreo@gmail.com
-
✅ Subdominio n8n.tudominio.com
-
✅ Subdominio traefik.tudominio.com
Configuración del Servidor
Paso 1: Instalar imagen ubuntu
-
Sistema Operativo: Ubuntu 24.04 LTS
Configuración Inicial del Servidor
Paso 1: Conectar por SSH
ssh root@TU_IP_DE_VPS
Paso 2: Actualizar Sistema
apt update && apt upgrade -y
Nota: Si aparece una ventana de configuración de OpenSSH, seleccionar "keep the local version currently installed" usando las flechas ↓ y presionar Enter.

Paso 3: Crear Usuario No-Root
# Crear usuario
adduser n8nuser
# Agregar a grupo sudo
usermod -aG sudo n8nuser
# Cambiar a nuevo usuario
su - n8nuser

Instalación de Docker
Paso 4: Instalar Docker y Docker Compose
# Instalar dependencias
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# Agregar clave GPG de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Agregar repositorio Docker
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" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalar Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# Instalar Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Agregar usuario al grupo docker
sudo usermod -aG docker $USER
newgrp docker
Configuración de la Estructura de Archivos
Paso 5: Crear Directorios
# Crear estructura de directorios
mkdir -p ~/n8n-stack/{traefik,n8n,postgres}
cd ~/n8n-stack
# Crear directorios para datos persistentes
mkdir -p traefik/data
mkdir -p traefik/config
mkdir -p n8n/data
mkdir -p postgres/data
Paso 6: Configurar Traefik
Crear archivo de configuración principal:
nano traefik/traefik.yml
Contenido del archivo:
# Traefik Configuration
global:
checkNewVersion: false
sendAnonymousUsage: false
api:
dashboard: true
debug: true
insecure: false
entryPoints:
web:
address: ":80"
http:
redirections:
entrypoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
certificatesResolvers:
letsencrypt:
acme:
tlsChallenge: {}
email: tu-email@ejemplo.com # CAMBIAR POR TU EMAIL
storage: /letsencrypt/acme.json
caServer: https://acme-v02.api.letsencrypt.org/directory
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: /config/dynamic.yml
watch: true
log:
level: INFO
Crear configuración dinámica:
nano traefik/config/dynamic.yml
Contenido del archivo:
# Dynamic Configuration
http:
middlewares:
secure-headers:
headers:
accessControlAllowMethods:
- GET
- OPTIONS
- PUT
accessControlMaxAge: 100
hostsProxyHeaders:
- "X-Forwarded-Host"
referrerPolicy: "same-origin"
sslRedirect: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
Configuración de Docker Compose
Paso 7: Generar Password Hash para Traefik
# Instalar herramientas
sudo apt install -y apache2-utils
# Generar hash (reemplazar 'tupassword' por tu password real)
htpasswd -nb admin tupassword
Ejemplo de salida:
admin:$apr1$n33ZsPF2$ibyAnDwObZ3OCEnpgfMqn.

Copiar este hash para usarlo en el siguiente paso.
Queda..
admin:$$apr1$$n33ZsPF2$$ibyAnDwObZ3OCEnpgfMqn.
Paso 8: Crear docker-compose.yml
nano docker-compose.yml
Contenido del archivo:
networks:
traefik:
external: true
internal:
external: false
volumes:
postgres_data:
n8n_data:
services:
# Traefik Reverse Proxy
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- traefik
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.yml:/traefik.yml:ro
- ./traefik/config:/config:ro
- ./traefik/data:/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.rule=Host(`traefik.tu-dominio.com`)" # CAMBIAR DOMINIO
- "traefik.http.routers.traefik.middlewares=traefik-auth"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$n33ZsPF2$$ibyAnDwObZ3OCEnpgfMqn." # CAMBIAR POR TU HASH
# PostgreSQL Database
postgres:
image: postgres:15-alpine
container_name: n8n-postgres
restart: unless-stopped
networks:
- internal
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: TU_PASSWORD_SEGURO_POSTGRES # CAMBIAR PASSWORD
POSTGRES_NON_ROOT_USER: n8n
POSTGRES_NON_ROOT_PASSWORD: TU_PASSWORD_SEGURO_POSTGRES # CAMBIAR PASSWORD
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U n8n -d n8n']
interval: 10s
timeout: 5s
retries: 5
# n8n Application
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
networks:
- traefik
- internal
depends_on:
postgres:
condition: service_healthy
environment:
# Database
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: TU_PASSWORD_SEGURO_POSTGRES # CAMBIAR PASSWORD
# n8n Configuration
N8N_HOST: n8n.tu-dominio.com # CAMBIAR DOMINIO
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.tu-dominio.com # CAMBIAR DOMINIO
# Timezone
GENERIC_TIMEZONE: Europe/Berlin
TZ: Europe/Berlin
# Security
N8N_SECURE_COOKIE: true
N8N_LOG_LEVEL: info
# Features
N8N_USER_MANAGEMENT_DISABLED: false
N8N_PERSONALIZATION_ENABLED: true
N8N_VERSION_NOTIFICATIONS_ENABLED: true
N8N_DIAGNOSTICS_ENABLED: false
N8N_PUBLIC_API_DISABLED: false
# Performance
EXECUTIONS_PROCESS: main
EXECUTIONS_MODE: regular
volumes:
- n8n_data:/home/node/.n8n
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.n8n.entrypoints=websecure"
- "traefik.http.routers.n8n.rule=Host(`n8n.tu-dominio.com`)" # CAMBIAR DOMINIO
- "traefik.http.routers.n8n.tls=true"
- "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
- "traefik.http.services.n8n.loadbalancer.server.port=5678"
- "traefik.http.routers.n8n.middlewares=secure-headers@file"
Paso 9: Configurar Permisos y Redes
# Crear archivo para certificados SSL
touch traefik/data/acme.json
chmod 600 traefik/data/acme.json
# Crear red de Traefik
docker network create traefik
Paso 10: Configurar Firewall
# Configurar ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
Paso 11: Configurar DNS (Solo si tienes dominio)
Configurar estos registros DNS en tu proveedor de dominio:
Para generar subdominio y apuntarlo hacia tu dirección IP de tu servidor, ir a administrador de DNS y generar nuevo registro tipo A especificando el subdominio apuntando a la dirección IP de tu VPS
Tipo A: n8n.tu-dominio.com → IP_DE_TU_LINODE
Tipo A: traefik.tu-dominio.com → IP_DE_TU_LINODE
Iniciar los Servicios
Paso 12: Verificar y Iniciar
# Verificar configuración
docker-compose config
# Iniciar servicios
docker-compose up -d
# Verificar estado
docker-compose ps
Resultado esperado (sin warnings):
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
n8n n8nio/n8n:latest "tini -- /docker-ent…" n8n 43 seconds ago Up 32 seconds 5678/tcp
n8n-postgres postgres:15-alpine "docker-entrypoint.s…" postgres 43 seconds ago Up 43 seconds (healthy) 5432/tcp
traefik traefik:v3.0 "/entrypoint.sh trae…" traefik 43 seconds ago Up 43 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp
Acceso a n8n
Con Dominio Configurado:
-
n8n:
https://n8n.tu-dominio.com -
Dashboard Traefik:
https://traefik.tu-dominio.com
Comandos de Mantenimiento
Ver Logs:
# Logs de n8n
docker-compose logs -f n8n
# Logs de Traefik
docker-compose logs -f traefik
# Logs de PostgreSQL
docker-compose logs -f postgres
Reiniciar Servicios:
# Reiniciar n8n
docker-compose restart n8n
# Reiniciar todos los servicios
docker-compose restart
Actualizar Servicios:
# Descargar últimas versiones
docker-compose pull
# Aplicar actualizaciones
docker-compose up -d
Backup de Base de Datos:
# Crear backup
docker-compose exec postgres pg_dump -U n8n n8n > backup_$(date +%Y%m%d).sql
# Restaurar backup
docker-compose exec -T postgres psql -U n8n -d n8n < backup_file.sql
Solución de Problemas Comunes
Problema: Warnings sobre variables no definidas
Solución: Verificar que el hash de password esté correctamente formateado con $$ duplicados.
Problema: Certificados SSL no se generan
Solución:
-
Verificar que los registros DNS estén configurados correctamente
-
Esperar 5-10 minutos para propagación DNS
-
Revisar logs de Traefik:
docker-compose logs traefik
Problema: n8n no carga
Solución:
-
Verificar que PostgreSQL esté saludable:
docker-compose ps -
Revisar logs de n8n:
docker-compose logs n8n -
Verificar conectividad de red:
docker network ls
Próximos Pasos
-
Acceder a n8n y crear tu cuenta de administrador
-
Configurar workflows según tus necesidades
-
Configurar backups automáticos de la base de datos
-
Monitorear el sistema usando el dashboard de Traefik
-
Considerar añadir servicios adicionales como Portainer para gestión de contenedores
Beneficios de esta Configuración
✅ SSL automático con Let’s Encrypt
✅ Renovación automática de certificados
✅ Dashboard de monitoreo con Traefik
✅ Base de datos PostgreSQL para mejor rendimiento
✅ Cumplimiento GDPR (servidores en Frankfurt)
✅ Alta disponibilidad con restart automático
✅ Fácil escalabilidad para servicios adicionales
✅ Seguridad mejorada con headers HTTP y encriptación
Guía creada por: Kevin Belier
Fecha: 12 jun 2025
Versión: 1.0