Перейти к содержимому

Запуск Claude Code с Olivares (совместное развёртывание)

Это половина Operate (управление выполнением) истории Anthropic-first: не просто наблюдать и регулировать Claude Code, но и дирижировать им. Control plane запускает реальный процесс claude, направляет его ввод-вывод в управляемый поток, закрепляет каждый переход жизненного цикла в аудит-журнале и завершает его — поверх общей рабочей области, из API/CLI (а позднее — и из портала), без SSH. Эта страница совместно развёртывает обе половины на одном Linux-хосте в четырёх топологиях, безопасно по умолчанию.

Про путь кооперативного наблюдения (телеметрия OTLP → access map) см. Подключение Claude Code; про путь регулирования (хуки PreToolUse как PEP) см. пример govern-claude-code. Эта страница — про совместное развёртывание: про совместный запуск двух сред выполнения.

  1. Подключение по выбору (opt-in). Базовый образ Olivares — distroless и не несёт claude. Слой Operate-Claude-Code — это отдельный артефакт: комбинированный образ (Dockerfile.agentops) или дополнение к нативной установке. Если вы не запускаете управляемый Claude Code, вы его никогда не скачиваете, и его дополнительная поверхность никогда не касается вашего control plane.
  2. Официальный источник, никогда не перераспространяемый. Условия Anthropic не разрешают перераспространять бинарник claude, поэтому мы устанавливаем его из официального, GPG-подписанного источника Anthropic при сборке/первом запуске (подписанные репозитории apt/dnf/apk), с закреплённой версией и отключённым автообновлением. Мы не поставляем стороннего бинарника. Вы также можете принести свой собственный claude и указать движку на него.
#OlivaresClaude CodeКак движок дирижирует имСтатус
1DockerDockerТот же контейнер (комбинированный образ), дочерний procRunnerРекомендуется (тот же управляемый путь, что и 2)
2НативноНативноТот же хост (systemd), дочерний procRunnerРекомендуется, проверено сквозным smoke-тестом
3DockerНативно (хост)Меж-namespace — не управляемо как естьРазмещайте вместе (см. ниже)
4НативноDocker (на каждую сессию)Контейнер на сессию через Docker APIПоследующая работа (документировано)

Две совместно размещённые топологии (1, 2) — это безопасный вариант по умолчанию. Топология 2 (нативная) проверяется сквозным тестом scripts/smoke-agentops.sh; топология 1 переиспользует тот же управляемый путь procRunner (сборка/запуск комбинированного образа пока не подключены к автоматизированному тесту). Топологии 3 и 4 хотят разместить дирижёра и управляемого в разных контейнерах; мостирование stdio через эту границу требует доступа к Docker API (привилегия, которую движок намеренно не берёт по умолчанию). Их честные пути изложены в Смешанных топологиях.


Один укреплённый контейнер запускает движок и claude; том рабочей области — это общий рабочий каталог. Только loopback, не от root, корневая ФС только для чтения — идентичная posture базовому compose, плюс дирижируемая среда выполнения.

claude устанавливается во время сборки из подписанного apt-репозитория Anthropic, с закреплённым отпечатком ключа подписи (31DD DE24 DDFA B679 F42D 7BD2 BAA9 29FF 1A7E CACE) и отключённым автообновлением. Закрепите базовый образ движка по digest и сначала проверьте его:

Окно терминала
# verify the engine image you build FROM (it is cosign-signed)
cosign verify docker.io/olivaresai/olivares:26.8.0 \
--certificate-identity-regexp '^https://github\.com/olivaresai/olivares/\.github/workflows/release\.yml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
docker build -f Dockerfile.agentops \
--build-arg OLIVARES_IMAGE=docker.io/olivaresai/olivares@sha256:<digest> \
--build-arg CLAUDE_CHANNEL=stable \
-t olivares-agentops:26.8.0 .

Используйте свой собственный claude через --build-arg CLAUDE_INSTALL=byo (образ поставляется без claude; смонтируйте свой во время выполнения и задайте OLIVARES_SESSION_RUNTIME_CLAUDE_BIN).

Окно терминала
export OLIVARES_AGENTOPS_IMAGE=olivares-agentops:26.8.0
docker compose -f deploy/compose/docker-compose.yml \
-f deploy/compose/docker-compose.agentops.yml up -d

Переопределение меняет только то, что нужно Operate: комбинированный образ, четыре записываемых тома (данные движка, рабочая область, домашний каталог ~/.claude процесса claude, краткоживущий токен вывода) и env среды выполнения сессий. Всё остальное — порты, привязанные к 127.0.0.1, uid 65532, корень read_only, cap_drop: ALL, no-new-privileges — наследуется от базы.


Движок и claude на хосте; systemd запускает движок, который дирижирует claude. Рабочая область располагается в /var/lib/olivares/workspaces.

Окно терминала
curl -fsSL https://raw.githubusercontent.com/olivaresai/olivares/main/scripts/install-agentops.sh | sh

