#!/usr/bin/env bash # Восстановление прода из архива бэкапа (fs_.tar.gz): БД + uploads + achievements. # ДЕСТРУКТИВНО — заменяет текущие данные тома. Сначала проверьте на тест-контуре! # Использование: # scripts/restore.sh backups/fs_YYYYmmdd_HHMMSS.tar.gz [--yes] set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" COMPOSE="docker compose -f $PROJECT_DIR/docker-compose.yml" SERVICE="app" ARCHIVE="${1:-}" CONFIRM="${2:-}" if [ -z "$ARCHIVE" ] || [ ! -f "$ARCHIVE" ]; then echo "Использование: $0 <путь к fs_*.tar.gz> [--yes]" >&2 exit 1 fi if [ "$CONFIRM" != "--yes" ]; then printf "ВНИМАНИЕ: текущие БД/uploads/achievements будут заменены из %s\nПродолжить? [y/N] " "$ARCHIVE" read -r ans case "$ans" in y|Y|yes|да|Да) ;; *) echo "Отменено."; exit 1 ;; esac fi STAGE="$(mktemp -d)" trap 'rm -rf "$STAGE"' EXIT tar -xzf "$ARCHIVE" -C "$STAGE" if [ ! -f "$STAGE/forbidden_stars.db" ]; then echo "ОШИБКА: в архиве нет forbidden_stars.db." >&2 exit 1 fi echo "[restore] Остановка приложения…" $COMPOSE stop "$SERVICE" echo "[restore] Очистка тома (старая БД, WAL/SHM, медиа, титулы)…" $COMPOSE run --rm --no-deps -T --entrypoint sh "$SERVICE" -c \ "rm -f /data/forbidden_stars.db /data/forbidden_stars.db-wal /data/forbidden_stars.db-shm; rm -rf /data/uploads/* /data/achievements/*" CID="$($COMPOSE ps -aq "$SERVICE")" echo "[restore] Запись данных в контейнер…" docker cp "$STAGE/forbidden_stars.db" "$CID:/data/forbidden_stars.db" [ -d "$STAGE/uploads" ] && docker cp "$STAGE/uploads/." "$CID:/data/uploads" [ -d "$STAGE/achievements" ] && docker cp "$STAGE/achievements/." "$CID:/data/achievements" echo "[restore] Запуск приложения…" $COMPOSE start "$SERVICE" echo "[restore] Готово. Проверьте https://forbiddenstars.ru и логи: $COMPOSE logs -f app"