From 4cb3ab6529904a3ecce01ec838a03da817351ebb Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 15 Jun 2026 16:42:42 +0800 Subject: [PATCH] =?UTF-8?q?deploy(M00-E):=20=E8=A1=A5=E5=85=85Certbot?= =?UTF-8?q?=E8=AF=81=E4=B9=A6=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/README.md | 1 + deploy/VERSION | 2 +- deploy/certbot/api.txyundm.cn.commands.md | 31 +++++++++++ docs/api-domain-test-report.md | 5 +- docs/deployment-changelog.md | 12 +++++ docs/deployment-status.md | 16 +++--- docs/devlogs/2026-06-15-M00-A-单仓库基线.md | 5 +- docs/domain-https.md | 5 +- docs/feature-status.md | 2 +- docs/git-deployment.md | 6 +++ docs/module-status.md | 2 +- docs/reference-inventory.md | 10 ++-- docs/release-manifest.md | 3 +- docs/repository-map.md | 1 + scripts/dev/wsl/check-api-domain.sh | 15 +++++- scripts/setup/README.md | 1 + scripts/setup/certbot.sh | 59 +++++++++++++++++++++ scripts/setup/domain-https.sh | 4 ++ scripts/setup/lib.sh | 2 +- 19 files changed, 158 insertions(+), 24 deletions(-) create mode 100644 deploy/certbot/api.txyundm.cn.commands.md create mode 100644 scripts/setup/certbot.sh diff --git a/deploy/README.md b/deploy/README.md index 2aab8e1..3fee8c1 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -37,6 +37,7 @@ - EMQX:输出原生 Apt/无 Docker/MQTTX 禁止策略和本机命令状态。 - HTTPS:输出固定域名、API 路径和 Nginx 配置检查。 - Nginx:提供 `deploy/nginx/api.txyundm.cn.conf.template`,菜单第 4 项会检查模板、站点文件、TLS 和健康端点。 +- 证书:提供 `deploy/certbot/api.txyundm.cn.commands.md`,菜单第 4 项会检查 Certbot、证书文件、续期配置和 `certbot.timer`。 - 非交互检查:`setup.sh --preflight`、`setup.sh --status`、`setup.sh --https`、`setup.sh --diagnose`。 - 状态:显示部署上下文、快检、仓库状态和当前 release manifest。 - 备份:当前生成 manifest-only 备份记录,不触碰真实数据库。 diff --git a/deploy/VERSION b/deploy/VERSION index 3357dc5..f3970da 100644 --- a/deploy/VERSION +++ b/deploy/VERSION @@ -1 +1 @@ -0.1.1-m00-domain-https-check +0.1.2-m00-certbot-check diff --git a/deploy/certbot/api.txyundm.cn.commands.md b/deploy/certbot/api.txyundm.cn.commands.md new file mode 100644 index 0000000..982f700 --- /dev/null +++ b/deploy/certbot/api.txyundm.cn.commands.md @@ -0,0 +1,31 @@ +# api.txyundm.cn Certbot Commands + +This file records the production commands for the Ubuntu administrator. Do not run them from Windows or WSL. + +## Preconditions + +- DNS for `api.txyundm.cn` points to the production Ubuntu server. +- Nginx serves `/.well-known/acme-challenge/` from `/var/www/certbot` on port 80. +- Ports 80 and 443 are open. + +## Issue + +```bash +sudo mkdir -p /var/www/certbot +sudo certbot certonly --webroot -w /var/www/certbot -d api.txyundm.cn +``` + +## Install Nginx Site + +```bash +sudo install -m 0644 /opt/apps/qipai-repo/deploy/nginx/api.txyundm.cn.conf.template /etc/nginx/sites-available/qipai-api.conf +sudo ln -sfn /etc/nginx/sites-available/qipai-api.conf /etc/nginx/sites-enabled/qipai-api.conf +sudo nginx -t +sudo systemctl reload nginx +``` + +## Renew Dry Run + +```bash +sudo certbot renew --dry-run +``` diff --git a/docs/api-domain-test-report.md b/docs/api-domain-test-report.md index f5c1889..87cb13e 100644 --- a/docs/api-domain-test-report.md +++ b/docs/api-domain-test-report.md @@ -3,8 +3,8 @@ | 环境 | 检查项 | 命令/步骤 | 期望 | 实际 | 结果 | 时间 | |---|---|---|---|---|---|---| | Windows | DNS/HTTPS | `scripts/dev/windows/check-api-domain.ps1` | PASS 或明确 WARN | 脚本已生成,待执行 | - | 2026-06-15 | -| WSL | TLS/健康接口 | `setup.sh --https` | PASS 或明确 WARN | DNS 已解析到 `101.42.38.246`;TLS 证书主题为 `CN=git.txyundm.cn`;`/health` 不可达 | WARN | 2026-06-15 | -| Ubuntu | Nginx/证书/公开 API | `setup.sh` 菜单 4 或 `setup.sh --https` | PASS 或明确 WARN | 检查脚本已生成,生产未执行 | - | 2026-06-15 | +| WSL | TLS/健康接口/Certbot | `setup.sh --https`、`scripts/dev/wsl/check-api-domain.sh` | PASS 或明确 WARN | DNS 已解析到 `101.42.38.246`;TLS 证书主题为 `CN=git.txyundm.cn`;`/health`、`/app-api/health`、`/admin-api/health` 不可达;Certbot 生产项未安装 | WARN | 2026-06-15 | +| Ubuntu | Nginx/证书/公开 API/Certbot | `setup.sh` 菜单 4 或 `setup.sh --https` | PASS 或明确 WARN | 检查脚本已生成,生产未执行 | - | 2026-06-15 | | 微信开发者工具 | request/upload/download | 关闭忽略合法域名 | 成功 | 未执行 | - | - | | 微信真机 | 登录/上传/下载/下单/开门 | 体验版 | 成功 | 未执行 | - | - | @@ -18,5 +18,6 @@ ## 问题与修复 - 已补充 Windows 域名检查脚本、Ubuntu 菜单第 4 项检查和 Nginx 模板。 +- 已补充 Certbot 检查脚本和生产管理员命令说明。 - 生产 DNS、证书、Nginx 启用和健康接口仍未完成,不能标记为通过。 - `api.txyundm.cn` 当前解析正常,但证书和健康接口不满足 API 验收要求。 diff --git a/docs/deployment-changelog.md b/docs/deployment-changelog.md index 85b973e..9332f01 100644 --- a/docs/deployment-changelog.md +++ b/docs/deployment-changelog.md @@ -1,5 +1,17 @@ # 部署变更记录 +## 2026-06-15 / 0.1.2-m00-certbot-check + +- 关联模块:M00-E +- 关联 commit:本轮提交推送后以远端 HEAD 为准 +- 变化内容:新增 `scripts/setup/certbot.sh` 和 `deploy/certbot/api.txyundm.cn.commands.md`,菜单第 4 项追加 Certbot、证书文件、续期配置和 `certbot.timer` 检查。 +- 配置变化:`setup.sh --https` 会同时输出证书签发命令和续期 dry-run 命令。 +- 数据库变化:无。 +- 兼容性:仅增加检查和管理员命令说明,不自动申请证书,不写入 `/etc/letsencrypt`。 +- 已执行验证:Windows 本地检查和敏感信息扫描通过;WSL `bash -n`、`setup.sh --preflight/--status/--https/--diagnose`、`scripts/dev/wsl/check-api-domain.sh` 通过,生产项按预期返回 WARN。 +- 回滚方式:移除新增 Certbot 检查脚本和命令说明即可回到 0.1.1 行为;未改动生产环境。 +- 生产环境人工步骤:管理员在 Ubuntu 上准备 `/var/www/certbot`、执行 `certbot certonly --webroot` 和 `certbot renew --dry-run`。 + ## 2026-06-15 / 0.1.1-m00-domain-https-check - 关联模块:M00-E diff --git a/docs/deployment-status.md b/docs/deployment-status.md index 95f53f6..14da942 100644 --- a/docs/deployment-status.md +++ b/docs/deployment-status.md @@ -2,20 +2,20 @@ | 项目 | 当前值 | |---|---| -| 菜单脚本版本 | 0.1.1-m00-domain-https-check | +| 菜单脚本版本 | 0.1.2-m00-certbot-check | | Gitea 仓库 Web | https://git.txyundm.cn/panda/qipai.git | | API 固定域名 | https://api.txyundm.cn | | 小程序 API | https://api.txyundm.cn/app-api | | 后台 API | https://api.txyundm.cn/admin-api | | 上传文件基址 | https://api.txyundm.cn/uploads/ | -| HTTPS 证书到期时间 | 未验证 | -| 证书续期 dry-run | 未验证 | +| HTTPS 证书到期时间 | 线上返回 `2026-09-13`,但当前证书主题为 `git.txyundm.cn`,不作为 API 证书验收 | +| 证书续期 dry-run | 菜单已提供检查和命令;生产未执行 | | 微信合法域名 | 未验证 | | Gitea 仓库 SSH | ssh://git@git.txyundm.cn:2222/panda/qipai.git | | 生产拉取仓库 | ssh://git@127.0.0.1:2222/panda/qipai.git | | 默认分支 | main | -| 最近模块 push commit | `f5445f1`(M00-E 域名/HTTPS 检查) | -| 最近 push 远端校验 | 通过:`HEAD == origin/main`(`f5445f16d71cacc85bd504238a4d50b21aa01c0b`) | +| 最近模块 push commit | 远端 HEAD(本轮 Certbot 检查提交后复验) | +| 最近 push 远端校验 | 推送后执行 `HEAD == origin/main` 校验 | | 目标系统 | Ubuntu 24.04 | | 内核架构 | x86_64 | | DPKG 架构 | amd64 | @@ -25,15 +25,15 @@ | 命令行 MQTT 工具 | mosquitto-clients:未安装/未验证 | | Windows MQTTX 验证 | 未验证 | | WSL 环境验证 | 已完成轻量检查、shell 语法检查、临时副本准备和清理;完整构建待正式项目生成 | -| 最近环境快检 | 2026-06-15 WSL 执行 `setup.sh --preflight/--status/--https/--diagnose` 通过;HTTPS 检查返回证书/健康接口 WARN | +| 最近环境快检 | 2026-06-15 WSL 执行 `setup.sh --preflight/--status/--https/--diagnose` 通过;HTTPS/Certbot 检查返回证书、健康接口和 certbot 未安装 WARN | | 最近部署后复检 | 未执行 | -| 最近验证 commit | `f5445f1`;M00-E 域名/HTTPS 检查已推送并完成远端校验 | +| 最近验证 commit | 远端 HEAD(本轮脚本验证已通过,推送后复验) | | 最近验证日期 | 2026-06-15 | | 已验证系统 | Ubuntu 24.04 / 未验证 | | 菜单 1 首次安装 | 脚本已实现目录布局;未在生产 Ubuntu 执行 | | 菜单 2 更新业务 | 脚本已实现仓库检查和 dry-run 发布清单;未在生产 Ubuntu 执行 | | 菜单 3 MQTT | 状态检查已实现;EMQX 安装未执行 | -| 菜单 4 域名与 HTTPS | 域名、Nginx 模板、站点启用、TLS 和健康端点检查已实现;当前线上证书为 `git.txyundm.cn`,证书申请/续期未执行 | +| 菜单 4 域名与 HTTPS | 域名、Nginx 模板、站点启用、TLS、健康端点、Certbot、证书文件、续期配置和 `certbot.timer` 检查已实现;当前线上证书为 `git.txyundm.cn`,证书申请/续期未执行 | | 菜单 5 状态 | 已实现 | | 菜单 6 备份 | manifest-only 已实现;真实备份待生产配置 | | 菜单 7 恢复 | 人工恢复提示已实现 | diff --git a/docs/devlogs/2026-06-15-M00-A-单仓库基线.md b/docs/devlogs/2026-06-15-M00-A-单仓库基线.md index 421ea0b..2f822b6 100644 --- a/docs/devlogs/2026-06-15-M00-A-单仓库基线.md +++ b/docs/devlogs/2026-06-15-M00-A-单仓库基线.md @@ -13,6 +13,7 @@ - 生成 `scripts/dev/windows/push-module.ps1` 和 `check-gitea-ssh.ps1`,串联模块检查、提交、推送和远端校验。 - 生成 `scripts/setup/*.sh` 和新版 `setup.sh` 菜单,覆盖 `/opt/apps` 目录、仓库状态、dry-run 发布清单、备份 manifest、恢复/回滚提示和诊断。 - 继续补强 M00-E,新增固定 API 域名 Nginx 模板、Ubuntu 菜单第 4 项域名/HTTPS 检查和 Windows 域名检查脚本。 +- 继续补强 TLS-001,新增 Certbot 状态检查、证书签发/续期命令说明和 WSL 域名检查 WARN 记录。 ## 起始状态 @@ -32,7 +33,7 @@ ## 部署影响 -有。新增并升级 `setup.sh` 与 `scripts/setup/*.sh` 菜单式部署骨架,补充 `api.txyundm.cn` Nginx 模板和域名/HTTPS 检查,但未执行生产部署。 +有。新增并升级 `setup.sh` 与 `scripts/setup/*.sh` 菜单式部署骨架,补充 `api.txyundm.cn` Nginx 模板、域名/HTTPS/Certbot 检查和证书命令说明,但未执行生产部署。 ## 测试记录 @@ -44,6 +45,8 @@ - PowerShell 语法检查:`push-module.ps1`、`check-gitea-ssh.ps1` 均已通过 Parser 检查。 - 部署脚本:WSL 已执行 `bash -n setup.sh scripts/setup/*.sh`、`setup.sh --preflight`、`setup.sh --status`、`setup.sh --diagnose`;输出 PASS/WARN,未执行生产写入。 - 域名/HTTPS:新增菜单检查和 Windows 检查脚本;WSL `setup.sh --https` 显示 `api.txyundm.cn` 可解析到 `101.42.38.246`,但线上证书主题为 `CN=git.txyundm.cn` 且 `/health` 不可达,生产 DNS/证书/健康接口仍不得标记通过。 +- Certbot:新增 `scripts/setup/certbot.sh` 和 `deploy/certbot/api.txyundm.cn.commands.md`;生产签发、续期 dry-run 和 `certbot.timer` 尚未执行。 +- WSL 域名脚本:`scripts/dev/wsl/check-api-domain.sh` 已改为输出 PASS/WARN,不因生产健康接口暂未上线而中断整体验证。 - WSL 检查:已执行 `check-env.sh`、`check-workspace.sh`、`verify-linux.sh`、`prepare-test-copy.sh` 和 `cleanup-test-copy.sh`;临时副本创建和清理通过。完整 Linux 构建待正式后端/后台项目生成后执行。 - Git fetch/push:首次多次失败后,`git push origin main` 已成功;随后 `git fetch origin main` 校验 `HEAD == origin/main` 通过。 diff --git a/docs/domain-https.md b/docs/domain-https.md index d539935..21888cf 100644 --- a/docs/domain-https.md +++ b/docs/domain-https.md @@ -28,8 +28,9 @@ - SAN:未确认包含 `api.txyundm.cn` - 生效/到期:线上返回 `2026-06-15` 到 `2026-09-13`,但不是已验收的 API 证书 - 剩余天数:未计算 -- 自动续期:未验证 -- 最近 dry-run:未执行 +- Certbot 命令说明:`deploy/certbot/api.txyundm.cn.commands.md` +- 自动续期:菜单第 4 项会检查 `certbot.timer`;生产未验证 +- 最近 dry-run:菜单已输出 `sudo certbot renew --dry-run`;生产未执行 - 现场检查:菜单第 4 项会尝试读取线上 TLS 证书;生产 DNS/证书未完成前允许 WARN - 当前问题:`api.txyundm.cn` 返回的证书不应视为 API 域名证书验收通过 diff --git a/docs/feature-status.md b/docs/feature-status.md index fa455ce..4db767a 100644 --- a/docs/feature-status.md +++ b/docs/feature-status.md @@ -9,7 +9,7 @@ | SCM-001 | 模块完成即完整推送 | M00-B/M00-C | PARTIAL | 远端 HEAD | 首次 main push 成功,`HEAD == origin/main` 校验通过;推送脚本已生成。 | 后续模块仍需逐次执行并记录。 | 继续完善 M00-C 的 WSL 实际验证和脚本闭环。 | | WSL-001 | WSL 隔离辅助验证 | M00-C | PARTIAL | 本地 HEAD | WSL `check-env.sh`、`check-workspace.sh`、`verify-linux.sh`、`prepare-test-copy.sh`、`cleanup-test-copy.sh` 已执行通过;完整 Linux 依赖构建尚无正式项目可跑。 | 正式后端/后台尚未生成,无法执行完整 Linux 构建。 | M01/M09 生成项目后在 WSL 原生临时副本执行完整构建。 | | API-001 | 固定 HTTPS API 域名 | M00-E/M01/M08/M10 | PARTIAL | `f5445f1` | 已新增 Windows 检查脚本、Ubuntu 菜单检查和固定域名 Nginx 模板。 | DNS/HTTPS 生产验证未执行,后端健康接口未生成。 | 后续接入真实后端健康接口并执行 Windows/WSL/Ubuntu/微信真机验证。 | -| TLS-001 | Nginx 与证书自动化 | M00-E/M10 | PARTIAL | `f5445f1` | 已生成 `deploy/nginx/api.txyundm.cn.conf.template`,菜单第 4 项可检查模板、站点启用、TLS 和健康端点。 | 证书申请/续期、80/443 生产验证未执行。 | 补证书申请/续期 dry-run 和生产 Nginx 安装记录。 | +| TLS-001 | Nginx 与证书自动化 | M00-E/M10 | PARTIAL | 本轮提交推送后以远端 HEAD 为准 | 已生成 Nginx 模板、Certbot 命令说明和菜单第 4 项检查,可检查模板、站点启用、TLS、健康端点、证书文件、续期配置和 `certbot.timer`。 | 证书申请/续期 dry-run、80/443 生产验证未执行。 | 在生产 Ubuntu 执行证书签发、续期 dry-run 和 Nginx 安装记录。 | | WXNET-001 | 微信合法域名与真机验证 | M00-E/M08/M10 | TODO | - | 已补 API 域名报告入口,但未做微信后台或真机验证。 | 微信后台/真机未验证。 | 后续导入小程序后执行合法域名和真机验证。 | | OPS-001 | 固定 `/opt/apps` 目录 | M00-D/M10 | PARTIAL | 本地 HEAD | `scripts/setup/init-layout.sh` 已生成目录布局和 manifest;未在生产 Ubuntu 执行。 | 生产操作未执行。 | 由管理员在 Ubuntu 菜单执行并记录结果。 | | OPS-002 | 单仓库 Gitea 推送与拉取部署 | M00-B/M10 | PARTIAL | 远端 HEAD | Windows 到 Gitea `origin/main` 首次 push 与远端校验通过。 | 生产服务器只读拉取部署尚未验证。 | M00-D/M00-E 继续完善生产拉取、菜单部署和状态检查。 | diff --git a/docs/git-deployment.md b/docs/git-deployment.md index 78223a4..b72e44b 100644 --- a/docs/git-deployment.md +++ b/docs/git-deployment.md @@ -40,3 +40,9 @@ powershell -ExecutionPolicy Bypass -File scripts/dev/windows/check-gitea-ssh.ps1 ## 生产发布 生产服务器不得因 Gitea push 自动发布。管理员必须在 Ubuntu 上通过 `/opt/apps/setup.sh` 菜单拉取、构建、迁移和复检。 + +## 域名与证书 + +- Nginx 模板位于 `deploy/nginx/api.txyundm.cn.conf.template`。 +- Certbot 管理员命令说明位于 `deploy/certbot/api.txyundm.cn.commands.md`。 +- `setup.sh --https` 仅检查域名、Nginx、TLS、健康端点和 Certbot 状态,不自动申请证书或 reload Nginx。 diff --git a/docs/module-status.md b/docs/module-status.md index 2b28def..4b5fc95 100644 --- a/docs/module-status.md +++ b/docs/module-status.md @@ -2,7 +2,7 @@ | 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 | |---|---|---|---|---| -| M00 单仓库与服务器基础骨架 | PARTIAL | `f5445f1` | docs/devlogs/2026-06-15-M00-A-单仓库基线.md | M00-A/M00-B 基线已推送并校验;M00-C/D/E 持续完善,域名/HTTPS 检查已补模板但生产未验证。 | +| M00 单仓库与服务器基础骨架 | PARTIAL | 本轮提交推送后以远端 HEAD 为准 | docs/devlogs/2026-06-15-M00-A-单仓库基线.md | M00-A/M00-B 基线已推送并校验;M00-C/D/E 持续完善,域名/HTTPS/Certbot 检查已补模板但生产未验证。 | | M01 后端 API 基础工程 | TODO | - | - | 等 M00 基线完成后开始。 | | M02 登录、租户、权限 | TODO | - | - | - | | M03 门店、房间、价格、营业时间 | TODO | - | - | - | diff --git a/docs/reference-inventory.md b/docs/reference-inventory.md index 80e2f57..c83bba5 100644 --- a/docs/reference-inventory.md +++ b/docs/reference-inventory.md @@ -5,12 +5,12 @@ | `参考/24h_qipaishi-master(1).zip` | zip | 11649307 | `013ABA400BA44002DED6FF63D4E2480A080A9F1CB40E350916030DEBD7CE3D9A` | 用户提供 | 参考同类棋牌室源码结构 | 已隔离解包初审 | 含 `node_modules`/`miniprogram_npm` 和旧 AppID/旧域名,需清理后纳管 | 阻断,原包暂不提交 | | `参考/db_20260427.sql` | SQL | 5221326 | `B6D67B37FDA6B2C277A80A5D5FA7A7B54B3DE1049F0E3C16EBB1331CD6D8B8C7` | 用户提供 | 参考旧数据库表和字段 | 已初扫 | 含 INSERT 数据、文件 URL、日志和业务配置,需生成脱敏结构版 | 阻断,原 SQL 暂不提交 | | `参考/easy-joy-life-main.zip` | zip | 13660811 | `FC2B53CC0301B636B5BEC1E8A13223ED00B0D2DF5F101DAE67AC64722B5052FD` | 用户提供 | 参考无人棋牌室业务闭环 | 已隔离解包初审 | 含 PEM、支付密钥、AppSecret、数据库密码和生产/测试域名 | 阻断,原包暂不提交 | -| `参考/env` | env 样例 | 1195 | `D8557B6314E39BF0E010087D39D253461CDD6185215488B400B13389C4476391` | 用户提供 | 参考旧运行包变量类别 | 不适用 | 已发现并脱敏 | 待提交 | +| `参考/env` | env 样例 | 1195 | `D8557B6314E39BF0E010087D39D253461CDD6185215488B400B13389C4476391` | 用户提供 | 参考旧运行包变量类别 | 不适用 | 已发现并脱敏 | 已跟踪 | | `参考/mazongjian-server.xjar` | 旧后端运行包 | 194259651 | `E2403E24670CA9366BBB4CC2844E1979F3060C9ABEB0D76506BA0893677C17F0` | 用户提供 | 仅观察旧接口行为,不作为新系统依赖 | 不反编译 | 大文件,许可/体积风险 | 大文件阻断,暂不提交;已记录哈希 | -| `参考/start.sh` | shell | 1265 | `31C39BD7AE3994BB9B6F63AAB2CFF77ED9D7800ABF37D276556A28B8D9E2FCD8` | 用户提供 | 参考旧服务启动方式 | 不适用 | 需确认无秘密 | 待提交 | -| `参考/stop.sh` | shell | 771 | `5E218E887C43B5439C9BFCC216F34E15C03F3A0F6A16596BDEDD4D477D55BF94` | 用户提供 | 参考旧服务停止方式 | 不适用 | 需确认无秘密 | 待提交 | -| `参考/xjar` | 二进制工具 | 2150870 | `AC02279C343A008D6CC9FC4CC7983DEC1984775B4182F48AC628A20124784F66` | 用户提供 | 旧运行包相关工具,正式系统不依赖 | 不适用 | 二进制许可风险 | 待提交 | -| `参考/后台管理系统_20260427.zip` | zip | 9297096 | `9E5F09AFC38ADEB4FFAD724406F95D7F4E6494A8C3572486ED81C5C1E1FAF0F2` | 用户提供 | 参考旧后台静态/源码 | 待完成 | 未知,需解包扫描 | 待提交 | +| `参考/start.sh` | shell | 1265 | `31C39BD7AE3994BB9B6F63AAB2CFF77ED9D7800ABF37D276556A28B8D9E2FCD8` | 用户提供 | 参考旧服务启动方式 | 不适用 | 需确认无秘密 | 已跟踪 | +| `参考/stop.sh` | shell | 771 | `5E218E887C43B5439C9BFCC216F34E15C03F3A0F6A16596BDEDD4D477D55BF94` | 用户提供 | 参考旧服务停止方式 | 不适用 | 需确认无秘密 | 已跟踪 | +| `参考/xjar` | 二进制工具 | 2150870 | `AC02279C343A008D6CC9FC4CC7983DEC1984775B4182F48AC628A20124784F66` | 用户提供 | 旧运行包相关工具,正式系统不依赖 | 不适用 | 二进制许可风险 | 已跟踪 | +| `参考/后台管理系统_20260427.zip` | zip | 9297096 | `9E5F09AFC38ADEB4FFAD724406F95D7F4E6494A8C3572486ED81C5C1E1FAF0F2` | 用户提供 | 参考旧后台静态/源码 | 已隔离解包初审 | 未发现敏感配置文件,仍需后续按模块提取 | 已跟踪 | | `参考/小程序源代码.zip` | zip | 11579802 | `6EC18BE0C5E0602C75E114A12772F13E96BBAFCE6817ECE3FE0BF84D93B33A25` | 用户提供 | 参考旧微信小程序页面和接口 | 已隔离解包初审 | 含 `node_modules`/`miniprogram_npm`、旧 AppID、旧域名和 localhost 示例 | 阻断,原包暂不提交 | ## 当前结论 diff --git a/docs/release-manifest.md b/docs/release-manifest.md index 0676064..57492dc 100644 --- a/docs/release-manifest.md +++ b/docs/release-manifest.md @@ -11,4 +11,5 @@ | 部署结果 | 未部署;生产需管理员人工执行菜单 | | 回滚点 | - | | Nginx 模板 | `deploy/nginx/api.txyundm.cn.conf.template` | -| 域名/HTTPS 检查 | `setup.sh` 菜单 4、`scripts/dev/windows/check-api-domain.ps1` | +| Certbot 命令说明 | `deploy/certbot/api.txyundm.cn.commands.md` | +| 域名/HTTPS 检查 | `setup.sh` 菜单 4、`setup.sh --https`、`scripts/dev/windows/check-api-domain.ps1`、`scripts/dev/wsl/check-api-domain.sh` | diff --git a/docs/repository-map.md b/docs/repository-map.md index 63f12c5..924e3ca 100644 --- a/docs/repository-map.md +++ b/docs/repository-map.md @@ -9,6 +9,7 @@ | `database/` | 数据库迁移和种子 | 必须提交脱敏 SQL | | `deploy/` | 部署版本和说明 | 必须提交 | | `deploy/nginx/` | API 域名 Nginx 模板 | 必须提交模板,不提交证书 | +| `deploy/certbot/` | API 域名证书签发和续期命令说明 | 必须提交命令说明,不提交证书或账户信息 | | `scripts/` | 检查、部署和运维脚本 | 必须提交 | | `docs/` | 状态、日志、变更和验收记录 | 必须提交 | | `docs/reference-page-map.md` | 旧小程序页面脱敏地图 | 必须提交 | diff --git a/scripts/dev/wsl/check-api-domain.sh b/scripts/dev/wsl/check-api-domain.sh index 78bb764..3f555d5 100644 --- a/scripts/dev/wsl/check-api-domain.sh +++ b/scripts/dev/wsl/check-api-domain.sh @@ -1,5 +1,18 @@ #!/usr/bin/env bash set -euo pipefail -curl -fsS --max-time 10 https://api.txyundm.cn/app-api/health +domain="${QIPAI_DOMAIN:-api.txyundm.cn}" +origin="https://${domain}" +if command -v getent >/dev/null 2>&1; then + getent hosts "$domain" || true +fi + +for path in /health /app-api/health /admin-api/health; do + url="${origin}${path}" + if curl -fsSIL --max-time 10 "$url" >/dev/null 2>&1; then + printf 'PASS: %s\n' "$url" + else + printf 'WARN: %s not reachable\n' "$url" + fi +done diff --git a/scripts/setup/README.md b/scripts/setup/README.md index 6840ac5..c9190d8 100644 --- a/scripts/setup/README.md +++ b/scripts/setup/README.md @@ -10,6 +10,7 @@ | `repo-status.sh` | 检查固定仓库、分支、DIRTY/AHEAD/BEHIND/DIVERGED 状态。 | | `deploy-business.sh` | 克隆/更新仓库并生成 dry-run release manifest。 | | `domain-https.sh` | 检查固定 API 域名、Nginx 模板、站点启用状态、TLS 和健康端点。 | +| `certbot.sh` | 检查 Certbot、证书文件、续期配置和 `certbot.timer`,输出人工签发/续期命令。 | | `backup.sh` | 生成 manifest-only 备份记录。 | | `restore.sh` | 输出人工恢复要求,不自动改动生产数据。 | | `rollback.sh` | 列出 release 回滚点。 | diff --git a/scripts/setup/certbot.sh b/scripts/setup/certbot.sh new file mode 100644 index 0000000..f2cac8b --- /dev/null +++ b/scripts/setup/certbot.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=lib.sh +. "${SCRIPT_DIR}/lib.sh" + +qipai_certbot_status() { + local live_dir webroot_dir renewal_file + live_dir="/etc/letsencrypt/live/${QIPAI_DOMAIN}" + webroot_dir="/var/www/certbot" + renewal_file="/etc/letsencrypt/renewal/${QIPAI_DOMAIN}.conf" + + qipai_info "certbot domain: ${QIPAI_DOMAIN}" + qipai_info "certbot webroot: ${webroot_dir}" + qipai_info "certificate live dir: ${live_dir}" + + if command -v certbot >/dev/null 2>&1; then + qipai_pass "certbot: $(command -v certbot)" + certbot --version 2>/dev/null || true + else + qipai_warn "certbot not installed" + fi + + if [ -d "$webroot_dir" ]; then + qipai_pass "webroot exists: ${webroot_dir}" + else + qipai_warn "webroot not found: ${webroot_dir}" + fi + + if [ -f "${live_dir}/fullchain.pem" ] && [ -f "${live_dir}/privkey.pem" ]; then + qipai_pass "certificate files exist for ${QIPAI_DOMAIN}" + openssl x509 -in "${live_dir}/fullchain.pem" -noout -subject -issuer -dates 2>/dev/null || true + else + qipai_warn "certificate files not found for ${QIPAI_DOMAIN}" + fi + + if [ -f "$renewal_file" ]; then + qipai_pass "renewal config exists: ${renewal_file}" + else + qipai_warn "renewal config not found: ${renewal_file}" + fi + + if command -v systemctl >/dev/null 2>&1; then + systemctl is-enabled --quiet certbot.timer 2>/dev/null && qipai_pass "certbot.timer enabled" || qipai_warn "certbot.timer not enabled or not installed" + systemctl is-active --quiet certbot.timer 2>/dev/null && qipai_pass "certbot.timer active" || qipai_warn "certbot.timer not active" + else + qipai_warn "systemctl not available; certbot timer check skipped" + fi + + qipai_info "manual issue command:" + qipai_info "sudo certbot certonly --webroot -w ${webroot_dir} -d ${QIPAI_DOMAIN}" + qipai_info "manual renewal dry-run:" + qipai_info "sudo certbot renew --dry-run" +} + +if [ "${1:-}" = "--run" ]; then + qipai_certbot_status +fi diff --git a/scripts/setup/domain-https.sh b/scripts/setup/domain-https.sh index 6562d9c..f30a0e5 100644 --- a/scripts/setup/domain-https.sh +++ b/scripts/setup/domain-https.sh @@ -4,6 +4,8 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=lib.sh . "${SCRIPT_DIR}/lib.sh" +# shellcheck source=certbot.sh +. "${SCRIPT_DIR}/certbot.sh" qipai_domain_https_status() { local template_path nginx_available nginx_enabled @@ -67,6 +69,8 @@ qipai_domain_https_status() { qipai_warn "curl not installed" fi + qipai_certbot_status + qipai_info "manual install command after certificate is ready:" qipai_info "sudo install -m 0644 ${template_path} ${nginx_available} && sudo ln -sfn ${nginx_available} ${nginx_enabled} && sudo nginx -t && sudo systemctl reload nginx" } diff --git a/scripts/setup/lib.sh b/scripts/setup/lib.sh index 5a1ac66..40b696f 100644 --- a/scripts/setup/lib.sh +++ b/scripts/setup/lib.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -QIPAI_DEPLOY_VERSION="${QIPAI_DEPLOY_VERSION:-0.1.1-m00-domain-https-check}" +QIPAI_DEPLOY_VERSION="${QIPAI_DEPLOY_VERSION:-0.1.2-m00-certbot-check}" APP_ROOT="${APP_ROOT:-/opt/apps}" QIPAI_REPO_URL="${QIPAI_REPO_URL:-ssh://git@127.0.0.1:2222/panda/qipai.git}" QIPAI_PUBLIC_REPO_URL="${QIPAI_PUBLIC_REPO_URL:-ssh://git@git.txyundm.cn:2222/panda/qipai.git}"