Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

cps

cps даёт аппаратно-изолированную Linux microVM, которая грузится мгновенно: root по SSH, персистентный диск и публичный HTTPS-ingress — всё управление собрано в одном CLI. Временные машины с автоматическим освобождением ресурсов: поднял, поработал, забыл — TTL уберёт за тобой.

Под капотом — Firecracker + jailer: каждая машина это отдельная виртуалка с собственным ядром, изолированная на уровне железа, а не контейнер, делящий ядро с соседями.

Что дальше

Что умеет microVM

  • Мгновенный старт — загрузка за ~секунду, а не десятки секунд, как полноценная VM.
  • Сильная изоляция — отдельное ядро на каждую машину (Firecracker + jailer), сеть между гостями изолирована. Не «контейнер с общим ядром».
  • Настоящий Linux — root, произвольные пакеты, системные вызовы, свой диск. Не sandbox с урезанным рантаймом.
  • Персистентность и переносимость — диск сохраняется между запусками; snapshot/backup можно восстановить на другом хосте.
  • Временность по умолчанию — TTL автоматически освобождает ресурсы; постоянные машины — по явному запросу (--ttl 0).

Это альфа по приглашениям. Вопросы, баги, идеи → чат сообщества @cps_run в Telegram.

Быстрый старт

Путь от нуля до работающей машины. Нужен токен доступа — его выдаёт команда cps (альфа по приглашениям).

1. Установка CLI

curl -fsSL https://cps.run/install.sh | sh

Скрипт скачивает бинарь cps под вашу ОС/архитектуру и ставит его в ~/.local/bin. Если этого каталога нет в PATH:

export PATH="$HOME/.local/bin:$PATH"

Поддержка: Linux и macOS, x86_64 или arm64. Проверить установку:

cps version

2. Вход

cps login --token <ваш-токен>

По умолчанию API — https://cps.run. Выберите проект вашей организации:

cps project list          # показывает проект "default", созданный для вашей org
cps project use <prj_id>  # из списка выше

3. Запуск машины

cps new ubuntu --name dev --start --wait

По умолчанию: 1 vCPU, 512 MiB RAM, диск 4 GiB и TTL 24 часа (машина сама удалится через сутки, чтобы ничего не осталось работать по забывчивости). Переопределить: --cpu, --ram 2G, --disk 10G, --ttl 2h. Для постоянной машины (без авто-удаления) — --ttl 0.

4. Работа с машиной

cps ssh dev                       # root-шелл по SSH
cps exec dev -- uname -a          # разовая команда
cps cp ./file dev:/root/          # скопировать файл внутрь
cps expose dev 8080               # опубликовать порт по публичному HTTPS
cps metrics dev                   # живые CPU / память
cps ps                            # список ваших машин

cps expose вернёт публичный URL вида https://rte-....cps.run, проксирующий на указанный порт внутри машины.

5. Snapshot и backup

Машину нужно остановить (cps stop):

cps stop dev
cps snapshot create dev --name base --wait     # быстрая точка восстановления
cps backup create dev --name daily --wait      # durable-копия вне хоста (S3)
cps snapshot restore <snap> --name dev2 --start --wait

Snapshot — быстрый слепок диска (точка восстановления). Backup — durable-копия в off-host хранилище (S3), переживает потерю хоста и восстанавливается на любом хосте флота.

6. Уборка

cps rm dev --yes

Лимиты и этикет (альфа)

  • У вашей org есть квота ресурсов и лимит на число машин. cps предупредит при достижении лимита.
  • Машины аппаратно изолированы (Firecracker + jailer) и не видят друг друга.
  • Пожалуйста, без злоупотреблений (спам, сканирование, майнинг). Это приватная альфа.
  • Вопросы, баги, идеи → чат @cps_run в Telegram.

Если что-то не так

  • cps ssh завис → Ctrl-C и повторить; про устойчивые зависания напишите в чат.
  • 401/403 → токен истёк или выбран не тот проект (cps project use).
  • cps whoami показывает, под кем вы аутентифицированы.

Справочник CLI

Все команды работают в контексте активного проекта (см. cps project use) и требуют входа (cps login). Глобальный флаг --json выводит машиночитаемый JSON вместо таблиц.

Окружение переопределяет конфиг: CPS_API_URL, CPS_TOKEN, CPS_PROJECT_ID.

Аутентификация и контекст

