Для AI-агентов: markdown этой страницы — /docs-content/infra/lifecycle/reboot.md индекс документации — /llms.txt
Перезагрузить сервер
POST /v1/infra/servers/:id/reboot
Перезагружает работающий сервер у облачного провайдера. На время перезагрузки сервер переходит в provisioning, туннель временно разрывается — blackholeStatus становится DISCONNECTED — и переподключается после старта виртуальной машины. Операция атомарная: внутренняя проверка на уровне базы предотвращает гонки, если одновременно пришло несколько вызовов. Если провайдер не поддерживает перезагрузку — возвращается 501 и статус откатывается на running.
Параметры
| Параметр | В | Тип | Обяз. | Описание |
|---|---|---|---|---|
id |
path | string (UUID) | да | ID сервера в статусе running |
Тело запроса пустое.
Примеры
curl — личный ключ
curl -X POST -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/reboot
curl — OAuth-приложение
curl -X POST -H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/reboot
JavaScript — личный ключ
await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/reboot`,
{ method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
// Опрос готовности после перезагрузки
while (true) {
await new Promise(r => setTimeout(r, 5000))
const res = await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}`,
{ headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
const { data } = await res.json()
if (data.status === 'running' && data.blackholeStatus === 'CONNECTED') break
}
JavaScript — OAuth-приложение
await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/reboot`,
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
}
)
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | true. Команда на перезагрузку отправлена провайдеру |
Пример ответа
{ "success": true }
Пример ответа при ошибке
422 — сервер существует, но не в статусе running. В ответе — текущее состояние и доступные действия:
{
"success": false,
"error": {
"code": "SERVER_WRONG_STATE",
"message": "Server is SLEEPING; /reboot requires RUNNING.",
"userMessage": "Server is currently SLEEPING. Reboot only applies to a RUNNING server.",
"currentState": { "status": "sleeping", "blackholeStatus": "DISCONNECTED", "hasExternalId": true },
"availableActions": ["wake", "start", "repair", "delete"]
}
}
409 — статус сервера изменился во время операции (гонка):
{
"success": false,
"error": {
"code": "CONFLICT",
"message": "Server state changed during operation"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 401 | INVALID_API_KEY |
Неверный или просроченный API-ключ |
| 402 | ACCOUNT_FROZEN |
Баланс Вайбкод заморожен. Пополните и повторите |
| 403 | INFRA_FORBIDDEN_FOR_COWORK_KEY |
Вызов сделан ключом Cowork/Code — такой ключ работает только с данными, изменяющие операции ему закрыты. Что делать — Проектный ключ для деплоя |
| 403 | SERVER_ROLE_FORBIDDEN |
Вы состоите в команде разработки этого сервера с ролью «Разработчик», а операция открыта роли «Администратор». В error.hint придут ваша роль, требуемый порог и перечень открытых вам вызовов. Разбор ролей — Список серверов |
| 404 | SERVER_NOT_FOUND |
Сервера с таким id нет — удалён или привязан к другому API-ключу, и вы не состоите в его команде разработки |
| 409 | CONFLICT |
Гонка состояний — статус сервера изменился во время операции. Повторите запрос после проверки GET /v1/infra/servers/:id |
| 422 | SERVER_WRONG_STATE |
Сервер существует, но не в статусе running. В error.currentState — текущее состояние, в error.availableActions — что можно сделать сейчас |
| 422 | VM_MISSING |
У серверной записи нет облачной ВМ (создание не завершилось или ВМ удалена вручную) — удалите сервер и создайте заново |
| 429 | RATE_LIMITED |
Превышен общий лимит запросов платформы |
| 501 | NOT_SUPPORTED |
Облачный провайдер не поддерживает перезагрузку. Используйте последовательность /stop → /start |
| 502 | PROVIDER_ERROR |
Облачный провайдер вернул ошибку. Статус сервера автоматически откатывается на running |
Полный список общих ошибок API — Ошибки.
Известные особенности
- Атомарный переход
running → provisioning. База обновляется однимupdateManyс условиемstatus = 'RUNNING'. Если в тот же момент прилетел ещё один/rebootили/stop, второй вызов получит 409CONFLICT. - Автоматический откат при ошибке провайдера. Если
adapter.rebootServer()кинул исключение, запись возвращается к статусуrunning— чтобы клиент не остался с «зависшим»provisioning. - Для перезапуска только приложения (без перезагрузки виртуальной машины) используйте
POST /execс командойsystemctl restart app— это в десятки раз быстрее и не прерывает туннель. - После перезагрузки ждите оба поля. Чтобы сервер был готов к работе, нужны одновременно
status: "running"иblackholeStatus: "CONNECTED"— туннель переподключается после старта виртуальной машины.
Galaxy-приложения (kind=GALAXY_APP)
Для приложения-контейнера в галактике (kind=GALAXY_APP — у него нет собственной виртуальной машины) /reboot перезапускает контейнер на хосте, а не перезагружает ВМ. Это «пинок» самовосстановления для зависшего или крашащегося приложения: он не стирает постоянный том /data (в отличие от удаления).
Перезапуск совещательный (advisory) — он не меняет статус записи и не снимает маркер краша. После рестарта контейнер проверяется, и в ответе возвращается вердикт healthy: запустился ли контейнер и перестал ли он перезапускаться. Это проверка состояния контейнера (docker inspect), а не HTTP-ответа приложения. Крашащееся приложение авторитетно чинится редеплоем исходников через POST /v1/infra/servers/:id/deploy — именно редеплой сбрасывает состояние ошибки.
Приложение принимает /reboot в статусе running или error (обычному серверу нужен только running).
Поля ответа
Вердикт приходит вложенным в data (в отличие от перезагрузки обычного сервера, где тело — плоское { "success": true }).
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | true — команда выполнена |
data.restarted |
boolean | true — контейнер перезапущен, false — перезапустить не удалось (контейнер отсутствует / образ удалён) — нужен редеплой |
data.healthy |
boolean | true — контейнер запустился и перестал перезапускаться, false — снова падает (нужен редеплой). Это проверка контейнера, не HTTP-ответа приложения |
data.hint |
string | присутствует только при data.healthy: false — как залить исправленную версию |
{ "success": true, "data": { "restarted": true, "healthy": false, "hint": "Redeploy the fixed source via POST /v1/infra/servers/:id/deploy" } }
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 404 | GALAXY_APP_NOT_FOUND |
Приложения с таким id на хосте нет — контейнер уже удалён или запись не соответствует хосту |
| 409 | CONFLICT |
Статус приложения изменился во время операции. Перечитайте состояние и повторите |
| 409 | GALAXY_APP_REBOOT_USE_AGENT_CONTROLS |
Приложение создано агентом или ботом — управляйте им из панели агента/бота, а не через /reboot |
| 409 | GALAXY_APP_BUSY |
Занято — либо на хосте выполняется другая команда (сборка соседнего приложения), либо этому же приложению уже отдан лок другой операцией (повторный клик / деплой). Ретраебельно: в ответе заголовок Retry-After, а в теле error.retryable: true и error.retryAfter |
| 422 | SERVER_WRONG_STATE |
Приложение не в статусе running/error (например, sleeping). В error.availableActions — что можно сделать сейчас. В любом статусе вне running/error этот отказ дополнительно запускает починку хоста — см. ниже |
| 502 | GALAXY_HOST_UNREACHABLE |
Хост-галактика недоступен, туннель хоста разорван. В error.hint — что делать. Повторяйте после восстановления хоста |
Отказ приложению попутно чинит хост
У galaxy-приложения, чей хост потерял связь с платформой, любая операция упирается в один и тот же барьер: и пробуждение, и деплой идут через хост, а хост недостижим. Поэтому перед отказом 422 SERVER_WRONG_STATE платформа запускает восстановление связи с хостом в фоне — сам отказ этим не отменяется, но следующая попытка имеет шанс пройти.
Если восстановление действительно началось, в теле ошибки появляется необязательный объект hint:
| Поле | Тип | Описание |
|---|---|---|
error.hint.reason |
string | Почему отказ и что запущено |
error.hint.recovery |
string | Какую операцию повторить — POST /deploy |
error.hint.retryAfterSeconds |
number | Нижняя граница ожидания в секундах. Это ориентир, а не обещание готовности |
Объекта hint может не быть — и это не ошибка. Он отсутствует, когда восстановление не запускалось: связь с хостом на самом деле жива, починка уже идёт или недавно завершилась, хост сам выключен или спит, его недавно будили, гостевая система на машине не стартует, машина закрыта для пробуждения либо автоматическое восстановление отключено на платформе. Читайте hint как необязательную подсказку: есть — подождите названное время и повторите деплой, нет — действуйте по коду ошибки.
Повторные вызовы новую починку не запускают. Пока починка идёт и ещё 10 минут после того, как она закончилась — успешно или нет, — платформа новую не начинает, поэтому повторный отказ придёт уже без hint. Это то же десятиминутное окно, что и время жизни завершённой записи в Статусе восстановления. Починку, которая оборвалась и перестала подавать признаки жизни, платформа считает мёртвой через 20 минут и разрешает начать заново.
Значение retryAfterSeconds равно 300 и остаётся нижней границей ожидания, а не обещанием готовности: раньше повторять смысла нет, позже — можно.
У отказа 502 GALAXY_HOST_UNREACHABLE объект hint другой — четыре поля вместо трёх, с собственным набором значений. Состав описан в разделе «Поле error.hint у GALAXY_HOST_UNREACHABLE» страницы Galaxy-приложение. Форму подсказки задаёт код отказа, поэтому разбирайте её по коду, а не по странице, на которой отказ встретился.