|
|
#!/bin/bash |
|
|
set -e |
|
|
|
|
|
echo "--- [$(date)] Background Backup Service Initializing ---" |
|
|
|
|
|
|
|
|
echo "--- [$(date)] Initial startup delay. Waiting 90 seconds before starting backup cycles... ---" |
|
|
sleep 90 |
|
|
|
|
|
|
|
|
while true; do |
|
|
|
|
|
flock -n /tmp/backup.lock bash -c ' |
|
|
set -e |
|
|
echo "--- [$(date)] Starting Scheduled Backup ---" |
|
|
|
|
|
# --- 变量与暂存区定义 --- |
|
|
LIVE_DATA_DIR="/app/server/storage" |
|
|
LIVE_DB_FILE="/app/server/anythingllm.db" |
|
|
STAGE_DIR="/tmp/backup_stage" |
|
|
|
|
|
# --- 步骤 1: 清理并创建干净的暂存区 --- |
|
|
echo "[Backup] Preparing a clean staging area at ${STAGE_DIR}..." |
|
|
rm -rf "${STAGE_DIR}" |
|
|
mkdir -p "${STAGE_DIR}/storage" |
|
|
|
|
|
# --- 步骤 2: 安全地创建数据库快照并复制到暂存区 --- |
|
|
echo "[Backup] Creating a safe snapshot of the SQLite database..." |
|
|
if [ ! -f "${LIVE_DB_FILE}" ]; then |
|
|
echo "[Error] Database file not found: ${LIVE_DB_FILE}" |
|
|
exit 1 |
|
|
fi |
|
|
sqlite3 "${LIVE_DB_FILE}" ".backup '${STAGE_DIR}/anythingllm.db'" |
|
|
if [ $? -ne 0 ]; then |
|
|
echo "[Error] Failed to create database backup" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
# --- 步骤 3: 将线上数据目录同步到暂存区 --- |
|
|
echo "[Backup] Syncing live data to the staging area..." |
|
|
rsync -a --delete "${LIVE_DATA_DIR}/" "${STAGE_DIR}/storage/" |
|
|
|
|
|
# --- 步骤 4: 从隔离的暂存区执行备份 --- |
|
|
# --- 4a. WebDAV 备份 --- |
|
|
if [ -n "${WEBDAV_URL}" ]; then |
|
|
echo "[Backup] Syncing from staging area to WebDAV..." |
|
|
rclone sync "${STAGE_DIR}/" "webdav:anythingllm_backup/" --create-empty-src-dirs |
|
|
echo "[Backup] WebDAV sync completed." |
|
|
fi |
|
|
|
|
|
# --- 4b. GitHub 备份 --- |
|
|
if [ -n "${GITHUB_REPO}" ]; then |
|
|
echo "[Backup] Pushing from staging area to GitHub..." |
|
|
cd "${STAGE_DIR}" |
|
|
if [ ! -d ".git" ]; then |
|
|
git init -b main |
|
|
git config --global user.email "backup-bot@example.com" |
|
|
git config --global user.name "Backup Bot" |
|
|
git remote add origin https://${GITHUB_TOKEN}@github.com/${GITHUB_REPO} |
|
|
fi |
|
|
git add . |
|
|
if ! git diff-index --quiet HEAD --; then |
|
|
git commit -m "Automated backup: $(date -u)" |
|
|
git push -u origin main -f |
|
|
echo "[Backup] Pushed changes to GitHub." |
|
|
else |
|
|
echo "[Backup] No changes to commit to GitHub." |
|
|
fi |
|
|
fi |
|
|
|
|
|
# --- 步骤 5: 清理暂存区 --- |
|
|
echo "[Backup] Cleaning up staging area..." |
|
|
rm -rf "${STAGE_DIR}" |
|
|
|
|
|
# --- 步骤 6: 发送成功心跳 --- |
|
|
if [ -n "${HEALTHCHECK_URL}" ]; then |
|
|
echo "[Backup] Sending success ping..." |
|
|
curl -fsS -m 10 --retry 3 ${HEALTHCHECK_URL} > /dev/null || echo "[Warning] Health check ping failed." |
|
|
fi |
|
|
|
|
|
echo "--- [$(date)] Backup Finished ---" |
|
|
' "${BACKUP_INTERVAL:-3600}" |
|
|
sleep ${BACKUP_INTERVAL:-3600} |
|
|
done |