50 lines
1.2 KiB
Bash
Executable File
50 lines
1.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -Eeuo pipefail
|
|
|
|
basedir="${basedir:-/backup}"
|
|
tempdir="$basedir/work/misskey"
|
|
|
|
database_container="misskey-database"
|
|
database_name="misskey"
|
|
volume_dir="/app/misskey/data"
|
|
docker_compose="/app/misskey/docker-compose.yml"
|
|
|
|
database_export_path="$tempdir/database.sql"
|
|
volume_export_path="$tempdir/data"
|
|
docker_compose_export_path="$tempdir/docker-compose.yml"
|
|
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')][Misskey Backup] $*"
|
|
}
|
|
|
|
cleanup() {
|
|
if mountpoint -q "$volume_export_path"; then
|
|
umount "$volume_export_path"
|
|
fi
|
|
rm -rf "$tempdir"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
main() {
|
|
log "Starting backup..."
|
|
rm -rf "$tempdir"
|
|
mkdir -p "$tempdir"
|
|
mkdir -p "$volume_export_path"
|
|
|
|
log "Exporting database..."
|
|
docker exec "$database_container" pg_dump -U postgres "$database_name" > "$database_export_path"
|
|
|
|
log "Prepare volume..."
|
|
# TODO 有一致性问题, 但问题不大, 后续可能采用 fsfreeze / btrfs snapshot
|
|
# 如果 misskey 启用了 S3, volume 里不会有文件
|
|
mount --bind "$volume_dir" "$volume_export_path"
|
|
cp "$docker_compose" "$docker_compose_export_path"
|
|
|
|
log "Run restic and upload backup"
|
|
restic backup --tag automate "$tempdir"
|
|
log "Backup complete."
|
|
}
|
|
|
|
main
|