From af23ced2070385eeec3e503c6fd9f5f8118f9583 Mon Sep 17 00:00:00 2001 From: xiaoqu Date: Fri, 4 Sep 2026 14:28:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(config):=20dev=E7=8E=AF=E5=A2=83DB/Redis?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E4=BF=A1=E6=81=AF=E6=98=8E=E6=96=87=E5=86=99?= =?UTF-8?q?=E5=85=A5application-dev.yml,=20=E4=B8=8D=E5=86=8D=E8=B5=B0?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F;=20=E5=90=8C=E6=AD=A5READM?= =?UTF-8?q?E/.env.example/=E8=AE=BE=E8=AE=A1=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaoqu-agent-service/README.md | 16 ++++---------- xiaoqu-agent-service/deploy/.env.example | 19 +++++++---------- .../src/main/resources/application-dev.yml | 21 ++++++++++--------- .../security/ConfigurationSecurityTest.java | 10 ++++----- .../doc/agent-mcp-service-design.md | 4 ++-- 5 files changed, 29 insertions(+), 41 deletions(-) diff --git a/xiaoqu-agent-service/README.md b/xiaoqu-agent-service/README.md index c92ff3c..0a4c585 100644 --- a/xiaoqu-agent-service/README.md +++ b/xiaoqu-agent-service/README.md @@ -93,19 +93,11 @@ mysql -h192.168.1.181 -u -p < sql/bootstrap/create-database.sql # 启动一次让 ToolSyncService 同步 tool 表后: mysql -h192.168.1.181 -u -p xiaoqu_agent_svc_d < sql/seed-dev.sql -# 必须显式指定环境及凭据;m0/m1/m2 使用数据库只读账号 +# 数据库/Redis 连接信息已明文写在 application-dev.yml(内网 dev 库); +# 仍需显式指定 profile export SPRING_PROFILES_ACTIVE=dev -export M0_DB_USERNAME= -export M0_DB_PASSWORD= -export M1_DB_USERNAME= -export M1_DB_PASSWORD= -export M2_DB_USERNAME= -export M2_DB_PASSWORD= -export SVC_DB_USERNAME= -export SVC_DB_PASSWORD= # 已有 V1 库首次接入时设 true;确认 flyway_schema_history 后可设 false export SVC_FLYWAY_BASELINE_ON_MIGRATE=true -export REDIS_PASSWORD= # 仅首次、且 admin_user 为空时创建管理员;创建完成后可移除这三个变量 export ADMIN_BOOTSTRAP_ACCOUNT= export ADMIN_BOOTSTRAP_PASSWORD= @@ -119,7 +111,7 @@ java -jar target/xiaoqu-agent-service.jar nohup java -jar target/xiaoqu-agent-service.jar > target/app.log 2>&1 & ``` -- 不提供默认 profile、数据库账号或密码;缺失配置时不得启动。 +- 不提供默认 profile;数据库/Redis 连接信息明文写在 `application-dev.yml`(内网 dev 库,与 xiaoqu-franchisee pom.xml dev profile 同一惯例);生产/测试环境不得在配置文件写明文密码。 - dev 端口 **8088**,管理后台 `http://localhost:8088/`,MCP 端点 `http://localhost:8088/mcp`。 - Flyway 在 Web 服务启动前执行 `validate + migrate`;checksum、版本或 SQL 执行失败时应用不会启动。 - 新增 SQL 必须遵循 [sql/README.md](sql/README.md),禁止修改已合并的历史 migration。 @@ -133,7 +125,7 @@ cp deploy/.env.example deploy/.env.dev # 填写 dev 凭据(已 gitignore, ./deploy/deploy.sh status | log | stop # 状态 / 跟踪日志 / 停止 ``` -- 凭据从 `deploy/.env.dev` 读取,无需手工 export;日志在 `logs/agent-service.log`,pid 在 `deploy/app.pid`。 +- `.env.dev` 只需管理员引导和 Flyway 开关;数据库/Redis 已走配置文件。日志在 `logs/agent-service.log`,pid 在 `deploy/app.pid`。 - 注意应用启动较慢(多数据源初始化,约 60-90s),脚本健康检查窗口已放宽到 180s。 ## 测试 ak(仅 dev) diff --git a/xiaoqu-agent-service/deploy/.env.example b/xiaoqu-agent-service/deploy/.env.example index 82409d0..f8d569b 100644 --- a/xiaoqu-agent-service/deploy/.env.example +++ b/xiaoqu-agent-service/deploy/.env.example @@ -1,13 +1,10 @@ -# dev 环境凭据(本文件为模板;实际使用复制为 .env.dev,已 gitignore) -# 取值参考 xiaoqu-franchisee/pom.xml dev profile -M0_DB_USERNAME=root -M0_DB_PASSWORD= -M1_DB_USERNAME=root -M1_DB_PASSWORD= -M2_DB_USERNAME=root -M2_DB_PASSWORD= -SVC_DB_USERNAME=root -SVC_DB_PASSWORD= +# dev 环境变量(本文件为模板;实际使用复制为 .env.dev,已 gitignore) +# 数据库/Redis 连接信息已明文写在 application-dev.yml,无需在此配置 + +# 后台管理员首次引导(仅首次启动且 admin_user 为空时建号,之后可删除) +APP_ADMIN_BOOTSTRAP_ACCOUNT=admin +APP_ADMIN_BOOTSTRAP_PASSWORD= +# APP_ADMIN_BOOTSTRAP_NAME=系统管理员 + # 默认拒绝为非空库自动建基线;仅已有 V1 库首次接入时临时改为 true SVC_FLYWAY_BASELINE_ON_MIGRATE=false -REDIS_PASSWORD= diff --git a/xiaoqu-agent-service/src/main/resources/application-dev.yml b/xiaoqu-agent-service/src/main/resources/application-dev.yml index 8574309..3298b4c 100644 --- a/xiaoqu-agent-service/src/main/resources/application-dev.yml +++ b/xiaoqu-agent-service/src/main/resources/application-dev.yml @@ -1,33 +1,34 @@ # dev 环境:内网 192.168.1.181(沿用 xiaoqu-franchisee pom.xml dev profile) -# 账号和密码必须由环境变量提供;m0/m1/m2 应使用数据库只读账号 +# 账号密码明文写在本文件(内网 dev 库,与 xiaoqu-franchisee pom.xml dev profile 同一惯例); +# 生产/测试环境不得在配置文件中写明文密码,改用环境变量 app: datasource: m0: # 权限库 xiaoqu_comples_d(user/agent/authority/propery/agent_manage_district_auth) driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://192.168.1.181:3306/xiaoqu_comples_d?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: ${M0_DB_USERNAME} - password: ${M0_DB_PASSWORD} + username: root + password: kaixinjiuhao m1: # 商城库 xiaoqu_mall_d(按需启用) driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://192.168.1.181:3306/xiaoqu_mall_d?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: ${M1_DB_USERNAME} - password: ${M1_DB_PASSWORD} + username: root + password: kaixinjiuhao m2: # 业务库 xiaoqu_franchisee_d(warehouse_agent_auth 等) driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://192.168.1.181:3306/xiaoqu_franchisee_d?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: ${M2_DB_USERNAME} - password: ${M2_DB_PASSWORD} + username: root + password: kaixinjiuhao svc: # 自有库 xiaoqu_agent_svc_d(token/scope/tool/audit,读写) driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://192.168.1.181:3306/xiaoqu_agent_svc_d?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: ${SVC_DB_USERNAME} - password: ${SVC_DB_PASSWORD} + username: root + password: kaixinjiuhao spring: data: redis: host: 192.168.1.181 port: 6379 - password: ${REDIS_PASSWORD} + password: kaixinjiuhao database: 5 timeout: 5s diff --git a/xiaoqu-agent-service/src/test/java/me/iiv/agent/security/ConfigurationSecurityTest.java b/xiaoqu-agent-service/src/test/java/me/iiv/agent/security/ConfigurationSecurityTest.java index 5578da8..4120ac6 100644 --- a/xiaoqu-agent-service/src/test/java/me/iiv/agent/security/ConfigurationSecurityTest.java +++ b/xiaoqu-agent-service/src/test/java/me/iiv/agent/security/ConfigurationSecurityTest.java @@ -11,8 +11,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; class ConfigurationSecurityTest { - private static final Pattern PASSWORD_WITH_DEFAULT = - Pattern.compile("password:\\s*\\$\\{[^}:]+:[^}]+}"); private static final Pattern COMMITTED_AK = Pattern.compile("xqak_[0-9a-f]{20,}"); @@ -24,11 +22,11 @@ class ConfigurationSecurityTest { } @Test - void devConfigurationHasNoRootUserOrPasswordDefaults() throws IOException { - String application = Files.readString(Path.of("src/main/resources/application-dev.yml")); + void baseConfigurationHasNoPlaintextPassword() throws IOException { + // dev 允许明文(内网库,与 xiaoqu-franchisee pom dev 同一惯例);公共 application.yml 不允许 + String application = Files.readString(Path.of("src/main/resources/application.yml")); - assertFalse(application.contains("username: root")); - assertFalse(PASSWORD_WITH_DEFAULT.matcher(application).find()); + assertFalse(application.contains("password: kaixinjiuhao")); } @Test diff --git a/xiaoqu-franchisee/doc/agent-mcp-service-design.md b/xiaoqu-franchisee/doc/agent-mcp-service-design.md index 730fbb8..c48e916 100644 --- a/xiaoqu-franchisee/doc/agent-mcp-service-design.md +++ b/xiaoqu-franchisee/doc/agent-mcp-service-design.md @@ -94,7 +94,7 @@ xq CLI ─────┘ (Go 单二进制, 同为 MCP 客户端) ┌── | ES | 部分列表查询 | 预留,一期可后置 | - 全部使用**只读数据库账号**(物理封死误写);将来写工具单独配有写权限的账号。 -- 配置按环境分文件(dev/test/prd),密码走环境变量,对齐现有 Maven profile 注入方式。 +- 配置按环境分文件(dev/test/prd);dev 环境密码明文写在 `application-dev.yml`(内网 dev 库,与现有 pom.xml dev profile 明文同一惯例),生产/测试环境不得在配置文件写明文密码。 ### 4.1 Entity 生成 @@ -237,7 +237,7 @@ xiaoqu-agent-service/ | Redis | 192.168.1.181:6379 | 密码见 pom dev | db5(`entity:User:{id}`、Dictionary)、db13 | | ES | 192.168.1.152:9200 | 无认证 | 预留,一期不用 | -- 密码等敏感值不入库本文档,以 `pom.xml` dev profile 为准;新系统 `application-dev.yml` 引用同名环境变量。 +- 密码等敏感值不入库本文档;dev 环境 DB/Redis 连接信息明文写在新系统 `application-dev.yml`(内网 dev 库,与 `pom.xml` dev profile 明文同一惯例)。 - 自有库表(§7)建在同实例新 schema:dev 用 `xiaoqu_agent_svc_d`(沿用 `_d` 后缀约定),首次部署前手工建库。 - 新系统与老的 dev 后端(Jetty 8091)可同时运行,互不干扰——注意两边连的是**同一套** dev 数据库和 Redis,老系统dev库的数据变动会同时影响两边的查询结果。