Бэкап: полный оффсайт-бэкап прода на 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
+11
View File
@@ -61,6 +61,17 @@ PROD_DATABASE_URL=sqlite:////data/forbidden_stars.db
DEV_UPLOAD_DIR=./data/dev/uploads
PROD_UPLOAD_DIR=/data/uploads
# ─── БЭКАП (оффсайт-копия на VPS; читает scripts/backup.sh на хосте Pi) ───────
# Полный бэкап (БД + uploads + achievements) кладётся локально в backups/, и — если задан
# BACKUP_VPS_HOST — копируется на VPS (Pi → VPS push, т.к. Pi за CGNAT). Пусто = только локально.
# Ключ бэкапа — deploy/backup/id_backup (в git НЕ идёт); его pubkey → authorized_keys у backup@VPS.
BACKUP_VPS_HOST=
BACKUP_VPS_USER=backup
BACKUP_VPS_DIR=/srv/fs-backups
BACKUP_VPS_KEY=deploy/backup/id_backup
BACKUP_KEEP_LOCAL=14
BACKUP_KEEP_REMOTE=30
# ─── ПРОЧЕЕ ───────────────────────────────────────────────────────────────────
# Часовой пояс приложения (фикс. смещение в часах; МСК = 3)
APP_TZ_OFFSET_HOURS=3