60 lines
2.2 KiB
Bash
Executable File
60 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 每日備份主機 106.105.181.40 各服務到 NAS NFS(hdsnas02:/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
|