Настройка бэкапа #64

Closed
opened 2026-09-13 18:55:48 +03:00 by NotBigGhost · 2 comments
Owner

Что-то для бэкапа уже настроено, нужно просмотреть. Нужно настроить грамотный бэкап БД и хранимых файлов, с возможностью обратной загрузки и с хронологией хранимых данных. Также нужны скрипты для быстрого копирования данный на устройство, с которого через ssh я подключен к паю. В общем, нужна качественно настроенная система создания, хранения и систематизации бэкапов, лёгкая и с простым управлением через заранее написанные скрипты. Ну ли можно попробовать развернуть что-то готовое третьим контейнером, и настроить для нашего приложения.

Что-то для бэкапа уже настроено, нужно просмотреть. Нужно настроить грамотный бэкап БД и хранимых файлов, с возможностью обратной загрузки и с хронологией хранимых данных. Также нужны скрипты для быстрого копирования данный на устройство, с которого через ssh я подключен к паю. В общем, нужна качественно настроенная система создания, хранения и систематизации бэкапов, лёгкая и с простым управлением через заранее написанные скрипты. Ну ли можно попробовать развернуть что-то готовое третьим контейнером, и настроить для нашего приложения.
NotBigGhost added this to the 1.4 — Настройка бэкапа на VPS milestone 2026-09-13 18:55:48 +03:00
NotBigGhost added the Compat/BreakingKind/Feature
Priority
High
2
labels 2026-09-13 18:55:48 +03:00
Agent self-assigned this 2026-09-14 00:11:53 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-14 00:11:55 +03:00
Collaborator

План выполнения

  1. Отдельный контейнер backup на restic в docker-compose.yml.
    • Образ собирается из deploy/backup/ на restic/restic:0.19.1 и публикуется через build-push.
    • Контейнер работает от uid 10001, как app.
    • Секреты приложения в контейнер не передаются.
    • На Pi по-прежнему нужны только docker-compose.yml и .env; SSH-ключ лежит в .env в base64.
  2. Снимки по расписанию.
    • Две копии: локальная на Pi (том backup-repo) и на VPS (SFTP).
    • Копия БД снимается консистентно (VACUUM INTO) и проверяется integrity_check.
    • Дедупликация и шифрование.
    • Сжатие — только средствами restic: формат репозитория v2, уровень задаёт BACKUP_COMPRESSION.
    • Хранение: 14 дней, 8 недель, 12 месяцев.
    • В теги снимка пишутся число игроков и партий.
    • Раз в неделю — проверка данных.
  3. Команда fs-backup: run, list (хронология), status, verify, restore, export (несжатый .tar), import (понимает и старые fs_*.tar.gz).
  4. Восстановление через промежуточную директорию.
    • Не выполняется, пока работает app.
    • Снимок разворачивается в .restore-new внутри каждого тома и проверяется.
    • Перед заменой создаётся страховочный снимок pre-restore.
    • Замена — через rename; при сбое текущие данные остаются нетронутыми или возвращаются на место.
    • Это заодно исправляет баг старого restore.sh: docker cp делал файлы root-овыми, и БД становилась доступна только для чтения.
  5. Скрипты для ПК scripts/fs-backup.ps1 и scripts/fs-backup.sh.
    • pull: снимок с Pi копируется в backups\ со сверкой sha256.
    • list, status, now: те же команды на Pi через ssh.
    • restore-test: учебное восстановление на тест-клоне.
  6. Подробная пошаговая инструкция deploy/backup/README.md по всем ручным шагам: пароль, ключ, VPS (пользователь только для SFTP), сборка образов, Pi, ПК, учебное восстановление, восстановление прода, гибель Pi, неполадки, чек-лист.
  7. Compat/Breaking. Удаляются scripts/backup.sh и scripts/restore.sh, меняется набор BACKUP_* в .env. Миграция прода: VPS → .env и compose на Pi → up -d. API и фронтенд не меняются.

