chore(deploy): 完成 #35 部署准备
This commit is contained in:
@@ -68,6 +68,12 @@ WECHAT_OA_APP_ID=replace-with-oa-appid
|
||||
WECHAT_OA_APP_SECRET=replace-with-oa-appsecret
|
||||
WECHAT_OA_TIMEOUT_SECONDS=5
|
||||
|
||||
# 保质期小程序(前端/运维联调)
|
||||
# 小程序前端请求后端时使用的 API 根地址
|
||||
EXPIRY_API_BASE_URL=https://api.example.com
|
||||
# 小程序 AppID(前端 manifest.json 同步)
|
||||
EXPIRY_MINIAPP_APP_ID=replace-with-miniapp-appid
|
||||
|
||||
# Redis(可选,用于缓存 session_key -> user)
|
||||
# 不配置 REDIS_ADDR 时,程序会自动禁用 Redis,保持原来每次请求查 MySQL 的方式。
|
||||
REDIS_ADDR=127.0.0.1:6379
|
||||
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
FROM golang:1.23-alpine AS builder
|
||||
WORKDIR /app
|
||||
|
||||
RUN apk add --no-cache git ca-certificates
|
||||
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
COPY . .
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /wx_service ./cmd/api
|
||||
|
||||
FROM alpine:3.20
|
||||
WORKDIR /app
|
||||
|
||||
RUN apk add --no-cache ca-certificates wget && update-ca-certificates
|
||||
|
||||
COPY --from=builder /wx_service /app/wx_service
|
||||
COPY .env /app/.env
|
||||
|
||||
EXPOSE 8080
|
||||
CMD ["/app/wx_service"]
|
||||
@@ -36,6 +36,31 @@ server {
|
||||
|
||||
client_max_body_size 50m;
|
||||
|
||||
# 健康检查接口
|
||||
location = /healthz {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_set_header Connection "";
|
||||
proxy_pass http://wx_service_upstream;
|
||||
}
|
||||
|
||||
# 业务接口(包括 /api/v1 与 /api/expiry)
|
||||
location /api/ {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_set_header Connection "";
|
||||
proxy_connect_timeout 10s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
proxy_pass http://wx_service_upstream;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
@@ -46,4 +71,3 @@ server {
|
||||
proxy_pass http://wx_service_upstream;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
services:
|
||||
api:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: wx_service_api
|
||||
restart: always
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- "8080:8080"
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1:8080/healthz"]
|
||||
interval: 20s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
container_name: wx_service_mysql
|
||||
restart: always
|
||||
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
|
||||
|
||||
redis:
|
||||
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
|
||||
|
||||
nginx:
|
||||
image: nginx:1.27-alpine
|
||||
container_name: wx_service_nginx
|
||||
restart: always
|
||||
depends_on:
|
||||
- api
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./deploy/nginx/wx_service_https.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
# 请在部署机上挂载真实证书路径(示例)
|
||||
# - /etc/letsencrypt:/etc/letsencrypt:ro
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
redis_data:
|
||||
@@ -0,0 +1,56 @@
|
||||
# 保质期小程序部署说明
|
||||
|
||||
## 1. 准备
|
||||
1. 复制环境变量模板:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
2. 按实际环境填写 `.env`:数据库、Redis、AI、七牛、小程序 AppID、API 域名。
|
||||
3. 确认域名解析到部署机:
|
||||
- `api.example.com -> 服务器公网 IP`
|
||||
|
||||
## 2. 数据库初始化
|
||||
```bash
|
||||
mysql -h <host> -u <user> -p <db_name> < docs/sql/expiry.sql
|
||||
```
|
||||
|
||||
## 3. 一键部署(Docker Compose)
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml up -d --build
|
||||
```
|
||||
|
||||
## 4. Nginx HTTPS 配置
|
||||
1. 修改 `deploy/nginx/wx_service_https.conf` 中 `server_name` 与证书路径。
|
||||
2. 挂载证书目录(例如 `/etc/letsencrypt`)。
|
||||
3. 重载 Nginx:
|
||||
```bash
|
||||
docker exec wx_service_nginx nginx -s reload
|
||||
```
|
||||
|
||||
## 5. 验证
|
||||
1. 健康检查:
|
||||
```bash
|
||||
curl -i https://api.example.com/healthz
|
||||
curl -i https://api.example.com/api/expiry/healthz
|
||||
```
|
||||
2. 接口联调:
|
||||
```bash
|
||||
BASE_URL=https://api.example.com TOKEN=<session_key> scripts/expiry/run_integration_tests.sh
|
||||
```
|
||||
|
||||
## 6. 小程序侧配置
|
||||
1. `manifest.json` 配置正式 `appid`。
|
||||
2. 在小程序后台添加服务器域名:
|
||||
- request 合法域名:`https://api.example.com`
|
||||
3. 发布前执行:
|
||||
```bash
|
||||
# 在前端仓库 expiry_uniapp 中
|
||||
npm install
|
||||
npm run build -- wx
|
||||
```
|
||||
|
||||
## 7. 回滚
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml down
|
||||
# 回滚到上一版本镜像后再 up -d
|
||||
```
|
||||
Reference in New Issue
Block a user