REST API: GPU и SSH-ключи
REST API: GPU и SSH-ключи
Помимо OpenAI-совместимого инференса (/chat/completions, /models) и Anthropic Messages на origin приложения (/v1/messages — см. Claude Code), тот же базовый адрес /api/v1 и тот же API-ключ cc-… позволяют управлять GPU-серверами и SSH-ключами из скриптов и CI.
Требования
- Положительный баланс команды (как для инференса)
- API-ключ, созданный в разделе API-доступ — ключи, созданные только в старом разделе «API-модели», тоже работают; для SSH через API рекомендуется создать ключ заново в API-доступ (привязка к пользователю)
Базовый адрес
https://app.cloudcompute.ru/api/v1
Авторизация: Authorization: Bearer cc-…
Эндпоинты (MVP)
| Метод | Путь | Описание |
|---|---|---|
GET |
/offers |
Каталог GPU-предложений (фильтры: gpu_name, num_gpus, min_vram, max_price_rub, sort, limit, offset) |
GET |
/instances |
Список инстансов команды |
POST |
/instances |
Создать инстанс (ask_id, template_image, disk_gb, ssh_key_ids, …) |
GET |
/instances/{id} |
Детали инстанса |
PATCH |
/instances/{id} |
Обновить метку (label, name) |
DELETE |
/instances/{id} |
Удалить инстанс |
POST |
/instances/{id}/terminal-token |
Выдать WebSocket URL для веб-терминала (автоматизация) |
GET |
/ssh-keys |
SSH-ключи владельца ключа |
POST |
/ssh-keys |
Добавить ключ (name, public_key) |
DELETE |
/ssh-keys/{id} |
Удалить ключ |
Полное описание полей и примеры ответов — в справочнике API (генерируется автоматически).
Пример: список инстансов
curl https://app.cloudcompute.ru/api/v1/instances \
-H "Authorization: Bearer cc-..."
Пример: создать инстанс
Минимальный набор полей совпадает с формой в панели: type, ask_id, образ (template_image или template_hash_id), при необходимости disk_gb и ssh_key_ids.
curl -X POST https://app.cloudcompute.ru/api/v1/instances \
-H "Authorization: Bearer cc-..." \
-H "Content-Type: application/json" \
-d '{
"type": 0,
"ask_id": 12345678,
"name": "training-1",
"template_image": "nvidia/cuda:12.1-devel-ubuntu22.04",
"offer_disk_space": 50,
"disk_gb": 32
}'
Цена (price_hour) пересчитывается на сервере — не передавайте её из клиента.
Поля инстанса в ответе
GET /instances и GET /instances/{id} возвращают объект инстанса, в том числе:
| Поле | Описание |
|---|---|
web_terminal_host |
Хост для веб-терминала (если доступен) |
web_terminal_port |
Порт ttyd |
web_terminal_url |
Прямой URL терминала (может быть null, если доступ только через прокси) |
web_terminal_ready |
true, когда терминал готов к подключению |
ports |
Карта именованных портов (SSH, Jupyter и др.) или null |
Веб-терминал через API
Для автоматизации (CI, скрипты) можно получить временный WebSocket URL с ограниченным сроком действия:
curl -X POST https://app.cloudcompute.ru/api/v1/instances/12345/terminal-token \
-H "Authorization: Bearer cc-..."
Ответ:
{ "ws_url": "wss://…", "expires_in": 300 }
Подключайтесь к ws_url клиентом ttyd/WebSocket. URL действует ограниченное время (expires_in в секундах).
Bootstrap-профиль и onstart при создании
В теле POST /instances можно задать, какой стартовый скрипт установит доступ к инстансу:
| Поле | Описание |
|---|---|
bootstrap_profile |
Предпочтительный способ: full, access_only, worker, none |
install_monitoring |
Устаревший boolean; если bootstrap_profile не передан, false → access_only, true → full |
onstart |
Дополнительный shell-фрагмент к bootstrap (full, access_only, worker); при none ваш onstart — единственный стартовый скрипт |
Семантика профилей:
| Профиль | Что устанавливается |
|---|---|
full |
SSH, веб-терминал (ttyd), Jupyter, агент мониторинга |
access_only |
SSH, ttyd, Jupyter — без агента мониторинга |
worker |
Минимальная оболочка SSH/ttyd, затем команда образа (CMD) |
none |
Без bootstrap-скрипта CloudCompute; можно передать свой onstart |
Итоговый onstart-скрипт (bootstrap + ваш onstart) не должен превышать 16 384 байта — иначе запрос вернёт ошибку валидации.
Пример: worker + свой onstart
curl -X POST https://app.cloudcompute.ru/api/v1/instances \
-H "Authorization: Bearer cc-..." \
-H "Content-Type: application/json" \
-d '{
"type": 0,
"ask_id": 12345678,
"name": "worker-1",
"template_image": "nvidia/cuda:12.1-devel-ubuntu22.04",
"offer_disk_space": 50,
"disk_gb": 32,
"bootstrap_profile": "worker",
"onstart": "cd /workspace && python train.py"
}'
Ошибки
REST-эндпоинты возвращают JSON вида:
{ "error": { "message": "…", "code": "insufficient_balance" } }
Инференс (/chat/completions) по-прежнему использует OpenAI-совместимый формат ошибок.