services: shierfeng-mysql: image: mysql:8.0 container_name: shierfeng-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?请在 .env 中设置 MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE:-shierfeng-fastapi} MYSQL_USER: ${DB_USERNAME:-shierfeng} MYSQL_PASSWORD: ${DB_PASSWORD:?请在 .env 中设置 DB_PASSWORD} TZ: ${TZ:-Asia/Shanghai} command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --skip-character-set-client-handshake=1 volumes: - mysql-data:/var/lib/mysql - ./shierfeng-fastapi-backend/sql/shierfeng-fastapi.sql:/docker-entrypoint-initdb.d/01-shierfeng-fastapi.sql:ro ports: - ${COMPOSE_BIND_IP:-127.0.0.1}:${MYSQL_HOST_PORT:-13307}:3306 healthcheck: test: - CMD-SHELL - >- mysqladmin ping -h 127.0.0.1 -uroot -p"$${MYSQL_ROOT_PASSWORD}" --silent interval: 5s timeout: 10s retries: 30 start_period: 20s networks: - shierfeng-network shierfeng-redis: image: redis:7-alpine container_name: shierfeng-redis restart: unless-stopped command: - redis-server - --appendonly - 'yes' - --save - '60' - '1000' volumes: - redis-data:/data healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 5s retries: 30 start_period: 5s networks: - shierfeng-network shierfeng-backend-my: build: context: ./shierfeng-fastapi-backend dockerfile: Dockerfile.my image: shierfeng-backend-my:latest container_name: shierfeng-backend-my restart: unless-stopped environment: APP_ENV: dockermy APP_HOST: 0.0.0.0 APP_PORT: '9099' APP_ROOT_PATH: /docker-api APP_RELOAD: 'false' APP_WORKERS: '1' APP_DEMO_MODE: 'false' APP_DISABLE_SWAGGER: 'true' APP_DISABLE_REDOC: 'true' DB_TYPE: mysql DB_HOST: shierfeng-mysql DB_PORT: '3306' DB_USERNAME: ${DB_USERNAME:-shierfeng} DB_PASSWORD: ${DB_PASSWORD:?请在 .env 中设置 DB_PASSWORD} DB_DATABASE: ${MYSQL_DATABASE:-shierfeng-fastapi} DB_ECHO: 'false' REDIS_HOST: shierfeng-redis REDIS_PORT: '6379' REDIS_USERNAME: ${REDIS_USERNAME:-} REDIS_PASSWORD: ${REDIS_PASSWORD:-} REDIS_DATABASE: ${REDIS_DATABASE:-2} JWT_SECRET_KEY: ${JWT_SECRET_KEY:?请在 .env 中设置 JWT_SECRET_KEY} TRANSPORT_CRYPTO_ENABLED: ${TRANSPORT_CRYPTO_ENABLED:-false} TRANSPORT_CRYPTO_MODE: ${TRANSPORT_CRYPTO_MODE:-off} LOG_FILE_ENABLED: 'false' LOGURU_STDOUT: 'true' expose: - '9099' ports: - ${COMPOSE_BIND_IP:-127.0.0.1}:${BACKEND_HOST_PORT:-9099}:9099 depends_on: shierfeng-mysql: condition: service_healthy shierfeng-redis: condition: service_healthy healthcheck: test: - CMD-SHELL - >- python -c "import socket; s=socket.create_connection(('127.0.0.1', 9099), 2); s.close()" interval: 10s timeout: 5s retries: 30 start_period: 20s networks: - shierfeng-network shierfeng-frontend: build: context: ./shierfeng-fastapi-frontend dockerfile: Dockerfile image: shierfeng-frontend:latest container_name: shierfeng-frontend restart: unless-stopped ports: - ${COMPOSE_BIND_IP:-127.0.0.1}:${FRONTEND_HOST_PORT:-8080}:80 volumes: - ./shierfeng-fastapi-frontend/bin/nginx.dockermy.conf:/etc/nginx/conf.d/default.conf:ro depends_on: shierfeng-backend-my: condition: service_healthy networks: - shierfeng-network volumes: mysql-data: redis-data: networks: shierfeng-network: name: shierfeng-network driver: bridge