فهرست منبع

fix:分离后端和mcp的配置文件

Jerry Liang 2 ماه پیش
والد
کامیت
f8c721771d
6فایلهای تغییر یافته به همراه72 افزوده شده و 11 حذف شده
  1. 46 0
      deploy/config.mcp.env.example
  2. 8 2
      deploy/scripts/deploy.sh
  3. 4 1
      deploy/scripts/setup.sh
  4. 2 2
      service/cmd/mcp/main.go
  5. 2 2
      service/cmd/mcp/test/runner/main.go
  6. 10 4
      service/config/config.go

+ 46 - 0
deploy/config.mcp.env.example

@@ -0,0 +1,46 @@
+# =============================================================================
+# FranklinWH Toolbox MCP Server 配置示例
+# 使用方式:复制为 config.mcp.env 后按需修改,切勿把真实密钥提交到仓库。
+# 读取路径:MCP 进程仅读取工作目录下的 ./config.mcp.env(与后端 config.env 独立)。
+#           环境变量可覆盖文件内配置。
+#
+# 说明:MCP Server 仅使用其运行所需的配置子集(数据库/缓存/MinIO、FWH 生产 API、
+#       Plane Web)。后端主服务专属的配置(MQTT、Plane API、Kiro、测试环境等)
+#       不在此文件内。
+# =============================================================================
+
+# ---------- APP(数据库 / 缓存 / 对象存储)----------
+# 运行环境:pro=生产 / dev=开发
+APP_ENV="dev"
+
+# PostgreSQL 连接串
+POSTGRES_DSN="host=localhost user=fwh_toolbox password=CHANGE_ME dbname=fwh_toolbox_db port=5432 sslmode=disable"
+# MongoDB 连接串——生产用 FwhToolboxDb,开发用 FwhToolboxDbDev
+MONGO_DSN="mongodb://127.0.0.1:27017/FwhToolboxDb"
+# Redis 地址(缓存)
+REDIS_ADDR="localhost:6379"
+# 远端只读 MySQL(FWH 生产库),用到站点信息查询时必填
+MYSQL_DSN="USER:PASSWORD@tcp(HOST:PORT)/home_energy_storage_server?charset=utf8mb4&parseTime=True&loc=Local"
+
+# ---------- MinIO(本地对象存储)----------
+MINIO_ENDPOINT="localhost:9198"
+MINIO_ACCESS_KEY="CHANGE_ME"
+MINIO_SECRET_KEY="CHANGE_ME"
+MINIO_BUCKET_NAME="fwh-toolbox"
+
+# ---------- FWH API(生产)----------
+FWH_ENERGY="energy.franklinwh.com"
+FWH_OSS="oss.franklinwh.com"
+FWH_USER="FMU006"
+# 后端会自动做 MD5,此处填明文
+FWH_PASSWORD="CHANGE_ME"
+
+# ---------- Plane Web(反馈协作)----------
+PLANE_WEB_HOST="http://localhost:8600"
+PLANE_WEB_EMAIL="CHANGE_ME"
+PLANE_WEB_PASSWORD="CHANGE_ME"
+PLANE_WEB_WORKSPACE_SLUG="fwh"
+PLANE_WEB_PROJECT_ID="CHANGE_ME"
+PLANE_WEB_LABEL_BUG="CHANGE_ME"
+PLANE_WEB_LABEL_FEATURE="CHANGE_ME"
+PLANE_WEB_LABEL_FEEDBACK="CHANGE_ME"

+ 8 - 2
deploy/scripts/deploy.sh

@@ -10,7 +10,7 @@
 # 目录约定(与线上服务器保持一致,可用环境变量覆盖):
 #   DEPLOY_ROOT   /var/www/fwh-toolbox
 #     ├── fwh-toolbox/   前端静态文件(构建产物 dist/*)
-#     └── server/        后端二进制 + config.env + cert/ + .kiro/(kiro-cli 配置)
+#     └── server/        后端二进制 + config.env + config.mcp.env + cert/ + .kiro/(kiro-cli 配置)
 #
 # 用法:
 #   ./deploy.sh all        # 前端 + 后端 + Kiro 配置(默认)
@@ -28,7 +28,8 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 DEPLOY_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"           # deploy/
 PROJECT_ROOT="$(cd "${DEPLOY_DIR}/.." && pwd)"         # 仓库根目录
 SERVICE_DIR="${PROJECT_ROOT}/service"                  # Go 后端目录
-CONFIG_EXAMPLE="${DEPLOY_DIR}/config.env.example"      # 配置模板
+CONFIG_EXAMPLE="${DEPLOY_DIR}/config.env.example"      # 后端配置模板
+MCP_CONFIG_EXAMPLE="${DEPLOY_DIR}/config.mcp.env.example"  # MCP 配置模板
 
 DEPLOY_ROOT="${DEPLOY_ROOT:-/var/www/fwh-toolbox}"
 FRONTEND_DIST_DIR="${DEPLOY_ROOT}/fwh-toolbox"
