Skip to content

Бэкапы и восстановление ​

Как снимаются копии ​

Копию базы снимает воркер по расписанию из Настройки → Бэкапы — по умолчанию каждый час в :00 по Москве. Там же: срок хранения, отправка в Telegram, «Снять копию сейчас», список и скачивание.

  • Что в копии — вся база, сжатая (pg_dump -Fc). Файл зашифрован паролем BACKUP_PASSWORD из .env (AES-256, совместимо с openssl enc -aes-256-cbc -pbkdf2 -iter 200000 -md sha256).
  • Где лежат — в BACKUP_HOST_DIR (по умолчанию /home/deploy/backups/auto), вне папки установки: обновление их не трогает. Имя файла — время по Москве, например …_2026-10-19_14-00-00_msk.dump.enc.
  • Сколько хранятся — все копии за 48 часов, затем последняя за день 14 дней и последняя за неделю 4 недели; старше 30 дней удаляются. Можно ограничить число копий.
  • Место на диске — если свободно меньше 1 ГБ, старые копии удаляются раньше срока и приходит «Мало места для копий». Если места нет совсем, копия не снимается: диск не забивается до отказа базы.
  • Telegram — файл уходит в чат из Уведомлений. Больше 50 МБ — частями по 45 МБ (собрать: cat ФАЙЛ.0* > ФАЙЛ) или только сообщение, как выбрано.
  • Ошибка — событие «Ошибка бэкапа» в колокольчике и Telegram, часть «Резервные копии» в Состоянии системы.

Пароль бэкапов

Без BACKUP_PASSWORD копию не открыть никому, в том числе нам. Посмотреть его: grep ^BACKUP_PASSWORD= .env в папке установки. Храните в менеджере паролей, не рядом с копиями.

Хранить копии ещё где-то ​

Копии на том же сервере не спасут, если пропадёт сам сервер. Включите отправку в Telegram или регулярно скачивайте копии из админки к себе.

Проверить копию ​

Команды на сервере из папки установки. Копия разворачивается в отдельную временную базу — рабочую это не трогает. Имя пользователя и базы — из docker-compose.yml (POSTGRES_USER, POSTGRES_DB).

bash
F=/home/deploy/backups/auto/ИМЯ_КОПИИ.dump.enc
DBU=$(docker compose exec -T db printenv POSTGRES_USER)
export BACKUP_PASSWORD=$(grep '^BACKUP_PASSWORD=' .env | cut -d= -f2-)
docker compose exec -T db createdb -U "$DBU" restore_check
sudo cat "$F" | openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -md sha256 -pass env:BACKUP_PASSWORD \
  | docker compose exec -T db pg_restore -U "$DBU" -d restore_check --exit-on-error
docker compose exec -T db psql -U "$DBU" restore_check -c "select count(*) from orders"
docker compose exec -T db dropdb -U "$DBU" restore_check

Число заявок совпало с ожидаемым — копия рабочая. Делайте такую проверку хотя бы раз в месяц.

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

Вернуть рабочую базу к копии: остановить приложение, на всякий случай снять копию текущего состояния, пересоздать базу и залить копию.

bash
F=/home/deploy/backups/auto/ИМЯ_КОПИИ.dump.enc
DBU=$(docker compose exec -T db printenv POSTGRES_USER)
DBN=$(docker compose exec -T db printenv POSTGRES_DB)
export BACKUP_PASSWORD=$(grep '^BACKUP_PASSWORD=' .env | cut -d= -f2-)
docker compose stop api worker bot
SAFE=/home/deploy/backups/auto/before-restore-$(date +%F_%H%M).dump
(umask 077; docker compose exec -T db pg_dump -U "$DBU" -Fc "$DBN" > "$SAFE")
test -s "$SAFE" && docker compose exec -T db dropdb -U "$DBU" --force "$DBN"
docker compose exec -T db createdb -U "$DBU" "$DBN"
sudo cat "$F" | openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -md sha256 -pass env:BACKUP_PASSWORD \
  | docker compose exec -T db pg_restore -U "$DBU" -d "$DBN" --exit-on-error --single-transaction
docker compose up -d api worker
docker compose --profile bot up -d bot   # если бот включён

Копия текущего состояния (before-restore-…) снимается в закрытую папку копий с правами только для владельца; если она не снялась или пустая, база не удаляется (test -s). Она не зашифрована — после успешного восстановления удалите её или зашифруйте.

Пароли ролей базы живут вне самой базы и при восстановлении не меняются. Права роли приложения (без права менять журналы) восстанавливаются вместе с копией.

Открыть копию на своём компьютере ​

Копию из Telegram или скачанную из админки расшифровать так же (спросит пароль):

bash
openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -md sha256 -in ФАЙЛ.dump.enc -out ФАЙЛ.dump
pg_restore --list ФАЙЛ.dump

Документация движка обменника OneSwaper