Скрипт автоматически определяет нативную топологию, устанавливает проверенный бинарник движка (защищённый cosign install.sh), устанавливает claude из подписанного репозитория apt/dnf/apk (с проверкой отпечатка ключа — или OLIVARES_CLAUDE_INSTALL=byo, чтобы пропустить), создаёт сервисного пользователя olivares без входа и каталог рабочей области, и добавляет укреплённое переопределение systemd + пример env. Он не запускает автоматически плоскость управления — запуск её — это ваше явное решение.

  • packaging/systemd/olivares.service.d/agentops.conf — drop-in, который даёт дирижируемому claude записываемый HOME для ~/.claude (держится под /var/lib/olivares, так что ProtectHome=true всё ещё защищает реальных пользователей), гарантирует существование каталога рабочей области и снимает ровно одно свойство песочницы: MemoryDenyWriteExecute (среда выполнения claude JIT-компилирует и нуждается в памяти W→X). Каждая другая директива укрепления из базового юнита остаётся в силе.
  • /etc/olivares/agentops.env — конфигурация среды выполнения сессий (файл токена, TTL, опциональный базовый URL шлюза, опциональный путь к собственному claude).

Затем, осознанно:

Окно терминала
sudo nano /etc/olivares/agentops.env # wire the short-lived inference token (refresher)
sudo systemctl enable --now olivares # loopback-only by default

Те же шаги в любой совместно размещённой топологии. Аутентифицируйте CLI, зарегистрируйте общую рабочую область, запустите:

Окно терминала
export OLIVARES_SERVER_URL=https://127.0.0.1:8443
export OLIVARES_TOKEN=<your-api-token>
export OLIVARES_TENANT=<your-tenant-id>
# 1) register the shared workspace (the session's working dir; jailed file API on top)
olivares agent workspace add /var/lib/olivares/workspaces/project-x --name project-x --mode rw
# 2) launch a governed session over the stream-json transport
olivares agent session create --transport stream-json \
--permission-mode acceptEdits --model opus \
--workspace <workspace-ref> --isolation native
# 3) attach to its live, bridged I/O (lossless replay from a cursor); send input; stop
olivares agent session attach <run-ref>
olivares agent session input <run-ref> --line '{"type":"user","message":{"role":"user","content":"…"}}'
olivares agent session stop <run-ref>

Каждый переход (created → launched → … → stopped) закрепляется в подписанном аудит-журнале (olivares agent session events <run-ref>); файловый API рабочей области (olivares agent workspace files|get|put|…) изолирован (jailed) и фиксируется в аудите. Контракт воспроизводимости для всего этого — scripts/smoke-agentops.sh, который поднимает нативное совместное развёртывание против герметичного поддельного claude и утверждает, что сессия управляема от начала до конца.


Они разделяют дирижёра и управляемого через границу контейнера. Будьте трезвы насчёт того, во что это обходится.

Чистого управляемого пути нет: контейнеризованный движок не может владеть stdio процесса в namespace’ах хоста, а управляемый транспорт — это stdio. Достижение хостового claude потребовало бы разделения PID-namespace хоста и монтирования в контейнер движка — большая, осознанная деизоляция, которая сводит на нет смысл контейнеризации движка. Размещайте вместе: запустите обе в комбинированном образе (это и есть топология 1) или запустите обе нативно (топология 2). Это реальное ограничение, заявленное, а не замазанное.

Топология 4 — Olivares нативно, Claude в контейнере на сессию

Заголовок раздела «Топология 4 — Olivares нативно, Claude в контейнере на сессию»

Это естественный дом для изоляции в свежем контейнере на каждую сессию: каждая сессия получает совершенно новый укреплённый контейнер claude (рабочая область смонтирована через bind, корень только для чтения, не от root, cap-drop), создаваемый и завершаемый движком через Docker API, со stdio, смостированным через Docker attach/hijack. Шов модели данных уже моделирует это (--isolation container — допустимое значение, а примитив монтирования исполнителя, который он будет потреблять, уже поставлен) — но runner за ним пока не подключён, поэтому нативный runner сегодня отказывает в этом значении (см. примечание выше).

Это документированная последующая работа, не поставленная в этом релизе. Управление братскими (sibling) контейнерами означает предоставление движку доступа к Docker API (в идеале через прокси-сокет с минимальными привилегиями) — поверхность доверия, которую этот релиз намеренно избегает в пользу комбинированного образа без сокета. Выбор этой топологии — это выбор более сильной изоляции дирижёр/управляемый ценой этого гранта Docker API; она прибудет за существующим швом isolation=container. До тех пор безопасный вариант по умолчанию — совместное размещение.


  • Loopback по умолчанию. Порты хоста публикуются только на 127.0.0.1. В контейнере движок слушает на 0.0.0.0 внутри контейнера, поэтому отображение порта хоста — это граница раскрытия — никогда не публикуйте его на не-loopback адресе хоста без собственного прокси аутентификации с терминацией TLS. Нативная/systemd привязка по умолчанию — loopback. Раскрывайте осознанно.
  • Не от root, минимальные привилегии. uid/gid 65532, корневая ФС только для чтения, cap_drop: ALL, no-new-privileges (Docker) / полный набор Protect*/Restrict* минус единственное документированное послабление W^X (systemd).
  • Минимум данных, env с allowlist. Дочерний claude наследует только явный allowlist (PATH, HOME, локаль…) плюс токен вывода в памяти — никаких ключей подписи OLIVARES_*, никаких окружающих ANTHROPIC_*/CLAUDE_CODE_*, которые могли бы затенить созданный учётный данные.
  • Проверенная цепочка поставок. Движок подписан cosign (проверьте его / закрепите по digest); claude устанавливается из подписанных репозиториев Anthropic с закреплённым отпечатком ключа. Установщик отказывается запускать непроверенный движок, если вы явно не откажетесь от проверки.
  • Закреплённый аудит. Каждый переход жизненного цикла и каждая мутация рабочей области запечатываются в hash-chained, подписанный журнал через PayloadHash — байты файлов и содержимое кадров никогда не сохраняются.