# Photography Portfolio Backend - Docker Compose # 本地开发和测试环境配置 # version 字段已废弃,不再需要使用 # version: '3.8' services: # PostgreSQL 数据库 db: image: postgres:16-alpine container_name: photography-db environment: POSTGRES_DB: photography POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres123 POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C" ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./configs/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql:ro networks: - photography-network restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d photography"] interval: 10s timeout: 5s retries: 5 # Redis 缓存 redis: image: redis:7-alpine container_name: photography-redis ports: - "6379:6379" volumes: - redis_data:/data - ./configs/redis.conf:/usr/local/etc/redis/redis.conf:ro command: redis-server /usr/local/etc/redis/redis.conf networks: - photography-network restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 # 后端API服务 api: build: context: . dockerfile: Dockerfile container_name: photography-api environment: # 数据库配置 DB_HOST: db DB_PORT: 5432 DB_NAME: photography DB_USER: postgres DB_PASSWORD: postgres123 DB_SSL_MODE: disable # Redis配置 REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASSWORD: "" REDIS_DB: 0 # JWT配置 JWT_SECRET: your-super-secret-jwt-key-change-in-production JWT_EXPIRE: 24h # 服务配置 APP_ENV: development APP_PORT: 8080 APP_HOST: 0.0.0.0 # CORS配置 CORS_ORIGINS: "http://localhost:3000,http://localhost:3001,http://localhost:5173" # 文件上传配置 UPLOAD_PATH: /app/uploads UPLOAD_MAX_SIZE: 10485760 # 10MB # 日志配置 LOG_LEVEL: info LOG_FORMAT: json ports: - "8080:8080" volumes: - uploads_data:/app/uploads - logs_data:/app/logs networks: - photography-network depends_on: db: condition: service_healthy redis: condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD", "/photography-api", "--health-check"] interval: 30s timeout: 10s retries: 3 start_period: 10s # 数据库迁移服务 (一次性运行) migrate: build: context: . dockerfile: Dockerfile container_name: photography-migrate environment: DB_HOST: db DB_PORT: 5432 DB_NAME: photography DB_USER: postgres DB_PASSWORD: postgres123 DB_SSL_MODE: disable networks: - photography-network depends_on: db: condition: service_healthy entrypoint: ["/migrate", "up"] restart: "no" volumes: postgres_data: driver: local redis_data: driver: local uploads_data: driver: local logs_data: driver: local networks: photography-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16