From 86f7da21684330502e64c38af2a4bc24fe78a3d1 Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 15 Jun 2026 16:48:30 +0800 Subject: [PATCH] =?UTF-8?q?deploy(M00-E):=20=E8=A1=A5=E5=85=85EMQX?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/README.md | 3 +- deploy/VERSION | 2 +- deploy/emqx/acl.conf.template | 29 +++++++++++ deploy/emqx/authorization.hocon.template | 11 ++++ deploy/emqx/install-ubuntu24-amd64.md | 49 ++++++++++++++++++ docs/deployment-changelog.md | 12 +++++ docs/deployment-status.md | 12 ++--- docs/devlogs/2026-06-15-M00-A-单仓库基线.md | 4 +- docs/feature-status.md | 6 +-- docs/git-deployment.md | 6 +++ docs/hardware-test-report.md | 2 +- docs/hardware-vendor.md | 3 +- docs/module-status.md | 2 +- docs/mqtt-deployment.md | 13 +++-- docs/mqtt-protocol-mapping.md | 9 +++- docs/release-manifest.md | 2 + docs/repository-map.md | 1 + scripts/setup/README.md | 1 + scripts/setup/emqx.sh | 57 +++++++++++++++++++++ scripts/setup/lib.sh | 2 +- setup.sh | 19 ++----- 21 files changed, 210 insertions(+), 35 deletions(-) create mode 100644 deploy/emqx/acl.conf.template create mode 100644 deploy/emqx/authorization.hocon.template create mode 100644 deploy/emqx/install-ubuntu24-amd64.md create mode 100644 scripts/setup/emqx.sh diff --git a/deploy/README.md b/deploy/README.md index 3fee8c1..c087c40 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -38,7 +38,8 @@ - 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`。 +- EMQX:提供 `deploy/emqx/install-ubuntu24-amd64.md`、ACL 模板和授权模板,菜单第 3 项会检查命令、服务、端口和模板。 +- 非交互检查:`setup.sh --preflight`、`setup.sh --status`、`setup.sh --https`、`setup.sh --mqtt`、`setup.sh --diagnose`。 - 状态:显示部署上下文、快检、仓库状态和当前 release manifest。 - 备份:当前生成 manifest-only 备份记录,不触碰真实数据库。 - 恢复/回滚:列出人工输入和回滚点,不自动改动生产数据。 diff --git a/deploy/VERSION b/deploy/VERSION index f3970da..89de72d 100644 --- a/deploy/VERSION +++ b/deploy/VERSION @@ -1 +1 @@ -0.1.2-m00-certbot-check +0.1.3-m00-emqx-check diff --git a/deploy/emqx/acl.conf.template b/deploy/emqx/acl.conf.template new file mode 100644 index 0000000..74f4e4b --- /dev/null +++ b/deploy/emqx/acl.conf.template @@ -0,0 +1,29 @@ +%% Qipai EMQX ACL baseline for device topic isolation. +%% EMQX ACL files use Erlang tuple rules and are matched from top to bottom. +%% Replace example usernames and topic namespaces after M06 device onboarding. + +%% Device clients may publish telemetry/status under their own client id. +{allow, {clientid, {re, "^qipai-device-[A-Za-z0-9_-]+$"}}, publish, [ + "qipai/${clientid}/telemetry", + "qipai/${clientid}/status", + "qipai/${clientid}/event/#" +]}. + +%% Device clients may subscribe only to commands for their own client id. +{allow, {clientid, {re, "^qipai-device-[A-Za-z0-9_-]+$"}}, subscribe, [ + "qipai/${clientid}/command/#" +]}. + +%% Backend service may publish commands and subscribe to device events. +{allow, {username, "qipai_backend"}, all, [ + "qipai/+/command/#", + "qipai/+/telemetry", + "qipai/+/status", + "qipai/+/event/#" +]}. + +%% Do not expose system topics or broad wildcards to ordinary clients. +{deny, all, subscribe, ["$SYS/#", {eq, "#"}, {eq, "+/#"}]}. + +%% Production default: deny anything not explicitly allowed above. +{deny, all}. diff --git a/deploy/emqx/authorization.hocon.template b/deploy/emqx/authorization.hocon.template new file mode 100644 index 0000000..bf8deed --- /dev/null +++ b/deploy/emqx/authorization.hocon.template @@ -0,0 +1,11 @@ +authorization { + deny_action = ignore + no_match = deny + sources = [ + { + type = file + enable = true + path = "etc/acl.conf" + } + ] +} diff --git a/deploy/emqx/install-ubuntu24-amd64.md b/deploy/emqx/install-ubuntu24-amd64.md new file mode 100644 index 0000000..9e105a7 --- /dev/null +++ b/deploy/emqx/install-ubuntu24-amd64.md @@ -0,0 +1,49 @@ +# EMQX Ubuntu 24.04 amd64 Install Notes + +This project uses native Ubuntu packages only. Docker is forbidden. + +Official references checked on 2026-06-15: + +- EMQX Ubuntu installation: https://docs.emqx.com/en/emqx/latest/deploy/install-ubuntu.html +- EMQX file authorization and ACL format: https://docs.emqx.com/en/emqx/latest/access-control/authz/file.html + +## Preconditions + +- Ubuntu Server 24.04 x86-64/amd64. +- Production host: `101.42.38.246`. +- Ports are restricted by firewall: + - `1883`: MQTT device access, not open wider than required. + - `18083`: EMQX dashboard, never open to arbitrary public networks. +- MQTTX is not installed on the server. + +## Install + +EMQX official Ubuntu documentation lists apt installation for Ubuntu 24.04. The administrator must confirm the selected EMQX major version before installing. + +```bash +curl -s https://packagecloud.io/install/repositories/emqx/emqx-enterprise5/script.deb.sh | sudo bash +sudo apt-get install emqx +sudo systemctl enable --now emqx +``` + +## Apply ACL Baseline + +```bash +sudo install -m 0640 /opt/apps/qipai-repo/deploy/emqx/acl.conf.template /etc/emqx/acl.conf +sudo install -m 0640 /opt/apps/qipai-repo/deploy/emqx/authorization.hocon.template /etc/emqx/conf.d/qipai-authorization.hocon +sudo emqx ctl conf reload +sudo systemctl restart emqx +``` + +## Check + +```bash +emqx version +systemctl status emqx --no-pager +ss -ltnp | grep -E ':(1883|18083)\b' +``` + +## Notes + +- Device usernames, passwords and client IDs are not stored in Git. +- M06 will replace the placeholder topic namespace with the final device protocol mapping. diff --git a/docs/deployment-changelog.md b/docs/deployment-changelog.md index 9332f01..65a911f 100644 --- a/docs/deployment-changelog.md +++ b/docs/deployment-changelog.md @@ -1,5 +1,17 @@ # 部署变更记录 +## 2026-06-15 / 0.1.3-m00-emqx-check + +- 关联模块:M00-E/IOT-001 +- 关联 commit:本轮提交推送后以远端 HEAD 为准 +- 变化内容:新增 `scripts/setup/emqx.sh`、`deploy/emqx/install-ubuntu24-amd64.md`、`deploy/emqx/acl.conf.template` 和 `deploy/emqx/authorization.hocon.template`,菜单第 3 项扩展为 EMQX 服务、端口和模板检查。 +- 配置变化:新增 `setup.sh --mqtt` 非交互检查入口;部署版本升级为 `0.1.3-m00-emqx-check`。 +- 数据库变化:无。 +- 兼容性:仅增加检查和模板,不自动安装 EMQX,不写入 `/etc/emqx`。 +- 已执行验证:Windows 本地检查和敏感信息扫描通过;WSL `bash -n`、`setup.sh --preflight/--status/--mqtt/--diagnose` 通过,EMQX 未安装和端口未监听按预期返回 WARN。 +- 回滚方式:移除新增 EMQX 检查脚本和模板即可回到 0.1.2 行为;未改动生产环境。 +- 生产环境人工步骤:管理员按 `deploy/emqx/install-ubuntu24-amd64.md` 安装 EMQX、应用 ACL 和授权模板,并限制 18083 访问范围。 + ## 2026-06-15 / 0.1.2-m00-certbot-check - 关联模块:M00-E diff --git a/docs/deployment-status.md b/docs/deployment-status.md index 14da942..865c338 100644 --- a/docs/deployment-status.md +++ b/docs/deployment-status.md @@ -2,7 +2,7 @@ | 项目 | 当前值 | |---|---| -| 菜单脚本版本 | 0.1.2-m00-certbot-check | +| 菜单脚本版本 | 0.1.3-m00-emqx-check | | Gitea 仓库 Web | https://git.txyundm.cn/panda/qipai.git | | API 固定域名 | https://api.txyundm.cn | | 小程序 API | https://api.txyundm.cn/app-api | @@ -14,25 +14,25 @@ | Gitea 仓库 SSH | ssh://git@git.txyundm.cn:2222/panda/qipai.git | | 生产拉取仓库 | ssh://git@127.0.0.1:2222/panda/qipai.git | | 默认分支 | main | -| 最近模块 push commit | 远端 HEAD(本轮 Certbot 检查提交后复验) | +| 最近模块 push commit | 推送后记录远端 HEAD | | 最近 push 远端校验 | 推送后执行 `HEAD == origin/main` 校验 | | 目标系统 | Ubuntu 24.04 | | 内核架构 | x86_64 | | DPKG 架构 | amd64 | | 用户空间位数 | 64 | -| EMQX 版本/架构 | 未安装/未验证 | +| EMQX 版本/架构 | 菜单可检查;未安装/未验证 | | 服务器 MQTTX | 不安装 | | 命令行 MQTT 工具 | mosquitto-clients:未安装/未验证 | | Windows MQTTX 验证 | 未验证 | | WSL 环境验证 | 已完成轻量检查、shell 语法检查、临时副本准备和清理;完整构建待正式项目生成 | -| 最近环境快检 | 2026-06-15 WSL 执行 `setup.sh --preflight/--status/--https/--diagnose` 通过;HTTPS/Certbot 检查返回证书、健康接口和 certbot 未安装 WARN | +| 最近环境快检 | 2026-06-15 WSL 执行 `setup.sh --preflight/--status/--https/--mqtt/--diagnose` 通过;HTTPS/Certbot/EMQX 生产项返回 WARN,EMQX 模板存在 | | 最近部署后复检 | 未执行 | -| 最近验证 commit | 远端 HEAD(本轮脚本验证已通过,推送后复验) | +| 最近验证 commit | 本轮 EMQX 检查提交后以远端 HEAD 为准;脚本验证已通过 | | 最近验证日期 | 2026-06-15 | | 已验证系统 | Ubuntu 24.04 / 未验证 | | 菜单 1 首次安装 | 脚本已实现目录布局;未在生产 Ubuntu 执行 | | 菜单 2 更新业务 | 脚本已实现仓库检查和 dry-run 发布清单;未在生产 Ubuntu 执行 | -| 菜单 3 MQTT | 状态检查已实现;EMQX 安装未执行 | +| 菜单 3 MQTT | EMQX 命令、systemd、1883/18083 端口、ACL 模板和授权模板检查已实现;EMQX 安装未执行 | | 菜单 4 域名与 HTTPS | 域名、Nginx 模板、站点启用、TLS、健康端点、Certbot、证书文件、续期配置和 `certbot.timer` 检查已实现;当前线上证书为 `git.txyundm.cn`,证书申请/续期未执行 | | 菜单 5 状态 | 已实现 | | 菜单 6 备份 | manifest-only 已实现;真实备份待生产配置 | diff --git a/docs/devlogs/2026-06-15-M00-A-单仓库基线.md b/docs/devlogs/2026-06-15-M00-A-单仓库基线.md index 2f822b6..0464d90 100644 --- a/docs/devlogs/2026-06-15-M00-A-单仓库基线.md +++ b/docs/devlogs/2026-06-15-M00-A-单仓库基线.md @@ -14,6 +14,7 @@ - 生成 `scripts/setup/*.sh` 和新版 `setup.sh` 菜单,覆盖 `/opt/apps` 目录、仓库状态、dry-run 发布清单、备份 manifest、恢复/回滚提示和诊断。 - 继续补强 M00-E,新增固定 API 域名 Nginx 模板、Ubuntu 菜单第 4 项域名/HTTPS 检查和 Windows 域名检查脚本。 - 继续补强 TLS-001,新增 Certbot 状态检查、证书签发/续期命令说明和 WSL 域名检查 WARN 记录。 +- 继续补强 IOT-001,新增 EMQX Ubuntu 安装说明、ACL 模板、授权模板和菜单第 3 项/`--mqtt` 检查。 ## 起始状态 @@ -33,7 +34,7 @@ ## 部署影响 -有。新增并升级 `setup.sh` 与 `scripts/setup/*.sh` 菜单式部署骨架,补充 `api.txyundm.cn` Nginx 模板、域名/HTTPS/Certbot 检查和证书命令说明,但未执行生产部署。 +有。新增并升级 `setup.sh` 与 `scripts/setup/*.sh` 菜单式部署骨架,补充 `api.txyundm.cn` Nginx 模板、域名/HTTPS/Certbot 检查、证书命令说明、EMQX 安装说明和 ACL 模板,但未执行生产部署。 ## 测试记录 @@ -47,6 +48,7 @@ - 域名/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,不因生产健康接口暂未上线而中断整体验证。 +- EMQX:新增 `scripts/setup/emqx.sh`、`deploy/emqx/install-ubuntu24-amd64.md`、ACL 模板和授权模板;WSL `setup.sh --mqtt` 可运行并确认模板存在,生产安装、端口限制、真实账号和 MQTT 冒烟尚未执行。 - 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/feature-status.md b/docs/feature-status.md index 4db767a..ce8421d 100644 --- a/docs/feature-status.md +++ b/docs/feature-status.md @@ -8,12 +8,12 @@ | REF-001 | 参考资料完整纳管 | M00-A | PARTIAL | 本地 HEAD | 已生成哈希清单、脱敏日志、页面地图、接口线索和旧数据库结构清单;含秘密/依赖/真实数据风险的原始包和 SQL 已移出 Git 跟踪。 | 后续仍需按模块生成正式源码/迁移,旧 xjar 需大文件策略。 | 进入 M00-B/M00-C 前继续保持原包忽略和摘要可追溯。 | | 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 | 本轮提交推送后以远端 HEAD 为准 | 已生成 Nginx 模板、Certbot 命令说明和菜单第 4 项检查,可检查模板、站点启用、TLS、健康端点、证书文件、续期配置和 `certbot.timer`。 | 证书申请/续期 dry-run、80/443 生产验证未执行。 | 在生产 Ubuntu 执行证书签发、续期 dry-run 和 Nginx 安装记录。 | +| API-001 | 固定 HTTPS API 域名 | M00-E/M01/M08/M10 | PARTIAL | `4cb3ab6` | 已新增 Windows 检查脚本、Ubuntu 菜单检查和固定域名 Nginx 模板。 | DNS/HTTPS 生产验证未执行,后端健康接口未生成。 | 后续接入真实后端健康接口并执行 Windows/WSL/Ubuntu/微信真机验证。 | +| TLS-001 | Nginx 与证书自动化 | M00-E/M10 | PARTIAL | `4cb3ab6` | 已生成 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 继续完善生产拉取、菜单部署和状态检查。 | | OPS-003 | 整仓发布清单 | M00-E/M10 | PARTIAL | 本地 HEAD | `deploy-business.sh` 可生成 dry-run release manifest;正式构建待项目生成。 | 后端/后台尚未生成。 | M01/M09 后接入真实构建结果。 | | OPS-004 | 菜单式更新与环境监测 | M00-E/M10 | PARTIAL | 本地 HEAD | `setup.sh` 已接入初始化、更新、MQTT、HTTPS、状态、备份、恢复、回滚和诊断菜单;WSL 快检/status/diagnose 通过。 | 未在生产 Ubuntu 执行。 | 生产执行后补部署记录。 | -| IOT-001 | MQTT Broker 生产部署 | M00/M06 | PARTIAL | 本地 HEAD | 菜单 3 已输出 EMQX 原生 Apt、禁止 MQTTX 和 mosquitto-clients 状态检查;未安装。 | 缺生产 EMQX 实机验证。 | M00/M06 继续补官方 Apt 安装和 ACL。 | +| IOT-001 | MQTT Broker 生产部署 | M00/M06 | PARTIAL | 本轮提交推送后以远端 HEAD 为准 | 已生成 EMQX Ubuntu 安装说明、ACL 模板、授权模板和菜单第 3 项检查;WSL `setup.sh --mqtt` 已验证脚本可运行。 | 缺生产 EMQX 安装、端口限制、真实账号和实机验证。 | 生产执行后补 EMQX 版本、端口、ACL、备份和 MQTT 冒烟记录;M06 精化设备 Topic。 | | SYS-001 | 微信原生小程序 | M00-C/M08 | TODO | - | - | 参考小程序压缩包尚未深度整理。 | 后续导入正式 `miniapp/`。 | diff --git a/docs/git-deployment.md b/docs/git-deployment.md index b72e44b..8623788 100644 --- a/docs/git-deployment.md +++ b/docs/git-deployment.md @@ -46,3 +46,9 @@ powershell -ExecutionPolicy Bypass -File scripts/dev/windows/check-gitea-ssh.ps1 - Nginx 模板位于 `deploy/nginx/api.txyundm.cn.conf.template`。 - Certbot 管理员命令说明位于 `deploy/certbot/api.txyundm.cn.commands.md`。 - `setup.sh --https` 仅检查域名、Nginx、TLS、健康端点和 Certbot 状态,不自动申请证书或 reload Nginx。 + +## EMQX + +- EMQX 安装说明位于 `deploy/emqx/install-ubuntu24-amd64.md`。 +- ACL 模板位于 `deploy/emqx/acl.conf.template`,授权配置模板位于 `deploy/emqx/authorization.hocon.template`。 +- `setup.sh --mqtt` 仅检查 EMQX 命令、服务、端口和模板状态,不自动安装或写入 `/etc/emqx`。 diff --git a/docs/hardware-test-report.md b/docs/hardware-test-report.md index 9b72e34..07644e0 100644 --- a/docs/hardware-test-report.md +++ b/docs/hardware-test-report.md @@ -3,4 +3,4 @@ | 时间 | 设备 | 场景 | 环境 | 结果 | 证据 | 问题 | |---|---|---|---|---|---|---| | 2026-06-15 | - | 尚未联调 | 本地文档骨架 | 未执行 | - | 缺实机联调。 | - +| 2026-06-15 | EMQX Broker | 菜单检查模板 | WSL 脚本验证 | WARN | `setup.sh --mqtt` | 本地未安装 EMQX,生产未验证。 | diff --git a/docs/hardware-vendor.md b/docs/hardware-vendor.md index 710a2cf..8865b93 100644 --- a/docs/hardware-vendor.md +++ b/docs/hardware-vendor.md @@ -5,5 +5,4 @@ | 4G 智能门禁控电箱 | 待在参考资料中定位正式协议 | TODO | M06 前完成协议录入。 | | Sub-1G 智能门锁 | 待在参考资料中定位正式协议 | TODO | M06 前完成绑定和控制模型。 | | 4G 智慧插座 | 待在参考资料中定位正式协议 | TODO | M06 前完成型号能力识别。 | -| EMQX Broker | 固定主机 `101.42.38.246` | TODO | M00/M10 生成部署与巡检。 | - +| EMQX Broker | 固定主机 `101.42.38.246`;已生成安装说明、ACL 模板和菜单检查 | PARTIAL | 生产 Ubuntu 安装、端口限制和 ACL 应用后复验。 | diff --git a/docs/module-status.md b/docs/module-status.md index 4b5fc95..fb3e5ae 100644 --- a/docs/module-status.md +++ b/docs/module-status.md @@ -2,7 +2,7 @@ | 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 | |---|---|---|---|---| -| M00 单仓库与服务器基础骨架 | PARTIAL | 本轮提交推送后以远端 HEAD 为准 | docs/devlogs/2026-06-15-M00-A-单仓库基线.md | M00-A/M00-B 基线已推送并校验;M00-C/D/E 持续完善,域名/HTTPS/Certbot 检查已补模板但生产未验证。 | +| M00 单仓库与服务器基础骨架 | PARTIAL | 本轮提交推送后以远端 HEAD 为准 | docs/devlogs/2026-06-15-M00-A-单仓库基线.md | M00-A/M00-B 基线已推送并校验;M00-C/D/E 持续完善,域名/HTTPS/Certbot/EMQX 检查已补模板但生产未验证。 | | M01 后端 API 基础工程 | TODO | - | - | 等 M00 基线完成后开始。 | | M02 登录、租户、权限 | TODO | - | - | - | | M03 门店、房间、价格、营业时间 | TODO | - | - | - | diff --git a/docs/mqtt-deployment.md b/docs/mqtt-deployment.md index 2bf21a0..756d15c 100644 --- a/docs/mqtt-deployment.md +++ b/docs/mqtt-deployment.md @@ -5,12 +5,19 @@ | Broker 主机 | 101.42.38.246 | | Broker 软件 | EMQX 5.x,待安装/验证 | | 安装方式 | Ubuntu Apt 原生安装,禁止 Docker | +| 安装说明 | `deploy/emqx/install-ubuntu24-amd64.md` | | MQTTX | 服务器不安装,Windows 可使用 | | 命令行工具 | mosquitto-clients 可选 | | 匿名连接 | 待验证关闭 | -| ACL | 待配置 | -| 1883 | 待验证 | -| 18083 | 待验证不对公网任意开放 | +| ACL | 已生成 `deploy/emqx/acl.conf.template`,生产未应用 | +| 授权配置 | 已生成 `deploy/emqx/authorization.hocon.template`,生产未应用 | +| 1883 | 菜单第 3 项/`setup.sh --mqtt` 可检查,生产未验证 | +| 18083 | 菜单第 3 项/`setup.sh --mqtt` 可检查;必须限制访问,生产未验证 | | 备份 | 待生成 | | 恢复 | 待生成 | +## 当前 M00 结论 + +- 已提供 EMQX Ubuntu 24.04 amd64 原生安装说明、ACL 模板和授权模板。 +- 菜单第 3 项已扩展为检查 EMQX 命令、systemd 服务、1883/18083 端口和模板文件。 +- 未在生产 Ubuntu 安装 EMQX,未创建真实设备账号,未执行真实 MQTT 发布/订阅。 diff --git a/docs/mqtt-protocol-mapping.md b/docs/mqtt-protocol-mapping.md index f356315..1cc7fe9 100644 --- a/docs/mqtt-protocol-mapping.md +++ b/docs/mqtt-protocol-mapping.md @@ -1,6 +1,6 @@ # MQTT 协议映射 -当前尚未完成厂商协议深度录入。后续 M06 必须以正式协议文档为准,记录 Topic、命令、字段、回包、超时、重试和审计要求。 +当前尚未完成厂商协议深度录入。M00 仅提供 EMQX ACL 安全基线,后续 M06 必须以正式协议文档为准,记录 Topic、命令、字段、回包、超时、重试和审计要求。 | 设备 | Topic/命令 | 方向 | 字段 | 状态 | |---|---|---|---|---| @@ -8,3 +8,10 @@ | Sub-1G 智能门锁 | 待补充 | 双向 | 待补充 | TODO | | 4G 智慧插座 | 待补充 | 双向 | 待补充 | TODO | +## M00 ACL 基线 + +| 客户端 | 允许发布 | 允许订阅 | 状态 | +|---|---|---|---| +| 设备客户端 `qipai-device-*` | `qipai/${clientid}/telemetry`、`qipai/${clientid}/status`、`qipai/${clientid}/event/#` | `qipai/${clientid}/command/#` | 模板已生成,M06 精化 | +| 后端服务 `qipai_backend` | `qipai/+/command/#` 等业务命令与事件主题 | 设备遥测、状态和事件主题 | 模板已生成,M06 精化 | +| 普通客户端 | 禁止 `$SYS/#`、`#`、`+/#` | 禁止未显式允许主题 | 模板已生成 | diff --git a/docs/release-manifest.md b/docs/release-manifest.md index 57492dc..192e2a9 100644 --- a/docs/release-manifest.md +++ b/docs/release-manifest.md @@ -13,3 +13,5 @@ | Nginx 模板 | `deploy/nginx/api.txyundm.cn.conf.template` | | 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` | +| EMQX 模板 | `deploy/emqx/install-ubuntu24-amd64.md`、`deploy/emqx/acl.conf.template`、`deploy/emqx/authorization.hocon.template` | +| EMQX 检查 | `setup.sh` 菜单 3、`setup.sh --mqtt` | diff --git a/docs/repository-map.md b/docs/repository-map.md index 924e3ca..062b8aa 100644 --- a/docs/repository-map.md +++ b/docs/repository-map.md @@ -10,6 +10,7 @@ | `deploy/` | 部署版本和说明 | 必须提交 | | `deploy/nginx/` | API 域名 Nginx 模板 | 必须提交模板,不提交证书 | | `deploy/certbot/` | API 域名证书签发和续期命令说明 | 必须提交命令说明,不提交证书或账户信息 | +| `deploy/emqx/` | EMQX 安装说明、ACL 模板和授权模板 | 必须提交模板,不提交设备账号、密码或运行数据 | | `scripts/` | 检查、部署和运维脚本 | 必须提交 | | `docs/` | 状态、日志、变更和验收记录 | 必须提交 | | `docs/reference-page-map.md` | 旧小程序页面脱敏地图 | 必须提交 | diff --git a/scripts/setup/README.md b/scripts/setup/README.md index c9190d8..89e9cca 100644 --- a/scripts/setup/README.md +++ b/scripts/setup/README.md @@ -11,6 +11,7 @@ | `deploy-business.sh` | 克隆/更新仓库并生成 dry-run release manifest。 | | `domain-https.sh` | 检查固定 API 域名、Nginx 模板、站点启用状态、TLS 和健康端点。 | | `certbot.sh` | 检查 Certbot、证书文件、续期配置和 `certbot.timer`,输出人工签发/续期命令。 | +| `emqx.sh` | 检查 EMQX、mosquitto-clients、systemd、1883/18083 端口和 ACL/授权模板。 | | `backup.sh` | 生成 manifest-only 备份记录。 | | `restore.sh` | 输出人工恢复要求,不自动改动生产数据。 | | `rollback.sh` | 列出 release 回滚点。 | diff --git a/scripts/setup/emqx.sh b/scripts/setup/emqx.sh new file mode 100644 index 0000000..340eced --- /dev/null +++ b/scripts/setup/emqx.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=lib.sh +. "${SCRIPT_DIR}/lib.sh" + +qipai_emqx_status() { + local acl_template authz_template + acl_template="${SCRIPT_DIR}/../../deploy/emqx/acl.conf.template" + authz_template="${SCRIPT_DIR}/../../deploy/emqx/authorization.hocon.template" + + qipai_info "EMQX target: native Ubuntu Apt package, no Docker" + qipai_info "MQTT broker host: 101.42.38.246" + qipai_info "MQTT protocol: MQTT 3.1.1 compatible, QoS 1 baseline" + qipai_info "MQTTX on server: forbidden" + qipai_info "ACL template: ${acl_template}" + qipai_info "Authorization template: ${authz_template}" + + if command -v emqx >/dev/null 2>&1; then + qipai_pass "emqx command exists: $(command -v emqx)" + emqx version 2>/dev/null || true + else + qipai_warn "emqx command not found" + fi + + if command -v mosquitto_pub >/dev/null 2>&1; then + qipai_pass "mosquitto-clients available" + else + qipai_warn "mosquitto-clients not installed" + fi + + if command -v systemctl >/dev/null 2>&1; then + systemctl is-enabled --quiet emqx 2>/dev/null && qipai_pass "emqx service enabled" || qipai_warn "emqx service not enabled or missing" + systemctl is-active --quiet emqx 2>/dev/null && qipai_pass "emqx service active" || qipai_warn "emqx service inactive or missing" + else + qipai_warn "systemctl not available; service check skipped" + fi + + for port in 1883 18083; do + if command -v ss >/dev/null 2>&1; then + ss -ltn "( sport = :${port} )" | grep -q ":${port}" && qipai_pass "port ${port} is listening" || qipai_warn "port ${port} is not listening" + else + qipai_warn "ss not available; port ${port} check skipped" + fi + done + + [ -f "$acl_template" ] && qipai_pass "ACL template exists" || qipai_warn "ACL template not found" + [ -f "$authz_template" ] && qipai_pass "authorization template exists" || qipai_warn "authorization template not found" + + qipai_info "manual install summary:" + qipai_info "see deploy/emqx/install-ubuntu24-amd64.md" +} + +if [ "${1:-}" = "--run" ]; then + qipai_emqx_status +fi diff --git a/scripts/setup/lib.sh b/scripts/setup/lib.sh index 40b696f..51d00dc 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.2-m00-certbot-check}" +QIPAI_DEPLOY_VERSION="${QIPAI_DEPLOY_VERSION:-0.1.3-m00-emqx-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}" diff --git a/setup.sh b/setup.sh index f956dc7..f28e632 100644 --- a/setup.sh +++ b/setup.sh @@ -16,6 +16,8 @@ SETUP_DIR="${SCRIPT_DIR}/scripts/setup" . "${SETUP_DIR}/deploy-business.sh" # shellcheck source=scripts/setup/domain-https.sh . "${SETUP_DIR}/domain-https.sh" +# shellcheck source=scripts/setup/emqx.sh +. "${SETUP_DIR}/emqx.sh" # shellcheck source=scripts/setup/backup.sh . "${SETUP_DIR}/backup.sh" # shellcheck source=scripts/setup/restore.sh @@ -60,20 +62,7 @@ show_status() { } show_mqtt_status() { - qipai_info "EMQX target: native Ubuntu Apt package, no Docker" - qipai_info "MQTT broker host: 101.42.38.246" - qipai_info "MQTTX on server: forbidden" - if command -v emqx >/dev/null 2>&1; then - qipai_pass "emqx command exists" - emqx version 2>/dev/null || true - else - qipai_warn "emqx command not found" - fi - if command -v mosquitto_pub >/dev/null 2>&1; then - qipai_pass "mosquitto-clients available" - else - qipai_warn "mosquitto-clients not installed" - fi + qipai_emqx_status } show_https_status() { @@ -118,6 +107,8 @@ elif [ "${1:-}" = "--status" ]; then show_status elif [ "${1:-}" = "--https" ]; then show_https_status +elif [ "${1:-}" = "--mqtt" ]; then + show_mqtt_status elif [ "${1:-}" = "--diagnose" ]; then qipai_diagnose else