mirror of
https://gitee.com/nicefold/seewis-cloud-plus.git
synced 2026-10-14 03:52:27 +08:00
chore(nacos): 新增 dev/prod 双命名空间配置导入脚本 / Add import scripts for dev and prod namespaces
- bash 与 PowerShell 双版本脚本,默认导入 dev、prod 命名空间(不再导入 public) - 命名空间 ID 可通过 NACOS_NAMESPACES 覆盖,地址/账号/密码走环境变量 - 导入前检查命名空间是否存在(缺失仅告警),逐文件输出导入结果 - 重写 README:文件清单、导入前需修改的配置项、命名空间与脚本用法说明
This commit is contained in:
@@ -1 +1,58 @@
|
||||
# 将此文件夹下所有配置文件内容复制到 `nacos` 对应的配置中
|
||||
# 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`,否则交互式输入。
|
||||
|
||||
@@ -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 })
|
||||
Executable
+101
@@ -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 ]]
|
||||
Reference in New Issue
Block a user