78 lines
3.0 KiB
Bash
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 |