version: '3.8' services: # PostgreSQL 数据库 postgres: image: postgres:18-alpine container_name: app-starter-postgres restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-appstarter} POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - app_starter_postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro ports: - "5432:5432" networks: - app-starter-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-appstarter}"] interval: 10s timeout: 5s retries: 5 # Redis 缓存 (可选) redis: image: redis:7-alpine container_name: app-starter-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - app_starter_redis_data:/data ports: - "6379:6379" networks: - app-starter-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # 应用服务 app: build: context: . dockerfile: Dockerfile container_name: app-starter-app restart: unless-stopped environment: NODE_ENV: production DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-appstarter} REDIS_URL: redis://redis:6379 BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET} BETTER_AUTH_URL: ${BETTER_AUTH_URL} SERVER_URL: ${SERVER_URL:-http://localhost:3000} # OAuth 环境变量 GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET} ADMIN_EMAILS: ${ADMIN_EMAILS} SEED_ON_START: ${SEED_ON_START:-false} DRIZZLE_MIGRATIONS_FOLDER: drizzle ports: - "3000:3000" depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - app-starter-network volumes: - ./uploads:/app/uploads healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/api/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"] interval: 30s timeout: 10s retries: 3 start_period: 40s volumes: app_starter_postgres_data: driver: local app_starter_redis_data: driver: local networks: app-starter-network: driver: bridge