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!
MH

About Mike Holownych

I help entrepreneurs build self-running businesses with DashNex + automation. n8n automation expert specializing in e-commerce, affiliate marketing, and business systems.