Бэкапы
База данных — единственное, что нельзя восстановить переустановкой: клиенты, подписки, транзакции, настройки. Поэтому бэкапы включены из коробки: раз в сутки воркер снимает дамп Postgres, шифрует его и кладёт копию так, чтобы она пережила даже потерю сервера.
Как снимается бэкап
Задача run_backup делает pg_dump базы в SQL-файл, упаковывает его в zip с шифрованием AES-256, удаляет открытый дамп и подчищает старые архивы — остаются последние BACKUP_KEEP_LAST. Архивы лежат в каталоге ./backups рядом с установкой, имя вида backup_YYYYMMDD_HHMMSS.zip.
Запускается тремя путями:
- По расписанию — ежедневно во время
BACKUP_TIME(по МСК), пока включёнBACKUP_ENABLED. Повторный запуск в тот же день отсекается. - Вручную — кнопка «Бэкап сейчас» на экране «Обслуживание».
- Перед каждым обновлением —
./scripts/update.shпервым шагом снимает дамп вbackups/pre-update-<время>.sql.gzи отменяет обновление, если дамп не снялся или пустой. Это страховка отката, отдельная от ежедневных архивов (без шифрования, обычный gzip).
| Параметр | По умолчанию | Что это |
|---|---|---|
BACKUP_ENABLED | вкл | Ежедневный автобэкап |
BACKUP_TIME | 04:00 | Время снятия (МСК) |
BACKUP_KEEP_LAST | 7 | Сколько архивов хранить |
BACKUP_ENCRYPTION_PASSWORD | первые 16 символов APP__JWT_SECRET | Пароль шифрования архива |
Пароль шифрования
Архив без пароля не открыть — это защита дампа с данными клиентов на случай утечки файла. Пароль задаётся в кабинете (BACKUP_ENCRYPTION_PASSWORD, категория «Бэкапы»); пока свой не задан, используются первые 16 символов APP__JWT_SECRET из .env — установщик печатает этот пароль в конце установки.
Сохраните пароль отдельно от сервера
Смысл бэкапа — пережить потерю сервера. Если пароль лежит только в .env на том же сервере, вместе с сервером пропадёт и возможность расшифровать архив. Запишите пароль в менеджер паролей сразу после установки.
Куда складываются копии
Локальный каталог ./backups — не офф-сайт: умер диск — умерли и архивы. Поэтому каждый архив дополнительно уходит в Telegram:
- в отчётную форум-группу, в топик «backups» — если группа настроена;
- в личку админам — всегда, как последний рубеж: даже если отчётная группа не настроена и дублирование в ЛС выключено, архив бэкапа всё равно доставляется админам. Копия базы обязана существовать вне сервера.
Восстановление
На чистом сервере (после установки, до запуска продаж):
Распакуйте архив — спросит пароль шифрования:
bashunzip backup_YYYYMMDD_HHMMSS.zip # → db_YYYYMMDD_HHMMSS.sqlПоднимите только Postgres и залейте дамп:
bash./scripts/dc.sh up -d postgres cat db_*.sql | ./scripts/dc.sh exec -T postgres psql -U vpn -d vpnПоднимите остальной стек:
bash./scripts/dc.sh up -d
Откат после неудачного обновления проще: update.sh при провале сам печатает готовые команды — checkout прежней ревизии и заливку pre-update-дампа. Подробности — в Обновлении.
