services: postgres: image: postgres:16 container_name: n8n-postgres restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-n8n} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env} POSTGRES_DB: ${POSTGRES_DB:-n8n} volumes: - /data/n8n/postgres:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}'] interval: 10s timeout: 5s retries: 5 n8n: image: n8nio/n8n:latest container_name: n8n restart: unless-stopped ports: - '${N8N_PORT:-5678}:5678' environment: DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_PORT: '5432' DB_POSTGRESDB_DATABASE: ${POSTGRES_DB:-n8n} DB_POSTGRESDB_USER: ${POSTGRES_USER:-n8n} DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env} N8N_HOST: ${N8N_HOST:-localhost} N8N_PORT: '5678' N8N_PROTOCOL: ${N8N_PROTOCOL:-http} WEBHOOK_URL: ${WEBHOOK_URL:-} GENERIC_TIMEZONE: ${TZ:-UTC} TZ: ${TZ:-UTC} volumes: - /data/n8n/files:/home/node/.n8n depends_on: postgres: condition: service_healthy