КомандаНазначение
cps login --token <t>Сохранить токен и адрес API в конфиг.
cps whoamiПоказать текущего пользователя/org.
cps versionВерсия CLI.
cps project listПроекты вашей org.
cps project use <prj_id>Сделать проект активным.
cps project create <name>Создать проект.

Машины

cps new <image> --name <n> [--start] [--wait] [опции]
ФлагПо умолчаниюОписание
--cpu <n>1vCPU.
--ram <n>512 (MiB)Память; принимает 2G, 512M.
--disk <n>4Диск в GiB.
--ttl <d>24hВремя жизни; 0 — постоянная машина. Принимает 2h, 30m, 7d.
--ssh-key <path>—Публичный ключ, который прописать внутрь.
--region <r>—Предпочитаемый регион/хост.
--require <label>—Требуемые метки хоста (можно несколько).
--start—Сразу запустить после создания.
--wait—Дождаться готовности.
КомандаНазначение
cps ps [--all]Список машин (--all включает удалённые).
cps status <m>Подробный статус машины.
cps start <m> / cps stop <m>Запустить / остановить.
cps rm <m> --yesУдалить машину.
cps wait <m> --timeout <s>Дождаться готовности.
cps clone <src> --name <n> [--start] [--wait]Клонировать машину.
cps console <m>Подключиться к серийной консоли.

Доступ и файлы

КомандаНазначение
cps ssh <m> [--identity <key>] [-- <cmd>]Root-шелл по SSH (через туннель); с командой — выполнить и выйти.
cps exec <m> [--timeout <s>] -- <cmd>Разовая команда, вернуть stdout/stderr.
cps cp [--recursive] <src> <dst>Копировать файлы (m:/path — путь внутри машины).
cps ssh-proxy <project> <m>Вывести ProxyCommand для нативного ssh/scp.

Публикация портов (ingress)

КомандаНазначение
cps expose <m> <port>Публичный HTTPS-URL на внутренний порт; печатает https://rte-….cps.run.
cps routesАктивные маршруты.
cps unexpose <selector>Снять маршрут.

Snapshot и backup

Машина должна быть остановлена. Snapshot — быстрая точка восстановления; backup — durable-копия в S3 (переносима между хостами).

КомандаНазначение
cps snapshot create <m> --name <n> [--wait]Снять snapshot.
cps snapshot list [<m>]Список snapshot’ов.
cps snapshot show <snap>Детали.
cps snapshot restore <snap> --name <n> [--start] [--wait]Восстановить в новую машину.
cps snapshot rm <snap> [--yes]Удалить.
cps backup create <m> --name <n> [--wait]Создать backup.
cps backup list [<m>] / show <b> / restore <b> … / rm <b> [--yes]Управление backup’ами.

Метрики

КомандаНазначение
cps metrics <m>Текущие CPU / память.
cps metrics <m> --history [--window <s>]История за окно (из ClickHouse).
cps operationsНедавние асинхронные операции проекта.

Секреты

Секреты проекта шифруются at-rest и доступны машинам проекта.

КомандаНазначение
cps secret set KEY=VALUE …Задать секреты.
cps secret listИмена секретов (без значений).
cps secret rm <name>Удалить.

Токены

КомандаНазначение
cps token create [--name <n>] [--ttl <d>]Выпустить токен (секрет показывается один раз).
cps token listВаши токены.
cps token rm <token_id>Отозвать.

Образы

Реестр образов в S3; хосты подтягивают образ по требованию (см. также API).

КомандаНазначение
cps image push <id> --kernel <vmlinux> --rootfs <ext4> [--name] [--version] [--arch] [--boot-args]Загрузить и зарегистрировать образ.
cps image listДоступные образы.
cps image rm <id> [--yes]Удалить образ из реестра и S3.

Администрирование

Требует admin-токена. Обычным пользователям недоступно.

КомандаНазначение
cps admin org create <name> --cpu --ram --disk --max-machinesСоздать org с квотой (авто-создаёт проект default).
cps admin org list / usage <org>Список org / потребление vs квота.
cps admin org quota set <org> …Изменить квоту.
cps admin user create <org> --name [--email] / user rm <user>Пользователи.
cps admin token issue <org> <user> [--name] [--ttl]Выпустить пользовательский токен.
cps admin hosts / cps admin host <inspect|drain|cordon|uncordon|tag> <host>Управление флотом.

API и авторизация

CLI — тонкая обёртка над REST API control-plane. Тот же API можно вызывать напрямую для автоматизации.

