- 新增 backup.sh: pg_dump + gzip,自动清理过期备份 - production compose 添加 backup 服务: cron 每日 02:00 执行 - 可通过 BACKUP_CRON / BACKUP_KEEP_DAYS 环境变量自定义
44 lines
1.2 KiB
Bash
44 lines
1.2 KiB
Bash
#!/usr/bin/env bash
|
|
# PostgreSQL 自动备份脚本
|
|
# 用法:
|
|
# 手动: ./docker/backup.sh
|
|
# 自动: 由 docker compose backup 服务每日 02:00 执行
|
|
set -euo pipefail
|
|
|
|
BACKUP_DIR="${BACKUP_DIR:-/backups}"
|
|
PG_HOST="${PGHOST:-postgres}"
|
|
PG_PORT="${PGPORT:-5432}"
|
|
PG_USER="${PGUSER:-erp}"
|
|
PG_DB="${PGDATABSE:-erp}"
|
|
KEEP_DAYS="${KEEP_DAYS:-7}"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
FILENAME="${PG_DB}_${TIMESTAMP}.sql.gz"
|
|
FILEPATH="${BACKUP_DIR}/${FILENAME}"
|
|
|
|
mkdir -p "${BACKUP_DIR}"
|
|
|
|
echo "[$(date -Iseconds)] 开始备份 ${PG_DB} → ${FILEPATH}"
|
|
|
|
if pg_dump \
|
|
-h "${PG_HOST}" \
|
|
-p "${PG_PORT}" \
|
|
-U "${PG_USER}" \
|
|
-d "${PG_DB}" \
|
|
--format=plain \
|
|
--no-owner \
|
|
--no-privileges \
|
|
| gzip > "${FILEPATH}"; then
|
|
SIZE=$(du -h "${FILEPATH}" | cut -f1)
|
|
echo "[$(date -Iseconds)] 备份完成: ${FILENAME} (${SIZE})"
|
|
else
|
|
echo "[$(date -Iseconds)] 备份失败!" >&2
|
|
rm -f "${FILEPATH}"
|
|
exit 1
|
|
fi
|
|
|
|
# 清理过期备份
|
|
DELETED=$(find "${BACKUP_DIR}" -name "${PG_DB}_*.sql.gz" -mtime +${KEEP_DAYS} -delete -print | wc -l)
|
|
if [ "${DELETED}" -gt 0 ]; then
|
|
echo "[$(date -Iseconds)] 已清理 ${DELETED} 个过期备份(>${KEEP_DAYS}天)"
|
|
fi
|