@@ -110,6 +111,11 @@ deploy_backend() {
         sudo cp "${CONFIG_EXAMPLE}" "${SERVER_DIR}/config.env"
     fi
 
+    if [[ ! -f "${SERVER_DIR}/config.mcp.env" ]]; then
+        info "未发现 ${SERVER_DIR}/config.mcp.env,从示例模板复制(MCP 独立配置,请务必修改其中的密钥)"
+        sudo cp "${MCP_CONFIG_EXAMPLE}" "${SERVER_DIR}/config.mcp.env"
+    fi
+
     install_service
 
     if systemctl is-active --quiet "${APP_NAME}"; then

+ 4 - 1
deploy/scripts/setup.sh

@@ -430,6 +430,7 @@ prepare_remote_stage() {
         rm -f /tmp/fwh-dist.tgz
     fi
     [[ -n "${GEN_CONFIG}" ]] && scp_to "${GEN_CONFIG}" "${REMOTE_STAGE}/config.env"
+    [[ -n "${GEN_CONFIG}" ]] && scp_to "${GEN_CONFIG}" "${REMOTE_STAGE}/config.mcp.env"
     ok "产物已上传到远程 ${REMOTE_STAGE}"
 }
 
@@ -548,7 +549,8 @@ step_backend() {
              sudo mv '${REMOTE_STAGE}/${MCP_NAME}' '${server_dir}/' && \
              sudo chmod +x '${server_dir}/${APP_NAME}' '${server_dir}/${MCP_NAME}' && \
              { [ -d '${REMOTE_STAGE}/cert' ] && sudo cp -r '${REMOTE_STAGE}/cert' '${server_dir}/' || true; } && \
-             { [ -f '${REMOTE_STAGE}/config.env' ] && sudo cp '${REMOTE_STAGE}/config.env' '${server_dir}/config.env' || true; }"
+             { [ -f '${REMOTE_STAGE}/config.env' ] && sudo cp '${REMOTE_STAGE}/config.env' '${server_dir}/config.env' || true; } && \
+             { [ -f '${REMOTE_STAGE}/config.mcp.env' ] && sudo cp '${REMOTE_STAGE}/config.mcp.env' '${server_dir}/config.mcp.env' || true; }"
     else
         sudo mkdir -p "${server_dir}"
         sudo mv "${SERVICE_DIR}/${APP_NAME}" "${server_dir}/"
@@ -556,6 +558,7 @@ step_backend() {
         sudo chmod +x "${server_dir}/${APP_NAME}" "${server_dir}/${MCP_NAME}"
         [[ -d "${SERVICE_DIR}/cert" ]] && sudo cp -r "${SERVICE_DIR}/cert" "${server_dir}/" || true
         [[ -n "${GEN_CONFIG}" ]] && sudo cp "${GEN_CONFIG}" "${server_dir}/config.env" || true
+        [[ -n "${GEN_CONFIG}" ]] && sudo cp "${GEN_CONFIG}" "${server_dir}/config.mcp.env" || true
     fi
 
     # 写入 systemd 服务

+ 2 - 2
service/cmd/mcp/main.go

@@ -31,8 +31,8 @@ func main() {
 	initMCPLogger()
 	defer zap.L().Sync()
 
-	// 加载配置(复用现有 config)
-	cfg, err := config.LoadConfig()
+	// 加载配置(MCP 使用独立配置文件,与后端主服务分开)
+	cfg, err := config.LoadConfig("./config.mcp.env")
 	if err != nil {
 		zap.L().Fatal("加载配置失败", zap.Error(err))
 	}

+ 2 - 2
service/cmd/mcp/test/runner/main.go

@@ -1,6 +1,6 @@
 // Command runner 是 FWH MCP Server 的非写操作接口测试驱动。
 //
-// 它通过 mcp-go 的 stdio client 拉起被测二进制(cwd 设为运行路径以加载 config.env),
+// 它通过 mcp-go 的 stdio client 拉起被测二进制(cwd 设为运行路径以加载 config.mcp.env),
 // 执行 L0(协议/清单)、L1(参数校验)、L2(只读冒烟)、L4(敏感数据脱敏)用例,
 // 三态判定 PASS/FAIL/SKIP,并生成 report.md 与 pii_report.md。
 //
@@ -183,7 +183,7 @@ func callText(ctx context.Context, c *client.Client, name string, args map[strin
 
 func main() {
 	bin := flag.String("bin", "/tmp/fwh-mcp-server-new", "被测 MCP server 二进制路径")
-	cwd := flag.String("cwd", "/var/www/fwh-toolbox/server", "server 工作目录(加载 config.env)")
+	cwd := flag.String("cwd", "/var/www/fwh-toolbox/server", "server 工作目录(加载 config.mcp.env)")
 	out := flag.String("out", "/var/www/fwh-toolbox/server", "报告输出目录")
 	flag.Parse()
 

+ 10 - 4
service/config/config.go

@@ -89,8 +89,11 @@ type Config struct {
 // var FWH_USER string = ""
 // var FWH_PASSWORD string = "" // MD5 - PASSWORD
 
-// LoadConfig 读取配置文件和环境变量
-func LoadConfig() (*Config, error) {
+// LoadConfig 读取配置文件和环境变量。
+// 可选参数 configPaths 指定候选配置文件路径(按顺序尝试,命中第一个存在的即停)。
+// 不传时使用默认路径 ["./.env", "./config.env"](后端主服务用)。
+// MCP 等独立进程可传入自己的配置文件,例如 LoadConfig("./config.mcp.env")。
+func LoadConfig(configPaths ...string) (*Config, error) {
 	v := viper.New()
 
 	// 默认值(避免缺省时崩溃)
@@ -111,8 +114,11 @@ func LoadConfig() (*Config, error) {
 	v.SetDefault("FWH_OSS", "oss.franklinwh.com")
 	// FWH MQTT
 
-	// 多文件路径支持
-	paths := []string{"./.env", "./config.env"}
+	// 多文件路径支持:优先使用调用方传入的路径,否则回退默认
+	paths := configPaths
+	if len(paths) == 0 {
+		paths = []string{"./.env", "./config.env"}
+	}
 	var readErr error
 	for _, path := range paths {
 		v.SetConfigFile(path)