Files
lehuo/infra/ubuntu/scripts/backup.sh
T

39 lines
1.3 KiB
Bash

#!/usr/bin/env bash
set -Eeuo pipefail
# shellcheck source=lib.sh
source "$(dirname -- "${BASH_SOURCE[0]}")/lib.sh"
env_file="${1:-/etc/lehuo/lehuo.env}"
require_command docker
require_command gzip
require_command sha256sum
require_env_file "$env_file"
backup_dir="$(env_value "$env_file" BACKUP_DIR)"
[[ "$backup_dir" == /opt/lehuo/backups || "$backup_dir" == /opt/lehuo/backups/* ]] || {
echo 'BACKUP_DIR 必须位于 /opt/lehuo/backups。' >&2
exit 1
}
install -d -m 0700 "$backup_dir"
database="$(env_value "$env_file" MYSQL_DATABASE)"
timestamp="$(date -u +%Y%m%dT%H%M%SZ)"
target="$backup_dir/lehuo-${timestamp}.sql.gz"
temporary="${target}.tmp"
trap 'rm -f -- "$temporary"' EXIT
compose "$env_file" exec -T mysql sh -c \
'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysqldump --single-transaction --routines --triggers --events --set-gtid-purged=OFF -u root "$MYSQL_DATABASE"' \
| gzip -9 > "$temporary"
gzip -t "$temporary"
mv -- "$temporary" "$target"
chmod 600 "$target"
sha256sum "$target" > "${target}.sha256"
chmod 600 "${target}.sha256"
find "$backup_dir" -maxdepth 1 -type f \( -name 'lehuo-*.sql.gz' -o -name 'lehuo-*.sql.gz.sha256' \) -mtime +30 -delete
printf '数据库备份完成:%s(数据库:%s)\n' "$target" "$database"
echo '请将备份及 SHA-256 文件同步到异地加密存储。'