services: frontend: build: context: ./frontend dockerfile: Dockerfile container_name: camtalk-frontend ports: - "9000:80" depends_on: - backend networks: - camtalk-net restart: unless-stopped backend: build: context: ./backend dockerfile: Dockerfile container_name: camtalk-backend env_file: - .env environment: # 三级存储配置(敏感信息通过 env_file 注入) - CAMTALK_STORAGE_REDIS_ENABLED=${CAMTALK_STORAGE_REDIS_ENABLED:-true} - CAMTALK_STORAGE_PERSISTENCE_ENABLED=${CAMTALK_STORAGE_PERSISTENCE_ENABLED:-true} - CAMTALK_STORAGE_PERSISTENCE_DRIVER=${CAMTALK_STORAGE_PERSISTENCE_DRIVER:-postgres} - CAMTALK_REDIS_ADDR=redis:6379 depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - camtalk-net restart: unless-stopped postgres: image: docker.m.daocloud.io/library/postgres:15-alpine container_name: camtalk-postgres env_file: - .env environment: POSTGRES_DB: camtalk volumes: - pgdata:/var/lib/postgresql/data - ./backend/migrations:/docker-entrypoint-initdb.d networks: - camtalk-net healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d camtalk"] interval: 5s timeout: 3s retries: 10 restart: unless-stopped redis: image: docker.m.daocloud.io/library/redis:7-alpine container_name: camtalk-redis env_file: - .env command: > sh -c ' if [ -n "$$CAMTALK_REDIS_PASSWORD" ]; then exec redis-server --appendonly yes --requirepass "$$CAMTALK_REDIS_PASSWORD" else exec redis-server --appendonly yes fi' volumes: - redisdata:/data networks: - camtalk-net healthcheck: test: ["CMD-SHELL", "if [ -n \"$$CAMTALK_REDIS_PASSWORD\" ]; then redis-cli -a \"$$CAMTALK_REDIS_PASSWORD\" ping; else redis-cli ping; fi"] interval: 5s timeout: 3s retries: 10 restart: unless-stopped volumes: pgdata: redisdata: networks: camtalk-net: driver: bridge