services: db: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-wg} POSTGRES_USER: ${POSTGRES_USER:-wg} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 20 networks: - wg - dokploy-network app: build: . restart: unless-stopped depends_on: db: condition: service_healthy # Dokploy/Traefik routes to this internal port — do NOT publish host ports. expose: - "4000" environment: APP_PORT: "4000" APP_URL: ${APP_URL:-http://localhost:4000} SITE_NAME: ${SITE_NAME:-Evilfox.cc} DATABASE_URL: postgres://${POSTGRES_USER:-wg}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-wg}?sslmode=disable SESSION_SECRET: ${SESSION_SECRET:?set SESSION_SECRET} ADMIN_USERNAME: ${ADMIN_USERNAME:-admin} ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@evilfox.cc} ADMIN_PASSWORD: ${ADMIN_PASSWORD:?set ADMIN_PASSWORD} AUTO_IMPORT_MYSQL: ${AUTO_IMPORT_MYSQL:-true} MYSQL_DUMP_PATH: /data/wg.sql SECURE_COOKIES: ${SECURE_COOKIES:-true} TZ: ${TZ:-UTC} networks: - wg - dokploy-network volumes: pgdata: networks: wg: driver: bridge # Required so Traefik (Dokploy) can reach containers. dokploy-network: external: true