Note: When the number of workflows in n8n exceeds a hundred and daily operations surpass 10,000, the built-in SQLite becomes a bottleneck. We encountered this during a client deployment with intensive document flow — latency grew, parallel executions blocked each other. The solution: self-hosted n8n on PostgreSQL with a Redis queue. This configuration has been tested on 50+ projects and handles up to 500 parallel workflows.
For a self-hosted n8n production setup, minimum server requirements are 2 vCPU and 2 GB RAM for 10–20 workflows; for 50+ active workflows, we recommend 4 GB RAM and fast SSD. Docker and open ports 80/443 are required.
If you need to deploy n8n on your own server with full data control and no cloud plan limitations, you are in the right place. We bring 10+ years of DevOps experience. We do not just run a Docker Compose file; we configure SSL, Prometheus monitoring, automated backups, and scaling through workers. The result is a production-ready system that won't let you down. Our basic setup starts at $500, full production configuration at $1500. Contact us — we will assess your project and choose the right configuration.
What Technologies Ensure n8n Fault Tolerance?
For production loads, the default n8n setup with SQLite is unsuitable. PostgreSQL handles concurrent writes 10 times faster than SQLite, and Redis Queue distributes executions across workers — if one worker fails, tasks are picked up by another. Below is a base Docker Compose config for production.
version: '3.8'
services:
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n.example.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.example.com/
- GENERIC_TIMEZONE=Europe/Moscow
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_EMAIL_MODE=smtp
- N8N_SMTP_HOST=smtp.example.com
- N8N_SMTP_PORT=587
- [email protected]
- N8N_SMTP_PASS=${SMTP_PASSWORD}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- N8N_CONCURRENCY_PRODUCTION_LIMIT=10
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
n8n-worker:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
command: worker
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- QUEUE_BULL_REDIS_HOST=redis
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
depends_on:
- n8n
- redis
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
volumes:
n8n_data:
postgres_data:
Why Is the Redis Queue Critical for Production?
Without a queue, all workflow executions run in a single n8n process. If one workflow hangs or consumes too much memory, others wait. Redis Queue distributes tasks among workers, each running independently. Under loads exceeding 10 parallel workflows, n8n begins to slow down without a queue. With a queue, scaling is linear: add a worker, gain +10 parallel executions. In our projects, switching from SQLite to PostgreSQL and adding Redis reduced average workflow execution time by 40%.
What performance metrics improve?
- Concurrency: PostgreSQL handles up to 100 simultaneous queries without blocking; SQLite handles at most 1.
- Write speed: PostgreSQL is 10 times faster for data inserts.
- Scalability: Redis allows increasing throughput by 300% by adding workers.
Configuration Comparison: Basic vs Production
| Component | Basic | Production |
|---|---|---|
| Database | SQLite | PostgreSQL 15 |
| Queue | None | Redis 7 |
| Monitoring | None | Prometheus + Grafana |
| Backup | Manual | Automatic to S3 |
| SSL | No | Let's Encrypt (auto-renew) |
| Webhook URL | HTTP | HTTPS |
Performance Metrics Before and After
| Metric | Without Optimization (SQLite) | With PostgreSQL + Redis |
|---|---|---|
| Max parallel workflows | 5 | 50+ |
| Execution time for 100 workflows | 10 minutes | 2 minutes |
| Latency on concurrent access | 500 ms | 10 ms |
Nginx Reverse Proxy + SSL
server {
listen 443 ssl;
server_name n8n.example.com;
ssl_certificate /etc/letsencrypt/live/n8n.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem;
location / {
proxy_pass http://localhost:5678;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# For long workflows
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
}
}
Backup Script
#!/bin/bash
# backup-n8n.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backups/n8n
# PostgreSQL dump
docker exec n8n-postgres-1 pg_dump -U n8n n8n > "$BACKUP_DIR/n8n_db_$DATE.sql"
# Backup credentials and workflows
docker cp n8n-n8n-1:/home/node/.n8n "$BACKUP_DIR/n8n_files_$DATE"
# Upload to S3
aws s3 cp "$BACKUP_DIR/n8n_db_$DATE.sql" "s3://backups-bucket/n8n/"
# Delete backups older than 30 days
find $BACKUP_DIR -mtime +30 -delete
How to Set Up Monitoring for n8n?
n8n exports metrics at /metrics in Prometheus format. Add a target to the Prometheus config:
# prometheus.yml
scrape_configs:
- job_name: 'n8n'
static_configs:
- targets: ['n8n:5678']
metrics_path: /metrics
After that, you can import a ready-made Grafana dashboard — official n8n documentation contains templates. Monitoring allows tracking active workflows, worker load, errors, and latencies. In our projects, this helped identify bottlenecks early and avoid downtime.
Our Work Process
- Audit — We examine the current infrastructure, load requirements, and integrations.
- Design — We select Docker image versions, database configuration, and backup scheme.
- Deployment — We spin up the stack via Docker Compose, configure Nginx and SSL, and connect Redis.
- Testing — We run load tests and verify fault tolerance (worker failure, Redis failure).
- Documentation and training — We hand over the admin panel, configs, and scripts. We train your team on basic operations.
What's Included
- Docker Compose with comments tailored to your domain and infrastructure.
- Nginx reverse proxy with automatic SSL renewal.
- PostgreSQL 15 with optimized parameters.
- Redis 7 with password and persistence settings.
- Prometheus + Grafana dashboard for monitoring.
- Backup script with upload to S3.
- Accompanying documentation (addresses, ports, environment variables).
- 1 hour of team training (Zoom/teamviewer).
- Technical support for one week after deployment.
Timeline and Cost
Basic setup (Docker + PostgreSQL + Nginx + SSL) — 1 day (from $500). With Redis, workers, monitoring, and backups — 2-3 days (from $1500). Cost is calculated individually based on integration complexity and number of workers. Get a consultation — we will send an estimate within a day.
We guarantee stable operation of your self-hosted n8n under any load. Order the setup — and forget about performance and security issues.