Критерии готовности

  • Снимки по расписанию попадают в оба репозитория, зашифрованы, дедуплицированы и чистятся по дням, неделям и месяцам.
  • Сжатие делает только restic.
  • list показывает хронологию: время, размер, содержимое.
  • Восстановление и импорт идут через промежуточную директорию и возвращают рабочие данные с правильным владельцем. Проверено, что при сбое проверки текущие данные не меняются, что восстановление поверх работающего app запрещено и что создаётся pre-restore.
  • С ПК снимок выгружается одной командой со сверкой sha256.
  • Инструкция написана и прогнана на локальном стенде: эмуляция VPS в контейнере, тест-клон.
  • Все проверки (сборка amd64 и arm64, shellcheck, compose config, сценарии бэкапа и восстановления) зелёные.

Ветка: issue-64-backup от dev

## План выполнения 1. **Отдельный контейнер `backup` на restic** в `docker-compose.yml`. - Образ собирается из `deploy/backup/` на `restic/restic:0.19.1` и публикуется через `build-push`. - Контейнер работает от uid 10001, как `app`. - Секреты приложения в контейнер не передаются. - На Pi по-прежнему нужны только `docker-compose.yml` и `.env`; SSH-ключ лежит в `.env` в base64. 2. **Снимки по расписанию.** - Две копии: локальная на Pi (том `backup-repo`) и на VPS (SFTP). - Копия БД снимается консистентно (`VACUUM INTO`) и проверяется `integrity_check`. - Дедупликация и шифрование. - Сжатие — только средствами restic: формат репозитория v2, уровень задаёт `BACKUP_COMPRESSION`. - Хранение: 14 дней, 8 недель, 12 месяцев. - В теги снимка пишутся число игроков и партий. - Раз в неделю — проверка данных. 3. **Команда `fs-backup`:** `run`, `list` (хронология), `status`, `verify`, `restore`, `export` (несжатый `.tar`), `import` (понимает и старые `fs_*.tar.gz`). 4. **Восстановление через промежуточную директорию.** - Не выполняется, пока работает `app`. - Снимок разворачивается в `.restore-new` внутри каждого тома и проверяется. - Перед заменой создаётся страховочный снимок `pre-restore`. - Замена — через `rename`; при сбое текущие данные остаются нетронутыми или возвращаются на место. - Это заодно исправляет баг старого `restore.sh`: `docker cp` делал файлы root-овыми, и БД становилась доступна только для чтения. 5. **Скрипты для ПК** `scripts/fs-backup.ps1` и `scripts/fs-backup.sh`. - `pull`: снимок с Pi копируется в `backups\` со сверкой sha256. - `list`, `status`, `now`: те же команды на Pi через ssh. - `restore-test`: учебное восстановление на тест-клоне. 6. **Подробная пошаговая инструкция** `deploy/backup/README.md` по всем ручным шагам: пароль, ключ, VPS (пользователь только для SFTP), сборка образов, Pi, ПК, учебное восстановление, восстановление прода, гибель Pi, неполадки, чек-лист. 7. **Compat/Breaking.** Удаляются `scripts/backup.sh` и `scripts/restore.sh`, меняется набор `BACKUP_*` в `.env`. Миграция прода: VPS → `.env` и compose на Pi → `up -d`. API и фронтенд не меняются. **Критерии готовности** - Снимки по расписанию попадают в оба репозитория, зашифрованы, дедуплицированы и чистятся по дням, неделям и месяцам. - Сжатие делает только restic. - `list` показывает хронологию: время, размер, содержимое. - Восстановление и импорт идут через промежуточную директорию и возвращают рабочие данные с правильным владельцем. Проверено, что при сбое проверки текущие данные не меняются, что восстановление поверх работающего `app` запрещено и что создаётся `pre-restore`. - С ПК снимок выгружается одной командой со сверкой sha256. - Инструкция написана и прогнана на локальном стенде: эмуляция VPS в контейнере, тест-клон. - Все проверки (сборка amd64 и arm64, shellcheck, compose config, сценарии бэкапа и восстановления) зелёные. **Ветка:** `issue-64-backup` от `dev`
Agent added the
Status
In Review
label 2026-09-14 01:30:21 +03:00
Collaborator

