Control plane

Плоскость управления — типизированный воркспейс на Rust (pkgs/mev-rs). Она вычисляет flake, проверяет схему, авторизует запросы, ведёт хранилище SQLite и управляет жизненным циклом окружений. Модель привилегий и сборщики Nix при этом не меняются: узкие root-помощники остаются отдельными бинарниками.

Структура воркспейса

pkgs/mev-rs/
crates/mev-core/ библиотека: spec, validate, authz, store, eval, exec, reconcile, publish
crates/mevd/ mevd + mevd-apply + HTTP API (axum) + дашборд статуса
crates/mev/ клиент CLI
crates/mev-mcp/ MCP-сервер (rmcp) поверх HTTP API
crates/mev-activator/ активатор пробуждения: HTTP, reaper, управляющий сокет, метрики

mev-core

Общая библиотека, которой пользуются все остальные крейты.

mevd

Воркер forced-command по SSH и HTTP API.

МаршрутОписание
GET /healthzпроверка работоспособности
GET /metricsметрики активатора для Prometheus
GET /v1/envsсписок окружений
POST /v1/envsсоздать / обновить окружение
GET /v1/envs/{owner}/{slug}состояние окружения
DELETE /v1/envs/{owner}/{slug}удалить окружение
GET /v1/envs/{owner}/{slug}/logsжурнал юнита
GET /v1/envs/{owner}/{slug}/eventsсобытия окружения
GET /v1/envs/{owner}/{slug}/statsстатистика ресурсов окружения
POST /v1/forkфорк окружения
POST /v1/wakeпринудительно разбудить
GET /v1/auditжурнал аудита
GET /v1/statsстатистика хоста
GET /metrics/statsстатистика хоста для Prometheus (admin)

mev (клиент)

Клиент для рабочей машины разработчика. Справочник команд — в CLI mev. Три пути получить бинарник: nix run
.#mev -- ...
из этого репозитория, dev shell (direnv allow / nix
develop
, где mev уже на PATH), либо он уже установлен в environment.systemPackages на самом хосте платформы (modules/platform/mev.nix).

mev-mcp

MCP-сервер (rmcp) поверх HTTP API. Транспорт: stdio. Оператор задаётся переменной MEV_OPERATOR. Логи пишутся только в stderr.

ИнструментОписание
create_envCreate or update an environment from typed fields. Arg: { name: "owner/slug", users: [..], domains?: {host: port}, packages?: [..], backend?: "nspawn"|"microvm" }. The owner must be in users; server-side authz still applies.
destroy_envDestroy an environment (owner/admin only). Arg: { name, purge? }. purge=true moves the data to trash (recoverable for 7 days); default keeps the data for a re-push.
env_eventsRead an environment's audit/event trail (recent first). Arg: { name: "owner/slug" }.
env_logsTail an environment's unit journal. Arg: { name, n? } (n defaults to 50).
env_statusGet one environment's status: id, backend, wake mode, idle, members, domains, live state and last-seen time. Arg: { name: "owner/slug" }.
fork_envFork an existing environment into a new one. Arg: { src: "owner/slug", name: "owner/slug", users: [..] }. You must be a member of src; the new owner must be in users.
list_envsList environments you may see (owner/member; admins see all). Returns name, id, owner, backend and members for each.
wake_envResolve which environment/upstream a wake for a domain would target. Arg: { domain }.

mev-activator

Активатор пробуждения на Rust (замена версии на Go). Те же флаги CLI, имена метрик Prometheus и логика контроля допуска. Принимает HTTP-запросы от Traefik на 127.0.0.1:8080; управляющий unix-сокет (/run/wake/ctl.sock, 0660, группа wake-ctl) использует SSH-диспетчер, чтобы будить окружения и обновлять lastSeen. Работает без привилегий от пользователя wake.

Контроль допуска: объединение одинаковых запросов, общий лимит холодных стартов, бюджет свободной RAM и ограничение частоты по источнику сдерживают последствия наплыва запросов.

Корневые помощники

Узкие привилегированные бинарники (в pkgs/mev, не в pkgs/mev-rs):

ПомощникНазначение
mev-containerextra-container create/destroy; пиннит <nixpkgs>, сам строит выражение — root никогда не вычисляет выбранный вызывающим nixpkgs
mev-dataZFS-датасет / каталог данных; leaf повторно проверяется до env<id>, путь не может выйти за rpool/environments
mev-logsфиксированный journalctl -u (container\|microvm)@env<id>
mev-statчтение использования ZFS; только чтение, отдельно от mev-data

Правила sudo покрывают только эти четыре помощника. Правило polkit разрешает пользователю wake лишь start/stop юнитов container@env<N> / microvm@env<N>.

Связывание модулей

Подробнее об архитектуре в целом — в разделе Архитектура.