Бэкап: полный оффсайт-бэкап прода на VPS (БД + uploads + achievements) + восстановление

- scripts/backup.sh: консистентный снимок SQLite (.backup) + архив fs_<TS>.tar.gz с uploads и
  achievements в backups/, локальная ротация; при заданном BACKUP_VPS_HOST — push на VPS (scp
  отдельным ключом/юзером) с удалённой ротацией. Настройки читаются из .env (BACKUP_*).
- scripts/restore.sh: восстановление архива в прод (stop app → очистка тома → docker cp → start).
- .env.example: блок BACKUP_* (host/user/dir/key/keep). .gitignore: id_backup* (ключ бэкапа).
- deploy/pi/README, deploy/vps/README: настройка ключа и юзера backup, /srv/fs-backups, cron, restore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 23:36:58 +03:00
co-authored by Claude Opus 4.8
parent 1e19038b7c
commit 32c74abc43
6 changed files with 155 additions and 17 deletions
+15
View File
@@ -108,3 +108,18 @@ systemctl reload caddy
(HTTP 503), это ожидаемо.
Логи Caddy: `journalctl -u caddy -f`.
## 8. Приём бэкапов с Pi (оффсайт-копии)
Pi ежедневно шлёт полный архив (`scripts/backup.sh`) на VPS отдельным пользователем `backup`
(не путать с `tunnel`). Каталог — **вне** веб-корней Caddy, права 700.
```bash
useradd -m -s /bin/bash backup
install -d -m 700 -o backup -g backup /home/backup/.ssh
install -m 600 -o backup -g backup /dev/null /home/backup/.ssh/authorized_keys
install -d -m 700 -o backup -g backup /srv/fs-backups
# Публичный ключ бэкапа с Pi (deploy/backup/id_backup.pub) добавь в authorized_keys:
# echo '<содержимое id_backup.pub>' >> /home/backup/.ssh/authorized_keys
```
> Ротацию на VPS делает сам скрипт с Pi (`BACKUP_KEEP_REMOTE`, по умолч. 30). Каталог
> `/srv/fs-backups` не отдаётся Caddy (нет `root`/`file_server` на него) → бэкапы не публичны.
> Проверка приёма: после `scripts/backup.sh` на Pi → `ls -1 /srv/fs-backups/` на VPS.