Files
106_105_181_40/nfs_backup/backup_all_to_nfs.sh
2026-06-29 14:31:39 +08:00

60 lines
2.2 KiB
Bash
Executable File
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.
#!/usr/bin/env bash
# 每日備份主機 106.105.181.40 各服務到 NAS NFShdsnas02:/TEL_BACKUP_NFS
# 由 cron 以 root 執行(見 /etc/cron.d/backup-nfs
# 手動執行sudo /opt/backup_all_to_nfs.sh
set -u
NFS=/mnt/tel_backup_nfs
BASE=$NFS/106_105_181_40
RETAIN_DAYS=14 # 保留天數,超過即刪除
TS=$(date +%Y%m%d_%H%M%S)
DEST=$BASE/$TS
LOG=$BASE/backup.log
log(){ echo "[$(date '+%F %T')] $*" | tee -a "$LOG"; }
# 安全檢查NFS 一定要掛載,否則中止(避免寫進本機根磁碟把它撐爆)
if ! mountpoint -q "$NFS"; then
echo "[$(date '+%F %T')] ERROR: $NFS 未掛載,中止備份" | tee -a "$LOG" >&2
exit 1
fi
mkdir -p "$DEST"
log "===== 備份開始 -> $DEST ====="
ok=0; fail=0
# do_tar <名稱> <來源上層目錄> <項目>
do_tar(){
if tar czf "$DEST/$1.tar.gz" -C "$2" "$3" 2>"$DEST/$1.err"; then
log "$1 OK $(du -h "$DEST/$1.tar.gz" | cut -f1)"; rm -f "$DEST/$1.err"; ok=$((ok+1))
else
log "$1 FAIL: $(cat "$DEST/$1.err")"; fail=$((fail+1))
fi
}
do_tar caddy /opt caddy
do_tar php /opt php
do_tar php-staging /opt php-staging
do_tar phpmyadmin /opt phpmyadmin
do_tar coturn /opt coturn
do_tar antmedia_volume /var/lib/docker/volumes/antmedia_volume/_data .
# MySQL邏輯備份--single-transaction = InnoDB 一致性快照,不鎖表)
# 密碼從容器內環境變數取,不出現在主機 process list
if docker exec mysql-container sh -c \
'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases --single-transaction --routines --triggers --events' \
2>"$DEST/mysql.err" | gzip > "$DEST/mysql_all_databases.sql.gz" \
&& [ -s "$DEST/mysql_all_databases.sql.gz" ]; then
log "mysql OK $(du -h "$DEST/mysql_all_databases.sql.gz" | cut -f1)"; rm -f "$DEST/mysql.err"; ok=$((ok+1))
else
log "mysql FAIL: $(cat "$DEST/mysql.err" 2>/dev/null)"; fail=$((fail+1))
fi
log "===== 完成:成功 $ok / 失敗 $fail,本次大小 $(du -sh "$DEST" | cut -f1) ====="
# 保留天數內,清掉更舊的備份
find "$BASE" -maxdepth 1 -type d -name '20*' -mtime +"$RETAIN_DAYS" -exec rm -rf {} \; 2>/dev/null
log "===== 已清理超過 ${RETAIN_DAYS} 天的舊備份 ====="
[ "$fail" -eq 0 ] || exit 1