Для AI-агентов: markdown этой страницы — /docs-content/infra/deploy/operations.md индекс документации — /llms.txt

Последние операции сервера

GET /v1/infra/servers/:id/operations

Возвращает последние операции на сервере от текущего API-ключа, от новых к старым. Видов операций два — выкладки POST /deploy и команды POST /exec, и каждая строка называет свой вид в поле kind. По умолчанию список отдаёт только выкладки: ручка появилась раньше команд, и без параметра возвращается тот же набор строк, что и прежде. Сами строки при этом дополнительно несут поле kind. Команды показывает kind=exec, смешанную ленту — kind=all. Это канал восстановления, когда ответ потерян раньше, чем клиент успел получить operationId — в частности, при обрыве связи во время сборки galaxy-приложения или при обрыве ожидания длительной команды.

Ручка только читает общую запись исхода: она не будит сервер, не чинит туннель и не снимает mutex. Право на сервер совпадает с правом на deploy, но строки дополнительно фильтруются по точному API-ключу, который начал операцию. Поэтому связанный с приложением ключ может читать только собственные запуски, а id общего galaxy-хоста не даёт доступа к запускам его приложений. Владелец может сверить свои операции после мягкого удаления сервера.

Параметры

Параметр В Тип Обяз. Описание
id path string да ID сервера или galaxy-приложения
limit query integer нет Число строк: по умолчанию 5, максимум 20. Ноль ограничивается до 1, целое значение выше 20 — до 20. Отрицательное, дробное, нечисловое и пустое значение даёт 400 INVALID_LIMIT
kind query string нет Какой вид операций вернуть: deploy (по умолчанию), exec или all для обоих сразу. Другое значение, включая пустое, даёт 400 INVALID_KIND

Пример

Terminal
curl -H "X-Api-Key: YOUR_API_KEY" \
  'https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/operations?limit=5'
JSON
{
  "success": true,
  "data": {
    "operations": [
      {
        "operationId": "clz9k2m4x0001qw8h3f7d2n5p",
        "kind": "deploy",
        "serverId": "8f14e45f-ceea-467a-9c8d-2f1c5a6b7e30",
        "status": "running",
        "outcomeAvailable": true,
        "step": "build",
        "startedAt": "2026-08-26T09:14:22.117Z",
        "finishedAt": null,
        "error": null
      }
    ]
  }
}

Пустое значение параметра — это переданное значение, а не опущенный параметр. ?kind= и ?limit= рождаются из шаблона с незаполненной переменной, то есть сузить выдачу хотели, но не сумели. Такой вызов получает отказ, а не молчаливое умолчание: подставить умолчание значило бы отдать ленту, за которой клиент не приходил. Умолчания kind=deploy и limit=5 действуют только тогда, когда ключа в строке запроса нет вовсе.

Поля операции

Поле Тип Описание
operationId string Идентификатор для GET /v1/infra/operations/:operationId
kind string Вид операции: deploy или exec
serverId string ID сервера или galaxy-приложения
outcomeAvailable boolean Хранится ли исход операции
status string running, succeeded, failed или unknown. Отсутствует у просроченного терминального исхода
step string | null Последний наблюдаемый шаг. У строк kind: "exec" всегда null — у команды шагов нет. Отсутствует у просроченного терминального исхода
exitCode number | null Только у строк kind: "exec". Код возврата команды, если агент его подтвердил, иначе null. У строк выкладки поле отсутствует, а не приходит null. Отсутствует также у просроченного терминального исхода
startedAt string Время старта, ISO 8601
finishedAt string | null Время завершения; отсутствует у просроченного терминального исхода
error object | null { code, message } только для failed; отсутствует у просроченного терминального исхода

У строк kind: "exec" судите по паре exitCode + status, а не по одному полю. Число приходит только у succeeded и означает, что команда отработала до конца. Само по себе null не означает «исход не доказан»: у succeeded оно означает, что команда отработала, а кода агент не назвал, — повторять её не нужно; у failed — что она не запускалась и повтор безопасен; у running — что она ещё идёт; и только у unknown не доказано ничего. Подробный разбор статусов — GET /v1/infra/operations/:operationId.

Терминальный исход хранится 7 суток. После этого строка некоторое время остаётся в списке с outcomeAvailable: false, но её статус, шаг и ошибка больше не раскрываются. unknown — устойчивый терминальный ответ, когда платформа не может доказать удалённый исход, например после GATEWAY_UNREACHABLE; просроченная операция, оставшаяся в running, также отображается как unknown.

Безопасное восстановление после обрыва

  1. Не повторяйте выкладку или изменяющую команду вслепую. Найдите свежую операцию этого ключа в списке. Ищете команду — передайте kind=exec: без параметра список показывает только выкладки.
  2. Пока она running, ждите и опрашивайте список или адресную ручку раз в несколько секунд.
  3. При succeeded или failed используйте подтверждённый исход. При unknown либо отсутствии записи сверьте GET /v1/infra/servers/:id и логи.
  4. Если следующий запрос подтвердил EXEC_BUSY, смотрите на error.hint.holder в этом же ответе 409: он называет операцию, которая держит замок, независимо от того, каким ключом она запущена. Держатель есть — значит операция идёт: ждите, а не освобождайте замок силой. По списку операций этот вопрос не решается: список показывает только запуски вашего ключа, поэтому операция, начатая другим ключом того же портала, в нём отсутствует, и пустой список не доказывает, что сервер свободен. Держателя нет — это НЕ зеркальное доказательство простоя: чтение держателя fail-open, поэтому «держателя нет» приходит и тогда, когда прочитать его не удалось. Отсутствие даёт право на обычный повтор после Retry-After и на гардированный POST /v1/infra/servers/:id/unstick — он на живой операции без force отвечает 409. Независимое подтверждение простоя — состоянием сервера (GET /v1/infra/servers/:id) и логами — нужно ОБОИМ шагам: и /unstick, чей разрыв туннеля убивает всё, что выполняет агент, и тем более безусловному DELETE /lock после него. Дальше учитывайте вид сервера. Для STANDALONE можно вызвать POST /v1/infra/servers/:id/unstick и снова выполнить read-only проверки. У GALAXY_APP exec-канал принадлежит общему хосту: tenant-вызов unstick не поддерживается; подождите 30–60 секунд, а при устойчивом EXEC_BUSY обратитесь в поддержку. После любого recovery снова сверьте список, состояние и логи до повторной выкладки.

Ответ standalone-deploy с транспортной причиной GATEWAY_UNREACHABLE, DEPLOY_CONNECTION_TERMINATED, DEPLOY_TIMEOUT или DEPLOY_TUNNEL_STALE, а также post-drop ответы Galaxy GALAXY_DEPLOY_INTERRUPTED и GALAXY_HOST_UNREACHABLE, содержат эту read-first последовательность в error.hint. У Galaxy такой ответ несёт error.retryable: false: сам по себе обрыв не доказывает ни успех, ни провал операции. Слот, контейнер и /data при неизвестном исходе сохранены — не удаляйте и не пересоздавайте приложение.

Ошибки

HTTP Код Описание
400 INVALID_LIMIT limit отрицательный, дробный, нечисловой, пустой или не помещается в безопасное целое число
400 INVALID_KIND kind передан, но это не deploy, не exec и не all. Пустое значение тоже передано
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Ключ не опознан: такой строки на платформе нет
404 SERVER_NOT_FOUND Сервер недоступен этому ключу
429 RATE_LIMITED Превышен лимит 60 запросов в минуту на ключ. Точное значение — в заголовке x-ratelimit-limit (потолок делится на реплики)

Полный список общих ошибок API — Ошибки.

Смотрите также