- Include a webhook URL to send notifications after backups. - Capture and log the duration and size of the backups. - Create a new Kubernetes secret for storing the Feishu webhook URL. - Enhance the backup script to notify users of backup success with details. This change improves monitoring and user notification of backup events, allowing for better awareness and response times in case of failure or success of the backup processes.
128 lines
3.9 KiB
YAML
128 lines
3.9 KiB
YAML
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: backup-script
|
|
namespace: backup-system
|
|
data:
|
|
backup.sh: |
|
|
#!/bin/bash
|
|
set -e
|
|
|
|
# 获取环境变量
|
|
S3_ENDPOINT="${S3_ENDPOINT}"
|
|
S3_ACCESS_KEY="${S3_ACCESS_KEY}"
|
|
S3_SECRET_KEY="${S3_SECRET_KEY}"
|
|
S3_BUCKET="${S3_BUCKET}"
|
|
S3_SUBPATH="${S3_SUBPATH:-backups}"
|
|
BACKUPS_TO_KEEP="${BACKUPS_TO_KEEP:-7}"
|
|
|
|
# 获取主机名
|
|
HOSTNAME=$(hostname)
|
|
HOSTNAME="${NODE_NAME:-$HOSTNAME}"
|
|
|
|
FEISHU_WEBHOOK_URL=$(cat /etc/feishu-webhook/url)
|
|
|
|
START_TIME=$(date +%s)
|
|
|
|
# 配置 s3cmd
|
|
cat > ~/.s3cfg << EOF
|
|
[default]
|
|
access_key = ${S3_ACCESS_KEY}
|
|
secret_key = ${S3_SECRET_KEY}
|
|
host_base = ${S3_ENDPOINT}
|
|
host_bucket = ${S3_ENDPOINT}
|
|
use_https = ${USE_HTTPS:-True}
|
|
signature_v2 = ${SIGNATURE_V2:-False}
|
|
EOF
|
|
|
|
# 检查 /data/local-csi 路径是否存在
|
|
if [ ! -d "/data/local-csi" ]; then
|
|
echo "目录 /data/local-csi 不存在,退出备份"
|
|
exit 0
|
|
fi
|
|
|
|
# 检查目录下是否有至少一个子目录
|
|
DIR_COUNT=$(find /data/local-csi -mindepth 1 -maxdepth 1 -type d | wc -l)
|
|
if [ "$DIR_COUNT" -eq 0 ]; then
|
|
echo "目录 /data/local-csi 中没有子目录,退出备份"
|
|
exit 0
|
|
fi
|
|
|
|
# 遍历所有目录
|
|
find /data/local-csi -mindepth 1 -maxdepth 1 -type d | while read dir; do
|
|
DIR_NAME=$(basename "$dir")
|
|
TIMESTAMP=$(date +%Y-%m-%d-%H-%M-%S)
|
|
BACKUP_NAME="backup-${DIR_NAME}-${TIMESTAMP}.tar.gz"
|
|
TEMP_DIR=$(mktemp -d)
|
|
BACKUP_PATH="/tmp/${BACKUP_NAME}"
|
|
SOURCE_SIZE=$(du -sh /data/local-csi | cut -f1)
|
|
|
|
echo "正在备份目录: $dir"
|
|
|
|
rsync -a "/data/local-csi/$DIR_NAME/" "$TEMP_DIR/"
|
|
# 创建备份压缩包
|
|
# tar -czf "$BACKUP_PATH" -C "/data/local-csi" "$DIR_NAME"
|
|
tar -czf "$BACKUP_PATH" -C "/data/local-csi" "$TEMP_DIR"
|
|
|
|
# 清理临时目录
|
|
rm -rf "$TEMP_DIR"
|
|
|
|
# 计算上传路径
|
|
BACKUP_TARGET_PATH="s3://${S3_BUCKET}/${S3_SUBPATH}/${HOSTNAME}/${DIR_NAME}/"
|
|
echo "上传备份 $BACKUP_PATH 到 S3 路径: $BACKUP_TARGET_PATH"
|
|
|
|
# 上传备份文件
|
|
s3cmd put "$BACKUP_PATH" "${BACKUP_TARGET_PATH}${BACKUP_NAME}"
|
|
|
|
# 删除本地临时备份
|
|
rm "$BACKUP_PATH"
|
|
|
|
# 清理旧备份
|
|
echo "清理旧备份,保留最新的 $BACKUPS_TO_KEEP 个文件"
|
|
|
|
# 获取所有备份文件并按时间排序
|
|
BACKUP_FILES=$(s3cmd ls "${BACKUP_TARGET_PATH}" | sort -k1,2)
|
|
BACKUP_COUNT=$(echo "$BACKUP_FILES" | grep -c "backup-${DIR_NAME}")
|
|
|
|
if [ "$BACKUP_COUNT" -gt "$BACKUPS_TO_KEEP" ]; then
|
|
# 计算需要删除的文件数量
|
|
DELETE_COUNT=$((BACKUP_COUNT - BACKUPS_TO_KEEP))
|
|
|
|
# 获取需要删除的文件列表
|
|
FILES_TO_DELETE=$(echo "$BACKUP_FILES" | head -n $DELETE_COUNT | awk '{print $4}')
|
|
|
|
# 删除文件
|
|
for FILE in $FILES_TO_DELETE; do
|
|
echo "删除旧备份: $FILE"
|
|
s3cmd rm "$FILE"
|
|
done
|
|
fi
|
|
done
|
|
|
|
END_TIME=$(date +%s)
|
|
echo "备份完成"
|
|
|
|
DURATION=$((END_TIME - START_TIME))
|
|
MSG_TITLE="✅ [K3s Backup] $NODE_NAME Backup Success"
|
|
MSG_TEXT="Host: $NODE_NAME\nSource: /data\nSource Size: $SOURCE_SIZE\nDuration: ${DURATION}s"
|
|
JSON_PAYLOAD=$(jq -n \
|
|
--arg title "$MSG_TITLE" \
|
|
--arg text "$MSG_TEXT" \
|
|
'{msg_type: "post", content: {post: {zh_cn: {title: $title, content: [[{tag: "text", text: $text}]]}}}}')
|
|
echo "Sending notification to Feishu..."
|
|
curl -X POST -H "Content-Type: application/json" -d "$JSON_PAYLOAD" "$FEISHU_WEBHOOK_URL"
|
|
echo "Notification sent."
|
|
|
|
s3cmd-trigger.sh: |
|
|
#!/bin/bash
|
|
set -e
|
|
|
|
# 检查标记文件
|
|
if [ -f "/tmp/backup-triggered" ]; then
|
|
echo "发现备份触发标记,执行备份脚本..."
|
|
bash /scripts/backup.sh
|
|
rm /tmp/backup-triggered
|
|
echo "备份完成"
|
|
fi
|
|
|