diff --git a/script/config/nacos/README.md b/script/config/nacos/README.md index 8b7b94d49..618a1b45f 100644 --- a/script/config/nacos/README.md +++ b/script/config/nacos/README.md @@ -1 +1,58 @@ -# 将此文件夹下所有配置文件内容复制到 `nacos` 对应的配置中 \ No newline at end of file +# Nacos 配置说明 + +本目录存放 seewis-cloud-plus 各服务的 Nacos 配置种子文件,并提供一键导入脚本(支持 dev / prod 双命名空间)。 + +## 文件清单 + +| 文件 | 说明 | 导入前通常需要修改 | +|---|---|---| +| `application-common.yml` | 所有服务共享的公共配置 | `spring.data.redis`(host/port/password)、`spring.rabbitmq`、`sa-token.jwt-secret-key`(务必换成自己的随机串)、监控账号(nacos discovery metadata) | +| `datasource.yml` | 数据库连接 | 各库 jdbc 地址/账号/密码(system / job / ai / workflow) | +| `ruoyi-auth.yml` | 认证服务 | `security.captcha`(验证码开关与类型)、`security.xcx.apps`(小程序 appid/密钥兜底配置,正式建议用参数管理 `sys.account.xcxApps`)、`justauth`(三方登录密钥) | +| `ruoyi-gateway.yml` | 网关 | `security.ignore.whites`(放行白名单)、路由规则 | +| `ruoyi-system.yml` | 系统模块 | `spring.liquibase.enabled`:**全新空库首次启动改为 `true`** 初始化表结构和种子数据,初始化完成后建议改回 `false` | +| `ruoyi-resource.yml` / `ruoyi-job.yml` / `ruoyi-workflow.yml` / `ruoyi-gen.yml` / `ruoyi-ai.yml` / `ruoyi-snailai-server.yml` / `ruoyi-snailjob-server.yml` | 对应模块 | 各自的 liquibase 开关、第三方参数,按需修改 | +| `ruoyi-monitor.yml` | SpringBoot Admin 监控 | 监控服务账号密码,按需修改 | +| `seata-server.properties` | Seata 服务端配置 | 脚本只导入 `*.yml`,此文件需手动在 Nacos 控制台创建(dataId `seata-server.properties`,group `DEFAULT_GROUP`,类型 `properties`) | + +> 注意:**导入会覆盖服务器上 dataId 相同的同名配置**(按 dataId 全量覆盖),服务器上已有个性化修改的配置请先备份或在控制台核对差异。 + +## 命名空间 + +- 默认导入到 **`dev` 和 `prod`** 两个命名空间,**不会**导入 `public`。 +- 需要先在 Nacos 控制台创建命名空间,**命名空间 ID 必须为 `dev` / `prod`**;如使用其他 ID,通过环境变量 `NACOS_NAMESPACES` 指定(如 `NACOS_NAMESPACES=dev-id-1,prod-id-2`)。 +- 服务的注册与配置拉取必须使用相同命名空间:各服务 `application.yml` / maven profile 中的 `spring.cloud.nacos.discovery.namespace` 与 `spring.cloud.nacos.config.namespace` 需与目标命名空间 ID 一致,否则服务找不到配置。 + +## 导入脚本 + +脚本与本目录的 yml 放在一起,自动导入当前目录下所有 `*.yml`。 + +### Linux / macOS + +```bash +chmod +x import-nacos-config.sh +./import-nacos-config.sh +``` + +### Windows(PowerShell 5.1+,Win10 1803+ 自带 curl.exe) + +```powershell +powershell -ExecutionPolicy Bypass -File .\import-nacos-config.ps1 +``` + +### 环境变量(两个脚本通用) + +| 变量 | 说明 | 默认值 | +|---|---|--------------------------| +| `NACOS_ADDR` | Nacos 地址 | `http://localhost:8848` | +| `NACOS_USER` | 用户名 | `nacos` | +| `NACOS_PASS` | 密码 | 未设置时交互输入(避免密码进 shell 历史) | +| `NACOS_NAMESPACES` | 目标命名空间 ID,逗号分隔 | `dev,prod` | + +示例:只导入到 dev,指向本地 Nacos: + +```bash +NACOS_ADDR=http://127.0.0.1:8848 NACOS_NAMESPACES=dev ./import-nacos-config.sh +``` + +脚本使用 Nacos 3.x 的 v3 admin API(v1/v2 写接口在 3.x 已移除);密码输入优先走环境变量 `NACOS_PASS`,否则交互式输入。 diff --git a/script/config/nacos/import-nacos-config.ps1 b/script/config/nacos/import-nacos-config.ps1 new file mode 100644 index 000000000..21b1beadb --- /dev/null +++ b/script/config/nacos/import-nacos-config.ps1 @@ -0,0 +1,79 @@ +# 一键导入 seewis-cloud-plus 的 Nacos 配置(Windows PowerShell 5.1+) +# 用法: powershell -ExecutionPolicy Bypass -File .\import-nacos-config.ps1 +# 环境变量: +# NACOS_ADDR Nacos 地址 (默认 http://localhost:8848) +# NACOS_USER 用户名 (默认 nacos) +# NACOS_PASS 密码 (未设置时交互输入) +# NACOS_NAMESPACES 目标命名空间 ID,逗号分隔 (默认 dev,prod,不会导入 public) +# 依赖: Windows 10 1803+ 自带的 curl.exe;Linux/macOS 请使用同目录下的 import-nacos-config.sh + +$ErrorActionPreference = "Stop" + +$NacosAddr = if ($env:NACOS_ADDR) { $env:NACOS_ADDR } else { "http://localhost:8848" } +$NacosUser = if ($env:NACOS_USER) { $env:NACOS_USER } else { "nacos" } +$Group = "DEFAULT_GROUP" +$Namespaces = if ($env:NACOS_NAMESPACES) { $env:NACOS_NAMESPACES } else { "dev,prod" } + +$ConfigDir = $PSScriptRoot +if (-not $ConfigDir) { $ConfigDir = Split-Path -Parent $MyInvocation.MyCommand.Path } + +if ($env:NACOS_PASS) { + $NacosPass = $env:NACOS_PASS +} else { + $secure = Read-Host "请输入 Nacos 密码($NacosUser)" -AsSecureString + $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure) + try { $NacosPass = [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr) } + finally { [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) } +} + +$files = @(Get-ChildItem -Path $ConfigDir -Filter *.yml -File) +if ($files.Count -eq 0) { + Write-Error "配置目录下没有 yml 文件: $ConfigDir" + exit 1 +} + +# Nacos 3.x: v1/v2 写接口已移除,配置发布走 v3 admin API + +# ---------- 登录 ---------- +$resp = & curl.exe -sf -m 10 -X POST "$NacosAddr/nacos/v1/auth/login" -d "username=$NacosUser&password=$NacosPass" +if (-not $resp -or $resp -notmatch '"accessToken":"([^"]+)"') { + Write-Error "登录失败或未获取到 accessToken: $NacosAddr (检查地址/账号/网络) $resp" + exit 1 +} +$token = $Matches[1] +Write-Host "登录成功: $NacosUser @ $NacosAddr" + +function Publish($ns, $file) { + $out = & curl.exe -s -m 15 -X POST "$NacosAddr/nacos/v3/admin/cs/config" ` + --data-urlencode "dataId=$($file.Name)" ` + --data-urlencode "groupName=$Group" ` + --data-urlencode "namespaceId=$ns" ` + --data-urlencode "type=yaml" ` + --data-urlencode "content@$($file.FullName)" ` + --data-urlencode "accessToken=$token" + return (($out -join "") -match '"code":0') +} + +# ---------- 主流程 ---------- +$totalFail = 0 +foreach ($raw in $Namespaces.Split(",")) { + $ns = $raw.Trim() + if (-not $ns) { continue } + Write-Host ">>> 导入到命名空间: $ns (group=$Group)" + $ok = 0; $fail = 0 + foreach ($file in $files) { + if (Publish $ns $file) { + Write-Host " [OK] $($file.Name)" + $ok++ + } else { + Write-Host " [FAIL] $($file.Name)" + $fail++ + } + } + Write-Host " 命名空间 $ns 完成: 成功 $ok, 失败 $fail" + $totalFail += $fail +} + +Write-Host "" +Write-Host "全部完成: 命名空间 [$Namespaces],失败总数 $totalFail" +exit $(if ($totalFail -eq 0) { 0 } else { 1 }) diff --git a/script/config/nacos/import-nacos-config.sh b/script/config/nacos/import-nacos-config.sh new file mode 100755 index 000000000..f36a12941 --- /dev/null +++ b/script/config/nacos/import-nacos-config.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# 一键导入 seewis-cloud-plus 的 Nacos 配置(Linux / macOS) +# 用法: ./import-nacos-config.sh +# 环境变量: +# NACOS_ADDR Nacos 地址 (默认 http://localhost:8848) +# NACOS_USER 用户名 (默认 nacos) +# NACOS_PASS 密码 (未设置时交互输入,避免密码进 shell 历史) +# NACOS_NAMESPACES 目标命名空间 ID,逗号分隔 (默认 dev,prod,不会导入 public) +# Windows 请使用同目录下的 import-nacos-config.ps1 + +set -euo pipefail + +NACOS_ADDR="${NACOS_ADDR:-http://locahost:8848}" +NACOS_USER="${NACOS_USER:-nacos}" +GROUP="DEFAULT_GROUP" +NACOS_NAMESPACES="${NACOS_NAMESPACES:-dev,prod}" + +# Nacos 3.x: v1/v2 写接口已移除,配置发布走 v3 admin API + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +CONFIG_DIR="${CONFIG_DIR:-$SCRIPT_DIR}" + +IFS=',' read -r -a NAMESPACES <<< "$NACOS_NAMESPACES" + +if [[ -z "${NACOS_PASS:-}" ]]; then + read -rsp "请输入 Nacos 密码($NACOS_USER): " NACOS_PASS; echo +fi + +# ---------- 登录 ---------- +login() { + local resp + resp=$(curl -sf -m 10 -X POST "$NACOS_ADDR/nacos/v1/auth/login" \ + -d "username=$NACOS_USER" -d "password=$NACOS_PASS") || { + echo "登录失败: $NACOS_ADDR (检查地址/账号/网络)" >&2 + exit 1 + } + ACCESS_TOKEN=$(echo "$resp" | sed -n 's/.*"accessToken":"\([^"]*\)".*/\1/p') + [[ -n "$ACCESS_TOKEN" ]] || { echo "未获取到 accessToken: $resp" >&2; exit 1; } + echo "登录成功: $NACOS_USER @ $NACOS_ADDR" +} + +# ---------- 检查命名空间是否存在(接口不可用或解析失败时仅跳过检查,不阻断导入) ---------- +check_namespaces() { + local resp ids ns + resp=$(curl -sf -m 10 "$NACOS_ADDR/nacos/v3/admin/core/namespace/list?pageNo=1&pageSize=100&accessToken=$ACCESS_TOKEN" || true) + [[ -z "$resp" ]] && return 0 + ids=$(echo "$resp" | grep -o '"namespaceId":"[^"]*"' | sed 's/"namespaceId":"//;s/"$//' || true) + [[ -z "$ids" ]] && return 0 + for ns in "${NAMESPACES[@]}"; do + if ! echo "$ids" | grep -qx "$ns"; then + echo " [警告] 命名空间 [$ns] 未在 Nacos 中找到,请先在控制台创建(命名空间 ID 需为 $ns)" >&2 + fi + done +} + +# ---------- 发布单个配置 ---------- +publish() { + local ns="$1" file="$2" dataId resp + dataId=$(basename "$file") + resp=$(curl -sf -m 15 -X POST "$NACOS_ADDR/nacos/v3/admin/cs/config" \ + --data-urlencode "dataId=$dataId" \ + --data-urlencode "groupName=$GROUP" \ + --data-urlencode "namespaceId=$ns" \ + --data-urlencode "type=yaml" \ + --data-urlencode "content@$file" \ + --data-urlencode "accessToken=$ACCESS_TOKEN") || return 1 + echo "$resp" | grep -q '"code":0' +} + +# ---------- 主流程 ---------- +[[ -d "$CONFIG_DIR" ]] || { echo "配置目录不存在: $CONFIG_DIR" >&2; exit 1; } + +shopt -s nullglob +files=("$CONFIG_DIR"/*.yml) +shopt -u nullglob +[[ ${#files[@]} -gt 0 ]] || { echo "配置目录下没有 yml 文件: $CONFIG_DIR" >&2; exit 1; } + +login +check_namespaces + +total_fail=0 +for ns in "${NAMESPACES[@]}"; do + echo ">>> 导入到命名空间: $ns (group=$GROUP)" + ok=0; fail=0 + for file in "${files[@]}"; do + dataId=$(basename "$file") + if publish "$ns" "$file"; then + echo " [OK] $dataId" + ok=$((ok+1)) + else + echo " [FAIL] $dataId" >&2 + fail=$((fail+1)) + fi + done + echo " 命名空间 $ns 完成: 成功 $ok, 失败 $fail" + total_fail=$((total_fail+fail)) +done + +echo +echo "全部完成: 命名空间 [$NACOS_NAMESPACES],失败总数 $total_fail" +[[ $total_fail -eq 0 ]]