Откат после неудачного обновления
Обновление прошло, а система не пускает: откат к точке с сервера, восстановление доступа администратора и ручное восстановление базы.
Страница для администратора: обновление уже применено, а система не пускает. Интерфейс не открывается, войти не получается или backend не поднимается - значит, кнопкой на экране «Обновления» воспользоваться нельзя, и все делается на сервере.
Откат возвращает базу на момент точки. Все, что создано после обновления (заявки, проекты, документы, переписка), пропадет: обратных миграций нет. Если эти данные ценны, сначала снимите копию текущего состояния - раздел 4.
# 1. Быстрая диагностика
Команды выполняются из каталога установки: /opt/volrix при установке мастером, ~/volrix при установке без мастера. Первая строка каждого блока задает DC - короткое имя команды compose, дальше используются переменные.
cd /opt/volrix
./volrix-update status
curl -s http://127.0.0.1:3000/api/v1/health
DC="docker compose -f docker-compose.release.yml --env-file .env"
$DC ps
$DC logs --tail=100 backend
ls -1dt backups/*-to-*/ | head -3
На что смотреть в журнале backend:
Признак
Что это значит
Running upgrade и дальше тишина, контейнер перезапускается
миграция падает, backend не стартует
DiskFullError: No space left on device
закончилось место: освободите (раздел 4) и повторите откат
relation does not exist, column does not exist
код новой версии не совпал со схемой базы
Повторное использование токена
сессия отозвана, вход не держится. Так вела себя версия до 1.3.0 при гонке двух обновлений токена: обновитесь и войдите заново
Если health отвечает ok, а войти нельзя, откат, скорее всего, не нужен: перейдите к разделу 3.
# 2. Откат агентом (основной путь)
cd /opt/volrix
./volrix-update rollback
./volrix-update rollback 20261109-085426-to-1.3.1
Без аргумента откат идет к последней точке, с аргументом - к указанной. Имя точки - это имя каталога в backups/, его показывает ./volrix-update status. В имени видно, до какой версии откатываемся.
Что делает команда:
останавливает backend и scheduler;
возвращает из точки .env, docker-compose.release.yml и config/ (если точка снята агентом 1.1.0 и новее; в старых точках возвращается только тег базового образа);
наполняет том кода и том фронта из точки;
поднимает postgres и восстанавливает базу во временную базу volrix_pm_rollback, и только после успешного pg_restore подменяет рабочую по имени: при сбое рабочая база остается нетронутой, временная удаляется;
поднимает стек целиком, возвращает запись версии и снимает режим обслуживания.
Время - несколько минут, система в это время недоступна. Итог последней операции агент пишет в .volrix-update/last_result.json, ход - в консоль.
Проверка после отката:
cd /opt/volrix
./volrix-update status
curl -s http://127.0.0.1:3000/api/v1/health
И вход в браузере: логин администратора и пароль, действовавшие до обновления. Если страница открывается пустой, обновите ее с Ctrl+F5: после отката имена файлов сборки прежние, а браузер мог сохранить новые.
# 3. Администратор не может войти, откат не нужен
Штатная команда восстановления доступа - seed_admin в контейнере backend. Она сбрасывает пароль, снимает блокировку после неудачных попыток, включает выключенную учетную запись и добавляет роль admin_system, если ее нет.
cd /opt/volrix
DC="docker compose -f docker-compose.release.yml --env-file .env"
$DC exec -T -e ADMIN_EMAIL=admin@company.ru -e ADMIN_PASSWORD='НовыйПароль' backend python -m app.tools.seed_admin
без ADMIN_PASSWORD пароль сгенерируется и будет напечатан строкой GENERATED_ADMIN_PASSWORD;
RESET_2FA=1 снимает двухфакторную аутентификацию (потерян телефон и резервные коды);
KEEP_EXISTING=1 ничего не меняет, если учетная запись уже есть;
на версиях до 1.0.2 скрипт лежал файлом seed_admin.py в корне комплекта и подавался в контейнер через stdin.
После сброса система попросит сменить пароль при первом входе.
Если вход не работает, хотя пароль верный, проверьте состояние учетной записи:
cd /opt/volrix
DC="docker compose -f docker-compose.release.yml --env-file .env"
$DC exec -T postgres psql -U volrix_user -d volrix_pm -c "select email, is_active, failed_login_count, locked_until, must_change_password from persons where email='admin@company.ru';"
Дальше по результату:
cd /opt/volrix
DC="docker compose -f docker-compose.release.yml --env-file .env"
$DC exec -T postgres psql -U volrix_user -d volrix_pm -c "update persons set failed_login_count=0, locked_until=null where email='admin@company.ru';"
$DC exec -T postgres psql -U volrix_user -d volrix_pm -c "update persons set is_active=true where email='admin@company.ru';"
Если включена обязательная двухфакторная аутентификация, а приложения-генератора и резервных кодов нет, запустите seed_admin с RESET_2FA=1.
# 4. Откат не прошел
Нет места. Откат пишет базу во временную и распаковывает тома, ему нужен запас. Освободите место и повторите:
cd /opt/volrix
df -h .
docker image prune -f
rm -rf updates/inbox/*.volrixpkg
./volrix-update rollback
Приложение не поднялось после отката. Смотрите состояние и журналы:
cd /opt/volrix
DC="docker compose -f docker-compose.release.yml --env-file .env"
$DC ps -a
$DC logs --tail=100 postgres backend
Нужно сохранить текущее состояние перед откатом. Автоматической точки перед откатом агент не снимает, поэтому если данные после обновления ценны:
cd /opt/volrix
STAMP=$(date +%Y%m%d-%H%M%S)
mkdir -p "backups/manual-$STAMP"
DC="docker compose -f docker-compose.release.yml --env-file .env"
$DC exec -T postgres pg_dump -U volrix_user -d volrix_pm -Fc > "backups/manual-$STAMP/db.dump"
Такую копию агент не видит как точку отката (имя не по шаблону), но восстановить из нее можно теми же командами ниже, подставив свой файл.
Ручное восстановление базы из точки. Только когда приложение остановлено, иначе оно пишет в базу, которую вы заменяете. Команды повторяют то, что делает агент:
cd /opt/volrix
DC="docker compose -f docker-compose.release.yml --env-file .env"
POINT=backups/20261109-085426-to-1.3.1
$DC stop backend scheduler
$DC up -d postgres
$DC exec -T postgres psql -U volrix_user -d postgres -c "DROP DATABASE IF EXISTS volrix_pm_rollback"
$DC exec -T postgres psql -U volrix_user -d postgres -c "CREATE DATABASE volrix_pm_rollback TEMPLATE template0 ENCODING 'UTF8'"
$DC exec -T postgres pg_restore -U volrix_user -d volrix_pm_rollback --no-owner --exit-on-error < "$POINT/db.dump"
$DC exec -T postgres psql -U volrix_user -d postgres -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='volrix_pm' AND pid <> pg_backend_pid()"
$DC exec -T postgres psql -U volrix_user -d postgres -c "DROP DATABASE IF EXISTS volrix_pm_replaced"
$DC exec -T postgres psql -U volrix_user -d postgres -c "ALTER DATABASE volrix_pm RENAME TO volrix_pm_replaced"
$DC exec -T postgres psql -U volrix_user -d postgres -c "ALTER DATABASE volrix_pm_rollback RENAME TO volrix_pm"
$DC up -d
Рабочая база не удаляется, а переименовывается в volrix_pm_replaced: пока восстановленная не заработала, шаг назад - это ALTER DATABASE volrix_pm_replaced RENAME TO volrix_pm. Базу volrix_pm_replaced удалите только после проверки входа и данных.
Сам агент не запускается. volrix-update - обычный скрипт из комплекта: возьмите его из архива (tar -xzf volrix-dist-<версия>.tar.gz ./volrix-update) и запустите из каталога установки. Если и это не выходит, восстанавливайте базу вручную командами выше.
Восстановление из обычной резервной копии. Если точек отката нет (например, backups/ чистили), порядок другой: [Резервные копии: создать, проверить и восстановить](/docs/guide-maintenance) или обращение в поддержку [info@volrix.ru](mailto:info@volrix.ru).
# 5. Что откат не возвращает
данные после точки - заявки, проекты, документы, переписка, созданные после обновления;
внешние хранилища файлов (S3, сетевая папка, WebDAV): в точку входит только база, файлы в них живут отдельно и не откатываются. Файлы, загруженные в базу (по умолчанию так), возвращаются вместе с базой;
файл лицензии (data/volrix.lic) и том данных не входят в точку и не меняются;
письма, уже отправленные наружу, и записи встреч в хранилище - тоже вне точки.
# 6. Профилактика
не удаляйте backups/: по умолчанию хра
Откат после неудачного обновления | volrix.pm