# GoToSocial Backup — Delta Spec ## ADDED Requirements ### Requirement: Consistent бэкап SQLite + медиа - **MUST**: Скрипт `/opt/gotosocial/backup.sh` создаёт consistent-бэкап SQLite через `VACUUM INTO` (или `sqlite3 .backup`) — не просто копию файла - **MUST**: Бэкап включает медиа из `data/storage` (локальные файлы) - **MUST**: Архив собирается в `/opt/gotosocial/backups/` с именем `gotosocial_.tar.gz` - **MUST**: Секреты (`.env`) бэкапятся отдельным архивом (`.env` в git исключён) - **SHOULD**: Remote-медиа не бэкапится (пере-фетчится) — по официальной рекомендации #### Scenario: Создание архива - GIVEN запущен `bash /opt/gotosocial/backup.sh`, WHEN проверить, THEN файл `gotosocial_.tar.gz` создан и непустой - GIVEN архив создан, WHEN `tar tzf <архив>`, THEN содержит `data/sqlite.db` и файлы медиа ### Requirement: Копия на Яндекс.Диск - **MUST**: Бэкап копируется в `/mnt/yandex-disk/backup/gotosocial-backups/` (mount Яндекс.Диска) - **MUST**: Если Яндекс.Диск не примонтирован — скрипт сообщает об ошибке и завершается с ненулевым кодом - **SHOULD**: Копия второго архива (env) также на ЯД #### Scenario: Копия на ЯД - GIVEN Яндекс.Диск примонтирован, WHEN скрипт отработал, THEN файл присутствует на `/mnt/yandex-disk/backup/gotosocial-backups/` - GIVEN диск НЕ примонтирован, WHEN скрипт, THEN exit code != 0 и сообщение об ошибке ### Requirement: Ротация бэкапов - **MUST**: Локально хранится 7 дней (`find -mtime +7 -delete`) - **MUST**: На Яндекс.Диске хранится 30 дней (`find -mtime +30 -delete`) - **SHOULD**: Ротация применяется только к файлам `gotosocial_*` #### Scenario: Ротация - GIVEN бэкап старше 7 дней локально, WHEN ротация, THEN файл удалён - GIVEN бэкап старше 30 дней на ЯД, WHEN ротация, THEN файл удалён ### Requirement: Автоматический запуск (cron/systemd) - **SHOULD**: Бэкап запускается по расписанию (cron/systemd timer) — например ежедневно - **SHOULD**: Запуск тихий при успехе (без шума), сообщает только при ошибке #### Scenario: Запуск по расписанию - GIVEN настроен таймер/cron, WHEN время запуска, THEN бэкап создан (файл с сегодняшней датой) ## MODIFIED Requirements (нет)