Skip to content

Instantly share code, notes, and snippets.

@BorysVrublevskyi
Created May 1, 2025 08:28
Show Gist options
  • Save BorysVrublevskyi/99b44692133a67ad1efb11a1d4ad9e3c to your computer and use it in GitHub Desktop.
Save BorysVrublevskyi/99b44692133a67ad1efb11a1d4ad9e3c to your computer and use it in GitHub Desktop.

N8N with Traefik, Postgres and Redis in Docker compose

docker compose -f n8n-compose.yml --env-file prod.env -p n8n up -d

version: '3.8'
volumes:
db_storage:
n8n_storage:
redis_storage:
letsencrypt:
services:
traefik:
image: traefik:v2.11
command:
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.websecure.address=:443
- --entrypoints.web.address=:80
- --certificatesresolvers.mytlschallenge.acme.tlschallenge=true
- --certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}
- --certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json
ports:
- "80:80"
- "443:443"
volumes:
- letsencrypt:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
postgres:
image: postgres:16
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db_storage:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
redis:
image: redis:6-alpine
restart: always
volumes:
- redis_storage:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 10
initContainer:
image: busybox
command: ['sh', '-c', 'chown -R 1000:1000 /home/node/.n8n']
volumes:
- n8n_storage:/home/node/.n8n
n8n:
image: docker.n8n.io/n8nio/n8n
restart: always
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_HEALTH_CHECK_ACTIVE=true
- N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY}
- N8N_HOST=${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- N8N_PATH=${N8N_PATH}
- WEBHOOK_URL=https://${DOMAIN_NAME}${N8N_PATH}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
initContainer:
condition: service_completed_successfully
volumes:
- n8n_storage:/home/node/.n8n
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`${DOMAIN_NAME}`) && PathPrefix(`${N8N_PATH}`)
- traefik.http.routers.n8n.entrypoints=websecure
- traefik.http.routers.n8n.tls=true
- traefik.http.routers.n8n.tls.certresolver=mytlschallenge
- traefik.http.routers.n8n.middlewares=n8n-stripprefix,n8n-headers
- traefik.http.middlewares.n8n-stripprefix.stripprefix.prefixes=${N8N_PATH}
- traefik.http.middlewares.n8n-headers.headers.SSLRedirect=true
- traefik.http.middlewares.n8n-headers.headers.STSSeconds=315360000
- traefik.http.middlewares.n8n-headers.headers.browserXSSFilter=true
- traefik.http.middlewares.n8n-headers.headers.contentTypeNosniff=true
- traefik.http.middlewares.n8n-headers.headers.forceSTSHeader=true
- traefik.http.middlewares.n8n-headers.headers.SSLHost=${DOMAIN_NAME}
- traefik.http.middlewares.n8n-headers.headers.STSIncludeSubdomains=true
- traefik.http.middlewares.n8n-headers.headers.STSPreload=true
n8n-worker:
image: docker.n8n.io/n8nio/n8n
restart: always
command: worker
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_HEALTH_CHECK_ACTIVE=true
- N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY}
depends_on:
- n8n
- postgres
- redis
volumes:
- n8n_storage:/home/node/.n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=securepass
POSTGRES_DB=n8ndb
ENCRYPTION_KEY=supersecretkey123456
DOMAIN_NAME=n8n.example.com
# N8N_PATH=/n8n # n8n.example.com/n8n
N8N_PATH=/
[email protected]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment