Обновление и откат
Перед обновлением
- Зафиксируйте текущую версию сервера, агента, протокола и сборочный пакет агента.
- Создайте согласованную копию PostgreSQL, ClickHouse, объектов S3, конфигурации и ключей и проверьте восстановление.
- Сохраните текущий EXE-релиз агента, legacy ZIP-релиз при наличии, манифесты, SHA-256 и ключи подписи.
- Проверьте миграции, регистрацию тестового агента и совместимость политик на staging.
- Определите окно обслуживания и способ отката.
Обновление сервера
cd server
docker compose config --quiet
docker compose build --no-cache
docker compose up -d
docker compose ps
docker compose exec app python -c "import urllib.request; print(urllib.request.urlopen('http://127.0.0.1:5000/api/health/ready').status)"
Контейнер db-init выполняет инициализацию и миграции до запуска приложения. В команде readiness выше указан базовый путь /; при публикации под /roy используйте /roy/api/health/ready. После обновления проверьте вход в интерфейс, рабочие области, регистрацию тестового агента, получение политики, события, инциденты, Socket.IO и загрузку пакета агента.
Обновление пакета агента
Перед публикацией проверяют версию агента, совместимость протокола, происхождение и контрольную сумму пакета, доступность штатного установщика. Основной EXE-сценарий использует защищённую выдачу и SHA-256; проверка подписи Ed25519 манифеста относится к legacy ZIP-сценарию. Проверка контрольной суммы и проверка подписи имеют разное назначение.
Автоматическое обновление агентов
Сервер публикует актуальную версию, SHA-256 и ссылку на пакет через API версии агента. При heartbeat клиент сообщает свою версию; сервер может создать задание обновления и выдать одноразовый grant на скачивание.
| Параметр | Назначение |
|---|---|
COPKA_ROY_AGENT_UPDATE_MODE | auto - ставить устаревших клиентов в очередь автоматически, manual - только по кнопке администратора, off - не предлагать обновление. |
COPKA_ROY_AGENT_UPDATE_MAX_PARALLEL_PER_WORKSPACE | Ограничивает число одновременных обновлений в рабочей области. |
COPKA_ROY_AGENT_UPDATE_ROLLOUT_PERCENT | Процент совместимых агентов в текущей волне: от 1 до 100, по умолчанию 100. Для небольшой области выбирается минимум один агент. |
COPKA_ROY_AGENT_UPDATE_GRANT_TTL_SECONDS | Срок действия одноразового ключа скачивания обновления. |
COPKA_ROY_AGENT_UPDATE_JITTER_SECONDS | Разносит скачивание по времени, чтобы не перегружать сервер. |
COPKA_ROY_AGENT_UPDATE_DOWNLOAD_MAX_ATTEMPTS | Ограничивает число попыток скачивания по одному update grant. |
Для Windows основным auto-update package является EXE-установщик с installer_type=exe. Агент скачивает его по grant, проверяет SHA-256 и запускает CopkaRoySetup.exe /quiet /auto-update /install-path .... Режим auto-update требует существующую валидную identity и не использует новый registration key. Legacy ZIP-путь с CopkaRoyUpdater.exe остаётся fallback: он проверяет подпись Ed25519 манифеста и SHA-256 каждого файла. Launcher коммитит новую версию только после локальной health/readiness проверки.
Процентная волна и аварийная остановка
Участники волны выбираются детерминированно по workspace, версии релиза и client_id. Поэтому увеличение процента расширяет стабильную выборку, а повторный запуск с тем же значением не выбирает случайно другие компьютеры. Рекомендуемый порядок: 1% → 10% → 25% → 50% → 100%.
Процент рабочей области читается и изменяется через GET/PATCH /roy/api/v1/owner/workspaces/<workspace_uuid>/agent-update-rollout. PATCH принимает JSON {"percentage": 25}, отменяет только состояния queued и leased и пересчитывает очередь. Значение Owner API переопределяет .env только для выбранной рабочей области.
Кнопка «Остановить обновления» является отдельным аварийным рубильником. Она сохраняет паузу в настройках рабочей области, блокирует ручную и автоматическую очередь и аннулирует неиспользованные grants. Уже выполняющиеся установки намеренно не обрываются.
Откат
- Сначала остановите распространение обновления в разделе установки агента.
- Для агента предпочтительно выпустите код последней исправной сборки под следующим номером версии — это безопасное исправление вперёд.
- Локальный launcher автоматически возвращает предыдущий слот, только если новая версия не запускается или не проходит readiness до commit.
- Остановите новую версию серверного приложения.
- Верните прежний образ, compose-конфигурацию и
.env. - Если миграция несовместима назад, восстановите дамп PostgreSQL на отдельную БД и переключите приложение.
- Убедитесь, что плохой пакет больше не выдаётся, а процент новой волны не увеличивается.
- Выполните smoke-тест и задокументируйте причину отката.
Согласованность версии и базы данных
Этот комплект документации описывает только СОПКА.Рой 1.0.0. Описание процедуры обновления не является объявлением других выпусков. До применения поставки проверьте совместимость схемы и сохраните восстановимую копию всех постоянных хранилищ.
Миграции Alembic выполняются отдельным db-init под учётной записью мигратора. Не запускайте старую и новую схему записи произвольно одновременно. Откат контейнера не откатывает PostgreSQL, ClickHouse и S3; план возврата включает совместимую схему или согласованное восстановление данных. Начатое обновление агента и ещё не выданное предложение обновления обрабатываются по-разному.
Приёмка после обновления
Проверьте вход и роли, выбранную область, heartbeat тестового клиента, получение политики, доставку события через worker в ClickHouse, открытие существующего объекта S3 и выполнение безвредной команды. Только готовность HTTP-порта не подтверждает работоспособность всего комплекса.
Нагрузка при распространении
Бюджет 1000 одновременно работающих агентов в «Системных требованиях» не включает одновременное скачивание пакета всей сетью. Процент волны определяет долю выбранных клиентов, а лимит параллельности - число одновременно выполняемых обновлений; эти ограничения не взаимозаменяемы. Полосу, временные файлы, запас диска и работу старых и новых экземпляров сервера учитывают отдельно. После обновления на прежнем профиле проверяют задержки, ошибки и рост очереди.
Обновление AI-чата и схемы
История диалогов и учёт квот входят в PostgreSQL; обновление интерфейса не сбрасывает их. Текущая схема объединена в первую миграцию 0001. Для принятия прежних ревизий оператор создаёт резервную копию и проверяет структуру; пересоздание базы для обновления не требуется.
Подробнее: AI-чат: анализ безопасности.