# 在 campus-server 目录执行;仅默认启动基础设施,backend 需显式启用 app profile。 services: mysql: image: mysql:8.4 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?请先设置 MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${DB_NAME:-qinghe_local} MYSQL_USER: ${DB_USERNAME:-qinghe} MYSQL_PASSWORD: ${DB_PASSWORD:?请先设置 DB_PASSWORD} TZ: Asia/Shanghai command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] ports: - "127.0.0.1:${DB_PORT:-13306}:3306" volumes: - mysql-data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "MYSQL_PWD=\"$$MYSQL_PASSWORD\" mysql --protocol=TCP -h 127.0.0.1 -u\"$$MYSQL_USER\" \"$$MYSQL_DATABASE\" -e 'SELECT 1' >/dev/null"] interval: 10s timeout: 5s retries: 20 start_period: 40s redis: image: redis:7.4-alpine environment: REDIS_PASSWORD: ${REDIS_PASSWORD:?请先设置 REDIS_PASSWORD} command: ["sh", "-c", "exec redis-server --appendonly yes --requirepass \"$$REDIS_PASSWORD\""] ports: - "127.0.0.1:${REDIS_PORT:-16379}:6379" volumes: - redis-data:/data healthcheck: test: ["CMD-SHELL", "REDISCLI_AUTH=\"$$REDIS_PASSWORD\" redis-cli ping | grep -q PONG"] interval: 10s timeout: 5s retries: 10 rabbitmq: image: rabbitmq:4.1-management environment: RABBITMQ_DEFAULT_USER: ${RABBITMQ_USERNAME:-qinghe} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:?请先设置 RABBITMQ_PASSWORD} ports: - "127.0.0.1:${RABBITMQ_PORT:-15672}:5672" - "127.0.0.1:${RABBITMQ_MANAGEMENT_PORT:-15673}:15672" volumes: - rabbitmq-data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 10s timeout: 10s retries: 20 start_period: 30s backend: profiles: ["app"] build: context: . dockerfile: Dockerfile env_file: - .env environment: DB_HOST: mysql DB_PORT: "3306" REDIS_HOST: redis REDIS_PORT: "6379" RABBITMQ_HOST: rabbitmq RABBITMQ_PORT: "5672" SERVER_PORT: "8009" JWT_SECRET: ${JWT_SECRET:?请先设置 JWT_SECRET} # env_file 中空值不会触发 Spring 的默认值,这里统一回落到明确的本地占位值。 OSS_ENDPOINT: ${OSS_ENDPOINT:-http://127.0.0.1:19000} OSS_ACCESS_KEY_ID: ${OSS_ACCESS_KEY_ID:-your-local-placeholder} OSS_ACCESS_KEY_SECRET: ${OSS_ACCESS_KEY_SECRET:-your-local-placeholder} OSS_BUCKET_NAME: ${OSS_BUCKET_NAME:-qinghe-local-placeholder} OSS_DOMAIN: ${OSS_DOMAIN:-http://127.0.0.1:19000} SMS_ACCESS_KEY_ID: ${SMS_ACCESS_KEY_ID:-your-local-placeholder} SMS_ACCESS_KEY_SECRET: ${SMS_ACCESS_KEY_SECRET:-your-local-placeholder} SMS_SIGN_NAME: ${SMS_SIGN_NAME:-local-placeholder} SMS_TEMPLATE_CODE: ${SMS_TEMPLATE_CODE:-local-placeholder} SMS_REGION_ID: ${SMS_REGION_ID:-cn-hangzhou} ports: - "127.0.0.1:${SERVER_PORT:-8009}:8009" depends_on: mysql: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy volumes: mysql-data: redis-data: rabbitmq-data: