# 83 Admin:允许从 config.yaml 读取 MySQL 8 配置 - 类型:需求 - 父级大工单:#76 - 所属 MVP / 版本:#77 / 线上 MySQL 8 部署 - 状态:已完成,用户验收通过 - 日期:2026-08-10 - Gitea 工单: ## 背景与目标 Admin 运行时原来只读取 `CMAUTOBUY_DB_*` 环境变量,本地使用 `run_admin.bat` 前必须手工设置五个变量。项目负责人确认本机 MySQL 密码可以写入 被 Git 忽略的 `admin/config.yaml`,目标是让本地配置直接生效,同时保留线上环境变量 部署方式。 ## 最终方案 - `config.yaml` 新增 `database:`,包含 host、port、name、user、password。 - Admin 主程序和 SQLite → MySQL 迁移命令读取 YAML 数据库配置。 - 非空的 `CMAUTOBUY_DB_*` 环境变量按字段覆盖 YAML;线上 systemd 无需改变。 - 没有 `config.yaml` 时,只要环境变量完整仍可启动。 - 数据库配置的字符串表示继续隐藏密码,错误信息只列配置项名称。 - 真实 `admin/config.yaml` 继续由 `.gitignore` 排除;示例和文档明确说明明文风险。 与建单方案一致,没有修改数据库结构、Client API 或 MySQL 公网监听策略。 ## 改了哪些 - `admin/config/config.go`:增加 YAML 数据库结构、文件读取和环境变量覆盖。 - `admin/config/config_test.go`:覆盖纯 YAML、按字段覆盖和纯环境变量兼容。 - `admin/main.go`:主程序改用合并后的数据库配置。 - `admin/cmd/migrate-sqlite-to-mysql/main.go`:迁移命令支持同一配置入口。 - `admin/config.example.yaml`:增加完整 `database:` 示例及安全说明。 - `admin/AGENTS.md`:记录本机 YAML 与线上环境文件的边界。 - `docs/admin/00-getting-started.md`:更新本地启动和 MySQL 配置方法。 - `docs/admin/06-quality-security.md`:增加本机明文配置保护规则。 - `docs/admin/09-sqlite迁移到mysql.md`:同步迁移命令的配置来源。 ## 验收结果 | 验收标准 | 结果 | |---|---| | 未设置数据库环境变量时可读取完整 `database:` YAML | 通过 | | 环境变量按字段覆盖 YAML,纯环境变量启动保持兼容 | 通过 | | 示例包含五个 MySQL 字段和明文风险说明 | 通过 | | 配置字符串和错误不泄露明文密码 | 通过 | | 真实 `admin/config.yaml` 保持 Git 忽略 | 通过 | | Go 1.23.0 静态检查、构建和全部测试通过 | 通过 | ## 测试 - 执行的命令: ```powershell cd D:\chengma\cmautobuy\admin $env:GOTOOLCHAIN="go1.23.0" go vet ./... go build ./... go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN ``` - 结果:全部通过;`admin/config`、`repository`、`service`、`syb` 等测试包均为 `ok`。 - **没验证到的部分**:本机执行策略阻止自动后台启动 SSH 隧道,因此未完成 `run_admin.bat` 连接线上 MySQL 的页面冒烟;线上 schema 初始化、数据迁移和服务启动 继续在部署工单 #81 验证。未开放 MySQL 公网端口。 ## 相关提交 - `04a777d` feat: 支持从 config.yaml 读取 MySQL 配置 (#83)