📋 Contexto
n8n es una poderosa herramienta de automatización de workflows, similar a Zapier o Make (Integromat), pero con la ventaja de poder ser self-hosted. Después de montar mi home lab, quería una plataforma para automatizar tareas personales sin depender de servicios cloud pagos.
La instalación "oficial" con SQLite funciona, pero para un entorno más robusto decidí usar PostgreSQL como base de datos. Este post documenta el proceso completo, incluyendo todos los problemas que enfrenté y cómo los resolví.
🎯 Objetivo
Instalar n8n en mi servidor home lab con:
- Docker Compose para gestión de servicios
- PostgreSQL como base de datos (más robusto que SQLite)
- Nginx como reverse proxy
- Persistencia de datos con Docker volumes
- Health checks y auto-restart
- Configuración lista para producción personal
🛠️ Implementación
Estructura del Proyecto
n8n-lab/
├── docker-compose.yml
├── .env
└── website/
└── html/
Paso 1: Archivo docker-compose.yml
Creé la configuración con tres servicios: PostgreSQL, n8n y Nginx.
version: '3.8'
services:
postgres:
image: postgres:14
container_name: n8n-postgres
environment:
POSTGRES_DB: ${DB_POSTGRES_DATABASE}
POSTGRES_USER: ${DB_POSTGRES_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- n8n-network
n8n:
image: n8nio/n8n:latest
container_name: n8n-app
depends_on:
postgres:
condition: service_healthy
environment:
# Database
DB_TYPE: ${DB_TYPE}
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${DB_POSTGRES_DATABASE}
DB_POSTGRESDB_USER: ${DB_POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${DB_PASSWORD}
# n8n config
N8N_BASIC_AUTH_ACTIVE: true
N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER}
N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
N8N_HOST: ${N8N_HOST}
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: https://${N8N_HOST}/
# Timezone
GENERIC_TIMEZONE: America/Argentina/Buenos_Aires
TZ: America/Argentina/Buenos_Aires
volumes:
- n8n_data:/home/node/.n8n
restart: unless-stopped
networks:
- n8n-network
nginx:
image: nginx:alpine
container_name: nginx-web
ports:
- "127.0.0.1:8080:80"
volumes:
- ./website/html:/usr/share/nginx/html:ro
restart: unless-stopped
networks:
- n8n-network
volumes:
pg_data:
n8n_data:
networks:
n8n-network:
driver: bridge
•
depends_on con condition: service_healthy asegura que n8n espere a que PostgreSQL esté listo•
DB_POSTGRESDB_HOST: postgres usa el nombre del servicio Docker (no localhost)• Nginx solo escucha en
127.0.0.1:8080 (acceso via Cloudflare Tunnel)• Volúmenes nombrados para persistencia de datos
Paso 2: Archivo .env
Variables de entorno para configuración sensible:
# Database
DB_TYPE=postgresdb
DB_POSTGRES_DATABASE=n8n
DB_POSTGRES_USER=n8n
DB_PASSWORD=tu_password_seguro_aqui
# n8n Authentication
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=tu_n8n_password
# n8n Host
N8N_HOST=n8n.mytechzone.dev
.env a GitHub.
Agrégalo a .gitignore y crea un .env.example con placeholders.
Paso 3: Iniciar los Servicios
# Navegar al directorio
cd /home/mytechzone/n8n-lab
# Iniciar servicios
docker compose up -d
# Ver logs
docker compose logs -f n8n
# Verificar estado
docker compose ps
🐛 Troubleshooting: El Error ECONNREFUSED
Durante la configuración inicial, n8n no podía conectarse a PostgreSQL.
El error en los logs era: Error: connect ECONNREFUSED ::1:5432
Problema 1: Variables de Entorno Incorrectas
Síntoma: n8n intentaba conectarse a ::1 (localhost IPv6) en lugar de postgres.
Causa: Usé DB_HOST en lugar de DB_POSTGRESDB_HOST.
Solución: n8n requiere nombres específicos de variables según el tipo de base de datos:
# ❌ INCORRECTO
DB_HOST: postgres
DB_PORT: 5432
DB_USER: n8n
# ✅ CORRECTO (para PostgreSQL)
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_USER: n8n
Problema 2: Password con Caracteres Especiales
Síntoma: Logs de PostgreSQL mostraban password authentication failed.
Causa: Caracteres especiales en la password sin escapar correctamente.
Solución: Usar password simple o sin comillas en el archivo .env:
# ❌ Puede causar problemas
DB_PASSWORD="MyP@ssw0rd!"
# ✅ Mejor
DB_PASSWORD=mypassword123
# ✅ O si necesitas caracteres especiales
DB_PASSWORD=MyPass_word-123
Problema 3: Volumen con Data Antigua
Síntoma: Después de cambiar credenciales, seguía fallando la autenticación.
Causa: El volumen de PostgreSQL tenía una base de datos inicializada con las credenciales antiguas.
Solución: Eliminar el volumen y recrearlo:
# Detener servicios
docker compose down
# Eliminar volumen de PostgreSQL
docker volume rm n8n-lab_pg_data
# Reiniciar con configuración limpia
docker compose up -d
# Verificar logs
docker compose logs -f postgres
✅ Verificación del Deployment
1. Verificar Containers Corriendo
docker compose ps
Deberías ver algo como:
NAME IMAGE STATUS PORTS
n8n-postgres postgres:14 Up (healthy) 5432/tcp
n8n-app n8nio/n8n:latest Up 5678/tcp
nginx-web nginx:alpine Up 0.0.0.0:8080->80/tcp
2. Probar Conexión a PostgreSQL
# Desde dentro del container de n8n
docker exec -it n8n-app sh
n8n:~ $ psql -h postgres -U n8n -d n8n
# Si conecta, la configuración es correcta
3. Acceder a n8n
Si tienes Cloudflare Tunnel configurado:
# URL: https://n8n.mytechzone.dev/
# Credenciales: Las de N8N_BASIC_AUTH_USER y PASSWORD
🔧 Configuración Post-Instalación
Comandos Útiles
# Ver logs en tiempo real
docker compose logs -f n8n
# Reiniciar solo n8n
docker compose restart n8n
# Ver uso de recursos
docker stats n8n-app n8n-postgres
# Backup de la base de datos
docker exec n8n-postgres pg_dump -U n8n n8n > backup_$(date +%Y%m%d).sql
# Entrar al container de n8n
docker exec -it n8n-app sh
Health Check Manual
# Verificar PostgreSQL
docker exec n8n-postgres pg_isready -U n8n
# Verificar n8n responde
curl http://localhost:5678/healthz
📊 Recursos del Sistema
En mi servidor (notebook con 8GB RAM), el stack consume aproximadamente:
- PostgreSQL: ~50-80 MB RAM, CPU mínima en idle
- n8n: ~150-200 MB RAM, CPU variable según workflows activos
- Nginx: ~5-10 MB RAM, CPU mínima
💡 Optimizaciones y Best Practices
1. Configurar Log Rotation
Para evitar que los logs llenen el disco:
# En docker-compose.yml, agregar a cada servicio:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
2. Backups Automatizados
Script bash para backup diario:
#!/bin/bash
# backup_n8n.sh
BACKUP_DIR="/home/mytechzone/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Backup PostgreSQL
docker exec n8n-postgres pg_dump -U n8n n8n | \
gzip > "$BACKUP_DIR/n8n_db_$DATE.sql.gz"
# Backup workflows (volumen de n8n)
docker run --rm -v n8n-lab_n8n_data:/data -v "$BACKUP_DIR":/backup \
alpine tar czf /backup/n8n_data_$DATE.tar.gz /data
# Limpiar backups viejos (mantener últimos 7)
find "$BACKUP_DIR" -name "n8n_*" -mtime +7 -delete
echo "✓ Backup completado: $DATE"
3. Monitoreo con Health Checks
Agregar health checks a n8n en docker-compose.yml:
n8n:
# ... resto de config ...
healthcheck:
test: ["CMD", "wget", "--spider", "http://localhost:5678/healthz"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
🚀 Workflows de Ejemplo
Una vez n8n esté funcionando, estos son algunos workflows útiles para empezar:
1. Backup Automático a Cloud
Workflow que toma backups diarios y los sube a AWS S3 o Google Drive.
2. Monitoreo de Website
Chequea tu sitio cada 5 minutos y envía alerta si está caído.
3. RSS to Email
Lee feeds RSS de tus blogs tech favoritos y envía resumen semanal.
4. GitHub Activity Tracker
Notificaciones cuando alguien da star o fork a tus repos.
📚 Recursos Útiles
💭 Lecciones Aprendidas
- Variables de entorno específicas: n8n requiere nombres exactos de variables según el tipo de DB. Leer la documentación ahorra horas de troubleshooting.
- Health checks son críticos: Usar
depends_onconcondition: service_healthyevita race conditions en el startup. - Volúmenes persisten data: Si cambias credenciales, puede que necesites recrear volúmenes para aplicar los cambios.
- Logs son tu mejor amigo:
docker compose logs -fte da toda la información necesaria para debuggear. - Backups no son opcionales: Incluso en un home lab, implementa backups desde el día 1.
🔄 Actualizar n8n
Para actualizar a la última versión:
# Pull nueva imagen
docker compose pull n8n
# Recrear container
docker compose up -d n8n
# Verificar versión
docker exec n8n-app n8n --version
✅ Resultado Final
Después de resolver todos los problemas, tengo:
- ✅ n8n corriendo establemente 24/7
- ✅ PostgreSQL con persistencia de datos
- ✅ Acceso seguro via Cloudflare Tunnel
- ✅ Health checks y auto-restart configurados
- ✅ Backups automatizados
- ✅ Configuración lista para escalar
• URL: n8n.mytechzone.dev
• Uptime: ~30 días sin problemas
• Workflows activos: 5+
• Costo: $0 (self-hosted)
🚀 Próximos Pasos
Mejoras que planeo implementar:
- Integrar con Prometheus para métricas avanzadas
- Configurar alertas vía Telegram para fallos de workflows
- Implementar OAuth2 en lugar de Basic Auth
- Agregar Redis para mejor performance con webhooks
- Crear library de workflows reutilizables
💭 Conclusión
n8n self-hosted es una excelente adición a cualquier home lab. Aunque la configuración inicial tiene sus desafíos (especialmente con PostgreSQL), una vez funcionando es extremadamente estable y potente.
El troubleshooting del error ECONNREFUSED me enseñó mucho sobre Docker networking,
environment variables, y la importancia de leer documentación oficial. Espero que esta guía
te ahorre las horas de frustración que yo experimenté.
Si estás considerando automatizar tareas personales o profesionales, n8n es una inversión de tiempo que vale totalmente la pena. Y con esta configuración, tienes una base sólida para crear workflows increíbles.