How to Install n8n with Docker: Complete VPS Setup Guide
Step-by-step guide to self-hosting n8n on a VPS with Docker. Includes SSL setup, PostgreSQL database, automatic backups, and production-ready configuration.
How to Install n8n with Docker: Complete VPS Setup Guide
Step-by-step guide to self-hosting n8n on a VPS with Docker. For VPS recommendations, see our best VPS for n8n guide. This production-ready setup includes SSL certificates, PostgreSQL database, Nginx reverse proxy, and automatic backups.
What You’ll Set Up
What You'll Set Up
- ✅ n8n running in Docker
- ✅ PostgreSQL database (production-ready)
- ✅ Nginx reverse proxy
- ✅ SSL with Let’s Encrypt
- ✅ Automatic backups
- ✅ Auto-restart on reboot
Time required: 15-20 minutes
Prerequisites
- A VPS with 2GB+ RAM (we recommend Hostinger KVM 1)
- A domain name pointing to your server
- Basic terminal knowledge
Step 1: Initial Server Setup
SSH into your VPS:
ssh root@your-server-ip
Update the system:
apt update && apt upgrade -y
Step 2: Install Docker
# Install Docker
curl -fsSL https://get.docker.com | sh
# Install Docker Compose
apt install docker-compose-plugin -y
# Verify installation
docker --version
docker compose version
Step 3: Create Project Structure
mkdir -p /opt/n8n
cd /opt/n8n
Create the Docker Compose file:
nano docker-compose.yml
Paste:
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.yourdomain.com/
- GENERIC_TIMEZONE=Europe/London
# Database
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=your-secure-password
# Encryption
- N8N_ENCRYPTION_KEY=your-32-char-encryption-key
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
networks:
- n8n-network
postgres:
image: postgres:15
restart: always
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=your-secure-password
- POSTGRES_DB=n8n
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- n8n-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 5s
timeout: 5s
retries: 5
volumes:
n8n_data:
postgres_data:
networks:
n8n-network:
Important: Replace:
n8n.yourdomain.comwith your actual domainyour-secure-passwordwith a strong passwordyour-32-char-encryption-keywith a random 32+ character string
Generate an encryption key:
openssl rand -hex 16
Step 4: Install Nginx
apt install nginx -y
Create the Nginx config:
nano /etc/nginx/sites-available/n8n
Paste:
server {
listen 80;
server_name n8n.yourdomain.com;
location / {
proxy_pass http://localhost:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
proxy_buffering off;
}
}
Enable the site:
ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
Step 5: Set Up SSL with Let’s Encrypt
# Install Certbot
apt install certbot python3-certbot-nginx -y
# Get SSL certificate
certbot --nginx -d n8n.yourdomain.com
Follow the prompts. Certbot will automatically configure Nginx for HTTPS.
Step 6: Start n8n
cd /opt/n8n
docker compose up -d
Check if it’s running:
docker compose ps
docker compose logs -f n8n
Access n8n at: https://n8n.yourdomain.com
Step 7: Configure Firewall
Follow our VPS security guide for a complete hardening checklist. At minimum:
ufw allow ssh
ufw allow 'Nginx Full'
ufw enable
Step 8: Set Up Automatic Backups
Create backup script:
nano /opt/n8n/backup.sh
Paste:
#!/bin/bash
BACKUP_DIR="/opt/n8n/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# Backup PostgreSQL
docker compose exec -T postgres pg_dump -U n8n n8n > $BACKUP_DIR/db_$DATE.sql
# Backup n8n data
docker compose exec -T n8n n8n export:workflow --all --output=/home/node/.n8n/backups/workflows_$DATE.json 2>/dev/null || true
# Keep only last 7 days
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed: $DATE"
Make it executable and schedule:
chmod +x /opt/n8n/backup.sh
# Add to crontab (daily at 3 AM)
crontab -e
Add:
0 3 * * * /opt/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1
Step 9: Enable Auto-Start on Boot
Docker containers with restart: always will auto-start. Verify Docker is enabled:
systemctl enable docker
Updating n8n
To update to the latest version:
cd /opt/n8n
docker compose pull
docker compose up -d
Troubleshooting
n8n won’t start
docker compose logs n8n
Check for database connection errors or missing environment variables.
SSL certificate issues
certbot renew --dry-run
Database connection failed
Ensure PostgreSQL is healthy:
docker compose exec postgres pg_isready -U n8n
Out of memory
Upgrade your VPS or optimize n8n:
# In docker-compose.yml, add under n8n service:
deploy:
resources:
limits:
memory: 2G
Performance Optimization
1. Execution Pruning
Automatically delete old executions to save space. In n8n settings:
- Settings → Workflow Settings → Save Data Error Execution: last 30 days
- Save Data Success Execution: last 7 days
2. Increase Workers
For heavy workloads:
environment:
- EXECUTIONS_MODE=queue
- EXECUTIONS_PROCESS=own
3. Use Redis for Queue Mode
Add Redis service for high-volume workflows:
redis:
image: redis:alpine
restart: always
networks:
- n8n-network
Recommended VPS Specs
| Workload | RAM | CPU | VPS |
|---|---|---|---|
| Light | 2GB | 1 vCPU | Hostinger KVM 1 |
| Medium | 4GB | 2 vCPU | Hostinger KVM 2 |
| Heavy | 8GB | 4 vCPU | Contabo VPS S |
Conclusion
You now have a production-ready n8n installation with:
✅ PostgreSQL database for reliability
✅ Nginx reverse proxy for performance
✅ SSL encryption for security
✅ Automatic backups for peace of mind
✅ Auto-restart for 24/7 availability
Your self-hosted n8n is ready for unlimited automations! Wondering how n8n compares to paid alternatives? Check our n8n vs Zapier comparison.
Ready to get started?
Get the best VPS hosting deal today. Hostinger offers 4GB RAM VPS starting at just $4.99/mo.
Get Hostinger VPS — $4.99/mo// up to 75% off + free domain included
// related topics
// related guides
Best VPS for n8n: Top Hosting Picks for Workflow Automation in 2026
Looking for the perfect VPS to host n8n? We compare the best VPS providers for running n8n workflow automation, with top picks for every budget.
tutorial$1 VPS Hosting 2026: Cheapest VPS Servers Starting at $1/Month
Looking for $1 VPS hosting? Compare the cheapest VPS providers starting from $1-3/month. Real specs, no hidden fees, honest reviews of budget VPS options.
tutorialCaddy Reverse Proxy Guide 2026: Automatic HTTPS Made Easy
Set up Caddy as a reverse proxy with automatic HTTPS, zero-config SSL, and simple Caddyfile syntax. Complete VPS deployment guide.
tutorialCloudflare Tunnel VPS Guide 2026: Expose Services Without Opening Ports
Set up Cloudflare Tunnel on your VPS to expose web apps securely without opening ports or revealing your server IP. Complete guide with Docker and DNS config.
Andrius Putna
I am Andrius Putna. Geek. Since early 2000 in love tinkering with web technologies. Now AI. Bridging business and technology to drive meaningful impact. Combining expertise in customer experience, technology, and business strategy to deliver valuable insights. Father, open-source contributor, investor, 2xIronman, MBA graduate.
// last updated: February 3, 2026. Disclosure: This article may contain affiliate links.