JJServiceManagerRelay/backup/backup.sh

40 lines
1.2 KiB
Bash
Executable File

#!/bin/sh
# JJServiceManagerRelay DB 백업 — 매일 BACKUP_HOUR시에 pg_dump, 최근 BACKUP_KEEP개 보관
# 수동 백업: sudo docker exec jjsm-backup /bin/sh /backup.sh now
KEEP="${BACKUP_KEEP:-30}"
HOUR="${BACKUP_HOUR:-3}"
run_backup() {
ts=$(date +%Y%m%d-%H%M%S)
file="/backup/jjsm-$ts.sql.gz"
if pg_dump --no-owner --no-privileges | gzip -9 > "$file.tmp"; then
mv "$file.tmp" "$file"
echo "$(date '+%F %T') 백업 완료: $file ($(du -h "$file" | cut -f1))"
else
rm -f "$file.tmp"
echo "$(date '+%F %T') 백업 실패" >&2
return 1
fi
# 오래된 백업 파일 정리 (최근 KEEP개만 남김)
ls -1t /backup/jjsm-*.sql.gz 2>/dev/null | tail -n +$((KEEP + 1)) | while read -r old; do
rm -f "$old" && echo "$(date '+%F %T') 오래된 백업 정리: $old"
done
}
if [ "$1" = "now" ]; then
run_backup
exit $?
fi
echo "$(date '+%F %T') 백업 대기 시작 (매일 ${HOUR}시, ${KEEP}개 보관)"
until pg_isready -q; do sleep 5; done
last=""
while true; do
today=$(date +%F)
if [ "$(date +%H | sed 's/^0//')" = "$HOUR" ] && [ "$last" != "$today" ]; then
run_backup && last="$today"
fi
sleep 60
done