
Форкинг sandbox-окружений microVM за миллисекунды для AI-агентов на Kubernetes. Виртуальные машины Firecracker восстанавливаются из снапшотов памяти за миллисекунды, форкают запущенную ВМ на N копий и сохраняют долговечные версионированные рабочие пространства. Самостоятельное развёртывание, декларативные CRD.
Изолированные компьютеры с поддержкой форков для ваших ИИ-агентов.
Миллисекундный форкинг песочниц microVM на Kubernetes: разветвляйте работающую ВМ на параллельные попытки и восстанавливайте состояние из памяти за десятки миллисекунд.
Быстрый старт . Документация . Возможности . Сравнение . Участие . Сообщество
Mitos даёт каждому ИИ-агенту собственный изолированный компьютер: аппаратно-изолированную микро-ВМ Firecracker, которая безопасно выполняет недоверенный код и которую можно форкнуть прямо во время работы. Живой форк с copy-on-write разветвляет одну «тёплую» ВМ на N независимых «потомков» за десятки миллисекунд, поэтому агент может исследовать множество попыток параллельно из общего готового состояния, а вы платите только за страницы, которые изменяет каждый из потомков.
Запускайте его сегодня в собственном кластере Kubernetes, где код, данные и учётные данные ваших агентов никогда не покидают вашу инфраструктуру, либо в облаке через API без необходимости управлять узлами. Насколько нам известно, это единственная среда выполнения, которая одновременно является open source, самозагружаемой, Kubernetes-native и способной выполнять живой форк работающей ВМ.
pip install mitos-run export MITOS_API_KEY=sk-... # a key from https://mitos.run; no Kubernetes required
По умолчанию SDK использует размещённую конечную точку. Тот же код работает с вашим собственным кластером или автономным sandbox-сервером при установке `MITOS_BASE_URL`. Ключ берётся из аргумента или `MITOS_API_KEY` и никогда не логируется.
### 2. Создайте sandbox и запустите код```python
import mitos
sb = mitos.create("python") # Ready microVM sandbox (~27 ms warm-claim)
print(sb.exec("echo hello").stdout) # hello
# Files and a stateful code interpreter hang off the same flat handle.
sb.files.write("/workspace/plan.txt", "draft")
print(sb.run_code("import math; math.sqrt(144)").text) # 12.0
Полная документация: mitos.run/docs/quickstart.
a, b = sb.fork(2) a.exec("echo conservative > /workspace/plan.txt") b.exec("echo aggressive > /workspace/plan.txt")
sb.terminate()
Асинхронный клиент повторяет ту же поверхность: `await mitos.aio.create("python")` возвращает `AsyncDirectSandbox` с теми же `exec` / `run_code` / `files` / `create_pty` / `fork` / `terminate`.
Блокирующие `exec` и `run_code` работают в husk по умолчанию. Потоковый exec (`sb.exec(..., on_stdout=...)`), фоновые процессы (`sb.exec_background(...)`) и интерактивный PTY (`sb.create_pty()`) пока выполняются по пути engine и переводятся на husk по умолчанию; `run_code` возвращает fail-closed `KernelUnavailable`, пока ядро не войдёт в базовый образ husk.
### Запускайте по-своему
Тот же движок, тот же API, больше точек входа. Подробности — в [документации](https://mitos.run/docs) по одному клику.
**Каждый язык — два режима.** Каждый SDK использует один и тот же REST API sandbox-сервера в **прямом режиме** (standalone или hosted), а также имеет **кластерный режим** (`AgentRun`, который управляет CRD `mitos.run/v1` через Kubernetes API). Именование пула по умолчанию побайтно идентично во всех шести.
| Язык | Установка | Прямой | Кластерный | Документация SDK |
|---|---|---|---|---|
| Python | `pip install mitos-run` | sync + async | `AgentRun` | [sdk/python](https://github.com/mitos-run/mitos/blob/HEAD/sdk/python) |
| TypeScript | `npm i @mitos/sdk` | да | `AgentRun` | [sdk/typescript](https://github.com/mitos-run/mitos/blob/HEAD/sdk/typescript/README.md) |
| Go | `go get github.com/mitos-run/mitos/sdk/go` | типизированный, совместим с `errors.Is` | `AgentRun` | [sdk/go](https://github.com/mitos-run/mitos/blob/HEAD/sdk/go/README.md) |
| Ruby | gem (только stdlib) | да | `AgentRun` | [sdk/ruby](https://github.com/mitos-run/mitos/blob/HEAD/sdk/ruby/README.md) |
| Rust | crate (блокирующий) | да | `AgentRun` | [sdk/rust](https://github.com/mitos-run/mitos/blob/HEAD/sdk/rust/README.md) |
| Java | JDK 17 (только stdlib) | да | `AgentRun` | [sdk/java](https://github.com/mitos-run/mitos/blob/HEAD/sdk/java/README.md) |
Go SDK поставляется в собственном вложенном модуле (`github.com/mitos-run/mitos/sdk/go`), поэтому его импорт никогда не подтягивает контроллер в вашу сборку.
**Собственный хостинг? Тот же код.** Helm-чарт разворачивает тот же шлюз, который использует хостинг-сервис, поэтому приведённый выше быстрый старт без изменений работает с вашим собственным кластером: укажите `MITOS_BASE_URL` на ваш шлюз и оставьте всё остальное как есть. Хостинг и собственный хостинг — единый опыт; отличаются только URL и то, кто им управляет.
**Нативное управление Kubernetes, когда оно вам нужно.** Для платформенных команд, которые управляют пулами декларативно (GitOps, автоматизация на основе RBAC, операторы), двухуровневый путь `AgentRun` минует шлюз и напрямую управляет CRD `mitos.run/v1` через Kubernetes API:```python
from mitos import AgentRun
c = AgentRun() # kubeconfig or in-cluster; autodetected
sb = c.sandbox("python", ready=True) # claims a warm sandbox, waits Ready
print(sb.exec("python -c 'print(40 + 2)'").stdout) # 42
fork_a, fork_b = sb.fork(2) # fork against shared warmed state
sb.terminate()
c.sandbox("python") лениво создает пул по умолчанию, если у вас его нет; передайте pool="my-pool", чтобы использовать существующий. Ошибки вызывают AgentRunError(code, cause, remediation). AsyncAgentRun повторяет горячие пути и добавляет create_pty() через WebSocket.
CLI и MCP.
CLI mitos работает с размещенным шлюзом (кластер не нужен) или с вашим собственным
кластером Kubernetes:```bash
go install mitos.run/mitos/cmd/mitos@latest # requires a Go toolchain
export MITOS_API_KEY=sk-... mitos sandbox create --pool python # create from the python template mitos sandbox exec "python3 -c 'print(42)'" mitos fork --count 2 # fork into 2 independent siblings mitos sandbox ls mitos sandbox terminate
mitos sandbox create --pool dev-default mitos run echo hello --pool dev-default
`mitos dev up` одной командой поднимает локальную управляющую плоскость на mock-движке для
разработки в кластерном режиме. MCP-сервер (`mitos-mcp`) предоставляет песочницы как MCP
инструменты для любого агента, говорящего на MCP, а [Agent Skill](https://github.com/mitos-run/mitos/blob/HEAD/skills/mitos/SKILL.md)
обучает агентов, поддерживающих навыки, рабочему процессу. Полная матрица установки (скрипт,
Homebrew, deb/rpm, scoop/winget, контрольные суммы) приведена в
[mitos.run/docs/install](https://mitos.run/docs/install).
**Встройтесь в агента, которым уже пользуетесь.** Каждый адаптер — это тонкий шим поверх тех же нативных операций (`exec`, `run_code`, `files`, `fork`), без жёсткой зависимости от пакета фреймворка: Claude Code и opencode (MCP-сервер + навык агента), OpenAI Agents SDK, Claude Agent SDK, LangChain / deepagents, Vercel AI SDK / Pydantic AI / AutoGen / LlamaIndex (стандартный MCP), а также миграционные шимы «измени один импорт» для команд, уходящих с облаков [E2B](https://mitos.run/docs/migrating-from-e2b) или [Daytona](https://mitos.run/docs/migrating-from-daytona). [Центр интеграций](https://github.com/mitos-run/mitos/blob/HEAD/docs/integrations/README.md) индексирует каждый путь.
**Установите оператор.**```bash
kubectl apply -k deploy/
Автономная база kustomize устанавливает CRDs, контроллер (режим husk), DaemonSet forkd, плагин устройства /dev/kvm и инициализацию PKI и применяется на реальном узле KVM без ручных патчей. Helm-чарт опубликован в реестре OCI на GHCR: helm install mitos oci://ghcr.io/mitos-run/charts/mitos --version 1.42.1; см. deploy/charts/mitos. Затем объявите тёплый пул и выполните форк из него с помощью Sandbox, чей source.fromSandbox указывает на живую сессию (templates):```yaml
apiVersion: mitos.run/v1
kind: SandboxPool
metadata:
name: python-agent-pool
spec:
template:
image: python:3.12-slim
init: ["pip install numpy pandas requests"]
resources: { cpu: "1", memory: "512Mi" }
volumes:
- { name: workspace, size: 5Gi, forkPolicy: Snapshot }
warm: { min: 10 }
**Where it runs.** Единственное требование к узлу — `/dev/kvm` плюс метка `mitos.run/kvm=true`, поэтому mitos устанавливается на любой кластер Kubernetes с KVM-узлами на bare-metal или с вложенной виртуализацией:
| платформа | узел KVM | руководство |
|---|---|---|
| Bare metal (Talos, Hetzner) | нативный `/dev/kvm` | [docs/platforms/talos-hetzner.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/platforms/talos-hetzner.md) (эталонный вариант) |
| AWS / EKS | `*.metal` или группы узлов с вложенной виртуализацией | сейчас — универсальный чарт; руководство для отдельного облака — issue [#919](https://github.com/mitos-run/mitos/issues/919) |
| GKE | пулы узлов с вложенной виртуализацией | сейчас — универсальный чарт; руководство для отдельного облака — issue [#919](https://github.com/mitos-run/mitos/issues/919) |
| Azure / AKS | размеры ВМ с поддержкой вложенной виртуализации | сейчас — универсальный чарт; руководство для отдельного облака — issue [#919](https://github.com/mitos-run/mitos/issues/919) |
Чарт и CRD одинаковы на всех платформах; отличается только пул узлов, предоставляющий `/dev/kvm`.
## Почему Mitos
Агентным харнесам нужны быстрые изолированные среды, где агенты читают и записывают файлы, устанавливают пакеты и запускают недоверенный код. Любой существующий вариант заставляет идти на компромисс: скорость без владения, изоляция без форкинга, нативность для Kubernetes без тёплого старта или долговечность, запертая в чужом облаке.
- **Живой форк работающей ВМ.** N-сторонний copy-on-write форк живой микроВМ: дочерние ВМ разделяют страницы памяти родителя, пока не выполнят запись, поэтому каждый форк попадает в тёплую готовую среду. Разветвляйте одного агента на множество параллельных попыток.
- **~27 мс — активация тёплой среды.** МикроВМ Firecracker восстанавливаются из снимка памяти за десятки миллисекунд: P50 ~27 мс на эталонном bare-metal узле, воспроизводимо из [`bench/husk-activate-latency.sh`](https://github.com/mitos-run/mitos/blob/HEAD/bench/husk-activate-latency.sh).
- **Открытый исходный код, самохостинг, нативность для Kubernetes.** Насколько нам известно, единственный рантайм, который умеет все три. Вы управляете всем жизненным циклом через декларативные CRD (`mitos.run`).
Два способа запуска:
- **Самостоятельный хостинг (доступен сегодня):** любой кластер Kubernetes с KVM-узлами. Ваши данные никогда не покидают вашу инфраструктуру. Bare metal (Talos + Hetzner) — основная эталонная платформа.
- **Управляемый хостинг (в разработке):** тот же движок и API под нашим управлением для команд, которым нужны миллисекунды без управления узлами.
> Существует два пути движка. **Путь husk pod-native используется по умолчанию**: каждая ВМ работает в собственном непривилегированном поде, а исходный husk-под снимает снапшот своей работающей ВМ, чтобы N дочерних подов восстановили его через CoW. **Путь raw-forkd** выполняет форки во внутрипроцессном движке forkd. Всё, что описано здесь, работает по умолчанию на husk, если явно не указано `engine path`.
Песочницы — это не поды. Механизмы Kubernetes, действующие в пределах пода (NetworkPolicy, ResourceQuota, PSA), управляют husk-подом, а не рабочей нагрузкой внутри микроВМ; песочница — это ВМ, а не husk-под, и там, где мы предоставляем эквивалент, он документирован как наш. Полные пути данных claim и exec, а также диаграмма компонентов приведены на [mitos.run/docs/architecture](https://mitos.run/docs/architecture).
## Бенчмарки
Каждое число здесь воспроизводимо из [`bench/`](https://github.com/mitos-run/mitos/blob/HEAD/bench/) на реальном KVM-оборудовании; не публикуется ничего, что читатель не мог бы воспроизвести (правило проекта «никаких непроверенных заявлений»). Каждая строка называет, что именно измеряется, и точную команду для воспроизведения. Полные данные по каждому запуску и контекст оборудования находятся в [`bench/results/`](https://github.com/mitos-run/mitos/blob/HEAD/bench/results/).
### Время до интерактивности (hosted) в сравнении с набором ComputeSDK
Время до интерактивности (TTI) — единственный показатель, который можно честно сравнить с публичным [бенчмарком ComputeSDK](https://github.com/computesdk/benchmarks), по которому оценивают каждого вендора управляемых песочниц: отсчёт начинается в `create()` и останавливается, когда команда реально ВЫПОЛНИЛАСЬ внутри песочницы и вернула результат.
| провайдер | TTI P50 | измерение |
|---|---|---|
| northflank | 95.9 мс | опубликовано ComputeSDK |
| **mitos** | **96.8 мс** | наш харнесс, `api.mitos.run` |
| daytona | 136.2 мс | опубликовано ComputeSDK |
| e2b | 365.6 мс | опубликовано ComputeSDK |
Воспроизведите наше число и таблицу участников (числа участников берутся из неизменяемого коммита ComputeSDK, а не перезапускаются нами):```sh
MITOS_API_KEY=... python3 bench/tti-latency.py 100 # our TTI, N=100
python3 bench/peer-tti.py --date 2026-07-09 \
--ref 3eddee1a972bd49aea56fd6c16d238ca0a45dece # the peer table
Читайте его с учётом оговорок, которые полная запись указывает и не скрывает: это наша тестовая среда рядом с их опубликованными цифрами, а не измеренная позиция в их таблице лидеров; это последовательный прогон (одновременный всплеск истощил бы сегодняшний одноузловой тёплый пул, issue #586); и претензия на реальное место в таблице лидеров требует поставки адаптера computesdk/computesdk (issue #891). В этих рамках размещённый mitos находится ниже Daytona и наравне с Northflank: 100/100 успешных итераций.
Когда агент работает в вашем кластере и разветвляется на параллельные попытки, важнейший показатель — время от форка до первого exec: время по настенным часам от форка живой ВМ до возврата команды в дочернем процессе. Измерено с помощью того же внутрипроцессного движка, которым управляет forkd:
Полный метод и оборудование — в [bench/README.md](https://github.com/mitos-run/mitos/blob/HEAD/bench/README.md); результаты — в [2026-06-19-bare-metal-fork-exec.md](https://github.com/mitos-run/mitos/blob/HEAD/bench/results/2026-06-19-bare-metal-fork-exec.md) и [2026-06-21-kvm-perf-correctness.md](https://github.com/mitos-run/mitos/blob/HEAD/bench/results/2026-06-21-kvm-perf-correctness.md).
### Активация тёплого запроса (движок, а не полный цикл)
Собственная активация тёплой песочницы движком (загрузка снапшота + подтверждение корректности форка + готовность гостя) составляет P50 ~27 мс на эталонном узле с голым железом и воспроизводится из [`bench/husk-activate-latency.sh`](https://github.com/mitos-run/mitos/blob/HEAD/bench/husk-activate-latency.sh). Это меньшая и иная цифра, чем сквозной хостинг-показатель TTI выше; приводить цифру движка против числа create-API конкурента было бы категориальной ошибкой, поэтому мы держим их раздельно.
## Возможности
Путь husk с pod-нативным исполнением используется по умолчанию. Некоторые возможности сегодня работают только на `engine path` поверх raw-forkd и помечены, со ссылкой на задачу по отслеживанию.
### Скорость
| Возможность | Что вы получаете | Документация |
|---|---|---|
| Тёплая активация по требованию | P50 ~27 мс на эталонном узле с голым железом (загрузка снапшота + подтверждение корректности форка + готовность гостя); ~6–16 мс восстановление снапшота; ~3 МиБ прироста памяти на форк за счёт CoW-совместного использования страниц | [BENCHMARKS.md](https://github.com/mitos-run/mitos/blob/HEAD/BENCHMARKS.md) |
| Пуллы с заранее созданными снапшотами | OCI-образы преобразуются в ext4 rootfs и прогреваются вашими шагами `init` перед созданием снапшота, так что при запросе нет холодного старта | [docs/templates.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/templates.md) |
| CoW-совместное использование памяти | Вы платите за уникальные страницы между форками, а не за копии | [mitos.run/docs/metering](https://mitos.run/docs/metering) |
| Контентно-адресуемое распространение | Форки получают от держателя по mTLS только недостающие фрагменты sha256; пересборки доставляют дельты в рамках контракта совместимости версий | [docs/snapshot-distribution.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/snapshot-distribution.md) |
### Изоляция
| Возможность | Что вы получаете | Документация |
|---|---|---|
| Аппаратная изоляция на сессию | Отдельное ядро для каждой песочницы (KVM/Firecracker); по умолчанию в husk каждая ВМ работает в собственном непривилегированном pod-е с ограничениями PSA, что и является границей для каждой ВМ | [mitos.run/docs/threat-model](https://mitos.run/docs/threat-model) |
| Никакого скрытого наследования секретов | Живые форки песочниц, хранящих секреты, отклоняются, если явно не дано согласие; учётные данные внедряются при запросе через vsock и никогда не запекаются в снапшоты | [mitos.run/docs/threat-model](https://mitos.run/docs/threat-model) |
| Запрет исходящего трафика по умолчанию | Внутри pod-а в его собственном netns действует nftables-фильтр default-deny (независимый от CNI), с безусловной блокировкой cloud-metadata (169.254.169.254) и разрешающим списком для каждого шаблона по IP:port и по имени через внутриpod-овый DNS-прокси. Проверено сквозным образом на реальном KVM-кластере; гость не может повлиять на применение политики | [mitos.run/docs/networking](https://mitos.run/docs/networking) |
| Шифрование в состоянии покоя | Контейнеры LUKS2 на область действия с крипто-шреддингом и KMS-обёрткой ключей (за флагом `--enable-encryption`, fail-closed); ключи на базе HSM и область действия на рабочую область — в планах | [docs/encryption.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/encryption.md) |
### Агентный DX
| Возможность | Что вы получаете | Документация |
|---|---|---|
| Блокирующий exec | Корректные stdout и код возврата через API песочницы | [mitos.run/docs/cli](https://mitos.run/docs/cli) |
| Потоковый exec и PTY | Инкрементальные stdout/stderr, фоновые процессы и интерактивный WebSocket-терминал с доступом по токену (`engine path`) | [mitos.run/docs/cli](https://mitos.run/docs/cli) |
| Интерпретатор кода | `run_code` с сохраняющим состояние ядром и богатыми multi-MIME результатами во всех SDK и в MCP-сервере; fail-closed `KernelUnavailable` до тех пор, пока ядро не появится в базовом образе husk | [mitos.run/docs/mcp](https://mitos.run/docs/mcp) |
| Понятные LLM ошибки | Каждый сбой содержит `{code, cause, remediation}`, разбираемый SDK в структурированный `AgentRunError` | [docs/api/errors.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/api/errors.md) |
### Нативность для Kubernetes
| Возможность | Что вы получаете | Документация |
|---|---|---|
| Декларативные CRD | `SandboxPool`, `Sandbox` (источник poolRef/fromSandbox/fromRevision), `Workspace`/`WorkspaceRevision` в `mitos.run/v1` с топологией томов и поведением форка | [docs/templates.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/templates.md) |
| Pod-нативное исполнение | Каждая ВМ песочницы работает в непривилегированном pod-е (`/dev/kvm` от device plugin, а не `privileged`), поэтому запросы CPU/памяти — истина для планировщика, а pod управляется через PSA | [mitos.run/docs/threat-model](https://mitos.run/docs/threat-model) |
| Планирование с учётом ёмкости | CoW-упаковка в тёплые держатели, бюджет overcommit с учётом CoW, потолок `MaxSandboxes` против host-DoS с атомарным резервированием слотов и типизированное давление `NoCapacity` вместо OOM-а узла | [docs/scheduling.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/scheduling.md) |
| Автомасштабирование по спросу | `SandboxPool.spec.autoscale` масштабирует количество спящих husk-pod-ов до `clamp(inUse + targetSpare, minWarm, maxWarm)` с кулдауном, предотвращающим флап; фиксированный пул — это просто `minWarm == replicas` | [docs/scheduling.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/scheduling.md) |
| Семантика сбоев и сборки мусора | TTL запросов, вычистка осиротевших ВМ, согласование после рестарта контроллера, обработка падения forkd через журнал на диске, обработка потери узла и backpressure при насыщении — всё проверено в CI | [docs/failure-gc.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/failure-gc.md) |
### Долговечное состояние
| Возможность | Что вы получаете | Документация |
|---|---|---|
| Долговечные форкабельные рабочие области | CRD `Workspace`/`WorkspaceRevision`: долговечное, версионируемое, форкабельное состояние агента, независимое от песочницы. `/workspace` наполняется при старте, а закоммиченная ревизия выгружается при завершении через контентно-адресуемое хранилище. Проверено: create -> commit -> fork на реальном KVM-кластере | [mitos.run/docs/workspaces](https://mitos.run/docs/workspaces) |
| Выходные данные и diff | `spec.lifetime.onTerminate.outputs` сужает выгрузку до перечисленных поддеревьев; `{diff: true}` записывает diff по content-hash относительно родительской головы | [mitos.run/docs/workspaces](https://mitos.run/docs/workspaces) |
| Git-рандеву | Выход `{git}` пушит ветки для каждой попытки в рандеву-remote (пушит движок; сливает человек или CI). Сегодня на husk — best-effort | [mitos.run/docs/workspaces](https://mitos.run/docs/workspaces) |
| URL среды разработки | `mitos workspace serve <ws> --pool P` тёплым запросом активирует форк-песочницу, привязанную к рабочей области, и возвращает готовый URL `https://<label>.<expose-domain>/`; каждая форк-сессия получает собственный URL | [docs/recipes/dev-environment.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/recipes/dev-environment.md) |
### Эксплуатация
| Возможность | Что вы получаете | Документация |
|---|---|---|
| Метрики и трассировка | Prometheus-метрики узлов и контроллера, OpenTelemetry-трейс на каждый запрос (`--otlp-endpoint`) и включаемый структурированный журнал аудита (`--audit-log`) с записью команды/пути и количества байт, но никогда содержимого или секретов | [mitos.run/docs/observability](https://mitos.run/docs/observability) |
| Метринг с учётом CoW | Общий набор страниц шаблона учитывается один раз, а не для каждого форка, поэтому биллинг и планирование отражают честный физический след | [mitos.run/docs/metering](https://mitos.run/docs/metering) |
| Инструменты оператора | Плагин `kubectl mitos` (`ls` / `ps`) и операционный отчёт `GET /v1/metering` | [mitos.run/docs/observability](https://mitos.run/docs/observability) |
| Голое железо как цель первого класса | Talos + Hetzner — эталонная платформа | [docs/platforms/talos-hetzner.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/platforms/talos-hetzner.md) |
| Первый запуск для одного пользователя | Быстрый старт на k3s с входом для одного пользователя (только для QA, не для продакшена) | [docs/platforms/k3s-quickstart.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/platforms/k3s-quickstart.md) |
## Сравнение
Лобовая таблица с цифрами появится здесь только тогда, когда наш испытательный стенд сможет воспроизвести её на реальных конкурентах и на том же оборудовании, со скриптами в этом репозитории. Этот стенд — [#15](https://github.com/mitos-run/mitos/issues/15). Цифры ниже — **опубликованные числа других вендоров для других операций, на другом оборудовании и по другой методике**: они не измерены нами и не являются лобовым сравнением.
| Среда выполнения | Опубликованная цифра (их, не наша) | Описываемая ими операция |
|---|---|---|
| Mitos (наш замер) | ~27 мс P50 | активация тёплого запроса на эталонном узле с голым железом |
| E2B | ~150 мс | создание песочницы |
| Daytona | менее 90 мс | создание из снапшота |
| Modal | менее секунды | создание песочницы |
| CodeSandbox SDK | ~863 мс / ~495 мс | живой форк / возобновление из памяти |
| Fly Machines | < 1 с | запуск машины |
Что сегодня действительно сопоставимо и реально — это качественная карта Парето: комбинация открытого исходного кода, самостоятельного хостинга, k8s-нативности и живого форка из снапшота — это ось, на которой Mitos в одиночестве.
| | Mitos | E2B | Modal | Daytona | Morph | Cloudflare | Box | Agent Sandbox | Kata/KubeVirt | raw Firecracker |
|---|---|---|---|---|---|---|---|---|---|---|
| Аппаратная изоляция на сессию | KVM microVM | microVM | gVisor | container/VM | microVM | V8 isolate | VM | Kata option | KVM | KVM |
| Снапшот-форк работающего состояния | да, базовый примитив | снапшот/возобновление | снапшоты памяти | нет | да (Infinibranch) | нет | форк диска | нет | нет | DIY |
| Миллисекундные запросы из тёплого пула | да (центр дизайна) | тёплые пулы | тёплые пулы | рабочие области | да | мгновенные изоляты | не опубликовано | 1–3 с холодный | секунды | DIY |
| Долговечные форкабельные рабочие области | Workspace CRD | нет | тома | рабочие области | да, проприетарно | да (диск) | нет | PVCs | PVCs | нет |
| Kubernetes-нативный API | CRDs | SaaS API | SaaS API | SaaS/OSS | SaaS API | SaaS API | agent-native CLI | CRDs | CRDs | нет |
| Собственный хостинг | да, любой KVM-кластер | частично OSS | нет | OSS-ядро | нет | нет | нет | да | да | да |
| Хостинг-вариант | планируется (тот же движок) | да | да | да | да | да | да (только) | нет | нет | нет |
| Ваши данные остаются на вашей инфраструктуре | да (self-hosted) | нет | нет | частично | нет | нет | нет | да | да | да |
| Открытый исходный код | Apache 2.0 | частично | нет | частично | нет | нет | нет | Apache 2.0 | Apache 2.0 | Apache 2.0 |
SaaS-среды выполнения (E2B, Modal, Daytona, Cloudflare) быстры, но код, данные и учётные данные ваших агентов работают на чужой инфраструктуре без пути к самостоятельному хостингу с эквивалентными возможностями. Morph построил правильную модель состояния (ветвление/восстановление) как проприетарное облако; наш примитив Workspace нацелен на ту же семантику, с открытым исходным кодом, на скоростях fork(2). Agent Sandbox (k8s-sigs) выигрывает в борьбе за стандарт Kubernetes API без движка снапшот-форка, поэтому мы поставляем фасад соответствия (`cmd/facade`), чтобы быть его самым быстрым бэкендом, а не бороться с ним ([docs/facade-conformance.md](https://github.com/mitos-run/mitos/blob/HEAD/docs/facade-conformance.md)). Kata, KubeVirt и чистый Firecracker дают вам примитив изоляции, а пул, форк, распространение и агентные API-слои оставляют вам.
Если альтернатива превосходит нас по значимой для вас оси, а в роадмапе нет пункта, закрывающего этот разрыв, — это баг в нашей стратегии: открывайте issue.
## Архитектура
Mitos запускает Firecracker-микроВМ, форкает их через copy-on-write снапшоты и выставляет весь жизненный цикл через декларативные CRD (`SandboxPool`, `Sandbox`, `Workspace`) в API-группе `mitos.run/v1`. Песочница — это микроВМ, а не pod: она получает аппаратную изоляцию через KVM, и механизмы уровня pod-а (NetworkPolicy, ResourceQuota, PSA) ей не управляют.
Составные части:
- **controller** (Deployment): согласует CRD, выбирает узел и управляет `forkd`. Он отслеживает доступные узлы форка через реестр, который пополняется heartbeat-ами ёмкости от каждого узла.
- **forkd** (DaemonSet): демон на каждом узле, владеющий ВМ. Он обслуживает gRPC на `:9090` для контроллера (fork, prepare-pool, heartbeat) и HTTP API песочницы на `:9091` для exec- и файлового трафика. Ему нужен `/dev/kvm`, поэтому он работает только на узлах с поддержкой KVM.
- **guest agent**: PID 1 внутри каждой микроВМ. Он общается по протоколу vsock для exec, файлов, окружения и уведомлений о форке.
- **sandbox-server**: тот же движок форка за простым REST API, без необходимости Kubernetes, для локальных циклов и использования на одном хосте.
- **SDK** (`sdk/python`, `sdk/typescript`, `sdk/go` и другие): клиенты для хостинг-сервиса, кластера или `sandbox-server`.
Два горячих пути, на которых держится система:
- **Claim-путь**: контроллер выбирает тёплый узел из реестра и вызывает `forkd` `Fork` по gRPC; полученная песочница сообщает Ready через HTTP API `forkd` на этом узле.
- **Exec-путь**: SDK или CLI общается с `forkd` на `:9091`, который через vsock связывает с guest agent внутри ВМ.
Форк — это базовый примитив: исходная ВМ снэпшотится один раз, и N дочерних ВМ восстанавливаются из этого снапшота через copy-on-write, так что каждая дочерняя ВМ оказывается тёплой и независимой, а общие страницы шаблона хранятся и тарифицируются один раз. Поскольку Firecracker требует аппаратной виртуализации, голое железо (Talos на Hetzner — эталонная платформа) является целью первого класса; облачная управляющая плоскость остаётся на обычных узлах, а исполнение размещается на машинах с поддержкой KVM.
## Статус проекта
Ранняя разработка, до версии 1.0 (последний релиз `v0.3.0`). Пока не запускайте недоверенный код в продакшене: внешнего аудита безопасности не было, и некоторые средства контроля изоляции остаются открытыми (см. [модель угроз](https://mitos.run/docs/threat-model) для точного статуса по каждой границе). Управляющая плоскость полностью реальна, проверена в CI на mock-движках и реальных Firecracker-ВМ и обкатана на одноузловом Talos KVM-кластере.
**Проверено на реальном KVM-кластере (husk по умолчанию):** активация тёплого запроса, блокирующий exec, `run_code` с fail-closed `KernelUnavailable`, самовосстановление / повторное ожидание, прогрев пула и автомасштабирование по спросу, живой форк песочницы (исходный husk pod снэпшотит свою ВМ, а N дочерних pod-ов восстанавливают её через CoW, каждый — независимый Ready-потомок), долговечные форкабельные рабочие области (create -> commit -> fork) и изоляция исходящего трафика pod-а (default-deny, блокировка cloud-metadata, разрешающий список для каждого шаблона).
**Отслеживаемые остатки, пока не доступные в husk по умолчанию:** потоковый exec и интерактивный PTY; хуки снапшотов памяти живых ВМ для возобновляемых голов рабочих областей; выбор живого хранилища S3/шифрование; пуш `{git}` рабочей области в husk; и многоузловость N>1 (спроектировано, проверено на одном узле).
[ROADMAP.md](https://github.com/mitos-run/mitos/blob/HEAD/ROADMAP.md) — единственный источник информации о том, что сделано, в работе и за гейтами. Рабочее правило: этот репозиторий никогда не описывает систему, которой не существует.
## Локальная разработка (KVM не требуется)
`mitos dev up` поднимает локальный kind-кластер на mock-управляющей плоскости, а CLI `mitos` выполняет весь путь запроса; mock-движок доводит запросы до `Ready` и проверяет диспетчеризацию управляющей плоскости, но настоящий `exec` внутри ВМ требует узел с `/dev/kvm`. Для REST-цикла без кластера выполните `go run ./cmd/sandbox-server --mock --addr :8080` и укажите на него Python SDK. Полное прохождение по kind описано на [mitos.run/docs/cli](https://mitos.run/docs/cli).
## Документация
Полная документация находится на **[mitos.run/docs](https://mitos.run/docs)**: quickstart, архитектура, справочник SDK и CLI, жизненный цикл песочницы, рабочие области, сеть и модель угроз — всё формируется из этого репозитория.
Полный «длинный хвост» (шаблоны, формат и распространение снапшотов, шифрование и секреты, планирование и плотность, отказы и GC, корректность движка форка, рецепты и целевая спецификация API v2) находится в [`docs/`](https://github.com/mitos-run/mitos/blob/HEAD/docs/) в этом репозитории. Методология бенчмарков — в [BENCHMARKS.md](https://github.com/mitos-run/mitos/blob/HEAD/BENCHMARKS.md).
## Участие
Вклад приветствуется. Соглашения см. в [CONTRIBUTING.md](https://github.com/mitos-run/mitos/blob/HEAD/CONTRIBUTING.md) и [CLAUDE.md](https://github.com/mitos-run/mitos/blob/HEAD/CLAUDE.md), а работу, отслеживаемую в соответствии с [ROADMAP.md](https://github.com/mitos-run/mitos/blob/HEAD/ROADMAP.md), — на [странице issues](https://github.com/mitos-run/mitos/issues).
## Безопасность
Модель угроз со статусом по каждой границе находится на [mitos.run/docs/threat-model](https://mitos.run/docs/threat-model); внешнего аудита безопасности ещё не было, и в документе точно указано, что открыто. Чтобы сообщить об уязвимости, см. [SECURITY.md](https://github.com/mitos-run/mitos/blob/HEAD/SECURITY.md).
## Лицензия
[Apache 2.0](https://github.com/mitos-run/mitos/blob/HEAD/LICENSE).
| метрика | значение | что измеряется |
|---|
| fork -> first exec | P50 ~104 мс (референсный узел), ~67 мс на reflink + NVMe | один живой форк до готового дочернего процесса, обслуживающего exec |
| fork(n) fan-out | ~56 мс P50 на дочерний процесс при n=4 и n=16 | один тёплый базовый процесс разветвляется на N независимых потомков |
| плотность памяти CoW | 8 форков обходятся в ~35 MiB резидентной памяти, а не ~209 MiB | уникальные страницы оплачиваются, разделяемые страницы учитываются один раз |
| go build -o /tmp/bench ./cmd/bench/ | ||
| /tmp/bench --mode fork-exec --template --data-dir --iterations 100 # fork -> first exec | ||
| /tmp/bench --mode fork-fanout --template --data-dir --fanout-n 1,4,16 # 1-to-N fan-out |