Задать порт приложения

PATCH /v1/infra/servers/:id/port

Задаёт TCP-порт, на который агент туннеля проксирует входящие HTTPS-запросы с субдомена. По умолчанию туннель идёт на :3000 — это стандарт платформы, большинство приложений должны слушать именно его. Этот эндпоинт нужен в редких случаях: приложение по историческим причинам работает на другом порту или вы хотите 0 (автоопределение), чтобы агент сам нашёл слушающий порт. Порты 1–1023 запрещены — это системные (SSH, HTTP, HTTPS, SQL), их использование создало бы риск перенаправления трафика на служебные процессы.

Параметры

Параметр В Тип Обяз. Описание
id path string (UUID) да ID BLACKHOLE-сервера, status: running, blackholeStatus: CONNECTED

Поля запроса (body)

Поле Тип Обяз. Описание
port number да 0 (автоопределение) или 1024–65535. Порты 1–1023 отклоняются с PORT_RESTRICTED

Примеры

curl — личный ключ

Terminal
# Установить порт 8080
curl -X PATCH https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/port \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"port": 8080}'

# Автоматическое определение
curl -X PATCH https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/port \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"port": 0}'

curl — OAuth-приложение

Terminal
curl -X PATCH https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/port \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"port": 8080}'

JavaScript — личный ключ

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/port`,
  {
    method: 'PATCH',
    headers: {
      'X-Api-Key': 'YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ port: 8080 }),
  }
)
const { data } = await res.json()
console.log(`Порт приложения: ${data.port}`)

JavaScript — OAuth-приложение

javascript
await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/port`,
  {
    method: 'PATCH',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ port: 0 }),
  }
)

Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе
data.port number Итоговый порт. При port: 0 вернётся 3000 (значение по умолчанию при автоопределении)
data.mode string manual (задан конкретный порт) или auto (port: 0)
data.verified boolean true — платформа подтвердила (probe), что агент уже проксирует на этот порт. false — порт сохранён, но маршрутизация ещё не подтверждена (см. data.warning)
data.warning string Присутствует только при verified: false: маршрутизация не подтверждена, приложение может кратко (до ~30 с) отдавать страницу Black Hole, пока автоопределение не подтвердит порт

Пример ответа

JSON
{
  "success": true,
  "data": { "port": 8080, "mode": "manual", "verified": true }
}

Пример ответа при ошибке

400 — системный порт запрещён:

JSON
{
  "success": false,
  "error": {
    "code": "PORT_RESTRICTED",
    "message": "System ports (1-1023) are not allowed. Use port >= 1024 or 0 for auto-detect"
  }
}

409 — агент отклонил смену порта (фиксированный порт / устаревший бинарь):

JSON
{
  "success": false,
  "error": {
    "code": "PORT_NOT_APPLIED",
    "message": "The server agent runs in fixed-port mode and cannot change its port at runtime. Repair the server (POST /v1/infra/servers/:id/repair) to switch the agent to port auto-detection, then retry.",
    "agentError": "NO_SCANNER"
  }
}

Ошибки

HTTP Код Описание
400 VALIDATION_ERROR port не число, вне диапазона 0–65535
400 PORT_RESTRICTED Порт в диапазоне 1–1023 (системные порты)
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Неверный или просроченный API-ключ
404 NOT_FOUND Сервер не BLACKHOLE + RUNNING, удалён или принадлежит другому API-ключу
409 SERVER_NOT_READY Агент туннеля не в статусе CONNECTED
409 PORT_NOT_APPLIED Агент отклонил смену порта. agentError: NO_SCANNER — сервер в режиме фиксированного порта (см. ниже). Другой agentError — агент устарел. В обоих случаях помогает `/repair`
429 RATE_LIMITED Превышен общий лимит запросов платформы
502 GATEWAY_ERROR Gateway не смог доставить команду агенту

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

Известные особенности

  • Системные порты (1–1023) запрещены не случайно. SSH (22), HTTP (80), HTTPS (443), DNS (53), PostgreSQL (5432), MySQL (3306) — открытие туннеля на них создало бы риск перенаправления внешнего трафика на служебные процессы внутри виртуальной машины.
  • Как работает port: 0. Агент сканирует /proc/net/tcp и /proc/net/tcp6, находит процесс, слушающий на прикладном порту (≥1024), и проксирует туда. Полезно для приложений, выбирающих порт динамически при запуске.
  • Значение сохраняется между перезапусками агента. Платформа пишет localPort в базу сервера — после `/repair` или перезагрузки агент возьмёт то же значение. При /deploy с явным port значение перезапишется.
  • port: 0 в ответе возвращается как 3000. Это не ошибка: «при автоопределении возвращаем 3000, если ничего подходящего не нашли». Реальный слушающий порт проверяйте через `/exec` с командой ss -tlnp.
  • Платформа подтверждает смену порта (data.verified). После set_port платформа опрашивает агента и проверяет, что туннель действительно проксирует на запрошенный порт. verified: true — маршрутизация готова. verified: false + data.warning — порт сохранён, но агент ещё не подтвердил порт (автоопределение сработает в течение ~30 с). Если приложение остаётся недоступным дольше — `/repair`. 409 PORT_NOT_APPLIED — агент в принципе не принял смену порта: при agentError: NO_SCANNER сервер работает в режиме фиксированного порта (запустите приложение на текущем порту, либо /repair для перехода в автоопределение), при ином agentError — агент устарел (/repair обновит его).

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