x-shared: &shared restart: always image: docker.n8n.io/n8nio/n8n environment: - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} - EXECUTIONS_MODE=queue - QUEUE_BULL_REDIS_HOST=redis - QUEUE_HEALTH_CHECK_ACTIVE=true - N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY} links: - postgres - redis volumes: - ./n8n_storage:/home/node/.n8n depends_on: redis: condition: service_healthy postgres: condition: service_healthy services: postgres: image: postgres:16 restart: always environment: - POSTGRES_USER - POSTGRES_PASSWORD - POSTGRES_DB - POSTGRES_NON_ROOT_USER - POSTGRES_NON_ROOT_PASSWORD volumes: - ./db_storage:/var/lib/postgresql/data - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh healthcheck: test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}'] interval: 5s timeout: 5s retries: 10 networks: - n8n redis: image: redis:6-alpine restart: always volumes: - ./redis_storage:/data healthcheck: test: ['CMD', 'redis-cli', 'ping'] interval: 5s timeout: 5s retries: 10 networks: - n8n n8n: <<: *shared ports: - ${VPORT}:${VPORT} environment: - N8N_HOST=${VHOST} - N8N_PORT=${VPORT} - N8N_PROTOCOL=https - NODE_ENV=production - N8N_PATH - WEBHOOK_URL=https://${VHOST}${N8N_PATH} labels: - 'traefik.enable=true' - 'traefik.http.routers.n8n.rule=Host(`${VHOST}`)' - 'traefik.http.routers.n8n.service=n8n-service' - 'traefik.http.routers.n8n.entrypoints=websecure' - 'traefik.http.routers.n8n.tls=true' - 'traefik.http.services.n8n-service.loadbalancer.server.port=${VPORT}' networks: - default - n8n n8n-worker: <<: *shared command: worker depends_on: - n8n networks: - n8n networks: default: name: nginx-proxy external: true n8n: driver: bridge