services: dashboard: build: context: . container_name: dashboard restart: unless-stopped ports: - "${PORT:-3000}:3000" environment: HOST: 0.0.0.0 PORT: "3000" DATA_DIR: /app/data NODE_ENV: production DASHBOARD_SECRET: ${DASHBOARD_SECRET:-} HTTPS: "${HTTPS:-false}" DATABASE_URL: ${DATABASE_URL:-postgresql://${PG_USER:-dashboard}:${PG_PASSWORD:-dashboard}@postgres:5432/${PG_DB:-dashboard}} ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-} ADMIN_PASSWORD_HASH: ${ADMIN_PASSWORD_HASH:-} HTTPS_PROXY: ${HTTPS_PROXY:-} HTTP_PROXY: ${HTTP_PROXY:-} REDDIT_CLIENT_ID: ${REDDIT_CLIENT_ID:-} REDDIT_CLIENT_SECRET: ${REDDIT_CLIENT_SECRET:-} AI_BASE_URL: ${AI_BASE_URL:-} AI_API_KEY: ${AI_API_KEY:-} AI_MODEL: ${AI_MODEL:-gpt-4o-mini} AI_DAILY_TOKEN_LIMIT: ${AI_DAILY_TOKEN_LIMIT:-100000} LOG_LEVEL: ${LOG_LEVEL:-info} LOG_DIR: /app/data/logs LOG_MAX_SIZE: ${LOG_MAX_SIZE:-10m} LOG_MAX_FILES: ${LOG_MAX_FILES:-5} volumes: - ${DATA_HOST_DIR:-./data}:/app/data healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ] interval: 30s timeout: 5s retries: 5 start_period: 20s depends_on: postgres: condition: service_healthy postgres: image: postgres:16-alpine container_name: dashboard-pg restart: unless-stopped environment: POSTGRES_USER: ${PG_USER:-dashboard} POSTGRES_PASSWORD: ${PG_PASSWORD:-dashboard} POSTGRES_DB: ${PG_DB:-dashboard} ports: - "${PG_PORT:-5432}:5432" volumes: - pg_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${PG_USER:-dashboard} -d ${PG_DB:-dashboard}"] interval: 5s timeout: 5s retries: 5 start_period: 5s volumes: pg_data: