diff --git a/.env.prod.example b/.env.prod.example new file mode 100644 index 0000000..f402e1e --- /dev/null +++ b/.env.prod.example @@ -0,0 +1,23 @@ +# ---------- MySQL Center ---------- +MYSQL_CENTER_ROOT_PASSWORD=change-me-center-root +MYSQL_CENTER_DATABASE=fabric_center +MYSQL_CENTER_USER=fabric +MYSQL_CENTER_PASSWORD=change-me-center-db + +# ---------- MySQL Guild ---------- +MYSQL_GUILD_ROOT_PASSWORD=change-me-guild-root +MYSQL_GUILD_DATABASE=fabric_guild +MYSQL_GUILD_USER=fabric +MYSQL_GUILD_PASSWORD=change-me-guild-db + +# ---------- Center secrets ---------- +CENTER_SHARED_SECRET=change-me-center-shared-secret +JWT_ACCESS_SECRET=change-me-jwt-access-secret +JWT_REFRESH_SECRET=change-me-jwt-refresh-secret + +# ---------- Guild auth ---------- +FABRIC_API_KEY=change-me-fabric-api-key + +# ---------- Optional webhook ---------- +FABRIC_WEBHOOK_URL= +FABRIC_WEBHOOK_SECRET= diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..5a86db7 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,90 @@ +services: + mysql-center: + image: mysql:8.4 + container_name: fabric-mysql-center + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_CENTER_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_CENTER_DATABASE:-fabric_center} + MYSQL_USER: ${MYSQL_CENTER_USER:-fabric} + MYSQL_PASSWORD: ${MYSQL_CENTER_PASSWORD} + ports: + - "3307:3306" + volumes: + - mysql_center_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-p${MYSQL_CENTER_ROOT_PASSWORD}"] + interval: 10s + timeout: 5s + retries: 12 + + mysql-guild: + image: mysql:8.4 + container_name: fabric-mysql-guild + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_GUILD_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_GUILD_DATABASE:-fabric_guild} + MYSQL_USER: ${MYSQL_GUILD_USER:-fabric} + MYSQL_PASSWORD: ${MYSQL_GUILD_PASSWORD} + ports: + - "3308:3306" + volumes: + - mysql_guild_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-p${MYSQL_GUILD_ROOT_PASSWORD}"] + interval: 10s + timeout: 5s + retries: 12 + + backend-center: + build: + context: ./Fabric.Backend.Center + dockerfile: Dockerfile + container_name: fabric-backend-center + restart: unless-stopped + depends_on: + mysql-center: + condition: service_healthy + environment: + PORT: 7001 + DB_HOST: mysql-center + DB_PORT: 3306 + DB_USER: ${MYSQL_CENTER_USER:-fabric} + DB_PASSWORD: ${MYSQL_CENTER_PASSWORD} + DB_NAME: ${MYSQL_CENTER_DATABASE:-fabric_center} + DB_SYNC: "false" + DB_LOGGING: "false" + CENTER_SHARED_SECRET: ${CENTER_SHARED_SECRET} + JWT_ACCESS_SECRET: ${JWT_ACCESS_SECRET} + JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET} + ports: + - "7001:7001" + + backend-guild: + build: + context: ./Fabric.Backend.Guild + dockerfile: Dockerfile + container_name: fabric-backend-guild + restart: unless-stopped + depends_on: + mysql-guild: + condition: service_healthy + environment: + PORT: 7002 + DB_HOST: mysql-guild + DB_PORT: 3306 + DB_USER: ${MYSQL_GUILD_USER:-fabric} + DB_PASSWORD: ${MYSQL_GUILD_PASSWORD} + DB_NAME: ${MYSQL_GUILD_DATABASE:-fabric_guild} + DB_SYNC: "false" + DB_LOGGING: "false" + FABRIC_API_KEY: ${FABRIC_API_KEY} + FABRIC_WEBHOOK_URL: ${FABRIC_WEBHOOK_URL:-} + FABRIC_WEBHOOK_SECRET: ${FABRIC_WEBHOOK_SECRET:-} + ports: + - "7002:7002" + +volumes: + mysql_center_data: + mysql_guild_data: diff --git a/docs/TODO-backend-center-guild.md b/docs/TODO-backend-center-guild.md index c275c63..127a855 100644 --- a/docs/TODO-backend-center-guild.md +++ b/docs/TODO-backend-center-guild.md @@ -93,7 +93,7 @@ --- ## 6. 部署与运维 -- [ ] `docker-compose.prod.yml`(去掉 `DB_SYNC=true`) +- [x] `docker-compose.prod.yml`(去掉 `DB_SYNC=true`) - [ ] DB migration 机制(TypeORM migration) - [ ] 结构化日志 + request id - [ ] 基础监控指标(QPS、延迟、错误率)