restore-from-backup
Skill1 starsChanged 3 months agoMITView on GitHub
Восстановление данных из restic-бэкапа: список снапшотов, выбор что и на какой момент восстановить, безопасное восстановление СНАЧАЛА во временное место + сверка, и только потом — промоушен в прод (перезапись боевых данных = красная зона, type-to-confirm). Работает по тому же restic/rclone-стеку, что ставит `/setup-backups` (passphrase из менеджера паролей). Также — плановый restore-тест («бэкап без проверенного восстановления — это не бэкап»). Output: восстановленные данные + отчёт сверки. Триггеры: «восстанови из бэкапа», «restore», «откати базу к вчерашнему», «достань данные из снапшота», «потерял данные, есть бэкап?», «проверь что бэкап восстанавливается», «restore test», «verify backup». НЕ для настройки бэкапов с нуля — это `/setup-backups`. НЕ для смены секретов — `/rotate-secrets`. НЕ для миграции сервер→сервер — `/migrate-server-to-server`.
In this repository25 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- audit-securitySkill
- bootstrap-new-serverSkill
- cleanup-existing-serverSkill
- configure-vpn-routingSkill
- deploy-serviceSkill
- devSkill
- extract-subscription-serversSkill
- finalize-vpn-routingSkill
- generate-client-configSkill
- health-checkSkill
- install-monitoring-stackSkill
- inventory-scanSkill
- migrate-server-to-serverSkill
- refresh-vpn-knowledgeSkill
- retroSkill
- rotate-secretsSkill
- second-opinionSkill
- setup-backupsSkill
- setup-happ-subscriptionSkill
- setup-secrets-vaultSkill
- setup-server-proxySkill
- setup-vpn-panelSkill
- sysadmin-initSkill
- sysadmin-meetSkill
The file
Files
<role>
Я восстанавливаю данные из restic-бэкапа максимально безопасно. Главный принцип:
**сначала восстанавливаю во ВРЕМЕННОЕ место и проверяю, потом — перезаписываю прод**.
Перезапись боевых данных необратима — это красная зона (§6 персоны, C.3 type-to-confirm).Бэкап, который ни разу не восстанавливали, — это не бэкап, а надежда. Поэтому restore-
тест — не разовое событие при /setup-backups, а регулярная проверка (см. Шаг R ниже и
рефлекс персоны §4.1).
</role>
<context>
Источник истины о стеке бэкапов — `infra-config.json` (секция `backups`) и runbook
`runbooks/backup-restore.md`, сгенерированный `/setup-backups` под конкретный сервер. Стек:
- **restic** — зашифрованный репозиторий (AES-256), passphrase в менеджере паролей оператора
(`secrets.manager` в `agent-config.json`, индекс `restic-passphrase`).
- **rclone** — доступ к offsite-хранилищу (S3 / B2 / WebDAV), remote из `backups.rclone_remote`.
- БД-дампы (`backup-postgres.sh`/`backup-mysql.sh`/`backup-redis.sh`) лежат снапшотами внутри restic.STRICT-режим: без конфига инфры (infra-config.json) и доступа к passphrase не запускаюсь —
угадывать, откуда и чем восстанавливать, запрещено (C.2).
</context>
Шаг 0: Прочитать конфиг и подключиться к репозиторию (Green)
source .claude/skills/_lib/find-config.sh; find_brain_config; resolve_active_project
RESTIC_REPO="rclone:$(get_config_field backups.rclone_remote):$(get_config_field backups.restic_repo_path)"
export RESTIC_PASSWORD="$(read_from_vault "$(restic_pass_ref)")" # из менеджера паролей, не в argv/лог
restic -r "$RESTIC_REPO" snapshots --no-lock # read-only: список снапшотовЕсли репозиторий недоступен (нет сети/кред/remote) — STOP, честно сообщаю что нужно (rclone config, passphrase), суррогат не выдумываю (C.9).
Шаг 1: Что и на какой момент восстанавливаем (брифинг Yellow)
Спрашиваю оператора (или беру из запроса): какие данные (какая БД / какие файлы / весь хост), на какой момент (последний снапшот / на дату / конкретный snapshot ID). Показываю человеческим языком: «нашёл N снапшотов, самый свежий — <дата>, ближайший к твоей дате — <ID/дата>». Уточняю куда восстанавливать: по умолчанию — во временное место, НЕ поверх прода.
Шаг 2: Восстановление во ВРЕМЕННОЕ место (Yellow)
RESTORE_TMP="$(mktemp -d /tmp/restore.XXXXXX)"
restic -r "$RESTIC_REPO" restore <snapshot-id> --target "$RESTORE_TMP" --no-lockДля БД — поднимаю временный контейнер (как делает restore-тест в /setup-backups) и
импортирую дамп туда, прод не трогаю.
Шаг 3: Сверка (Green) — данные целые?
- Файлы: размер, контрольные суммы, наличие ключевых путей.
- БД: row counts ключевых таблиц во временном контейнере, сверка с ожиданием/продом; поднимается ли схема, нет ли ошибок импорта.
- Явный вердикт оператору: «восстановленная копия валидна / частична / битая — детали…». Битая копия → не промочу в прод, ищу другой снапшот.
Шаг 4: Промоушен в прод — КРАСНАЯ ЗОНА (только если Шаг 3 = валидно)
Перезапись боевых данных восстановленными — необратима. Полная 4-шаговая процедура §6 персоны:
- ASSESS — точно ли нужен промоушен? есть ли свежий бэкап ТЕКУЩЕГО состояния (на случай отката отката)? зависимые сервисы остановлены?
- PROPOSE — план перезаписи, точные команды, откат; обязательные строки «⚠️ ЧТО ТЕРЯЕМ» (текущие боевые данные за период между бэкапом и сейчас) и «⚠️ КОПИЯ: есть/НЕТ» (снапшот текущего состояния перед перезаписью); нет копии — сначала делаю её. Запрос type-to-confirm с именем БД/ресурса, которое оператор вписывает САМ (анти-копипаст, ADR-0014).
- EXECUTE — снапшот текущего → остановка сервиса → перезапись из проверенной копии → запуск. Ошибка → ОТКАТ к снятому снапшоту, не «дочистка руками».
- VERIFY & DOCUMENT — сервис поднялся, данные на месте;
incidents/YYYY-MM-DD-restore.md.
Шаг R: Плановый restore-тест (Green/Yellow, не ждёт инцидента)
Раз в месяц (ритуал жизни) или по запросу «проверь бэкап» — прогоняю Шаги 0–3 БЕЗ Шага 4:
восстанавливаю одну БД во временный контейнер, сверяю row counts, фиксирую дату успешного
теста (backups.last_restore_test или отметка в runbook). Если последний успешный restore-
тест старше 30 дней — считаю бэкапы непроверенными и говорю об этом оператору прямо.
Failed Attempts (граблекейс)
- «Восстановил сразу поверх прода» — потеряли данные за период между бэкапом и инцидентом без возможности отката. Урок: ВСЕГДА сначала во временное место + сверка + снапшот текущего состояния перед перезаписью. Промоушен — красная зона, не Yellow.
- «Passphrase в команде/логе» — restic-passphrase утёк в историю/лог. Урок: только через
RESTIC_PASSWORDиз менеджера паролей (как в/setup-backupsи/rotate-secrets), не в argv. - «Бэкап есть, а restore ни разу не пробовали» — в инцидент выяснилось, что репозиторий битый/passphrase потерян. Урок: бэкап без регулярного restore-теста = не бэкап (Шаг R).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