База и авторизация

  • Base URL: https://cps.run (переопределяется CPS_API_URL).
  • Авторизация: заголовок Authorization: Bearer <token>. Токен выпускается через cps token create (или админом через cps admin token issue).
  • Scoping: токен привязан к вашей организации; вы видите и меняете только ресурсы своей org.
  • Токен = секрет: показывается один раз, храните вне git, отзывается через cps token rm.

Проверка живости (без авторизации):

curl -s https://cps.run/healthz
# {"status":"ok"}

Кто я:

curl -s https://cps.run/v1/whoami -H "Authorization: Bearer $CPS_TOKEN"

Модель ресурсов

org ──┬── project ──┬── machine ──┬── snapshot
      │             │             └── backup
      │             └── route (ingress) / secret
      └── (квота: cpu / ram / disk / max-machines)

Почти все ресурсы скоупятся проектом и живут под /v1/projects/{project_id}/…. Проект по умолчанию — prj_default.

Основные эндпоинты

Метод + путьНазначение
GET /v1/whoamiТекущий principal.
GET /v1/projectsПроекты org.
GET /v1/projects/{p}/machinesСписок машин (?include_deleted=true — с удалёнными).
POST /v1/projects/{p}/machinesСоздать машину (JSON-тело: image, resources, ttl…).
POST /v1/projects/{p}/machines/{m}:start | :stopЗапустить / остановить (async-операция).
DELETE /v1/projects/{p}/machines/{m}Удалить.
GET /v1/projects/{p}/operations/{op}Статус асинхронной операции.
GET | POST /v1/projects/{p}/snapshotsСписок / создание snapshot’ов.
GET | POST /v1/projects/{p}/backupsСписок / создание backup’ов.
GET | POST /v1/projects/{p}/routesIngress-маршруты (expose).
GET | POST | DELETE /v1/tokensУправление токенами.
GET | POST /v1/imagesРеестр образов.

Асинхронные операции

Мутирующие действия (create/start/stop/snapshot/backup/restore) возвращают operation и выполняются асинхронно. Дождитесь завершения опросом статуса:

# создать машину → получить operation_id из ответа, затем опрашивать:
curl -s https://cps.run/v1/projects/prj_default/operations/$OP \
  -H "Authorization: Bearer $CPS_TOKEN"
# статус переходит pending → running → succeeded | failed

CLI делает это за вас при флаге --wait.

Пример: список машин

curl -s https://cps.run/v1/projects/prj_default/machines \
  -H "Authorization: Bearer $CPS_TOKEN" | jq .

Коды ошибок

КодЗначение
401Нет/невалидный токен.
403Токен валиден, но нет прав на ресурс (чужая org / admin-путь).
404Ресурс не найден в вашем scope.
409Конфликт состояния (например, действие над машиной в неподходящем статусе).
429Превышен rate limit; см. заголовок Retry-After.

API находится в активной разработке (альфа) и может меняться. Для стабильных сценариев используйте CLI. Полный контракт запросов/ответов — в репозитории contracts.

MCP и среда для агентов

cps-mcp отдаёт cps как инструменты Model Context Protocol, так что любой MCP-совместимый агент (Claude Code, Claude Desktop, …) может создавать изолированные Linux-песочницы (sandbox), запускать в них код, публиковать порты и удалять их — всё через публичный API cps.

Sandbox (песочница) — это агентское имя для эфемерной machine на уровне MCP. Это Firecracker-микроВМ с аппаратной изоляцией, диском на время задачи, исходящей сетью, опциональным HTTPS-превью и автоматическим TTL — агент может запускать недоверенный код и не оставлять за собой ресурсов.

cps-mcp работает по MCP через stdio и поставляется внутри CLI cps — установка CLI ставит и cps-mcp.

1. Установка и токен

Установите CLI (подробнее — Быстрый старт):

curl -fsSL https://cps.run/install.sh | sh
cps version          # подтверждает, что установлены и `cps`, и `cps-mcp`

Войдите и создайте токен для агента (показывается один раз):

cps login --token <ваш-токен>
cps token create --ttl 24h --name mcp

2. Конфигурация

cps-mcp берёт настройки из окружения, а после cps login подхватывает конфиг CLI cps (так что CPS_TOKEN можно не задавать, если вы уже вошли):

