#!/usr/bin/env bash # ============================================================================= # FranklinWH Toolbox - 新 AI 助手资料库同步脚本(单向:源 → AgentServer 资料库目录) # ============================================================================= # 作用:把产品 Wiki 与数据知识库同步到 AgentServer 的资料库目录,供后台“资料库”登记使用。 # AgentServer 以 agentsvc 运行且开启 ProtectHome,看不到 /home 下的源目录, # 所以需要拷贝到 /srv/agent-server/knowledge/ 下。 # # 同步内容(rsync --delete,目标目录与源保持一致): # * FranklinWH-Wiki client/docs → ${KNOWLEDGE_ROOT}/fwh-wiki # 只同步 *.md;排除 .vitepress / public / casdoor / graphify-out / node_modules # * FranklinWH-ToolBox docs/knowledge → ${KNOWLEDGE_ROOT}/fwh-data-knowledge # 同步全部文件 # 权限:目录属组 agentsvc、setgid,文件 0640、目录 2750(agentsvc 只读即可)。 # # 用法: # ./sync_agent_knowledge.sh # 执行同步 # AGENT_KB_DRY_RUN=y ./sync_agent_knowledge.sh # 预演,只打印 rsync 将做的改动 # # 环境变量: # WIKI_DOCS_DIR Wiki 文档源目录 (默认 /home/jerry-remote/web/FranklinWH-Wiki/client/docs) # DATA_KB_DIR 数据知识库源目录 (默认 /docs/knowledge) # KNOWLEDGE_ROOT 资料库根目录 (默认 /srv/agent-server/knowledge) # AGENT_SVC_GROUP AgentServer 运行组 (默认 agentsvc) # AGENT_KB_DRY_RUN 只打印不落盘 (y/n) (默认 n) # AGENT_KB_USE_SUDO 非 root 时是否经 sudo 写入 (y/n) (默认 y;目标目录自己可写时可设 n) # # 同步方式:手动。Wiki 或数据知识库更新后,需要时手动运行一次本脚本(不配置定时任务)。 # ============================================================================= set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" WIKI_DOCS_DIR="${WIKI_DOCS_DIR:-/home/jerry-remote/web/FranklinWH-Wiki/client/docs}" DATA_KB_DIR="${DATA_KB_DIR:-${REPO_DIR}/docs/knowledge}" KNOWLEDGE_ROOT="${KNOWLEDGE_ROOT:-/srv/agent-server/knowledge}" AGENT_SVC_GROUP="${AGENT_SVC_GROUP:-agentsvc}" AGENT_KB_DRY_RUN="${AGENT_KB_DRY_RUN:-n}" AGENT_KB_USE_SUDO="${AGENT_KB_USE_SUDO:-y}" c_blue='\033[34m'; c_green='\033[32m'; c_yellow='\033[33m'; c_red='\033[31m'; c_reset='\033[0m' info() { echo -e "${c_blue}[INFO]${c_reset} $*"; } ok() { echo -e "${c_green}[ OK ]${c_reset} $*"; } warn() { echo -e "${c_yellow}[WARN]${c_reset} $*"; } err() { echo -e "${c_red}[FAIL]${c_reset} $*" >&2; } # 目标目录属 agentsvc,当前用户通常没有写权限:非 root 时经 sudo 执行 SUDO="" if [[ "$(id -u)" -ne 0 && "${AGENT_KB_USE_SUDO}" == "y" ]]; then if ! command -v sudo >/dev/null 2>&1; then err "需要 root 权限写入 ${KNOWLEDGE_ROOT},但系统中没有 sudo" exit 1 fi SUDO="sudo" info "写入 ${KNOWLEDGE_ROOT} 需要 root 权限,将通过 sudo 执行(可能提示输入密码)" fi command -v rsync >/dev/null 2>&1 || { err "未安装 rsync(sudo apt install rsync)"; exit 1; } getent group "${AGENT_SVC_GROUP}" >/dev/null || { err "系统中没有组 ${AGENT_SVC_GROUP},请先安装 AgentServer(deploy/install.sh)"; exit 1; } [[ -d "${KNOWLEDGE_ROOT}" ]] || { err "资料库根目录不存在:${KNOWLEDGE_ROOT}(AgentServer 安装时创建)"; exit 1; } RSYNC_OPTS=(-rlt --delete --prune-empty-dirs --chmod=D2750,F0640) [[ "${AGENT_KB_DRY_RUN}" == "y" ]] && RSYNC_OPTS+=(--dry-run --itemize-changes) # sync_dir <源> <目标子目录名> [rsync 过滤参数...] sync_dir() { local src="$1" name="$2"; shift 2 local dst="${KNOWLEDGE_ROOT}/${name}" if [[ ! -d "${src}" ]]; then warn "源目录不存在,跳过:${src}" return 0 fi info "同步 ${src} → ${dst}" ${SUDO} mkdir -p "${dst}" ${SUDO} rsync "${RSYNC_OPTS[@]}" "$@" "${src%/}/" "${dst}/" if [[ "${AGENT_KB_DRY_RUN}" != "y" ]]; then ${SUDO} chgrp -R "${AGENT_SVC_GROUP}" "${dst}" ${SUDO} chmod 2750 "${dst}" local count count="$(${SUDO} find "${dst}" -type f | wc -l)" ok "${name}:${count} 个文件" fi } # Wiki:只要 Markdown;先排除无关目录,再放行目录与 *.md,其余排除 sync_dir "${WIKI_DOCS_DIR}" "fwh-wiki" \ --exclude='.vitepress/' --exclude='public/' --exclude='casdoor/' \ --exclude='graphify-out/' --exclude='node_modules/' \ --include='*/' --include='*.md' --exclude='*' sync_dir "${DATA_KB_DIR}" "fwh-data-knowledge" \ --exclude='.DS_Store' --exclude='node_modules/' if [[ "${AGENT_KB_DRY_RUN}" == "y" ]]; then ok "预演完成(未写入任何文件)" else ok "资料库同步完成。首次使用时在 AgentServer 后台“资料库”中登记这些目录(见 deploy/agent-assistant/SETUP.md)" fi