| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #!/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 数据知识库源目录 (默认 <repo>/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
|