mirror of
https://github.com/labring/FastGPT.git
synced 2026-03-25 01:01:56 +08:00
* sandbox-sync-agent (#6565) * action * action --------- Co-authored-by: Ryo <whoeverimf5@gmail.com>
84 lines
2.7 KiB
Bash
84 lines
2.7 KiB
Bash
#!/bin/sh
|
||
|
||
SYNC_PATH=${FASTGPT_SYNC_PATH:-/home/sandbox}
|
||
BUCKET_PATH="minio/${FASTGPT_MINIO_BUCKET}/agent-sessions/${FASTGPT_SESSION_ID}"
|
||
SYNC_INTERVAL=${SYNC_INTERVAL:-60}
|
||
HTTP_PORT=${HTTP_PORT:-8081}
|
||
STATE_DIR="${STATE_DIR:-/tmp/sync-state}"
|
||
# K8s 模式默认 /http_server.py,Docker 模式通过 supervisord.conf 注入 /opt/sync-agent/http_server.py
|
||
HTTP_SERVER_PATH="${HTTP_SERVER_PATH:-/http_server.py}"
|
||
|
||
mkdir -p "${STATE_DIR}"
|
||
|
||
LAST_SYNC_FILE="${STATE_DIR}/last_sync"
|
||
PENDING_FILE="${STATE_DIR}/pending_count"
|
||
TRIGGER_FILE="${STATE_DIR}/trigger"
|
||
|
||
# 初始化状态
|
||
date -u +%Y-%m-%dT%H:%M:%SZ > "${LAST_SYNC_FILE}"
|
||
echo "0" > "${PENDING_FILE}"
|
||
|
||
# 1. 启动时下载历史文件
|
||
echo "[Sync] Downloading files from ${BUCKET_PATH}..."
|
||
mc mirror "${BUCKET_PATH}" "${SYNC_PATH}" --overwrite || true
|
||
date -u +%Y-%m-%dT%H:%M:%SZ > "${LAST_SYNC_FILE}"
|
||
|
||
# 2. 启动 HTTP 健康检查服务(后台)
|
||
echo "[Sync] Starting HTTP server on port ${HTTP_PORT}..."
|
||
python3 "${HTTP_SERVER_PATH}" &
|
||
|
||
# 3. 启动后台全量同步(定时 + 手动触发)
|
||
(
|
||
while true; do
|
||
sleep "${SYNC_INTERVAL}"
|
||
|
||
# 检查手动触发
|
||
if [ -f "${TRIGGER_FILE}" ]; then
|
||
rm -f "${TRIGGER_FILE}"
|
||
echo "[Sync] Manual sync triggered via POST /sync"
|
||
fi
|
||
|
||
echo "[Sync] Periodic sync to MinIO..."
|
||
mc mirror "${SYNC_PATH}" "${BUCKET_PATH}" --overwrite
|
||
date -u +%Y-%m-%dT%H:%M:%SZ > "${LAST_SYNC_FILE}"
|
||
echo "0" > "${PENDING_FILE}"
|
||
done
|
||
) &
|
||
|
||
# 4. 使用 inotify 监听实时变更(前台,保持进程存活)
|
||
echo "[Sync] Watching ${SYNC_PATH} for changes..."
|
||
inotifywait -m -r -e create,modify,move,delete --format '%w%f' "${SYNC_PATH}" | while read -r file; do
|
||
# 过滤临时文件(锚定行尾)
|
||
if echo "$file" | grep -qE '\.(tmp|swp|~)$'; then
|
||
continue
|
||
fi
|
||
|
||
echo "[Sync] Change detected: $file"
|
||
|
||
# 更新待同步计数
|
||
PENDING=$(cat "${PENDING_FILE}" 2>/dev/null || echo "0")
|
||
echo $((PENDING + 1)) > "${PENDING_FILE}"
|
||
|
||
# 计算相对路径
|
||
rel_path="${file#${SYNC_PATH}/}"
|
||
|
||
if [ -f "$file" ]; then
|
||
# 文件创建/修改:上传到 MinIO
|
||
mc cp "$file" "${BUCKET_PATH}/${rel_path}"
|
||
date -u +%Y-%m-%dT%H:%M:%SZ > "${LAST_SYNC_FILE}"
|
||
# 成功后将 pending 减 1
|
||
PENDING=$(cat "${PENDING_FILE}" 2>/dev/null || echo "1")
|
||
PENDING=$((PENDING - 1))
|
||
[ "${PENDING}" -lt 0 ] && PENDING=0
|
||
echo "${PENDING}" > "${PENDING_FILE}"
|
||
elif [ ! -e "$file" ]; then
|
||
# 文件删除
|
||
mc rm "${BUCKET_PATH}/${rel_path}" || true
|
||
date -u +%Y-%m-%dT%H:%M:%SZ > "${LAST_SYNC_FILE}"
|
||
PENDING=$(cat "${PENDING_FILE}" 2>/dev/null || echo "1")
|
||
PENDING=$((PENDING - 1))
|
||
[ "${PENDING}" -lt 0 ] && PENDING=0
|
||
echo "${PENDING}" > "${PENDING_FILE}"
|
||
fi
|
||
done
|