feat(deploy): nightly database backups with verified restore (M7)
A backup container dumps the database every night, keeps 14 daily and 8 weekly copies and once a week restores a copy into a scratch database to check tables and row counts. update.sh takes a copy before updating, restore.sh brings one back and keeps the old database aside. CI runs the dump, verify and restore cycle on the database the end-to-end journey filled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d91ff89c64
commit
aacf55679a
7 files changed
+250
-3
No files matched your search
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# Восстановление базы из резервной копии (docs/deployment.md#бэкапы).
|
||||
# ./restore.sh — список копий
|
||||
# ./restore.sh daily/pipu-20261020-033000.dump
|
||||
# Сервисы, пишущие в базу, останавливаются на время восстановления; прежняя база сохраняется рядом.
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
[ -f .env ] || { echo "нет .env — сначала sudo ./install.sh" >&2; exit 1; }
|
||||
DATA="$(sed -n 's/^PIPU_DATA=//p' .env)"
|
||||
DATA="${DATA:-/srv/pipu}"
|
||||
|
||||
if [ -z "${1:-}" ]; then
|
||||
echo "Копии в $DATA/backups (новые сверху):"
|
||||
(cd "$DATA/backups" && ls -1t daily/*.dump weekly/*.dump 2>/dev/null) || echo " копий нет"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
rel="${1#"$DATA/backups/"}"
|
||||
[ -f "$DATA/backups/$rel" ] || { echo "нет файла $DATA/backups/$rel" >&2; exit 1; }
|
||||
|
||||
echo "→ восстановление из $rel: api, рекомендации и анализ будут остановлены на время восстановления"
|
||||
read -r -p "Продолжить? [y/N] " yes
|
||||
[ "$yes" = y ] || [ "$yes" = Y ] || exit 1
|
||||
|
||||
docker compose stop api recommender analyzer storage-agent
|
||||
if docker compose run --rm backup restore "/backups/$rel"; then
|
||||
status=0
|
||||
else
|
||||
status=1
|
||||
fi
|
||||
docker compose up -d
|
||||
[ "$status" = 0 ] || { echo "восстановление не удалось — база не изменена" >&2; exit 1; }
|
||||
echo "готово. Поиск переиндексируется при старте api (или вручную: «Администрирование → Библиотека»)."
|
||||
Reference in new issue
Block a user