Для AI-агентов: markdown этой страницы — /docs-content/infra/galaxy.md индекс документации — /llms.txt
Galaxy-приложение
Galaxy-приложение — это отдельное приложение Black Hole, которое живёт в контейнере на общем хосте — галактике — вместе с другими такими же приложениями. Каждое приложение получает свой HTTPS-субдомен и изоляцию, как у отдельной виртуальной машины, но все они делят одну галактику — это кратно дешевле, чем держать отдельный сервер под каждое приложение. Если администратор портала включил размещение в галактиках, тот же вызов POST /v1/infra/servers создаёт galaxy-приложение, а не виртуальную машину.
Скоуп: vibe:infra · Базовый URL: https://vibecode.bitrix24.tech/v1 · Авторизация: заголовок X-Api-Key
Кто выбирает модель размещения
Режим размещения выбирает администратор портала в кабинете на странице «Галактики», в разделе «Режим размещения приложений». Обычный участник портала видит режим только для чтения, а вызывающий API его не задаёт. Один и тот же запрос POST /v1/infra/servers создаёт либо отдельную виртуальную машину, либо galaxy-приложение, в зависимости от режима портала. Параметра «создать именно galaxy-приложение» в запросе нет.
Режим портала — один из трёх:
- Сначала галактика (
galaxies-only) — новые приложения размещаются плотно внутри галактик. Если приложение перерастает свой контейнер, его переносят на отдельный сервер Black Hole. - Гибридный режим (
both) — приложение попадает в галактику, когда в ней есть место, иначе разворачивается на отдельной виртуальной машине. - Отдельные серверы (
standalone-only) — галактики не используются, каждое приложение получает свою виртуальную машину.
Что с этим делать вызывающему:
- Определяйте модель по ответу, а не задавайте её. Признак galaxy-приложения — поле
createdViaравноgalaxyв ответе создания. Полный список признаков — в разделе «Как отличить galaxy-приложение в ответе» ниже. - Нужна именно отдельная виртуальная машина — запросите её явно. Если портал размещает приложения в галактиках, но конкретному приложению нужен выделенный сервер, передайте в теле
POST /v1/infra/serversполеplacementравнымdedicated— платформа создаст отдельную виртуальную машину вместо galaxy-приложения. По умолчаниюplacementравенauto, и применяется настройка портала.
На бесплатном тарифе Битрикс24 галактика не создаётся:
- Если у аккаунта Битрикс24 уже есть галактика, приложения по-прежнему разворачиваются в ней — ограничение касается только создания новой.
- Если галактики нет, каждое приложение получает отдельную виртуальную машину, а одношаговое создание с полем
sourceвернёт400 SOURCE_AT_CREATE_GALAXY_ONLY. Разворачивайте в два шага:POST /v1/infra/serversбезsource, затемPOST /v1/infra/servers/:id/deploy. - Коммерческий тариф Битрикс24 снимает ограничение.
Готовность у моделей разная:
- Отдельная виртуальная машина — по
status: "running"иblackholeStatus: "CONNECTED". - Galaxy-приложение — только через загрузку кода, ожидание
CONNECTEDздесь не работает (см. «Жизненный цикл» ниже).
Доступность галактик
Галактики включаются в два шага, и оба делаются на стороне Вайбкод: сначала команда платформы включает их на платформе, затем администратор портала — для своего портала. Приложения размещаются в галактиках только тогда, когда сделаны оба шага. Признак до вызова — блок deployment в ответе GET /v1/me:
galaxyEnabled— открыты ли галактики порталу. Значениеfalseозначает, что не сделан хотя бы один из двух шагов.galaxyApp— вложенный блок с контрактом деплоя galaxy-приложения. Приходит, когда галактики открыты и режим размещения не «Отдельные серверы». В остальных случаях блока в ответе нет совсем.primary— модель размещения, которую платформа считает основной для этого портала:galaxyAppилиstandalone.
Поле resolvedDeployMode показывает режим размещения, выбранный в кабинете, и приходит заполненным независимо от доступности. Значение both при galaxyEnabled равном false означает, что режим в кабинете выбран, но галактики порталу не открыты — приложения разворачиваются на отдельных виртуальных машинах.
Порядок включения:
- Команда платформы включает галактики на платформе. Пока этого не сделано, переключателя «Галактики» в разделе «Настройки» кабинета не видно — включить их самостоятельно нельзя, обратитесь в поддержку.
- Администратор портала включает галактики для своего портала — переключателем «Галактики» в том же разделе «Настройки». Обычный участник портала эту настройку не меняет.
Стоимость и лимиты у galaxy-приложения считаются иначе, чем у отдельной виртуальной машины — см. раздел «Стоимость» ниже.
Как отличить galaxy-приложение в ответе
| Поле | Где | Значение |
|---|---|---|
createdVia |
ответ POST /v1/infra/servers |
galaxy для galaxy-приложения |
kind |
ответ POST /v1/infra/servers и GET /v1/infra/servers/:id |
GALAXY_APP — galaxy-приложение (контейнер), GALAXY — галактика (хост-носитель), STANDALONE — отдельная виртуальная машина |
galaxyId |
ответ POST /v1/infra/servers и GET /v1/infra/servers/:id |
ID галактики, в которой размещено приложение. Для остальных типов null |
appCount |
ответ GET /v1/infra/servers/:id |
Для галактики (GALAXY) — число неудалённых приложений в ней. Для остальных типов null |
У galaxy-приложения нет своего SSH-доступа (ssh равно null), публичного IP-адреса и внешнего идентификатора виртуальной машины — у контейнера их нет. Поля region и plan в ответе — это регион и тариф галактики-носителя: переданные при создании значения ни на что не влияют, размещение платформа выбирает сама.
Жизненный цикл — сборка при загрузке кода
Galaxy-приложение никогда само не доходит до blackholeStatus: "CONNECTED". Его контейнер и агент туннеля создаёт сама загрузка кода — отдельного шага провижининга, как у виртуальной машины, здесь нет.
Из этого следует главное правило: загружайте код сразу после создания, не дожидаясь CONNECTED. Если создать galaxy-приложение и просто опрашивать статус, оно останется в provisioning, а примерно через 20 минут платформа пометит его как error и запишет в поле provisionError, что код так и не был загружен.
Создание и загрузка кода
Создание идёт тем же вызовом POST /v1/infra/servers. Код загружают одним из двух сценариев.
- Сценарий 1 — одним запросом. Передайте код в поле
sourceвместе сruntimeиstartпрямо вPOST /v1/infra/servers. Сборка пойдёт в фоновом режиме, отдельный вызов загрузки не нужен. - Сценарий 2 — в два шага. Создайте приложение без
source, получите в ответеnext: "deploy", затем загрузите код черезPOST /v1/infra/servers/:id/deploy. Создание безsourceтребуетprovider/plan/region(для galaxy они информационны — см. пример в create.md).
Полные тела запросов, поля и примеры для обоих сценариев — на странице Создать сервер.
Создание galaxy-приложения по сценарию 1 — source передан, сборка идёт в фоне. Признак модели — createdVia равно galaxy:
{
"success": true,
"data": {
"id": "7c2b1f08-3a4d-4e91-9b6c-2f5e8a1d0c33",
"status": "provisioning",
"name": "my-crm-app",
"kind": "GALAXY_APP",
"galaxyId": "<galaxy-host-id>",
"ssh": null,
"ip": null,
"plan": "bc-medium",
"region": "ru-central1-a",
"mode": "BLACKHOLE",
"createdVia": "galaxy",
"subdomain": "app-7c2b1f08",
"blackholeStatus": "NONE",
"appUrl": "https://app-7c2b1f08.vibecode.bitrix24.tech",
"createdAt": "2026-04-22T10:50:11.477Z"
}
}
Деплой
Деплой galaxy-приложения отличается от деплоя виртуальной машины. Полный контракт — на странице Деплой приложения.
- Источник кода — встроенный
source.content(архив в base64). Вариантыsource.urlиsource.versionIdдоступны там, где платформа включила для вас выкладку по ссылке; иначе они отклоняются с400 GALAXY_DEPLOY_CONTENT_ONLY. По ссылке архив скачивает сам хост, поэтому крупный архив не проезжает через тело запроса. - Поля
runtimeиstartобязательны. Безruntimeзапрос вернёт400 GALAXY_DEPLOY_RUNTIME_REQUIRED. Список рантаймов —GET /v1/infra/runtimes. - Свой
Dockerfileкласть не нужно — платформа генерирует его из полейruntime,portиstart. - Переменные
envподставляются в контейнер при запуске, а не вшиваются в образ, поэтому секреты не попадают в слои образа. Рядом с ними платформа добавляетPORT— номер порта приложения; ключPORTзарезервирован, подробности в POST /v1/infra/servers/:id/deploy. - Рабочая директория контейнера —
/opt/app, путь/appтоже ведёт на неё как ссылка. Постоянные данные сохраняйте в томе/data.
Управление жизненным циклом
Galaxy-приложение живёт в контейнере на общем хосте и своей облачной машины не имеет. Поэтому часть операций жизненного цикла работает через хост, а часть к приложению не применяется. Полная карта — ниже, на страницах самих операций остаётся только то, что специфично для вызова.
| Операция | Что происходит с galaxy-приложением |
|---|---|
POST /:id/start, POST /:id/wake |
Поднимают приложение через хост: платформа при необходимости запускает галактику, затем стартует контейнер. Ответ приходит сразу, готовность проверяйте опросом GET /v1/infra/servers/:id — параметр ?wait=true ожидания здесь не даёт. Запрет пробуждения на хосте блокирует оба вызова, и /start его не снимает: отказ приходит с кодом 403 SERVER_WAKE_BLOCKED, а когда причина в подписке или тарифе аккаунта — со статусом 402 и кодом соответствующего отказа доступа. Приложение в статусе error лечит повторный деплой, а не эти вызовы |
POST /:id/reboot |
Перезапускает контейнер на хосте. Постоянный том /data сохраняется |
POST /:id/stop |
Не применяется. Работающее приложение получает 422 VM_MISSING — останавливать нечего, машины у контейнера нет. Приложение вне статуса running отвечает раньше, 422 SERVER_WRONG_STATE. Чтобы снять приложение, вызовите DELETE /v1/infra/servers/:id |
PATCH /:id/sleep |
Не применяется — 400 GALAXY_APP_USE_GALAXY_ROUTE. Приложение засыпает вместе с хостом, таймер простоя через API Вайбкод ему не задаётся |
POST /:id/sleep-now |
Не применяется — 400 GALAXY_APP_USE_GALAXY_ROUTE |
PATCH /:id/port |
Не применяется — 400 GALAXY_APP_USE_GALAXY_ROUTE. Порт контейнера закреплён за хостом и задаётся полем port при загрузке кода |
POST /:id/repair |
Не применяется — 400 INVALID_INPUT. Ремонт переустанавливает агента на облачной машине, а у контейнера её нет |
POST /:id/refresh |
Отвечает текущим статусом записи. У облака состояние не запрашивается — запрашивать нечего |
| Окна пробуждения: создать, изменить | 403 WAKE_SCHEDULE_GALAXY_DISABLED, пока возможность не раскрыта для приложений |
DELETE /:id |
Работает — платформа разбирает контейнер в галактике. Подробности в разделе «Удаление» ниже |
Три вызова из таблицы — PATCH /:id/sleep, POST /:id/sleep-now и PATCH /:id/port — отвечают одним кодом GALAXY_APP_USE_GALAXY_ROUTE. Тип сервера проверяется раньше статуса и режима, поэтому приложение получает этот код в любом состоянии, а не NOT_RUNNING и не 404. Раньше проверки типа идут только проверки значений в запросе: недопустимый sleepAfterMinutes или port вне диапазона 0–65535 дадут VALIDATION_ERROR и на galaxy-приложении, а системный порт 1–1023 — PORT_RESTRICTED.
Команды, выкладка и файлы — по id приложения
Список серверов отдаёт и приложение (kind: "GALAXY_APP"), и несущую его машину (kind: "GALAXY"), поэтому у вызывающего на руках два разных id. Работать надо с id приложения. Машина общая: на ней стоят контейнеры других ключей того же аккаунта Битрикс24, поэтому клиентские операции по её id платформа отклоняет.
| Операция | По id приложения (kind: "GALAXY_APP") |
По id машины (kind: "GALAXY") |
|---|---|---|
POST /:id/exec |
Работает — команда выполняется внутри контейнера приложения. Поля workdir и env не поддерживаются: 400 GALAXY_EXEC_NO_WORKDIR_ENV. Вместо них добавьте приставку к самой команде: cd /opt/app; FOO=bar node script.js |
403 GALAXY_HOST_EXEC_FORBIDDEN |
POST /:id/deploy |
Работает — это основной способ выложить код, см. раздел «Деплой» выше | 400 GALAXY_HOST_NOT_A_DEPLOY_TARGET |
POST /:id/upload |
Не применяется: своего туннеля у контейнера нет, и вызов не проходит проверку готовности сервера. Файлы кладите в архив деплоя либо создавайте их командой через /exec |
400 GALAXY_HOST_NOT_A_DEPLOY_TARGET |
Отказ по id машины приходит до того, как платформа что-либо сделает с сервером, и блокировки на нём не оставляет — повторять тот же вызов бесполезно. Возьмите в списке серверов строку своего приложения (kind равен GALAXY_APP) и обращайтесь по её id.
Чтение журнала гейт не затрагивает: GET /:id/logs по id машины по-прежнему отдаёт её системный журнал.
Свободное место в галактике
Занятость диска машины-галактики видна в кабинете, на карточке галактики в разделе «Галактики»: сколько занято из общего объёма и когда сделан замер. Спящую машину платформа не опрашивает и показывает последнее известное значение — поэтому время замера стоит рядом с самой величиной. Когда свободного места остаётся мало, на карточке появляется подсказка с двумя действиями, которые у вас уже есть: расширить диск галактики или перевезти приложение на другую галактику.
Раньше эту величину получали командой df по id машины — теперь такой вызов отклоняется (403 GALAXY_HOST_EXEC_FORBIDDEN). Вместо него строка машины-галактики в GET /v1/infra/servers и в карточке сервера несёт четыре поля:
| Поле | Что означает |
|---|---|
diskTotalMb |
размер диска в мебибайтах |
diskFreeMb |
свободное место в мебибайтах |
diskState |
оценка: ok, warning, critical или unknown, если замера ещё не было |
diskProbedAt |
время замера в формате ISO-8601 |
Оценку считает та же величина, что решает, хватит ли места на сборку приложения: critical означает, что свободного места меньше этого порога и сборка будет отклонена, warning — что вы к нему подходите. Поэтому предупреждение приходит заранее, до первого отказа. У машин вида STANDALONE и у приложений галактики все четыре поля равны null: у первых диск не измеряется, у вторых своего диска нет.
Исходящий IP
У galaxy-приложения нет собственного статического исходящего IP-адреса. Запросы приложения наружу — к внешним базам данных, платёжным шлюзам, сторонним сервисам — уходят через общий публичный IP хоста-галактики, который делят все приложения на этом хосте.
Этот адрес динамический. Платформа сама выбирает размещение, и исходящий IP может измениться при остановке и пробуждении хоста, плановом перезапуске инфраструктуры и при переносе приложения на другую галактику. Отдельного эндпоинта, который возвращает исходящий IP приложения, нет.
Поэтому для сценариев, где внешний сервис ограничивает доступ по списку разрешённых IP (например, управляемый PostgreSQL), galaxy-приложение сейчас не подходит — предсказуемого адреса для такого списка у него нет. Если нужен собственный исходящий адрес, запросите отдельную виртуальную машину: передайте в POST /v1/infra/servers поле placement равным dedicated. У неё исходящий трафик идёт через собственный публичный IP, видимый в поле ip ответа. Гарантированно неизменного исходящего адреса платформа сейчас не предоставляет ни для одной из моделей.
Стоимость
Стоимость считается за галактику, а не за каждое приложение. Несколько galaxy-приложений в одной галактике делят её стоимость — пять приложений на тарифе bc-small обходятся примерно как одна галактика, а не как пять серверов. В лимит серверов на API-ключ (GET /v1/me → infra.limits.used) galaxy-приложения не входят — он считает только отдельные виртуальные машины.
Логи
Для galaxy-приложения GET /v1/infra/servers/:id/logs возвращает поток вывода самого контейнера (stdout и stderr), а не системный журнал галактики. Чтение логов не будит спящую галактику. Если галактика спит или недоступна, ответ — пустой массив data.logs плюс диагностическое поле data.hint. Параметр since для galaxy-приложения принимает только длительность (10m, 2h, 24h) или метку времени в формате RFC 3339 (например, 2026-04-22T10:50:11Z).
Удаление
Galaxy-приложение снимается тем же вызовом DELETE /v1/infra/servers/:id — платформа разбирает его контейнер в галактике и помечает запись удалённой. Спящую галактику платформа будит сама перед удалением. Галактика с неудалёнными приложениями этим вызовом не удаляется — сначала снимите её приложения.
Коды ошибок
| HTTP | Код | Описание |
|---|---|---|
| 400 | GALAXY_APP_USE_GALAXY_ROUTE |
На galaxy-приложение пришёл вызов, который относится к отдельной виртуальной машине — PATCH /:id/sleep, POST /:id/sleep-now или PATCH /:id/port. Что применимо к приложению — в разделе «Управление жизненным циклом» выше |
| 403 | GALAXY_HOST_EXEC_FORBIDDEN |
Команда пришла на id машины-галактики (kind равен GALAXY). Выполняйте её на приложении, по его собственному id — см. раздел «Команды, выкладка и файлы» выше |
| 400 | GALAXY_HOST_NOT_A_DEPLOY_TARGET |
Деплой или загрузка файла пришли на id машины-галактики (kind равен GALAXY). Машина — носитель контейнеров, а не цель выкладки: обращайтесь по id приложения |
| 400 | GALAXY_EXEC_NO_WORKDIR_ENV |
В команде для galaxy-приложения переданы workdir или env — контейнерный запуск их не принимает. Добавьте приставку к самой команде: cd /opt/app; FOO=bar node script.js |
| 400 | SOURCE_AT_CREATE_GALAXY_ONLY |
Поле source передано при создании на портале без режима галактик либо вместе с placement: "dedicated". Загружайте код через POST /:id/deploy после создания |
| 400 | GALAXY_DEPLOY_CONTENT_ONLY |
Деплой galaxy-приложения с source.url или source.versionId там, где выкладка по ссылке для вас не включена. Пришлите архив встроенным source.content |
| 400 | GALAXY_DEPLOY_RUNTIME_REQUIRED |
Деплой galaxy-приложения без runtime. Укажите рантайм, например node20 |
| 502 | GALAXY_BASE_IMAGE_UNAVAILABLE |
Сборка не смогла получить базовый образ — склад образов был недоступен. Состояние временное, повторите тот же деплой через 2–3 минуты, см. Загрузить код |
| 502 | GALAXY_APP_BUILD_FAILED |
Сборка контейнера не удалась. Хвост лога сборки приходит в поле buildLog, а разбор причины — в error.category и error.buildHint, см. Загрузить код |
| 502 | GALAXY_APP_START_FAILED |
Контейнер собрался, но упал или ушёл в перезапуск по нехватке памяти сразу после старта. Хвост лога приходит в поле buildLog, а разбор причины — в error.category и error.buildHint, см. Загрузить код |
| 409 | GALAXY_HAS_APPS |
Удаляемый сервер — галактика, на которой есть неудалённые приложения. Тело содержит appCount. Удалить галактику вместе с приложениями можно в кабинете |
| 409 | GALAXY_HOST_WAKE_BLOCKED |
Приложение удаляют на галактике, которую ЗАПРЕЩЕНО будить — например, заморожен счёт. Отказ терминальный: повтор не поможет, пока причина не снята. Причина приходит в error.reason — BILLING_FROZEN, ACCESS_EXPIRED, STOPPED или UNKNOWN. Поля error.hint в этом ответе нет |
| 502 | GALAXY_DEPLOY_INTERRUPTED |
Деплой не подтверждён. Слот приложения и том /data сохранены — повторите тот же запрос. Поле error.subcause называет причину (http_window_exhausted, exec_channel_busy, no_this_deploy_container, tail_unreached, source_fetch_interrupted), а error.repeated показывает, что это уже не первое прерывание подряд — тогда разбирайте запуск самого приложения либо обращайтесь в поддержку, см. Загрузить код |
| 502 | GALAXY_HOST_UNREACHABLE |
Галактика недоступна — её туннель не в статусе CONNECTED. Ответ несёт error.hint с планом восстановления, см. ниже. Если пробуждение ЗАПРЕЩЕНО, приходит терминальный 409 GALAXY_HOST_WAKE_BLOCKED — он error.hint не несёт |
Полный справочник общих ошибок API — Ошибки.
Поле `error.hint` у `GALAXY_HOST_UNREACHABLE`
Ответ 502 GALAXY_HOST_UNREACHABLE несёт объект error.hint из четырёх строк:
| Поле | Что содержит |
|---|---|
reason |
Почему галактика сейчас недоступна — её виртуальная машина просыпается либо агент переподключает туннель |
recovery |
Что делать. Текст зависит от того, откуда пришла ошибка — см. три ветки ниже |
recoveryAction |
Конкретное действие для повтора. Тоже зависит от источника ошибки |
note |
Оговорка: статус галактики в выдаче может отставать от реального состояния туннеля. Если состояние держится дольше 15 минут, галактика недоступна по-настоящему |
Поля reason и note одинаковы всегда, а recovery и recoveryAction различаются по источнику ошибки:
| Источник | Что советует подсказка |
|---|---|
Загрузка кода (POST /v1/infra/servers/:id/deploy) |
Подождать 1–2 минуты и повторить тот же деплой на тот же ID сервера. Спящая галактика будится самим деплоем автоматически |
Выполнение команды (POST /v1/infra/servers/:id/exec) |
Важно: если галактика спит, повторы команду не разбудят — сначала разбудите её деплоем или из кабинета, и только потом повторяйте. Если галактика работала, подождите 1–2 минуты, пока туннель переподключится |
Удаление (DELETE /v1/infra/servers/:id) |
Подождать 1–2 минуты и повторить удаление. Запись сервера сохраняется до того, как разбор действительно выполнится на галактике |
Во всех трёх случаях удалять и пересоздавать приложение не нужно: слот, его контейнер и том /data целы, а новый слот попадёт на ту же галактику и встретит то же состояние.