diff --git a/Dockerfile b/Dockerfile index de36472..95d6890 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,7 @@ FROM golang:1.23-alpine AS builder WORKDIR /app RUN apk add --no-cache git ca-certificates +ENV GOPROXY=https://goproxy.cn,direct COPY go.mod go.sum ./ RUN go mod download diff --git a/deploy/monitoring/expiry_alert_rules.yml b/deploy/monitoring/expiry_alert_rules.yml new file mode 100644 index 0000000..3ca989d --- /dev/null +++ b/deploy/monitoring/expiry_alert_rules.yml @@ -0,0 +1,29 @@ +groups: + - name: expiry-api-rules + rules: + - alert: ExpiryApiDown + expr: up{job="wx_service_api"} == 0 + for: 1m + labels: + severity: critical + annotations: + summary: "wx_service API 实例不可用" + description: "实例 {{ $labels.instance }} 已连续 1 分钟不可用" + + - alert: ExpiryApiHighLatencyP95 + expr: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket{job="wx_service_api",path=~"/api/expiry/.*"}[5m])) by (le)) > 0.5 + for: 5m + labels: + severity: warning + annotations: + summary: "Expiry API P95 延迟过高" + description: "过去 5 分钟 P95 延迟超过 500ms" + + - alert: ExpiryApiErrorRateHigh + expr: (sum(rate(http_requests_total{job="wx_service_api",path=~"/api/expiry/.*",status=~"5.."}[5m])) / sum(rate(http_requests_total{job="wx_service_api",path=~"/api/expiry/.*"}[5m]))) > 0.03 + for: 5m + labels: + severity: warning + annotations: + summary: "Expiry API 5xx 错误率过高" + description: "过去 5 分钟 5xx 错误率超过 3%" diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 1099d79..a9202a2 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -7,6 +7,10 @@ services: restart: always env_file: - .env + environment: + DB_HOST: mysql + DB_PORT: 3306 + REDIS_ADDR: redis:6379 ports: - "8080:8080" depends_on: @@ -25,8 +29,6 @@ services: environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME} - ports: - - "3306:3306" volumes: - mysql_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password --innodb-buffer-pool-size=256M @@ -35,8 +37,6 @@ services: image: redis:7-alpine container_name: wx_service_redis restart: always - ports: - - "6379:6379" volumes: - redis_data:/data command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru diff --git a/docs/expiry/reports/production_deploy_2026-03-04.md b/docs/expiry/reports/production_deploy_2026-03-04.md new file mode 100644 index 0000000..60d190c --- /dev/null +++ b/docs/expiry/reports/production_deploy_2026-03-04.md @@ -0,0 +1,28 @@ +# 生产部署执行报告(2026-03-04) + +## 执行内容 +1. 生产镜像构建与容器启动(mysql/redis/api) +2. 数据库初始化:执行 `docs/sql/expiry.sql` +3. 健康检查验证:`/healthz`、`/api/expiry/healthz` +4. 监控告警规则配置:`deploy/monitoring/expiry_alert_rules.yml` + +## 执行命令(摘要) +```bash +docker compose -f docker-compose.prod.yml up -d --build mysql redis api + +docker compose -f docker-compose.prod.yml exec -T mysql \ + mysql -uroot -p"${DB_PASSWORD}" "${DB_NAME}" < docs/sql/expiry.sql + +curl http://127.0.0.1:8080/healthz +curl http://127.0.0.1:8080/api/expiry/healthz +``` + +## 验证结果 +- 容器状态:`wx_service_api / wx_service_mysql / wx_service_redis` 均为 Up +- 健康检查: + - `/healthz` 返回 `{"status":"ok"}` + - `/api/expiry/healthz` 返回 `{"code":0,"message":"success"...}` + +## 小程序提审说明 +- 服务端接口已部署并可用。 +- 小程序“提审上线”需在微信公众平台人工提交,本次已完成提审前后端部署准备。