Skip to content

Бэкапы

База данных — единственное, что нельзя восстановить переустановкой: клиенты, подписки, транзакции, настройки. Поэтому бэкапы включены из коробки: раз в сутки воркер снимает дамп 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_TIME04:00Время снятия (МСК)
BACKUP_KEEP_LAST7Сколько архивов хранить
BACKUP_ENCRYPTION_PASSWORDпервые 16 символов APP__JWT_SECRETПароль шифрования архива

Пароль шифрования

Архив без пароля не открыть — это защита дампа с данными клиентов на случай утечки файла. Пароль задаётся в кабинете (BACKUP_ENCRYPTION_PASSWORD, категория «Бэкапы»); пока свой не задан, используются первые 16 символов APP__JWT_SECRET из .env — установщик печатает этот пароль в конце установки.

Сохраните пароль отдельно от сервера

Смысл бэкапа — пережить потерю сервера. Если пароль лежит только в .env на том же сервере, вместе с сервером пропадёт и возможность расшифровать архив. Запишите пароль в менеджер паролей сразу после установки.

Куда складываются копии

Локальный каталог ./backups — не офф-сайт: умер диск — умерли и архивы. Поэтому каждый архив дополнительно уходит в Telegram:

  • в отчётную форум-группу, в топик «backups» — если группа настроена;
  • в личку админам — всегда, как последний рубеж: даже если отчётная группа не настроена и дублирование в ЛС выключено, архив бэкапа всё равно доставляется админам. Копия базы обязана существовать вне сервера.

Восстановление

На чистом сервере (после установки, до запуска продаж):

  1. Распакуйте архив — спросит пароль шифрования:

    bash
    unzip backup_YYYYMMDD_HHMMSS.zip        # → db_YYYYMMDD_HHMMSS.sql
  2. Поднимите только Postgres и залейте дамп:

    bash
    ./scripts/dc.sh up -d postgres
    cat db_*.sql | ./scripts/dc.sh exec -T postgres psql -U vpn -d vpn
  3. Поднимите остальной стек:

    bash
    ./scripts/dc.sh up -d

Откат после неудачного обновления проще: update.sh при провале сам печатает готовые команды — checkout прежней ревизии и заливку pre-update-дампа. Подробности — в Обновлении.

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов