docs(V5.4): 固化MySQL双环境配置基线

This commit is contained in:
Codex
2026-06-18 15:07:52 +08:00
parent d4c026b247
commit 0251226d9e
4 changed files with 5432 additions and 33 deletions
+20 -15
View File
@@ -1,10 +1,10 @@
# 自助棋牌室系统 # 自助棋牌室系统
本仓库是 `panda/qipai.git` 的单一 Monorepo 工作区。Windows 固定开发路径为 `D:\qipai`,当前权威开发总纲为 [`V5.3.md`](./V5.3.md)。详细功能、模块顺序、验收标准和 Codex 纪律以总纲及 `docs/` 为准。 本仓库是 `panda/qipai.git` 的单一 Monorepo 工作区。Windows 固定开发路径为 `D:\qipai`,当前权威开发总纲为 [`V5.4.md`](./V5.4.md)。详细功能、模块顺序、验收标准和 Codex 纪律以总纲及 `docs/` 为准。
## 固定约束 ## 固定约束
- 当前权威总纲:`V5.3.md` - 当前权威总纲:`V5.4.md`
- 固定远端:`ssh://git@git.txyundm.cn:2222/panda/qipai.git` - 固定远端:`ssh://git@git.txyundm.cn:2222/panda/qipai.git`
- 默认分支:`main` - 默认分支:`main`
- 生产 API`https://api.txyundm.cn` - 生产 API`https://api.txyundm.cn`
@@ -14,7 +14,7 @@
- 正式 MQTT Broker`101.42.38.246:1883` - 正式 MQTT Broker`101.42.38.246:1883`
- 生产系统:Ubuntu Server 24.04 x86-64/amd64,无桌面、无 Docker、无微信云开发 - 生产系统:Ubuntu Server 24.04 x86-64/amd64,无桌面、无 Docker、无微信云开发
- 部署入口:Ubuntu 执行 `sudo bash /opt/apps/setup.sh` - 部署入口:Ubuntu 执行 `sudo bash /opt/apps/setup.sh`
- 开发流程:Windows 本地开发与测试 → 按 M00→M10 固定队列续编码 → 每个子阶段测试/commit/SSH push/远端校验 → 自动进入下一子阶段 - 开发流程:Windows 本地开发与测试 → 按 `M00→M10` 固定队列续编码 → 每个子阶段测试commitSSH push远端校验 → 自动进入下一子阶段
## 目录 ## 目录
@@ -35,17 +35,17 @@
| 用途 | 位置 | | 用途 | 位置 |
|---|---| |---|---|
| 项目入口 | `D:\qipai\README.md` | | 项目入口 | `D:\qipai\README.md` |
| 当前总纲 | `D:\qipai\V5.3.md` | | 当前总纲 | `D:\qipai\V5.4.md` |
| 完整配置索引 | `D:\qipai\docs\configuration.md` | | 完整配置索引 | `D:\qipai\docs\configuration.md` |
| 仓库目录映射 | `D:\qipai\docs\repository-map.md` | | 仓库目录映射 | `D:\qipai\docs\repository-map.md` |
| 后端开发配置 | `D:\qipai\backend\.env.development` | | 后端开发配置 | `D:\qipai\backend\.env.development` |
| 后端测试配置 | `D:\qipai\backend\.env.test` | | 后端测试配置 | `D:\qipai\backend\.env.test` |
| 后端配置模板 | `D:\qipai\backend\.env.example` | | 后端配置模板 | `D:\qipai\backend\.env.example` |
| WSL MySQL 本地配置 | `D:\qipai\config\dev\mysql.local.env` |
| WSL MQTT 本地配置 | `D:\qipai\config\dev\mqtt.local.env` |
| 后台开发配置 | `D:\qipai\admin\.env.development` | | 后台开发配置 | `D:\qipai\admin\.env.development` |
| 后台生产配置 | `D:\qipai\admin\.env.production` | | 后台生产配置 | `D:\qipai\admin\.env.production` |
| 小程序环境配置 | `D:\qipai\miniapp\config\env.js` | | 小程序环境配置 | `D:\qipai\miniapp\config\env.js` |
| WSL MQTT 本地配置 | `D:\qipai\config\dev\mqtt.local.env` |
| WSL MQTT 模板 | `D:\qipai\config\dev\mqtt.env.example` |
| PM2 模板 | `D:\qipai\deploy\pm2\ecosystem.config.cjs` | | PM2 模板 | `D:\qipai\deploy\pm2\ecosystem.config.cjs` |
| Nginx 模板 | `D:\qipai\deploy\nginx\api.txyundm.cn.conf` | | Nginx 模板 | `D:\qipai\deploy\nginx\api.txyundm.cn.conf` |
| EMQX 模板 | `D:\qipai\deploy\emqx\` | | EMQX 模板 | `D:\qipai\deploy\emqx\` |
@@ -65,6 +65,9 @@
| MQTTX CLI | `/usr/local/bin/mqttx` | | MQTTX CLI | `/usr/local/bin/mqttx` |
| EMQX Dashboard | `http://127.0.0.1:18083` | | EMQX Dashboard | `http://127.0.0.1:18083` |
| MQTT TCP | `127.0.0.1:1883` 或 WSL 当前 IP `:1883` | | MQTT TCP | `127.0.0.1:1883` 或 WSL 当前 IP `:1883` |
| MySQL | `127.0.0.1:3306` |
| MySQL 开发/测试账号 | `root` |
| MySQL 开发/测试密码 | `root123` |
WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running)` 且已开机启动;监听 `1883/8883/8083/8084/18083` WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running)` 且已开机启动;监听 `1883/8883/8083/8084/18083`
@@ -78,6 +81,7 @@ WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running
| 小程序源码镜像 | `/opt/apps/qipai-miniapp/source/` | | 小程序源码镜像 | `/opt/apps/qipai-miniapp/source/` |
| 非敏感配置 | `/etc/qipai/qipai.conf` | | 非敏感配置 | `/etc/qipai/qipai.conf` |
| 敏感配置 | `/etc/qipai/qipai.secrets` | | 敏感配置 | `/etc/qipai/qipai.secrets` |
| MySQL 客户端凭据 | `/etc/qipai/mysql-client.cnf`600 |
| 部署 SSH 私钥 | `/etc/qipai/ssh/id_ed25519` | | 部署 SSH 私钥 | `/etc/qipai/ssh/id_ed25519` |
| Nginx 站点 | `/etc/nginx/sites-available/api.txyundm.cn.conf` | | Nginx 站点 | `/etc/nginx/sites-available/api.txyundm.cn.conf` |
| PM2 配置 | `/opt/apps/qipai-backend/deploy/pm2/ecosystem.config.cjs` | | PM2 配置 | `/opt/apps/qipai-backend/deploy/pm2/ecosystem.config.cjs` |
@@ -95,10 +99,12 @@ WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running
| 环境 | 服务 | 地址 | 账号 | 密码 | 说明 | | 环境 | 服务 | 地址 | 账号 | 密码 | 说明 |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| WSL 本地 | EMQX Dashboard | `http://127.0.0.1:18083` | `admin` | `admin123` | 已知 Dashboard 登录凭据;是否可用于 MQTT 客户端认证仍待验证 | | WSL 本地 | EMQX Dashboard | `http://127.0.0.1:18083` | `admin` | `admin123` | 已知 Dashboard 登录凭据;是否可用于 MQTT 客户端认证仍待验证 |
| WSL 本地 | MySQL | `127.0.0.1:3306` | `root` | `root123` | 开发、测试和迁移预演 |
| Windows | Gitea SSH | `ssh://git@git.txyundm.cn:2222/panda/qipai.git` | SSH Key | 免密 | Windows 已配置 | | Windows | Gitea SSH | `ssh://git@git.txyundm.cn:2222/panda/qipai.git` | SSH Key | 免密 | Windows 已配置 |
| Ubuntu 生产 | MQTT | `101.42.38.246:1883` | 待配置 | 待配置 | 禁止复用 WSL 凭据 | | Ubuntu 生产 | MQTT | `101.42.38.246:1883` | 待配置 | 待配置 | 禁止复用 WSL 凭据 |
| Ubuntu 生产 | MySQL | `127.0.0.1:3306` | 待配置 | 待配置 | 配置后写入 `/etc/qipai/qipai.secrets` 并同步更新本表 | | Ubuntu 生产 | MySQL | `127.0.0.1:3306` | `root` | `Da@Shuai!6y8c..XT` | 已确认;写入 `/etc/qipai/qipai.secrets``/etc/qipai/mysql-client.cnf` |
数据库密码包含特殊字符时,脚本不得直接拼接到 shell 命令或未编码 URI。生产环境检查、迁移和备份统一通过权限为 `600``/etc/qipai/mysql-client.cnf` 或等效 `--defaults-extra-file` 连接,日志不得打印密码。
## 持续开发规则 ## 持续开发规则
@@ -107,27 +113,26 @@ WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running
- 一个 commit 只完成一个子阶段;同一次 Codex 会话可连续完成多个相邻子阶段。 - 一个 commit 只完成一个子阶段;同一次 Codex 会话可连续完成多个相邻子阶段。
- 每个子阶段必须完成工程编码、真实测试、增量文档、commit、push,并验证 `HEAD == origin/main` - 每个子阶段必须完成工程编码、真实测试、增量文档、commit、push,并验证 `HEAD == origin/main`
- 完成一个子阶段后,在会话资源允许时自动继续下一子阶段,不询问“是否继续”。 - 完成一个子阶段后,在会话资源允许时自动继续下一子阶段,不询问“是否继续”。
- 纯 Markdown 变更不计业务进度;V5.3 文档提交后的下一次普通开发必须产生工程增量。 - 纯 Markdown 变更不计业务进度;V5.4 文档提交后的下一次普通开发必须产生工程增量。
- 当前游标、最近工程提交和下一工程目标以 `docs/module-status.md``docs/current-baseline.md` 为准,不在 README 中猜测。 - 当前游标、最近工程提交和下一工程目标以 `docs/module-status.md``docs/current-baseline.md` 为准,不在 README 中猜测。
## 当前进度 ## 当前进度
项目已开发部分模块;从 V4.8 切换到 V5.0 后仅新增少量内容。具体完成度不得从 README 猜测,必须以现有代码、测试、数据库迁移、Git 历史以及 `docs/current-baseline.md``docs/module-status.md``docs/feature-status.md` 为准。 项目已开发部分模块。具体完成度不得从 README 猜测,必须以现有代码、测试、数据库迁移、Git 历史以及 `docs/current-baseline.md``docs/module-status.md``docs/feature-status.md` 为准。
- 当前执行游标:`M02-D` - 当前执行游标:`M03-C`
- 最近工程提交:`caacc78`M02-C RBAC、capability 与门店数据范围 - 最近工程提交:`f746242`,完成 M03-B 装修、广告与媒体管理
- 下一工程目标:用户与员工管理、角色分配、禁用和审计 - 下一工程目标:M03-C 地图选店、距离计算与营业状态筛选
## 版本递进 ## 版本递进
- **V4.8**:固定 `D:\qipai``参考/`、Monorepo、Windows/WSL 协作和模块完成即推送。
- **V5.0**:固化 WSL EMQX 5.8.9、MQTTX CLI 1.13.0 和已有代码续接规则。
- **V5.1**:同步 README,明确全部配置位置、明文凭据登记和 README 随总纲递进规则。 - **V5.1**:同步 README,明确全部配置位置、明文凭据登记和 README 随总纲递进规则。
- **V5.2**:增加工程编码优先、反文档循环、增量审计和工程完成证据。 - **V5.2**:增加工程编码优先、反文档循环、增量审计和工程完成证据。
- **V5.3**:增加固定模块队列、执行游标、会话内自动推进、可中断恢复和跨模块回归检查点。 - **V5.3**:增加固定模块队列、执行游标、会话内自动推进、可中断恢复和跨模块回归检查点。
- **V5.4**:固化 WSL/生产 MySQL 账号密码、配置位置、真实登录检测和特殊字符处理规则。
## Codex 入口 ## Codex 入口
```text ```text
请阅读 V5.3.md,按当前进度继续开发。 请阅读 V5.4.md,按当前进度继续开发。
``` ```
+5350
View File
File diff suppressed because it is too large Load Diff
+57 -13
View File
@@ -1,19 +1,65 @@
# 配置总表 # 配置总表
> 当前总纲:V5.3.md > 当前总纲:V5.4.md
> 最后更新:2026-06-18 > 最后更新:2026-06-18
> 维护规则:任何配置路径、账号、密码、域名、端口或加载顺序变化,必须与 README.mdV5.3.md 和实际配置在同一提交中更新。 > 维护规则:任何配置路径、账号、密码、域名、端口或加载顺序变化,必须与 `README.md`、`V5.4.md` 和实际配置在同一提交中更新。
## 当前已知凭据 ## 当前已知凭据
| 环境 | 服务 | 地址 | 账号 | 密码 | 状态 | | 环境 | 服务 | 地址 | 账号 | 密码 | 状态 |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| WSL | EMQX Dashboard | http://127.0.0.1:18083 | admin | admin123 | 已安装并运行;仅按 Dashboard 账号认定 | | WSL | EMQX Dashboard | `http://127.0.0.1:18083` | `admin` | `admin123` | 已安装并运行;仅按 Dashboard 账号认定 |
| Windows | Gitea SSH | ssh://git@git.txyundm.cn:2222/panda/qipai.git | SSH Key | 免密 | 已配置 | | WSL | MySQL | `127.0.0.1:3306` | `root` | `root123` | 已确认;开发、测试与迁移预演 |
| Ubuntu 生产 | MQTT | 101.42.38.246:1883 | 待配置 | 待配置 | 未登记正式凭据 | | Windows | Gitea SSH | `ssh://git@git.txyundm.cn:2222/panda/qipai.git` | SSH Key | 免密 | 已配置 |
| Ubuntu 生产 | MySQL | 127.0.0.1:3306 | 待配置 | 待配置 | 未登记正式凭据 | | Ubuntu 生产 | MQTT | `101.42.38.246:1883` | 待配置 | 待配置 | 未登记正式凭据 |
| Ubuntu 生产 | JWT | 环境变量 `QIPAI_JWT_SECRET` | - | 待生成 | 必须至少 32 位,禁止使用开发默认值 | | Ubuntu 生产 | MySQL | `127.0.0.1:3306` | `root` | `Da@Shuai!6y8c..XT` | 已确认;正式生产数据库 |
| Ubuntu 生产 | 微信小程序 | `QIPAI_WECHAT_APP_SECRETS` | AppID | 待配置 AppSecret | JSON 映射,仅放 `/etc/qipai/qipai.secrets` |
## MySQL 固定配置
### WSL 开发/测试
```dotenv
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=root123
MYSQL_DATABASE=<以项目实际数据库名为准>
```
有效配置位置按实际仓库结构选择一处,并在 `docs/repository-map.md` 中确认:
- `D:\qipai\backend\.env.development`
- `D:\qipai\backend\.env.test`
- `D:\qipai\config\dev\mysql.local.env`
### Ubuntu 正式生产
```dotenv
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD='Da@Shuai!6y8c..XT'
MYSQL_DATABASE=<以项目实际数据库名为准>
```
- 主运行配置:`/etc/qipai/qipai.secrets`,权限 `600`
- 菜单脚本、健康检查、迁移和备份:`/etc/qipai/mysql-client.cnf`,权限 `600`
- 禁止使用 `mysql -uroot -p明文密码`,禁止在日志中输出密码。
- 密码包含 `@``!` 和连续句点,脚本应使用分离变量或 `--defaults-extra-file`
- 确需 `DATABASE_URL` 时,密码应编码为 `Da%40Shuai%216y8c..XT`;数据库名仍以实际配置为准。
- WSL 与生产必须隔离;Windows/WSL 不得直接对生产数据库执行迁移。
## 环境检测要求
`setup.sh`、Windows/WSL 环境检查和 Ubuntu 菜单式诊断必须分别输出:
- `MYSQL_SERVICE`:服务与端口;
- `MYSQL_AUTH`:使用登记账号密码执行 `SELECT 1`
- `MYSQL_SCHEMA`:目标数据库、字符集和时区;
- `MYSQL_MIGRATION`:迁移表和当前版本;
- `MYSQL_BACKUP`:备份目录可写、最近备份和校验结果。
检测结果只能使用 `PASS/WARN/FAIL`,不得回显密码。只有五项全部通过,数据库环境才可标记 `DONE`
## 配置加载优先级 ## 配置加载优先级
@@ -26,12 +72,10 @@
## 文件位置 ## 文件位置
完整位置表见根目录 README.md 的“配置文件位置”章节以及 V5.3.md 的“0.6 README、配置文件与明文凭据同步规则”。 完整位置表见根目录 `README.md` 的“配置文件位置”章节以及 `V5.4.md` 的“0.6 README、配置文件与明文凭据同步规则”。
## 变更记录 ## 变更记录
- 2026-06-16:建立 V5.1 配置总表;登记 WSL EMQX Dashboard `admin/admin123`;固定 Windows、WSL 和 Ubuntu 配置路径。 - 2026-06-16:建立 V5.1 配置总表;登记 WSL EMQX Dashboard `admin/admin123`;固定 Windows、WSL 和 Ubuntu 配置路径。
- 2026-06-18:总纲升级为 V5.3;增加持续开发执行游标与固定模块推进规则。
- 2026-06-18:总纲升级为 V5.3;配置值未变,新增持续开发执行游标与固定模块推进规则。 - 2026-06-18:总纲升级为 V5.4;登记 WSL MySQL `root/root123` 与生产 MySQL `root/Da@Shuai!6y8c..XT`,增加 `/etc/qipai/mysql-client.cnf`、特殊字符处理和真实登录检测规则。
- 2026-06-18M02-B 新增 `QIPAI_JWT_SECRET``QIPAI_ACCESS_TOKEN_TTL_SECONDS``QIPAI_SESSION_TTL_SECONDS``QIPAI_WECHAT_APP_SECRETS`;真实值尚未提供,生产启动禁止使用开发 JWT 默认值。
+5 -5
View File
@@ -3,7 +3,7 @@ $ErrorActionPreference = "Stop"
$readmePath = "README.md" $readmePath = "README.md"
$configPath = "docs/configuration.md" $configPath = "docs/configuration.md"
$baselinePath = "docs/current-baseline.md" $baselinePath = "docs/current-baseline.md"
$expectedSpec = "V5.3.md" $expectedSpec = "V5.4.md"
$expectedOrigin = "ssh://git@git.txyundm.cn:2222/panda/qipai.git" $expectedOrigin = "ssh://git@git.txyundm.cn:2222/panda/qipai.git"
foreach ($path in @($readmePath, $configPath, $baselinePath, $expectedSpec)) { foreach ($path in @($readmePath, $configPath, $baselinePath, $expectedSpec)) {
@@ -28,7 +28,7 @@ $nextEngineeringLabel = [regex]::Unescape("\u4e0b\u4e00\u5de5\u7a0b\u76ee\u6807"
$pendingWord = [regex]::Unescape("\u5f85") $pendingWord = [regex]::Unescape("\u5f85")
$requiredSharedValues = @( $requiredSharedValues = @(
"V5.3.md", "V5.4.md",
"D:\qipai", "D:\qipai",
"/mnt/d/qipai", "/mnt/d/qipai",
$expectedOrigin, $expectedOrigin,
@@ -48,11 +48,11 @@ foreach ($value in $requiredSharedValues) {
throw "README missing required value: $value" throw "README missing required value: $value"
} }
if (-not $spec.Contains($value)) { if (-not $spec.Contains($value)) {
throw "V5.3 missing required value: $value" throw "V5.4 missing required value: $value"
} }
} }
foreach ($value in @("V5.3.md", $expectedOrigin, "admin123", "101.42.38.246:1883")) { foreach ($value in @("V5.4.md", $expectedOrigin, "admin123", "root123", "101.42.38.246:1883")) {
if (-not $config.Contains($value)) { if (-not $config.Contains($value)) {
throw "configuration.md missing required value: $value" throw "configuration.md missing required value: $value"
} }
@@ -98,4 +98,4 @@ if ($baseline -notmatch '(?m)^>\s*next_engineering_target:\s*\S') {
throw "current-baseline.md must record next_engineering_target" throw "current-baseline.md must record next_engineering_target"
} }
Write-Host "PASS: README, V5.3 and configuration index are consistent." Write-Host "PASS: README, V5.4 and configuration index are consistent."