n8n is a powerful, open-source workflow automation tool that allows you to connect different services and automate tasks without coding. When deployed with Docker on a VPS, you get maximum stability, easy updates, and isolated environments.
This comprehensive guide will walk you through installing n8n with Docker on a VPS, configuring it for maximum stability, implementing security best practices, and setting up automated backups.
🐳 Why Use Docker for n8n?
Docker provides several advantages for running n8n in production:
- Isolation: n8n runs in its own container, separate from your system
- Easy Updates: Update n8n by pulling a new Docker image
- Consistency: Same environment across development and production
- Portability: Easy to move between servers
- Resource Management: Better control over CPU and memory usage
- Stability: Reduced dependency conflicts and system issues
✅ Prerequisites
Before setting up n8n with Docker, ensure you have:
- VPS Access: Root or sudo access to your VPS
- Docker Installed: Docker and Docker Compose installed on your VPS
- Domain Name: A domain pointing to your VPS IP (optional but recommended)
- SSL Certificate: For secure HTTPS access (Let's Encrypt recommended)
- Minimum Resources: 2GB RAM, 2 CPU cores, 20GB storage
- Firewall Configured: Ports 80, 443, and optionally 5678 open
📦 Step 1: Install Docker and Docker Compose
First, install Docker and Docker Compose on your VPS if they're not already installed.
1 Install Docker
For Ubuntu/Debian systems, run:
# Update package index
sudo apt update
# Install prerequisites
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
# Add Docker's official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Add Docker repository
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
# Install Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# Start and enable Docker
sudo systemctl start docker
sudo systemctl enable docker
# Verify installation
sudo docker --version
2 Install Docker Compose
Install Docker Compose for easier container management:
# Download 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
# Make it executable
sudo chmod +x /usr/local/bin/docker-compose
# Verify installation
docker-compose --version
3 Add Your User to Docker Group (Optional)
To run Docker without sudo:
# Add user to docker group
sudo usermod -aG docker $USER
# Log out and log back in for changes to take effect
# Or run: newgrp docker
📝 Step 2: Create Docker Compose Configuration
Create a directory for n8n and set up the Docker Compose file for maximum stability.
1 Create n8n Directory
# Create directory for n8n
mkdir -p ~/n8n
cd ~/n8n
2 Create docker-compose.yml
Create a Docker Compose file optimized for stability:
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=your_secure_password_here
- N8N_HOST=yourdomain.com
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://yourdomain.com/
- GENERIC_TIMEZONE=UTC
- TZ=UTC
volumes:
- n8n_data:/home/node/.n8n
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:5678/healthz || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
- n8n-network
volumes:
n8n_data:
driver: local
networks:
n8n-network:
driver: bridge
⚠️ Important: Replace your_secure_password_here with a strong password and yourdomain.com with your actual domain name.
⚙️ Step 3: Configure Environment Variables
For better security and management, use an environment file instead of hardcoding values.
1 Create .env File
Create a .env file for sensitive configuration:
# Create .env file
nano .env
Add the following content:
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=your_secure_password_here
N8N_HOST=yourdomain.com
N8N_PROTOCOL=https
NODE_ENV=production
WEBHOOK_URL=https://yourdomain.com/
GENERIC_TIMEZONE=UTC
TZ=UTC
2 Update docker-compose.yml to Use .env
Update your docker-compose.yml to reference the .env file:
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
env_file:
- .env
volumes:
- n8n_data:/home/node/.n8n
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:5678/healthz || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
- n8n-network
volumes:
n8n_data:
driver: local
networks:
n8n-network:
driver: bridge
🔒 Step 4: Set Up Reverse Proxy with SSL (Nginx)
Configure Nginx as a reverse proxy with SSL for secure access to n8n.
1 Install Nginx and Certbot
# Install Nginx
sudo apt install -y nginx
# Install Certbot for SSL certificates
sudo apt install -y certbot python3-certbot-nginx
# Start and enable Nginx
sudo systemctl start nginx
sudo systemctl enable nginx
2 Create Nginx Configuration
Create an Nginx configuration file for n8n:
# Create Nginx configuration
sudo nano /etc/nginx/sites-available/n8n
Add the following configuration:
server {
listen 80;
server_name 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_cache_bypass $http_upgrade;
}
}
3 Enable Site and Obtain SSL Certificate
# Enable the site
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
# Test Nginx configuration
sudo nginx -t
# Reload Nginx
sudo systemctl reload nginx
# Obtain SSL certificate
sudo certbot --nginx -d yourdomain.com
# Certbot will automatically configure SSL and update your Nginx config
🚀 Step 5: Start n8n Container
Start the n8n container using Docker Compose.
# Navigate to n8n directory
cd ~/n8n
# Start n8n in detached mode
docker-compose up -d
# Check container status
docker-compose ps
# View logs
docker-compose logs -f n8n
✅ n8n is Now Running!
Access n8n at https://yourdomain.com or http://your-vps-ip:5678
🛡️ Stability Best Practices
Implement these practices for maximum stability:
1. Use Health Checks
The healthcheck in docker-compose.yml ensures n8n is running properly and automatically restarts if it fails.
2. Set Restart Policy
Use restart: unless-stopped to automatically restart the container on system reboot or crashes.
3. Resource Limits
Add resource limits to prevent n8n from consuming all server resources:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G
4. Regular Backups
Set up automated backups of the n8n_data volume to prevent data loss.
5. Monitor Logs
Regularly check logs for errors: docker-compose logs n8n
6. Keep Docker Updated
Regularly update Docker and n8n images: docker-compose pull && docker-compose up -d
💾 Set Up Automated Backups
Create automated backups for your n8n data:
Create Backup Script
Create a backup script:
# Create backup script
nano ~/n8n/backup.sh
Add the following content:
#!/bin/bash
BACKUP_DIR="/root/n8n/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/n8n_backup_$DATE.tar.gz"
# Create backup directory if it doesn't exist
mkdir -p $BACKUP_DIR
# Create backup
docker run --rm -v n8n_n8n_data:/data -v $BACKUP_DIR:/backup ubuntu tar czf /backup/n8n_backup_$DATE.tar.gz /data
# Keep only last 7 days of backups
find $BACKUP_DIR -name "n8n_backup_*.tar.gz" -mtime +7 -delete
echo "Backup completed: $BACKUP_FILE"
Make it executable and set up cron:
# Make script executable
chmod +x ~/n8n/backup.sh
# Add to crontab (daily backup at 2 AM)
crontab -e
# Add this line:
0 2 * * * /root/n8n/backup.sh >> /root/n8n/backup.log 2>&1
🔒 Security Best Practices
Implement these security measures:
1. Use Strong Passwords
Set a strong password for basic authentication. Use a password manager to generate and store it securely.
2. Enable HTTPS
Always use HTTPS with a valid SSL certificate. Never expose n8n over HTTP in production.
3. Firewall Configuration
Close port 5678 from public access. Only allow access through Nginx reverse proxy on ports 80/443.
4. Regular Updates
Keep n8n and Docker updated to patch security vulnerabilities.
5. Limit Access
Use firewall rules to restrict access to n8n from specific IP addresses if possible.
6. Secure Credentials
Store sensitive credentials in n8n's credential system, not in workflow code.
🔧 Common Issues & Troubleshooting
Issue: Container won't start
Solution:
- Check logs:
docker-compose logs n8n - Verify Docker is running:
sudo systemctl status docker - Check port conflicts:
sudo netstat -tulpn | grep 5678 - Verify .env file syntax is correct
Issue: Can't access n8n via domain
Solution:
- Verify DNS is pointing to your VPS IP
- Check Nginx configuration:
sudo nginx -t - Ensure SSL certificate is valid:
sudo certbot certificates - Check firewall allows ports 80 and 443
Issue: High memory usage
Solution:
- Add resource limits to docker-compose.yml
- Monitor with:
docker stats n8n - Consider upgrading VPS resources
- Optimize workflows to reduce memory usage
Issue: Workflows not executing
Solution:
- Check container logs for errors
- Verify webhook URLs are correct
- Check firewall allows incoming connections
- Ensure NODE_ENV is set to production
🌟 Get Pre-Installed n8n VPS Hosting with HosterOcean
Skip the setup process! HosterOcean offers VPS hosting with n8n pre-installed and pre-configured, ready to use immediately.
⚡ Pre-Installed n8n
- n8n pre-installed with Docker
- Ready-to-go images
- No installation needed
- Start automating immediately
🛡️ Optimized Configuration
- SSL certificates configured
- Reverse proxy setup
- Security hardened
- Performance optimized
📈 High Performance
- NVMe SSD storage
- Dedicated resources
- 99.9% uptime guarantee
- Fast workflow execution
🎯 Expert Support
- 24/7 technical support
- n8n setup assistance
- Docker expertise
- Migration help available
✅ Conclusion
Setting up n8n with Docker on a VPS provides maximum stability, easy management, and scalability. By following this guide, you'll have a production-ready n8n installation that's secure, stable, and optimized for performance.
Quick Summary:
- Docker provides isolation and easy updates for n8n
- Use Docker Compose for simplified container management
- Set up reverse proxy with SSL for secure access
- Implement health checks and restart policies for stability
- Configure automated backups to protect your workflows
- Follow security best practices for production deployments