guanghulab/server/zhiku-node/scripts/backup-data-to-cos.sh

78 lines
3.0 KiB
Bash

#!/bin/bash
# ═══════════════════════════════════════════════════════════
# 光湖智库数据备份脚本 · 定时备份/opt/zhiku/data到COS桶
# ═══════════════════════════════════════════════════════════
# 项目编号: ZY-PROJ-006
# 守护: 铸渊 · ICE-GL-ZY001
# 版权: 国作登字-2026-A-00037559
#
# 执行频率: 每天 03:00 (cron)
# 备份策略:
# - 每周一: 全量备份
# - 其他日: 增量备份(只备份变化文件)
# 存储位置: COS桶/{ZY_COS_BUCKET}/backups/zhiku-data/
# ═══════════════════════════════════════════════════════════
set -e
# ─── 环境变量 ───
COS_SECRET_ID=${ZY_COS_SECRET_ID}
COS_SECRET_KEY=${ZY_COS_SECRET_KEY}
COS_BUCKET=${ZY_COS_BUCKET:-"guanghu-1250000000"}
COS_REGION="ap-singapore"
DATA_DIR="/opt/zhiku/data"
BACKUP_DIR="/opt/zhiku/backups"
LOG_FILE="/var/log/zhiku/backup.log"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
WEEKDAY=$(date +%u) # 1-7 (1=周一)
# ─── 确保目录存在 ───
mkdir -p "${BACKUP_DIR}"
mkdir -p "$(dirname "${LOG_FILE}")"
# ─── 记录开始时间 ───
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份" >> "${LOG_FILE}"
# ─── 根据星期决定备份类型 ───
if [ "${WEEKDAY}" -eq 1 ]; then
# 周一全量备份
BACKUP_NAME="zhiku-data-full-${TIMESTAMP}.tar.gz"
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}" -C "${DATA_DIR}" .
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 创建全量备份: ${BACKUP_NAME}" >> "${LOG_FILE}"
else
# 其他日增量备份
BACKUP_NAME="zhiku-data-incr-${TIMESTAMP}.tar.gz"
FIND_CMD="find ${DATA_DIR} -type f -newermt '1 day ago'"
if [ "${WEEKDAY}" -eq 2 ]; then
# 周二对比周一的全量备份
LAST_FULL=$(ls -t "${BACKUP_DIR}"/zhiku-data-full-*.tar.gz | head -1)
if [ -n "${LAST_FULL}" ]; then
FIND_CMD="${FIND_CMD} -newer "${LAST_FULL}""
fi
fi
# 创建增量备份包
eval "${FIND_CMD}" | tar -czf "${BACKUP_DIR}/${BACKUP_NAME}" -T -
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 创建增量备份: ${BACKUP_NAME}" >> "${LOG_FILE}"
fi
# ─── 上传到COS ───
COS_CLI="/usr/local/bin/coscli"
if [ ! -f "${COS_CLI}" ]; then
# 安装COS CLI (如果还没有)
wget -q "https://github.com/tencentyun/coscli/releases/download/v0.11.0-beta/coscli-linux" -O "${COS_CLI}"
chmod +x "${COS_CLI}"
fi
"${COS_CLI}" cp "${BACKUP_DIR}/${BACKUP_NAME}" "cos://${COS_BUCKET}/backups/zhiku-data/" \
--secret-id "${COS_SECRET_ID}" \
--secret-key "${COS_SECRET_KEY}" \
--region "${COS_REGION}" \
>> "${LOG_FILE}" 2>&1
# ─── 清理旧备份(本地保留最近3份) ───
ls -t "${BACKUP_DIR}"/zhiku-data-*.tar.gz | tail -n +4 | xargs rm -f
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份完成: ${BACKUP_NAME}" >> "${LOG_FILE}"
exit 0