sync_agent_knowledge.sh 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env bash
  2. # =============================================================================
  3. # FranklinWH Toolbox - 新 AI 助手资料库同步脚本(单向:源 → AgentServer 资料库目录)
  4. # =============================================================================
  5. # 作用:把产品 Wiki 与数据知识库同步到 AgentServer 的资料库目录,供后台“资料库”登记使用。
  6. # AgentServer 以 agentsvc 运行且开启 ProtectHome,看不到 /home 下的源目录,
  7. # 所以需要拷贝到 /srv/agent-server/knowledge/ 下。
  8. #
  9. # 同步内容(rsync --delete,目标目录与源保持一致):
  10. # * FranklinWH-Wiki client/docs → ${KNOWLEDGE_ROOT}/fwh-wiki
  11. # 只同步 *.md;排除 .vitepress / public / casdoor / graphify-out / node_modules
  12. # * FranklinWH-ToolBox docs/knowledge → ${KNOWLEDGE_ROOT}/fwh-data-knowledge
  13. # 同步全部文件
  14. # 权限:目录属组 agentsvc、setgid,文件 0640、目录 2750(agentsvc 只读即可)。
  15. #
  16. # 用法:
  17. # ./sync_agent_knowledge.sh # 执行同步
  18. # AGENT_KB_DRY_RUN=y ./sync_agent_knowledge.sh # 预演,只打印 rsync 将做的改动
  19. #
  20. # 环境变量:
  21. # WIKI_DOCS_DIR Wiki 文档源目录 (默认 /home/jerry-remote/web/FranklinWH-Wiki/client/docs)
  22. # DATA_KB_DIR 数据知识库源目录 (默认 <repo>/docs/knowledge)
  23. # KNOWLEDGE_ROOT 资料库根目录 (默认 /srv/agent-server/knowledge)
  24. # AGENT_SVC_GROUP AgentServer 运行组 (默认 agentsvc)
  25. # AGENT_KB_DRY_RUN 只打印不落盘 (y/n) (默认 n)
  26. # AGENT_KB_USE_SUDO 非 root 时是否经 sudo 写入 (y/n) (默认 y;目标目录自己可写时可设 n)
  27. #
  28. # 同步方式:手动。Wiki 或数据知识库更新后,需要时手动运行一次本脚本(不配置定时任务)。
  29. # =============================================================================
  30. set -euo pipefail
  31. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  32. REPO_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
  33. WIKI_DOCS_DIR="${WIKI_DOCS_DIR:-/home/jerry-remote/web/FranklinWH-Wiki/client/docs}"
  34. DATA_KB_DIR="${DATA_KB_DIR:-${REPO_DIR}/docs/knowledge}"
  35. KNOWLEDGE_ROOT="${KNOWLEDGE_ROOT:-/srv/agent-server/knowledge}"
  36. AGENT_SVC_GROUP="${AGENT_SVC_GROUP:-agentsvc}"
  37. AGENT_KB_DRY_RUN="${AGENT_KB_DRY_RUN:-n}"
  38. AGENT_KB_USE_SUDO="${AGENT_KB_USE_SUDO:-y}"
  39. c_blue='\033[34m'; c_green='\033[32m'; c_yellow='\033[33m'; c_red='\033[31m'; c_reset='\033[0m'
  40. info() { echo -e "${c_blue}[INFO]${c_reset} $*"; }
  41. ok() { echo -e "${c_green}[ OK ]${c_reset} $*"; }
  42. warn() { echo -e "${c_yellow}[WARN]${c_reset} $*"; }
  43. err() { echo -e "${c_red}[FAIL]${c_reset} $*" >&2; }
  44. # 目标目录属 agentsvc,当前用户通常没有写权限:非 root 时经 sudo 执行
  45. SUDO=""
  46. if [[ "$(id -u)" -ne 0 && "${AGENT_KB_USE_SUDO}" == "y" ]]; then
  47. if ! command -v sudo >/dev/null 2>&1; then
  48. err "需要 root 权限写入 ${KNOWLEDGE_ROOT},但系统中没有 sudo"
  49. exit 1
  50. fi
  51. SUDO="sudo"
  52. info "写入 ${KNOWLEDGE_ROOT} 需要 root 权限,将通过 sudo 执行(可能提示输入密码)"
  53. fi
  54. command -v rsync >/dev/null 2>&1 || { err "未安装 rsync(sudo apt install rsync)"; exit 1; }
  55. getent group "${AGENT_SVC_GROUP}" >/dev/null || { err "系统中没有组 ${AGENT_SVC_GROUP},请先安装 AgentServer(deploy/install.sh)"; exit 1; }
  56. [[ -d "${KNOWLEDGE_ROOT}" ]] || { err "资料库根目录不存在:${KNOWLEDGE_ROOT}(AgentServer 安装时创建)"; exit 1; }
  57. RSYNC_OPTS=(-rlt --delete --prune-empty-dirs --chmod=D2750,F0640)
  58. [[ "${AGENT_KB_DRY_RUN}" == "y" ]] && RSYNC_OPTS+=(--dry-run --itemize-changes)
  59. # sync_dir <源> <目标子目录名> [rsync 过滤参数...]
  60. sync_dir() {
  61. local src="$1" name="$2"; shift 2
  62. local dst="${KNOWLEDGE_ROOT}/${name}"
  63. if [[ ! -d "${src}" ]]; then
  64. warn "源目录不存在,跳过:${src}"
  65. return 0
  66. fi
  67. info "同步 ${src} → ${dst}"
  68. ${SUDO} mkdir -p "${dst}"
  69. ${SUDO} rsync "${RSYNC_OPTS[@]}" "$@" "${src%/}/" "${dst}/"
  70. if [[ "${AGENT_KB_DRY_RUN}" != "y" ]]; then
  71. ${SUDO} chgrp -R "${AGENT_SVC_GROUP}" "${dst}"
  72. ${SUDO} chmod 2750 "${dst}"
  73. local count
  74. count="$(${SUDO} find "${dst}" -type f | wc -l)"
  75. ok "${name}:${count} 个文件"
  76. fi
  77. }
  78. # Wiki:只要 Markdown;先排除无关目录,再放行目录与 *.md,其余排除
  79. sync_dir "${WIKI_DOCS_DIR}" "fwh-wiki" \
  80. --exclude='.vitepress/' --exclude='public/' --exclude='casdoor/' \
  81. --exclude='graphify-out/' --exclude='node_modules/' \
  82. --include='*/' --include='*.md' --exclude='*'
  83. sync_dir "${DATA_KB_DIR}" "fwh-data-knowledge" \
  84. --exclude='.DS_Store' --exclude='node_modules/'
  85. if [[ "${AGENT_KB_DRY_RUN}" == "y" ]]; then
  86. ok "预演完成(未写入任何文件)"
  87. else
  88. ok "资料库同步完成。首次使用时在 AgentServer 后台“资料库”中登记这些目录(见 deploy/agent-assistant/SETUP.md)"
  89. fi