Для AI-агентов: markdown этой страницы — /docs-content/infra/deploy/logs.md индекс документации — /llms.txt
Логи сервиса
GET /v1/infra/servers/:id/logs
Возвращает логи BLACKHOLE-сервера через системную утилиту journalctl с фильтрацией по количеству строк, временному окну и подстроке. При деплое по умолчанию создаётся юнит app.service, если не указали другое имя.
Параметры
| Параметр | В | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|---|
id |
path | string (UUID) | да | — | ID BLACKHOLE-сервера. Список: GET /v1/infra/servers |
service |
query | string | нет | — | Имя systemd-юнита: app, crm-dashboard, и т. п. Не указывайте расширение .service. По умолчанию читается весь системный журнал |
lines |
query | number | нет | 50 | Количество строк, 1–500 |
since |
query | string | нет | — | Временная метка в формате утилиты journalctl: "1 hour ago", "2026-04-22 10:00:00", "10 minutes ago" |
grep |
query | string | нет | — | Подстрока для фильтра, до 200 символов |
Примеры
curl — личный ключ
# Логи приложения за последний час с фильтром по "error"
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/logs?service=app&lines=100&since=1%20hour%20ago&grep=error"
# Весь системный журнал, последние 10 строк (для отладки cloud-init)
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/logs?lines=10"
curl — OAuth-приложение
curl -H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
"https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/logs?service=app&lines=50"
JavaScript — личный ключ
const params = new URLSearchParams({
service: 'app',
lines: '100',
since: '30 minutes ago',
})
const res = await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/logs?${params}`,
{ headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
const { data } = await res.json()
data.logs.forEach(line => console.log(line))
JavaScript — OAuth-приложение
const res = await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/logs?service=app&lines=50`,
{
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
}
)
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data.service |
string | null | Значение параметра ?service= из запроса или null, если параметр не передан. У приложения в галактике поля нет |
data.logs |
array<string> | Основное поле. Строки логов в порядке поступления (новые — в конце массива) |
data.lines |
array<string> | Алиас data.logs (тот же массив). Сохранён для обратной совместимости — в новом коде используйте data.logs |
data.requestedLines |
number | Значение параметра ?lines= из запроса |
data.returnedLines |
number | Длина data.logs |
data.since |
string | null | Значение параметра ?since= из запроса или null |
data.grep |
string | null | Значение параметра ?grep= из запроса или null |
data.hint |
string | Опционально. Диагностика когда data.logs.length === 0 |
data.recovery |
object | Только у приложения в галактике, когда хост спит или недоступен. Как запустить приложение и сколько ждать — Сон и пробуждение Galaxy-приложения |
Пример ответа
{
"success": true,
"data": {
"service": null,
"logs": [
"Apr 22 11:17:02 epd65hdv07p8g89c0c06 CRON[1406]: pam_unix(cron:session): session closed for user root",
"Apr 22 11:17:27 epd65hdv07p8g89c0c06 vibe-agent[1098]: 2026/04/22 11:17:27 [exec] id= timeout=10s workdir=\"\" command=\"uname -a\"",
"Apr 22 11:17:28 epd65hdv07p8g89c0c06 cloud-init[975]: Reading package lists..."
],
"lines": [
"Apr 22 11:17:02 epd65hdv07p8g89c0c06 CRON[1406]: pam_unix(cron:session): session closed for user root",
"Apr 22 11:17:27 epd65hdv07p8g89c0c06 vibe-agent[1098]: 2026/04/22 11:17:27 [exec] id= timeout=10s workdir=\"\" command=\"uname -a\"",
"Apr 22 11:17:28 epd65hdv07p8g89c0c06 cloud-init[975]: Reading package lists..."
],
"requestedLines": 50,
"returnedLines": 3,
"since": null,
"grep": null
}
}
Пример ответа при ошибке
400 — сервер в OPEN-режиме:
{
"success": false,
"error": {
"code": "NOT_BLACKHOLE",
"message": "Deployment API only available for BLACKHOLE servers"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR |
Нарушена схема: lines вне 1–500, service длиннее 100 символов, grep длиннее 200 символов. У приложения в галактике — ещё и since не в виде длительности 10m или метки времени RFC 3339 |
| 400 | NOT_BLACKHOLE |
Сервер в режиме OPEN — Deploy API недоступен |
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 401 | INVALID_API_KEY |
Ключ не опознан: такой строки на платформе нет |
| 402 | BILLING_EXHAUSTED |
Сервер спит с запретом пробуждения, а баланс владельца сервера заморожен. Пополните баланс и повторите |
| 402 | ACCOUNT_FROZEN |
Баланс Вайбкод заморожен. Запрос отбивается до операции, спящий сервер при этом не будится — пополните баланс и повторите |
| 403 | SERVER_WAKE_BLOCKED |
Сервер спит, а пробуждение запрещено — например, закончился доступ к платформе или действует административная блокировка. Чтение журнала такой сервер не поднимает, повтор не поможет, пока запрет не снят. Разбор запрета — Разбудить сервер |
| 403 | WRONG_KEY |
Сервер существует, но вызывающему не принадлежит. Операции над содержимым приложения — выкладка, команда, загрузка файла и чтение логов — открыты по любому из трёх оснований: управляющий ключ сервера, ключ, приложение которого привязано к этому серверу (Application.serverId), либо членство в команде разработки этого сервера (обе роли, «Разработчик» и «Администратор»). Токены доступа и загрузка значка требуют именно управляющего ключа. Управление самой машиной открыто ещё и роли «Администратор» команды. В ответе — hint с восстановлением из двух шагов. Подробнее — Восстановление доступа к серверу |
| 403 | EXTERNAL_COLLABORATOR_KEY_SERVER_MISMATCH |
Вызов сделан ключом внешнего участника разработки, а в адресе указан не тот сервер, для которого ключ выпущен. Такой ключ действует ровно на одном сервере, и ответ не сообщает, существует ли запрошенный сервер. Для работы с другим сервером нужен ключ того внешнего членства |
| 403 | EXTERNAL_COLLABORATOR_NOT_A_MEMBER |
Ключ внешнего участника обращается к своему серверу, но доступа сейчас нет: членство снято, истёк его срок либо для аккаунта Битрикс24, которому принадлежит сервер, отключены внешние участники разработки. Код эти причины не различает и сведений о сервере не раскрывает. Членство перечитывается на каждом запросе, поэтому снятый доступ перестаёт работать сразу |
| 404 | GALAXY_APP_NOT_FOUND |
Только у приложения в галактике: запись приложения не связана с хостом-галактикой или у неё нет субдомена |
| 404 | NOT_FOUND |
Сервера с таким id нет или он удалён. Сервер, который существует, но вам не принадлежит, отвечает 403 WRONG_KEY — код различает «нет такого сервера» и «нет прав на него» |
| 409 | SERVER_NOT_READY |
Отдельный сервер не готов к операции: не запущен, туннель не подключён или успешный непустой снимок Gateway подтвердил отсутствие туннеля при сохранённом CONNECTED. Пустой или недоступный снимок не считается подтверждением отсутствия. GET не запускает repair: при подтверждённом stale-туннеле он отказывает до чтения журнала и возвращает в hint явный POST /v1/infra/servers/:id/repair. Выполните этот POST и повторите запрос. Спящий отдельный сервер платформа по-прежнему будит сама. Ветка GALAXY_APP имеет отдельный контракт, описанный ниже |
| 409 | EXEC_BUSY |
Только у приложения в галактике (kind: "GALAXY_APP"): общий exec-канал хоста занят — журнал читается через него же. Ответ несёт заголовок Retry-After и поля retryable: true / retryAfter, повторите с этим интервалом. Освободить общий канал владелец приложения не может, при устойчивой занятости обратитесь в поддержку |
| 409 | WAKE_IN_PROGRESS |
Спящий сервер уже будит другой запрос. Дождитесь его завершения и повторите |
| 409 | SERVER_STATE_CHANGED |
Состояние сервера изменилось во время автоматического восстановления. Повторите запрос |
| 422 | GUEST_NOT_BOOTING |
Гостевая система сервера не загружается, операции над содержимым недоступны |
| 422 | VM_MISSING |
У записи сервера нет виртуальной машины у облачного провайдера, поэтому будить нечего. Сервер нужно заменить: удалить и создать новый. Адрес каждого шага error.hint называет, только если шаг доступен этому запросу, а для недоступного — причину отказа и что изменить. Поле error.userMessage приходит, только когда доступны оба шага |
| 422 | VM_POINTER_LOST |
У записи нет externalId, но разбор облака видит машину под облачным именем этого сервера: связь потеряна, а сама машина может продолжать работать и тарифицироваться. Удалять сервер и создавать новый НЕ нужно — тогда машина останется работать вообще без записи. Сервер в error не переводится, обратитесь в поддержку за восстановлением связи |
| 502 | WAKE_FAILED |
Во время пробуждения спящего сервера он перешёл в неожиданное состояние. Повторите запрос |
| 502 | PROVIDER_ERROR |
Облачный провайдер вернул ошибку при запуске виртуальной машины спящего сервера. Туннель здесь ни при чём — вызов /repair не поможет |
| 429 | RATE_LIMITED |
Превышен лимит 10 операций в минуту на сервер. Точное значение — в заголовке x-ratelimit-limit (потолок делится на реплики) |
| 502 | TUNNEL_NOT_FOUND / GATEWAY_UNREACHABLE: … |
Нет живого туннеля до сервера либо Gateway недоступен — вызовите /repair и повторите. GATEWAY_UNREACHABLE несёт детали после двоеточия, поэтому сопоставляйте error.code по префиксу, а не по точному совпадению |
| 503 | GATEWAY_TIMEOUT: … |
Gateway не ответил вовремя. Код тоже несёт детали после двоеточия — сравнивайте по префиксу |
| 503 | WAKE_TIMEOUT |
Спящий сервер не поднялся за отведённые 6,5 минуты — машина не запустилась или туннель не подключился. Сервер возвращается в sleeping, поэтому повторный запрос безопасен. См. «Известные особенности» |
| 502 | RUNTIME_FAILED |
Установка среды выполнения на сервере завершилась ошибкой. Чтение журнала ждёт окончания установки и отказывает при ошибке |
| 503 | RUNTIME_TIMEOUT |
Установка среды выполнения не завершилась за 10 минут. Ответ содержит retryAfter: 30 и заголовок Retry-After: 30 |
| 502 | EXEC_FAILED и другие коды агента |
Только у приложения в галактике: агент хоста не смог прочитать журнал контейнера. Код и сообщение передаются от агента |
| 502 | LOGS_UNAVAILABLE |
Агент не смог прочитать системный журнал: нет такого юнита, неверный фильтр, отказано в доступе или journalctl вернул ошибку |
Полный список общих ошибок API — Ошибки.
Известные особенности
- Спящую отдельную виртуальную машину чтение журнала будит. Если сервер (
kind: "STANDALONE") в статусеsleeping, платформа запускает пробуждение и ждёт его в том же запросе — до 6,5 минуты, и только потом читает журнал. Клиентский таймаут запроса это время обязан пережить. У galaxy-приложения чтение ведёт себя иначе — см. раздел «Galaxy-приложения» ниже. - Формат строк — как выдаёт
journalctl. Каждая строка уже содержит время, имя хоста, имя процесса и его PID — дополнительная обработка на клиенте не нужна, выводите как есть. - Фильтр
grep— простая подстрока, не регулярное выражение. Для сложных паттернов выгружайте больше строк и фильтруйте на клиенте. - Логи агента туннеля видны без
service— под именемvibe-agent. По ним ищут причину, когда приложение не отвечает через Deploy API. - Лимит 500 строк помножен на ограничение вызовов. Ограничение
linesдействует на каждый запрос и между репликами не делится, а потолок вызовов делится — его действующее значение приходит в заголовкеx-ratelimit-limit. Реальный потолок — 500 × значение из этого заголовка. Для большего объёма логов делайте несколько вызовов с разнымиsince.
Galaxy-приложения
Если сервер — galaxy-приложение (kind=GALAXY_APP), эндпоинт возвращает не системный журнал хоста, а stdout/stderr самого контейнера приложения (docker logs). Параметр service для galaxy-приложений не применяется.
- Чтение не будит машину. Пока хост-галактика спит или недоступен, ответ приходит со статусом
200, пустым массивомdata.logsи двумя диагностическими полями —data.hintиdata.recovery. Поднимите приложение вызовомPOST /v1/infra/servers/:id/wakeи повторите запрос: пробуждение запускает тот же контейнер, поэтому строки, записанные до сна, остаются в журнале. Холодная галактика загружается минутами, её бюджет приходит в полеrecovery.coldBootBudgetSeconds, а готовность проверяется опросомGET /v1/infra/servers/:idпо полюreachability.effectiveStatus. Разбор всех полей ответа и порядок действий — Сон и пробуждение Galaxy-приложения. since— длительность или RFC 3339, не относительная текстовая форма. Для galaxy-приложенийsinceпринимает только длительность в секундах, минутах или часах —10m,2h,24h— или метку времени RFC 3339, например2026-06-24T10:00:00Z— для интервала в сутки используйте24h. Относительные текстовые формыjournalctl("1 hour ago","10 minutes ago") допустимы только для Black Hole-серверов.grepработает так же — простая подстрока, фильтрация на стороне платформы.