Files
seewis-hsl-cloud/script/config/nacos/import-nacos-config.sh
T
seewe fa276082e1 chore(nacos): 新增 dev/prod 双命名空间配置导入脚本 / Add import scripts for dev and prod namespaces
- bash 与 PowerShell 双版本脚本,默认导入 dev、prod 命名空间(不再导入 public)
- 命名空间 ID 可通过 NACOS_NAMESPACES 覆盖,地址/账号/密码走环境变量
- 导入前检查命名空间是否存在(缺失仅告警),逐文件输出导入结果
- 重写 README:文件清单、导入前需修改的配置项、命名空间与脚本用法说明
2026-08-30 18:30:57 +08:00

102 lines
3.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 ]]