签名算法从 COS HMAC-SHA1 改为 TOS V4 HMAC-SHA256, 更新前后端上传凭证字段、配置项、备份脚本和文档。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
50 lines
1.6 KiB
Bash
Executable File
50 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
||
# ===========================
|
||
# PostgreSQL 每日备份脚本
|
||
# 备份到本地 + 上传到火山引擎 TOS
|
||
# ===========================
|
||
# 配合 crontab 使用:
|
||
# 0 3 * * * /path/to/backup.sh >> /var/log/miaosi-backup.log 2>&1
|
||
|
||
set -euo pipefail
|
||
|
||
# ---- 配置 ----
|
||
BACKUP_DIR="${BACKUP_DIR:-/var/backups/miaosi}"
|
||
POSTGRES_CONTAINER="${POSTGRES_CONTAINER:-miaosi-postgres}"
|
||
POSTGRES_USER="${POSTGRES_USER:-postgres}"
|
||
POSTGRES_DB="${POSTGRES_DB:-miaosi}"
|
||
RETAIN_DAYS="${RETAIN_DAYS:-7}"
|
||
|
||
# TOS 备份桶(需要先安装 tosutil 并配置好凭证)
|
||
TOS_BACKUP_BUCKET="${TOS_BACKUP_BUCKET:-}"
|
||
TOS_BACKUP_PREFIX="${TOS_BACKUP_PREFIX:-backups/postgres}"
|
||
|
||
# ---- 执行 ----
|
||
DATE=$(date +%Y%m%d_%H%M%S)
|
||
FILENAME="miaosi_${DATE}.sql.gz"
|
||
|
||
mkdir -p "$BACKUP_DIR"
|
||
|
||
echo "[$(date)] 开始备份数据库 ${POSTGRES_DB}..."
|
||
|
||
# 1. pg_dump 导出并压缩
|
||
docker exec "$POSTGRES_CONTAINER" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" | gzip > "${BACKUP_DIR}/${FILENAME}"
|
||
|
||
echo "[$(date)] 本地备份完成: ${BACKUP_DIR}/${FILENAME}"
|
||
|
||
# 2. 上传到 TOS(如果配置了备份桶)
|
||
if [ -n "$TOS_BACKUP_BUCKET" ]; then
|
||
if command -v tosutil &> /dev/null; then
|
||
tosutil cp "${BACKUP_DIR}/${FILENAME}" "tos://${TOS_BACKUP_BUCKET}/${TOS_BACKUP_PREFIX}/${FILENAME}"
|
||
echo "[$(date)] 已上传到 TOS: ${TOS_BACKUP_BUCKET}/${TOS_BACKUP_PREFIX}/${FILENAME}"
|
||
else
|
||
echo "[$(date)] 警告: tosutil 未安装,跳过 TOS 上传"
|
||
fi
|
||
fi
|
||
|
||
# 3. 清理过期的本地备份
|
||
find "$BACKUP_DIR" -name "miaosi_*.sql.gz" -mtime +"$RETAIN_DAYS" -delete
|
||
echo "[$(date)] 已清理 ${RETAIN_DAYS} 天前的本地备份"
|
||
|
||
echo "[$(date)] 备份完成"
|