39 lines
1.3 KiB
Bash
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 文件同步到异地加密存储。'
|