后端部署

推荐先看 Docker 一键部署 —— 单镜像 / 单容器同时提供控制台与 API。 本页用于「只部署 API」「源码编译单二进制」「传统服务器(Supervisor / Nginx)」等场景。

1. 构建

在单仓的 backend/ 目录下:

1cd backend
2
3# 方式一:Makefile(下载依赖 + fmt + 构建,输出 bin/github.com/difyz9/pay-unify)
4make build
5
6# 方式二:直接构建
7CGO_ENABLED=0 GOOS=linux go build -o pay-unify-server .

常用 Makefile 目标:run(构建并运行)、test / test-coveragedocsswag init 重新生成 API 文档)、 docker(构建镜像)、lint / security / fmt / deps / check-secrets

单二进制(内嵌前端,推荐)

后端通过 //go:embed all:web 内嵌前端静态资源,可打包为单文件可部署

1cd backend
2make build-all FRONTEND_DIR=../frontend   # ① 前端静态导出到 backend/web/ ② 编译 ./pay_unify_all
3./pay_unify_all                           # 一个二进制同时提供 API + 控制台
4make clean-web                            # 清理内嵌产物,恢复占位页

backend/Makefile 默认 FRONTEND_DIR=../pay-unify-frontend 是旧拆仓目录名, 在单仓中执行时请显式覆盖为 ../frontend。 导出前会自动临时移开 frontend/src/app/apisrc/middleware.ts(静态导出不支持),构建后还原。

2. Docker(仅 API 镜像)

backend/Dockerfile 只含后端(也可内嵌 backend/web/ 里已有的前端产物):

1cd backend
2docker build -t pay-unify-api:2.0.1 .
3docker run -d --name pay-unify-api \
4  -p 8080:8080 \
5  -e CONFIG_FILE=/app/config.toml \
6  -e PANEL_DB_HOST=host.docker.internal \
7  -e PANEL_DB_NAME=payment_db -e PANEL_DB_USER=root -e PANEL_DB_USER_PASSWORD=secret \
8  -v "$PWD/runtime:/app/runtime" \
9  -v "$PWD/logs:/app/logs" \
10  --restart unless-stopped \
11  pay-unify-api:2.0.1

容器内要点:

  • WORKDIR /app/,监听 :8080EXPOSE 8080),自带 HEALTHCHECKwget /health/db)。
  • 运行用户为 app(uid/gid 1000,非 root);bind mount 时需保证目录可写。
  • 证书 Web 上传内容落盘 runtime/certs/务必持久化
  • 配置读取支持环境变量(CONFIG_FILEPAY_*PANEL_DB_*),详见环境变量参考

Docker Compose(仅 API + MySQL)

仓库根 docker-compose.yml 已编排「单镜像 + MySQL」。若只想跑 API,可参考:

1services:
2  mysql:
3    image: mysql:8.0
4    command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
5    environment:
6      MYSQL_ROOT_PASSWORD: change-me
7      MYSQL_DATABASE: payment_db
8    volumes: [ mysql-data:/var/lib/mysql ]
9
10  backend:
11    build:
12      context: .
13      dockerfile: backend/Dockerfile
14    ports: [ "8097:8080" ]
15    environment:
16      CONFIG_FILE: /app/runtime/config.toml
17      PANEL_DB_TYPE: mysql
18      PANEL_DB_HOST: mysql
19      PANEL_DB_NAME: payment_db
20      PANEL_DB_USER: root
21      PANEL_DB_USER_PASSWORD: change-me
22    volumes:
23      - backend-runtime:/app/runtime
24    depends_on: [ mysql ]
25
26volumes:
27  mysql-data:
28  backend-runtime:

3. Supervisor 部署(传统服务器)

仓库提供 backend/supervisor-deploy.sh(以 root 运行):自动安装 Supervisor、 将配置写入 /etc/supervisor/conf.d/、编译产物并 supervisorctl restart

1cd backend
2sudo ./supervisor-deploy.sh
3# 常用管理
4supervisorctl status pay-unify
5supervisorctl tail -f pay-unify stderr

4. 反向代理(Nginx)

若采用前后端分离部署,后端 API 反代示例:

1server {
2    listen 80;
3    server_name api.your-domain.com;
4
5    location / {
6        proxy_pass http://127.0.0.1:8097;
7        proxy_set_header Host $host;
8        proxy_set_header X-Real-IP $remote_addr;
9        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10    }
11
12    # 渠道异步回调必须公网可达;生产务必启用 HTTPS 443
13    location /api/v1/payment/notify/ { proxy_pass http://127.0.0.1:8097; }
14}

支付宝 / 微信的异步通知(/api/v1/payment/notify/*)要求公网可访问的 HTTPS 地址(沙箱除外), 请把回调域名配置到对应渠道的 NotifyURL

5. 发布前检查清单

1cd backend
2make check-secrets && go test ./...

人工核对:

  1. 密钥安全JWT.SecretKey 使用 openssl rand -hex 32 生成(≥32 字节);config.toml 不进 git、权限 chmod 600
  2. 证书文件:支付宝(应用私钥 / 应用公钥证书 / 支付宝公钥证书 / 根证书)、微信(商户 API 私钥 PKCS8)、 SkillHub(RSA 2048 私钥);或全部改用证书管理 Web 上传,自动落盘 runtime/certs/
  3. 数据库:MySQL 8.0+,utf8mb4;首次启动自动建表 + 种子数据。
  4. 生产开关Debug = false、渠道 SandBox = false、按需关闭 Auth.EnableRegister
  5. 可观测:Zap 结构化日志(logs/ / 容器 stdout),结合 docker logs 或 supervisor 查看; 指标 GET /metrics,探针 /health/health/db

6. 扩容与定时任务

  • OrderScheduler(每 5 分钟扫描,关闭 15 分钟前未支付订单)随进程启动,单实例部署即可; 多副本时建议仅保留一个调度实例。
  • 管理端配置变更(渠道开关 / 证书)为进程内热加载,多副本时依赖同一条 MySQL 保证最终一致。

相关文档