Files
Archer 7101ba5fee V4.14.9 dev (#6566)
* sandbox-sync-agent (#6565)

* action

* action

---------

Co-authored-by: Ryo <whoeverimf5@gmail.com>
2026-03-16 18:11:00 +08:00

84 lines
2.7 KiB
Bash
Raw Permalink 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.
#!/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.pyDocker 模式通过 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