[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Faccess\u002Fssh":3,"docs-tabs-infra\u002Faccess\u002Fssh":6},{"content":4,"lastmod":5},"\n## SSH-данные\n\n`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fssh`\n\nВозвращает данные для SSH-подключения. Полноценный SSH-доступ (с паролем, приватным ключом и публичным ключом) возвращается только для серверов в режиме `OPEN`. Для `BLACKHOLE` все SSH-поля — `null`: сервер закрыт фаерволом iptables, и прямой SSH невозможен. Вместо SSH для BLACKHOLE используйте [Deploy API](\u002Fdocs\u002Finfra\u002Fdeploy) — `\u002Fexec`, `\u002Fupload`, `\u002Flogs`. Rate-limit: до 10 запросов в минуту на сервер.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID сервера |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -H \"X-Api-Key: YOUR_API_KEY\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fssh\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fssh\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fssh`,\n  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } }\n)\nconst { data } = await res.json()\n\nif (data.mode === 'OPEN') {\n  console.log('Команда:', data.sshCommand)\n  console.log('Пароль:', data.sshPassword)  \u002F\u002F если выдавался\n} else {\n  console.log(data.note)  \u002F\u002F BLACKHOLE — используйте Deploy API\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fssh`,\n  {\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n    },\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.mode` | string | `OPEN` или `BLACKHOLE` |\n| `data.ip` | string | Публичный IP сервера |\n| `data.sshDirect` | boolean | `true` для `OPEN` (SSH работает по IP), `false` для `BLACKHOLE` (закрыт файрволом) |\n| `data.sshUser` | string \\| null | Пользователь SSH: `ubuntu` или `root`. `null` для BLACKHOLE |\n| `data.sshPort` | number \\| null | Порт SSH: `22`. `null` для BLACKHOLE |\n| `data.sshPassword` | string \\| null | Пароль. Для BLACKHOLE всегда `null`. Для OPEN — пароль если сервер сгенерил один при переходе в OPEN |\n| `data.sshPrivateKey` | string \\| null | Приватный ключ OpenSSH (ed25519). Возвращается для OPEN-сервера, когда платформа его сгенерировала |\n| `data.sshPublicKey` | string \\| null | Публичный ключ (ed25519) — соответствующая публичная часть к `sshPrivateKey` |\n| `data.sshCommand` | string \\| null | Готовая команда для копирования: `ssh ubuntu@IP`. Для BLACKHOLE — `null` |\n| `data.appUrl` | string | HTTPS-адрес приложения (присутствует только для BLACKHOLE, где SSH недоступен) |\n| `data.note` | string | Пояснение для BLACKHOLE: «BLACKHOLE servers do not expose SSH. Use the Deploy API…» |\n\n## Пример ответа\n\nOPEN-сервер:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"mode\": \"OPEN\",\n    \"ip\": \"111.88.251.211\",\n    \"sshUser\": \"ubuntu\",\n    \"sshPort\": 22,\n    \"sshPassword\": \"Oi9owBO6zMbueGmM75J9hg\",\n    \"sshPrivateKey\": \"-----BEGIN OPENSSH PRIVATE KEY-----\\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmU…\\n-----END OPENSSH PRIVATE KEY-----\\n\",\n    \"sshPublicKey\": \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM0JAP1EMGh0CkT7RkZ26pTSa4X1FsWXe61cB5Fiqqjz vibe-generated\",\n    \"sshCommand\": \"ssh ubuntu@111.88.251.211\",\n    \"sshDirect\": true\n  }\n}\n```\n\nBLACKHOLE-сервер:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"mode\": \"BLACKHOLE\",\n    \"ip\": \"93.77.184.167\",\n    \"sshDirect\": false,\n    \"sshPassword\": null,\n    \"sshPrivateKey\": null,\n    \"sshPublicKey\": null,\n    \"sshCommand\": null,\n    \"appUrl\": \"https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\",\n    \"note\": \"BLACKHOLE servers do not expose SSH. Use the Deploy API (exec\u002Fupload\u002Flogs) instead.\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — сервер не существует:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Server not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 404 | `NOT_FOUND` | Сервер не существует, удалён или принадлежит другому API-ключу |\n| 429 | `RATE_LIMITED` | Превышен rate-limit (до 10 запросов в минуту на сервер) либо общий rate-limit платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Каждый BLACKHOLE → OPEN переход генерирует новый пароль.** Старые пароли (если они были) становятся недействительными. То же при обратном цикле BLACKHOLE → OPEN → BLACKHOLE → OPEN: на каждый вход в OPEN платформа генерирует свежий `sshPassword`. Пароль также возвращается в ответе на [`PATCH \u002Fmode`](.\u002Fmode.md) — можно сохранить оттуда.\n- **`sshPrivateKey` и `sshPublicKey` отдаются только для ключей, сгенерированных платформой.** Если при создании сервера через [`POST \u002Fv1\u002Finfra\u002Fservers`](\u002Fdocs\u002Finfra\u002Fservers\u002Fcreate) вы передали свой `sshPublicKey`, платформа не генерировала приватный ключ — поле `sshPrivateKey` в ответе будет `null`. Используйте свой приватный ключ со стороны клиента.\n- **`sshCommand` — готовая к копированию строка для AI-агентов и скриптов.** Это не отдельная команда запуска — просто `ssh ubuntu@IP`. Аутентификация через пароль или ключ — отдельный шаг на стороне SSH-клиента.\n- **Отдельное ограничение — 10 запросов в минуту на сервер** существует именно из-за чувствительности возвращаемых данных. Общий лимит платформы выше, но `\u002Fssh` ограничивается жёстче.\n\n## Смотрите также\n\n- [Переключить режим](.\u002Fmode.md) — `PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fmode` — перейти в OPEN\u002FBLACKHOLE.\n- [Выполнить команду](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fexec) — `POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fexec` — SSH-эквивалент для BLACKHOLE.\n- [Загрузить файл](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fupload) — `POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fupload` — scp-эквивалент для BLACKHOLE.\n- [Политика доступа](.\u002Faccess-policy.md) — кому видно приложение по HTTPS.\n","2026-06-29",{"mode.md":7},"\n## Переключить режим\n\n`PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fmode`\n\nПереключает сервер между режимами `BLACKHOLE` (всё закрыто фаерволом, доступ только через HTTPS-субдомен) и `OPEN` (прямой доступ по IP, SSH на порту 22 открыт). При переходе в `OPEN` фаервол полностью снимается и генерируется SSH-пароль. При обратном переходе фаервол восстанавливается и пароль удаляется. Переход в `OPEN` запрещён, если платформа (флаг `openModeEnabled`) или портал (политика `allowOpenMode`) не разрешают его.\n\n> **OPEN отключает защиту Black Hole.** Сервер становится доступен из интернета по IP. Все Deploy API эндпоинты (`\u002Fexec`, `\u002Fupload`, `\u002Flogs`, `\u002Fdeploy`) работают только в BLACKHOLE-режиме — в OPEN они вернут ошибку.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID сервера |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|----------|\n| `mode` | string | **да** | Целевой режим: `OPEN` или `BLACKHOLE` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\n# BLACKHOLE → OPEN\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fmode \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"mode\": \"OPEN\"}'\n\n# OPEN → BLACKHOLE (вернуть защиту)\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fmode \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"mode\": \"BLACKHOLE\"}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fmode \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"mode\": \"OPEN\"}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fmode`,\n  {\n    method: 'PATCH',\n    headers: {\n      'X-Api-Key': 'YOUR_API_KEY',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({ mode: 'OPEN' }),\n  }\n)\nconst { data } = await res.json()\nif (data.sshPassword) console.log(`Новый SSH-пароль: ${data.sshPassword}`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nawait fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fmode`,\n  {\n    method: 'PATCH',\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({ mode: 'BLACKHOLE' }),\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.mode` | string | Новый режим (`OPEN` или `BLACKHOLE`) |\n| `data.ip` | string \\| null | IP сервера (не меняется при переключении) |\n| `data.sshPassword` | string \\| null | Сгенерированный SSH-пароль. Отдаётся только при переходе в `OPEN`. При переходе в `BLACKHOLE` — `null` |\n\n## Пример ответа\n\nПереход BLACKHOLE → OPEN:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"mode\": \"OPEN\",\n    \"ip\": \"178.154.230.106\",\n    \"sshPassword\": \"rT9xQ2mKaPzFHyB3\"\n  }\n}\n```\n\nПереход OPEN → BLACKHOLE:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"mode\": \"BLACKHOLE\",\n    \"ip\": \"178.154.230.106\",\n    \"sshPassword\": null\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — переход в `OPEN` запрещён политикой портала:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"OPEN_MODE_NOT_ALLOWED\",\n    \"message\": \"OPEN mode is not allowed by portal policy\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `INVALID_MODE` | `mode` не равен `OPEN` или `BLACKHOLE` |\n| 400 | `SAME_MODE` | Сервер уже в запрошенном режиме |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 403 | `OPEN_MODE_DISABLED` | Режим OPEN отключён на платформе (флаг `openModeEnabled`). Обратитесь к администратору платформы |\n| 403 | `OPEN_MODE_NOT_ALLOWED` | Режим OPEN запрещён политикой портала (флаг `allowOpenMode`). Обратитесь к администратору портала |\n| 404 | `NOT_FOUND` | Сервер не существует, удалён или принадлежит другому API-ключу |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n| 502 | `PROVIDER_ERROR` | Облачный провайдер вернул ошибку при смене конфигурации сети |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Порядок разрешения OPEN** (оба уровня должны пропустить): сначала платформенный флаг `openModeEnabled` — **платформенный админ тоже не обходит эту проверку**. Затем портальная политика `allowOpenMode` — **платформенный админ обходит её**. Только если оба разрешают, переход в OPEN возможен.\n- **IP не меняется при переключении.** Облачная виртуальная машина остаётся той же — меняются только правила iptables и SSH-конфигурация.\n- **Туннель (`blackholeStatus`) сохраняется в OPEN-режиме.** Агент Black Hole продолжает работать, HTTPS-субдомен остаётся рабочим — просто фаервол больше не блокирует внешний трафик. Однако Deploy API всё равно откажет: он требует именно BLACKHOLE.\n- **`accessPolicy` не применяется в OPEN.** В OPEN защита строится на SSH-ключах и iptables (который снят). Политика HTTPS-субдомена фактически не работает. При переключении значение `accessPolicy` сохраняется в базе — и снова начнёт действовать после возврата в BLACKHOLE.\n\n## Смотрите также\n\n- [SSH-данные](.\u002Fssh.md) — `GET \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fssh` — получить пароль и команду после перехода в OPEN.\n- [Политика доступа](.\u002Faccess-policy.md) — `PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess-policy` — работает только в BLACKHOLE.\n- [Deploy API](\u002Fdocs\u002Finfra\u002Fdeploy) — доступен только в BLACKHOLE.\n- [Получить сервер](\u002Fdocs\u002Finfra\u002Fservers\u002Fget) — проверить текущий `mode`.\n"]