ПеременнаяОбязательнаПо умолчаниюНазначение
CPS_TOKENда*—Токен cps (cpsk_…). *Не нужна, если cps login уже настроил CLI.
CPS_API_URLнетhttps://cps.runБазовый URL control-plane (например, лабораторный).
CPS_PROJECT_IDнетопределяется автоматическиПроект для создания песочниц; выводится из org токена, если не задан.

3. Подключение MCP-клиента

Claude Code — одной командой:

claude mcp add cps -e CPS_TOKEN=cpsk_ваш_токен -- cps-mcp

Claude Desktop / любой MCP-клиент — добавьте в конфиг mcpServers:

{
  "mcpServers": {
    "cps": {
      "command": "cps-mcp",
      "env": { "CPS_TOKEN": "cpsk_ваш_токен", "CPS_API_URL": "https://cps.run" }
    }
  }
}

Проверьте подключение командой /mcp — сервер cps должен показываться как подключённый с 8 инструментами.

4. Инструменты

ИнструментНазначение
create_sandbox(image?, ttl_seconds?)Запустить эфемерную микроВМ, дождаться готовности, вернуть sandbox_id. Авто-удаление по TTL (по умолчанию 900с).
run(sandbox_id, command[], timeout_secs?)Выполнить argv-массив в песочнице; возвращает exit_code, stdout, stderr. Не парсится шеллом — для пайпов/glob используйте ["sh", "-c", "…"].
write_file(sandbox_id, path, content)Записать текстовый файл в песочнице.
read_file(sandbox_id, path)Прочитать текстовый файл из песочницы.
expose(sandbox_id, port)Опубликовать порт по публичному HTTPS-URL.
destroy(sandbox_id)Удалить песочницу и её маршруты.
fork_sandbox(sandbox_id, ttl_seconds?)Клонировать диск песочницы в новую готовую песочницу (источник кратко останавливается для консистентной копии).
list_sandboxes()Список песочниц в проекте.

Типичный сценарий агента:

  1. create_sandbox → sandbox_id
  2. write_file(sandbox_id, "/root/app.py", "…")
  3. run(sandbox_id, ["python3", "/root/app.py"])
  4. expose(sandbox_id, 8080) → публичный HTTPS-URL
  5. destroy(sandbox_id) (или дождаться удаления по TTL)

5. Плагин и skill для Claude Code

Для Claude Code установка плагина cps-agent-runtime даёт агенту сразу и MCP-инструменты cps, и skill cps-agent-runtime, который учит агента пользоваться ими правильно (уборка по TTL, argv против шелла, освобождение маршрутов при destroy).

Плагин регистрирует команду cps-mcp — бинарь уже должен быть в PATH (шаг 1). Установка с Git-ремоута:

/plugin marketplace add https://git.codelab.vc/cps/cli
/plugin install cps-agent-runtime@cps

Или из локальной копии репозитория cli:

/plugin marketplace add /абсолютный/путь/к/cli
/plugin install cps-agent-runtime@cps

Дальше просите естественным языком — например, «запусти этот скрипт в изолированной песочнице cps и покажи вывод» — и skill проведёт create_sandbox → write_file/run → destroy.

6. Обновление

cps-mcp, CLI и плагин обновляются независимо — команды cps update пока нет.

CLI + cps-mcp (один бинарь, один шаг) — перезапустите установщик, он заменит бинарь на месте, затем перезапустите MCP-клиент, чтобы он заново поднял cps-mcp:

curl -fsSL https://cps.run/install.sh | sh
cps version          # проверьте новую версию

Либо из исходников:

git pull && cargo install --path . --locked --force

Плагин + skill — обновите маркетплейс Claude Code (заново тянет репозиторий cli), затем переустановите плагин:

/plugin marketplace update cps
/plugin install cps-agent-runtime@cps
/reload-plugins            # применить изменения без перезапуска сессии

Плагин только регистрирует cps-mcp — обновление плагина не обновляет бинарь. Чтобы получить новое поведение инструментов, обновите CLI (выше).

Примечания (альфа)

  • Публичные HTTPS-превью через expose требуют слоя маршрутизации cps. На одно-хостовых лабораторных стендах запись маршрута создаётся, но трафик пока не обслуживается.
  • cps-mcp общается только с публичным API cps, поэтому работает с любым доступным control-plane через CPS_API_URL.
  • Новые версии CLI появляются на https://cps.run/install.sh только после того, как команда cps выпустит релиз — повторный запуск установщика берёт текущую.