Работа выполнена, открыт PR: #66

Итог: бэкапы делает контейнер backup на restic. Каждую ночь он сохраняет зашифрованный снимок с дедупликацией в две копии — на Pi и на VPS (SFTP). Сжатие — средствами restic. Хронология показывает, сколько игроков и партий было в каждом снимке. Хранение: дни, недели, месяцы.

Восстановление идёт через промежуточную директорию: проверка развёрнутых данных, страховочный снимок pre-restore, откат при сбое и команда recover после обрыва питания.

С ПК снимок скачивается одной командой .\scripts\fs-backup.ps1 pull со сверкой sha256. Учебное восстановление на тест-клоне — restore-test.

Подробная пошаговая инструкция по всему, что нужно сделать руками: deploy/backup/README.md.

По ходу найдено и учтено:

  • В Debian/Ubuntu системный пользователь backup уже есть, поэтому на VPS используется fsbackup.
  • Старый restore.sh делал БД root-овой — после восстановления она была доступна только для чтения.
  • Добавлена защита: новый пустой Pi не перезапишет историю на VPS.

Проверки:

  • shellcheck, разбор .ps1, compose config — чисто.
  • Сборка образа под amd64 и arm64.
  • pytest — 147 passed.
  • На локальном стенде (эмуляция VPS и Pi) пройдены сценарии:
    • бэкап и очистка;
    • restore и import, в том числе настоящего старого архива;
    • сбои и обрезанные архивы — данные не меняются;
    • recover;
    • «Pi умер»;
    • скрипты ПК по ssh/scp.
  • Команды разделов VPS и Pi из README выполнены буквально.
  • Не проверено: реальные Pi и VPS.

Статус: Status/In Review
Осталось за вами:

  • ревью и мёрж PR — задача закроется автоматически;
  • после мёржа — ручная настройка по deploy/backup/README.md. На Pi не забудьте удалить старые строки BACKUP_* из .env.
Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/66 **Итог:** бэкапы делает контейнер `backup` на restic. Каждую ночь он сохраняет зашифрованный снимок с дедупликацией в две копии — на Pi и на VPS (SFTP). Сжатие — средствами restic. Хронология показывает, сколько игроков и партий было в каждом снимке. Хранение: дни, недели, месяцы. Восстановление идёт через промежуточную директорию: проверка развёрнутых данных, страховочный снимок `pre-restore`, откат при сбое и команда `recover` после обрыва питания. С ПК снимок скачивается одной командой `.\scripts\fs-backup.ps1 pull` со сверкой sha256. Учебное восстановление на тест-клоне — `restore-test`. Подробная пошаговая инструкция по всему, что нужно сделать руками: [`deploy/backup/README.md`](https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/src/branch/issue-64-backup/deploy/backup/README.md). **По ходу найдено и учтено:** - В Debian/Ubuntu системный пользователь `backup` уже есть, поэтому на VPS используется `fsbackup`. - Старый `restore.sh` делал БД root-овой — после восстановления она была доступна только для чтения. - Добавлена защита: новый пустой Pi не перезапишет историю на VPS. **Проверки:** - `shellcheck`, разбор `.ps1`, `compose config` — чисто. - Сборка образа под amd64 и arm64. - `pytest` — 147 passed. - На локальном стенде (эмуляция VPS и Pi) пройдены сценарии: - бэкап и очистка; - `restore` и `import`, в том числе настоящего старого архива; - сбои и обрезанные архивы — данные не меняются; - `recover`; - «Pi умер»; - скрипты ПК по ssh/scp. - Команды разделов VPS и Pi из README выполнены буквально. - Не проверено: реальные Pi и VPS. **Статус:** `Status/In Review` **Осталось за вами:** - ревью и мёрж PR — задача закроется автоматически; - после мёржа — ручная настройка по `deploy/backup/README.md`. На Pi не забудьте удалить старые строки `BACKUP_*` из `.env`.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#64