n8n on Docker: Complete Setup Guide with Docker Compose
Mike Holownych
#n8n
#docker
#deployment
#tutorial
#devops
Quick setup: Production-ready n8n with Docker Compose in 20 minutes. Includes PostgreSQL, automatic backups, and SSL.
What You’ll Build
Complete stack:
- n8n (latest version)
- PostgreSQL 16 (persistent database)
- Automated daily backups
- SSL certificate (Let’s Encrypt)
- Persistent volumes for data
- Restart policies for reliability
Prerequisites:
- Linux VPS (Ubuntu 22.04+ recommended)
- Docker + Docker Compose installed
- Domain name pointing to your server
- Basic command line knowledge
Quick Start (Copy-Paste Ready)
Step 1: Install Docker
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add your user to docker group
sudo usermod -aG docker $USER
# Log out and back in, then test
docker --version
Step 2: Create Project Directory
mkdir -p ~/n8n-docker
cd ~/n8n-docker
Step 3: Create docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
timeout: 5s
retries: 5
networks:
- n8n-network
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
ports:
- "5678:5678"
environment:
# Database
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 Config
N8N_HOST: ${N8N_HOST}
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: https://${N8N_HOST}/
# Authentication
N8N_BASIC_AUTH_ACTIVE: true
N8N_BASIC_AUTH_USER: ${N8N_USER}
N8N_BASIC_AUTH_PASSWORD: ${N8N_PASSWORD}
# Timezone
GENERIC_TIMEZONE: America/New_York
TZ: America/New_York
# Security
N8N_SECURE_COOKIE: true
# Execution
EXECUTIONS_DATA_SAVE_ON_SUCCESS: all
EXECUTIONS_DATA_SAVE_ON_ERROR: all
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS: true
# Performance
N8N_PAYLOAD_SIZE_MAX: 16
volumes:
- n8n_data:/home/node/.n8n
- ./local-files:/files
depends_on:
postgres:
condition: service_healthy
networks:
- n8n-network
volumes:
postgres_data:
n8n_data:
networks:
n8n-network:
driver: bridge
Step 4: Create .env File
cat > .env << EOF
# PostgreSQL
POSTGRES_PASSWORD=ChangeThisToSecurePassword123!
# n8n
N8N_HOST=n8n.yourdomain.com
N8N_USER=admin
N8N_PASSWORD=ChangeThisToSecurePassword456! More Posts You'll Love
Based on your interests and activity