# 微信小程序上线清单 > 最后更新:2026-02-20 > 本文档合并自 ENV-MANAGEMENT.md、MINIPROGRAM-RELEASE.md、PRE-TEST-VERIFICATION.md 及补充建议。 > 按优先级从高到低排列,同时兼顾依赖关系(后续步骤依赖前置步骤完成)。 > 每项完成后在状态栏标注完成日期。 --- ## 阅读指南 - 状态标记:待办 = 空框,已完成 = 日期 - 优先级:P0 = 不做就上不了线,P1 = 上线前必须做,P2 = 可上线后迭代 - 依赖关系用箭头标注,如 "依赖 1.1" 表示需要先完成第 1.1 项 --- ## 第一阶段:基础设施(P0 - 一切的前提) 所有后续步骤都建立在"三个环境能跑起来"的基础上。 ### 1.1 服务器环境初始化 | 状态 | 项目 | |------|------| | 完成 20260220 | 在 Windows Server 上创建目录结构 | | 完成 20260220 | 克隆仓库并切换分支 | | 完成 20260224 | 配置环境变量文件 | | 完成 20260224 | 安装 Python 依赖 | | 完成 20260224 | 运行 `setup-server-git.py` 配置 Git 排除规则 | | 完成 20260224 | 运行 `init-server-env.py` 删除排除文件 + 创建 export 目录 | 在 Windows Server 上执行: ```powershell # 创建目录(日志统一放在 repo/export/ 下,随 .env 配置走) New-Item -ItemType Directory -Path D:\NeoZQYY\test\repo -Force New-Item -ItemType Directory -Path D:\NeoZQYY\prod\repo -Force New-Item -ItemType Directory -Path D:\NeoZQYY\scripts -Force ``` > 旧方案在 repo 外单独建 `logs/` 目录,现已废弃。 > 所有运行时输出(日志、JSON 导出、报告)统一放在 `repo/export/` 下, > 路径由 `.env` 中的 `LOG_ROOT`、`EXPORT_ROOT` 等变量控制。 > 详见 [`docs/deployment/EXPORT-PATHS.md`](EXPORT-PATHS.md)。 ```powershell # 克隆仓库 cd D:\NeoZQYY\test git clone https://git.langlangzhuoqiu.cn/root/Neo-ZQYY.git repo cd repo git checkout test cd D:\NeoZQYY\prod git clone https://git.langlangzhuoqiu.cn/root/Neo-ZQYY.git repo cd repo git checkout master ``` 环境变量文件(不从 Git 同步,手动创建): 测试环境 `D:\NeoZQYY\test\repo\.env`: ```env DB_HOST=100.64.0.4 DB_PORT=5432 DB_USER=local-Python DB_PASSWORD=<密码> APP_DB_NAME=test_zqyy_app ETL_DB_NAME=test_etl_feiqiu PG_DSN=postgresql://<用户>:<密码>@<主机>:5432/test_etl_feiqiu APP_DB_DSN=postgresql://<用户>:<密码>@<主机>:5432/test_zqyy_app LOG_LEVEL=DEBUG # 输出路径(统一放在 repo/export/ 下) EXPORT_ROOT=D:/NeoZQYY/test/repo/export/ETL-Connectors/feiqiu/JSON LOG_ROOT=D:/NeoZQYY/test/repo/export/ETL-Connectors/feiqiu/LOGS FETCH_ROOT=D:/NeoZQYY/test/repo/export/ETL-Connectors/feiqiu/JSON ETL_REPORT_ROOT=D:/NeoZQYY/test/repo/export/ETL-Connectors/feiqiu/REPORTS SYSTEM_ANALYZE_ROOT=D:/NeoZQYY/test/repo/export/SYSTEM/REPORTS/dataflow_analysis BACKEND_LOG_ROOT=D:/NeoZQYY/test/repo/export/BACKEND/LOGS ``` 正式环境 `D:\NeoZQYY\prod\repo\.env`: ```env DB_HOST=100.64.0.4 DB_PORT=5432 DB_USER=prod-Python DB_PASSWORD=<正式密码> APP_DB_NAME=zqyy_app ETL_DB_NAME=etl_feiqiu PG_DSN=postgresql://<用户>:<密码>@<主机>:5432/etl_feiqiu APP_DB_DSN=postgresql://<用户>:<密码>@<主机>:5432/zqyy_app LOG_LEVEL=INFO # 输出路径(统一放在 repo/export/ 下) EXPORT_ROOT=D:/NeoZQYY/prod/repo/export/ETL-Connectors/feiqiu/JSON LOG_ROOT=D:/NeoZQYY/prod/repo/export/ETL-Connectors/feiqiu/LOGS FETCH_ROOT=D:/NeoZQYY/prod/repo/export/ETL-Connectors/feiqiu/JSON ETL_REPORT_ROOT=D:/NeoZQYY/prod/repo/export/ETL-Connectors/feiqiu/REPORTS SYSTEM_ANALYZE_ROOT=D:/NeoZQYY/prod/repo/export/SYSTEM/REPORTS/dataflow_analysis BACKEND_LOG_ROOT=D:/NeoZQYY/prod/repo/export/BACKEND/LOGS ``` > 正式环境建议使用独立的数据库用户(如 `prod-Python`),权限最小化。 ```powershell # 安装依赖(每个环境各自执行) cd D:\NeoZQYY\test\repo uv sync --all-packages cd D:\NeoZQYY\prod\repo uv sync --all-packages ``` ```powershell # 配置服务器 Git 排除规则(每个环境各执行一次) # 跳过 export/、.env 等开发机留存文件,避免占用服务器磁盘 cd D:\NeoZQYY\test\repo python scripts/server/setup-server-git.py cd D:\NeoZQYY\prod\repo python scripts/server/setup-server-git.py ``` ```powershell # 删除排除文件 + 创建 export 目录树(test + prod 一次搞定) cd D:\NeoZQYY python test\repo\scripts\server\init-server-env.py # 也可以只初始化单个环境 python test\repo\scripts\server\init-server-env.py --envs test python prod\repo\scripts\server\init-server-env.py --envs prod ``` Git 排除方案说明(统一 .gitignore + skip-worktree): 三个分支(dev / test / master)共用同一份 `.gitignore`(宽松版,允许 `.env`、`export/` 等留存文件提交)。 服务器上通过 `setup-server-git.py` 一次性配置,不需要每个分支维护不同的 `.gitignore`。 工作原理: 1. 脚本将 `scripts/server/server-exclude.txt` 复制到 `.git/info/exclude`(本地排除,不影响仓库) 2. 对已 track 但服务器不需要的文件设置 `git update-index --skip-worktree` 3. 后续 `git pull` 不会还原这些文件,可安全删除释放磁盘空间 被排除的内容(完整列表见 `scripts/server/server-exclude.txt`): - `.env` / `.env.local` -- 服务器有自己的环境配置 - `export/` -- ETL 导出数据(仅开发机留存) - `docs/` -- 全部文档(部署、PRD、H5 原型、审计、架构等) - `apps/miniprogram/` -- 小程序源码(服务器不编译小程序) - `apps/admin-web/src/` -- 管理后台源码(保留 dist/) - `tests/`、`.hypothesis/` -- 测试相关 - `samples/`、`infra/` -- 示例数据和基础设施文档 - `scripts/ops/`、`scripts/audit/`、`scripts/migrate/` -- 开发用脚本 - `.kiro/` -- Kiro 配置 - 根目录截图(`*.png`)、`.code-workspace` 等 优点: - merge 零冲突(三个分支 `.gitignore` 完全一致) - 服务器首次 clone 后运行一次脚本即可,后续 `git pull` 正常工作 - 开发机的留存文件正常提交到 Git,不受影响 环境总览: | 环境 | 位置 | Git 分支 | 数据库 | 用途 | |------|------|----------|--------|------| | 开发 | 本机 `C:\NeoZQYY` | `dev` | `test_etl_feiqiu` / `test_zqyy_app` | 日常开发 | | 测试 | 服务器 `D:\NeoZQYY\test\repo` | `test` | `test_etl_feiqiu` / `test_zqyy_app` | 集成测试 + 小程序体验版 | | 正式 | 服务器 `D:\NeoZQYY\prod\repo` | `master` | `etl_feiqiu` / `zqyy_app` | 生产环境 + 小程序正式版 | ### 1.2 后端服务管理 - bat 脚本(依赖 1.1) | 状态 | 项目 | |------|------| | 完成 20260224 | 将 bat 脚本放到服务器 `D:\NeoZQYY\scripts\` | | 完成 20260224 | 登录服务器手动运行对应脚本启动服务 | > 后续将由监控系统(见 7.2)统一管理所有服务的启停和状态监控。 > 在监控系统上线之前,登录 Windows Server 手动双击 bat 脚本启动。 端口分配: | 服务 | 测试环境 | 正式环境 | |------|----------|----------| | FastAPI 后端 | 8001 | 8000 | 启动脚本 `D:\NeoZQYY\scripts\start-test-api.bat`: ```bat @echo off title NeoZQYY Test API (port 8001) cd /d D:\NeoZQYY\test\repo\apps\backend D:\NeoZQYY\test\repo\.venv\Scripts\uvicorn.exe app.main:app --host 0.0.0.0 --port 8001 pause ``` 启动脚本 `D:\NeoZQYY\scripts\start-prod-api.bat`: ```bat @echo off title NeoZQYY Prod API (port 8000) cd /d D:\NeoZQYY\prod\repo\apps\backend D:\NeoZQYY\prod\repo\.venv\Scripts\uvicorn.exe app.main:app --host 0.0.0.0 --port 8000 pause ``` 一键全部启动 `D:\NeoZQYY\scripts\start-all.bat`: ```bat @echo off echo 启动测试环境后端... start "NeoZQYY Test API" cmd /c "D:\NeoZQYY\scripts\start-test-api.bat" echo 启动正式环境后端... start "NeoZQYY Prod API" cmd /c "D:\NeoZQYY\scripts\start-prod-api.bat" echo 全部已启动。 pause ``` > 每个 bat 会打开一个独立的 cmd 窗口,窗口标题显示服务名称,方便识别。 > 关闭窗口即停止服务。服务器重启后需要重新手动运行。 ### 1.3 跳板机 Nginx 反代(依赖 1.2) | 状态 | 项目 | |------|------| | 已完成 | 跳板机已配置好(用户确认) | | 已完成 | Tailscale 内网已配置(DB_HOST=100.64.0.4) | | 完成 20260224 | 确认 Nginx 将 `api.langlangzhuoqiu.cn` 反代到 Tailscale IP:8000(正式) | | 完成 20260224 | 确认 Nginx 将测试环境反代到 Tailscale IP:8001(如需区分域名) | | 完成 20260224 | 确认 SSL 证书有效且自动续期 | > 跳板机本身已配好,这里只需确认反代规则指向了正确的后端端口。 > 如果测试和正式共用 `api.langlangzhuoqiu.cn`,则体验版和正式版会打到同一个后端。 > 建议至少在初期区分:`test-api.langlangzhuoqiu.cn` 指向 8001,`api.langlangzhuoqiu.cn` 指向 8000。 ### 1.4 数据库备份方案(依赖 1.1) | 状态 | 项目 | |------|------| | | 编写 pg_dump 备份脚本 | | | 配置 Windows 计划任务定时执行 | | | 执行一次恢复演练验证备份可用 | > 你的 Windows Server 是单点,正式库 `etl_feiqiu` 和 `zqyy_app` 丢了不可逆。 > 建议每天凌晨自动 pg_dump,保留最近 7 天。备份文件可以同步到跳板机或其他位置做异地冗余。 示例备份脚本(放 `D:\NeoZQYY\scripts\backup-db.ps1`): ```powershell $date = Get-Date -Format "yyyy-MM-dd" $backupDir = "D:\NeoZQYY\backups" New-Item -ItemType Directory -Path $backupDir -Force # 正式 ETL 库 pg_dump -h 100.64.0.4 -U prod-Python -d etl_feiqiu -F c -f "$backupDir\etl_feiqiu_$date.dump" # 正式业务库 pg_dump -h 100.64.0.4 -U prod-Python -d zqyy_app -F c -f "$backupDir\zqyy_app_$date.dump" # 清理 7 天前的备份 Get-ChildItem $backupDir -Filter "*.dump" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item ``` 用 Windows 计划任务每天凌晨 3:00 执行此脚本。 --- ## 第二阶段:微信侧配置(P0 - 小程序能跑的前提) 这些是微信平台的硬性要求,缺任何一项小程序都无法在真机上正常运行或通过审核。 ### 2.1 合法域名 + HTTPS | 状态 | 项目 | |------|------| | 已完成 | request 合法域名:`https://api.langlangzhuoqiu.cn` | | 已完成 | socket 合法域名:`wss://socket.langlangzhuoqiu.cn` | | 已完成 | uploadFile 合法域名:`https://file.langlangzhuoqiu.cn` | | 已完成 | downloadFile 合法域名:`https://file.langlangzhuoqiu.cn` | > 已在微信公众平台后台配置完成。 ### 2.2 消息推送配置(依赖 1.2 + 1.3) | 状态 | 项目 | |------|------| | 已完成 | 后端接口 `GET/POST /api/wx/callback` 已实现(`wx_callback.py`) | | 已完成 | 在 `apps/backend/.env.local` 中配置 `WX_CALLBACK_TOKEN` | | 已完成 | 服务器上部署最新代码并重启后端 | | 未完成 | 微信后台填写消息推送配置并提交验证 | > 消息推送配置必须在服务器后端已启动、跳板机反代已就绪之后才能操作。 > 微信会向你的 URL 发 GET 请求验签,后端必须在线才能通过。 微信后台配置(开发 - 开发管理 - 消息推送): | 字段 | 值 | |------|------| | URL | `https://api.langlangzhuoqiu.cn/api/wx/callback` | | Token | `LLZQwx2026push`(和 .env.local 里一致,可自定义) | | EncodingAESKey | 点"随机生成" | | 消息加解密方式 | 先选"明文模式"(跑通后再切安全模式) | | 数据格式 | JSON | 点"提交"后微信发 GET 验证。如果失败,最常见原因: - 服务器后端未启动 - Nginx 反代未指向正确端口 - Token 两边不一致 **需要支持加密模式,见增补文档路径下的文档** ### 2.3 隐私协议 / 用户隐私保护指引 | 状态 | 项目 | |------|------| | | 在微信后台填写用户隐私保护指引 | | | 小程序端实现隐私授权弹窗组件 | 操作路径:微信后台 → 账号设置 → 服务内容声明 → 用户隐私保护指引 → 去完善 (也可在提交审核时填写,入口:管理 → 版本管理 → 提交代码审核) 根据你实际使用的隐私接口声明,对照官方列表: https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html 当前项目可能涉及的声明项: - 收集你的手机号(如果用了 `