version: '3.8' services: postgres: image: postgres:15-alpine container_name: taskboard-postgres restart: unless-stopped environment: POSTGRES_DB: taskboard POSTGRES_USER: taskboard_user POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-your_secure_password_here} PGDATA: /var/lib/postgresql/data/pgdata volumes: - postgres_data:/var/lib/postgresql/data - ./init-scripts:/docker-entrypoint-initdb.d ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U taskboard_user -d taskboard"] interval: 30s timeout: 10s retries: 5 start_period: 30s logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: - taskboard-network - nginx-proxy-manager_default app: build: context: . dockerfile: Dockerfile container_name: taskboard-app restart: unless-stopped depends_on: postgres: condition: service_healthy environment: NODE_ENV: production DATABASE_URL: postgresql://taskboard_user:${POSTGRES_PASSWORD:-your_secure_password_here}@postgres:5432/taskboard NEXTAUTH_URL: ${NEXTAUTH_URL:-http://localhost:3000} NEXT_PUBLIC_APP_URL: ${NEXTAUTH_URL:-http://localhost:3000} AUTH_SECRET: ${AUTH_SECRET:-your_auth_secret_change_this_in_production} AUTHENTIK_ID: ${AUTHENTIK_ID:-} AUTHENTIK_SECRET: ${AUTHENTIK_SECRET:-} VIRTUAL_HOST: ${VIRTUAL_HOST:-taskboard.local} VIRTUAL_PORT: 3000 LETSENCRYPT_HOST: ${LETSENCRYPT_HOST:-} LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-} volumes: - app_uploads:/app/uploads - app_logs:/app/logs ports: - "3000:3000" healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:3000/api/health || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 40s logging: driver: "json-file" options: max-size: "50m" max-file: "5" networks: - taskboard-network - nginx-proxy-manager_default volumes: postgres_data: driver: local app_uploads: driver: local app_logs: driver: local networks: taskboard-network: driver: bridge nginx-proxy-manager_default: external: true