run отказывается бэкапить БД без игроков и партий, если последний снимок в репозитории был
с данными: новый Pi до восстановления иначе отправил бы пустой снимок на VPS, он стал бы
latest, а keep-daily мог вытеснить настоящий снимок того же дня. Обход — run --allow-empty.
Очистка дополнительно всегда оставляет 3 последних снимка. Проверено сценарием «Pi умер»:
отказ бэкапа → restore latest --repo vps → следующий бэкап проходит. #64
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013jBxs9nBCk5nBdTLzcGz91
deploy/backup: образ на restic/restic:0.19.1 (+ sqlite, supercronic, tini), работает от
uid 10001, как appuser. Скрипт fs-backup:
- run: консистентная копия БД (VACUUM INTO + integrity_check), снимок в локальный
репозиторий и на VPS (SFTP), теги players/matches, GFS-очистка (дни/недели/месяцы;
именованные keep и pre-restore не удаляются), restic check;
- list / status / verify / export (tar без сжатия; сжатие — только restic, репозиторий v2);
- restore / import через промежуточную директорию: разворачивание в .restore-new внутри
каждого тома, проверка (integrity_check, таблицы, число файлов, целостность tar),
страховочный снимок pre-restore, двухфазная замена rename с файлом фазы и откатом;
recover разбирает прерванное восстановление. Отказ при работающем app.
Точка входа: без BACKUP_PASSWORD простой без рестарт-петли, первый снимок при пустом
репозитории, расписание supercronic, healthcheck по возрасту последнего успеха. #64
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013jBxs9nBCk5nBdTLzcGz91