Бэкап: полный оффсайт-бэкап прода на 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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user