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>
35 lines
1.7 KiB
Bash
Executable File
35 lines
1.7 KiB
Bash
Executable File
#!/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 (или вручную: «Администрирование → Библиотека»)."
|