Бэкапы и восстановление
Как снимаются копии
Копию базы снимает воркер по расписанию из Настройки → Бэкапы — по умолчанию каждый час в :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).
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Число заявок совпало с ожидаемым — копия рабочая. Делайте такую проверку хотя бы раз в месяц.
Восстановление
Вернуть рабочую базу к копии: остановить приложение, на всякий случай снять копию текущего состояния, пересоздать базу и залить копию.
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 или скачанную из админки расшифровать так же (спросит пароль):
openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -md sha256 -in ФАЙЛ.dump.enc -out ФАЙЛ.dump
pg_restore --list ФАЙЛ.dump