- 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>
65 lines
3.5 KiB
Markdown
65 lines
3.5 KiB
Markdown
# Raspberry Pi — ПРОД (`forbiddenstars.ru`)
|
|
|
|
Pi запускает приложение **и туннель** в Docker: `docker compose up` поднимает два сервиса —
|
|
`app` (FastAPI + SPA) и `tunnel` (ssh-контейнер). У `app` **портов на хост нет**, наружу он
|
|
доступен только через туннель-контейнер (`ssh -R 9000:app:8000` к VPS). Публичная точка —
|
|
VPS, домен `forbiddenstars.ru`. Снаружи Pi недоступен (CGNAT) — туннель сам стучится наружу.
|
|
|
|
## 1. Ключ для туннеля
|
|
Туннель-контейнер ходит на `tunnel@VPS` по ключу из `deploy/tunnel/id_tunnel` (gitignored).
|
|
Создай ключ и добавь его pubkey в `authorized_keys` пользователя `tunnel` на VPS:
|
|
```bash
|
|
ssh-keygen -t ed25519 -f deploy/tunnel/id_tunnel -N ""
|
|
ssh-copy-id -i deploy/tunnel/id_tunnel.pub tunnel@186.246.51.17
|
|
# (или вручную: содержимое deploy/tunnel/id_tunnel.pub -> /home/tunnel/.ssh/authorized_keys на VPS)
|
|
```
|
|
|
|
## 2. .env
|
|
```bash
|
|
cp .env.example .env # заполни секреты; APP_ENV контейнер форсит в production
|
|
```
|
|
Проверь, что заданы параметры VPS (их читает сервис `tunnel`):
|
|
```
|
|
VPS_TUNNEL_HOST=186.246.51.17
|
|
VPS_TUNNEL_USER=tunnel
|
|
```
|
|
|
|
## 3. Запуск
|
|
```bash
|
|
docker compose up -d --build # поднимет app + tunnel
|
|
docker compose ps # оба up; tunnel стартует после healthy app
|
|
docker compose logs -f tunnel # ждём строку: [tunnel] -R 9000:app:8000 -> tunnel@...
|
|
```
|
|
Открой `https://forbiddenstars.ru` — должен отдать прод.
|
|
|
|
## Обновление
|
|
```bash
|
|
git pull
|
|
docker compose up -d --build
|
|
```
|
|
|
|
## Бэкап (полный + оффсайт на VPS)
|
|
`scripts/backup.sh` делает консистентный онлайн-снимок и собирает **полный** архив
|
|
`fs_<TS>.tar.gz` (БД + `uploads/` + `achievements/`) в `backups/` с ротацией. Если в `.env`
|
|
задан `BACKUP_VPS_HOST` — копия дополнительно уходит на VPS (оффсайт; Pi → VPS push, т.к. CGNAT).
|
|
|
|
Настройка оффсайта (один раз):
|
|
```bash
|
|
# 1) отдельный ключ бэкапа + его pubkey на VPS (юзер backup — см. deploy/vps/README.md):
|
|
ssh-keygen -t ed25519 -f deploy/backup/id_backup -N ""
|
|
ssh-copy-id -i deploy/backup/id_backup.pub backup@186.246.51.17
|
|
# 2) в .env заполнить BACKUP_VPS_HOST=186.246.51.17 (по желанию — BACKUP_VPS_USER/DIR/KEEP_*)
|
|
# 3) разовый прогон и проверка, что архив доехал на VPS:
|
|
scripts/backup.sh
|
|
# 4) cron (ежедневно в 04:00):
|
|
crontab -e
|
|
# 0 4 * * * /home/pi/ForbidenStarsApp/scripts/backup.sh >> /var/log/fs-backup.log 2>&1
|
|
```
|
|
|
|
Восстановление: `scripts/restore.sh backups/fs_<TS>.tar.gz` (ДЕСТРУКТИВНО — заменяет текущие
|
|
данные; сначала проверь на тест-контуре). Тома — `db-data` / `uploads-data` / `achievements-data`.
|
|
|
|
Логи: `docker compose logs -f app` / `... tunnel`. Если `https://forbiddenstars.ru` отдаёт
|
|
502 — значит туннель не поднят: смотри `docker compose logs tunnel` (чаще всего ключ не в
|
|
`authorized_keys` на VPS или не заданы `VPS_TUNNEL_*` в `.env`).
|