Chief Beaver Officer

Деплой

Один compose, один .env, один порт. Профили, Obsidian Sync в контейнере, stable-ветка, Caddy для SSE.

Что нужно beaver-agent

Оверолл, до compose:

  • Сервер с Docker и compose. Любой Linux-хост, у меня домашний Dell; Postgres поднимается там же профилем db.
  • Подписка на Claude. Gateway ходит через Claude Agent SDK по OAuth-токену подписки: на маке claude setup-token, живёт год, тратит лимиты как обычный Claude Code. Это CLAUDE_CODE_OAUTH_TOKEN, единственный секрет, который доезжает до процесса модели.
  • Telegram-бот. @BotFather → токен; там же Bot Settings → Topics → включить в личных чатах, иначе веток-топиков не будет. Плюс твой numeric id (@userinfobot) - единственный, кому бот отвечает.
  • Vault. Подписка на Obsidian Sync, чтобы vault приехал в контейнер официальным клиентом (шаг «Obsidian Sync» ниже). Без Sync - любой другой способ положить папку на диск сервера.
  • Админка. ADMIN_USER/ADMIN_PASS/SESSION_SECRET; токены для плагина и клиентов выпускаются уже внутри.
  • Снаружи, опционально. Домен и Caddy, если плагин Obsidian и админка нужны не только с localhost; PUBLIC_BASE_URL.
  • Руки, опционально. По токену на каждую: Komodo, Home Assistant, t3code на каждой машине, приватные ical-фиды календарей, Firefly, beavergram, вайбграм.

Порядок: клонировать beaver-agent, cp .env.example .env, заполнить обязательное, docker compose up -d, залогинить Obsidian Sync в контейнере, зайти в /admin и выпустить токены. Дальше по шагам - что именно при этом поднялось.

Профили compose beaver-agent

COMPOSE_PROFILES=db,gateway,obsidian,t3,vibegram. Postgres, gateway (образ собирается из beaver-gateway#GATEWAY_REF), obsidian-headless с Obsidian Sync в том vault, коннекторы по профилям. Один опубликованный порт: /anthropic, /mcp, /admin, /api, /md, /hooks под ним.

Конфиг монтируется файлами: config.py, beaver_agent/, config.json Raycast, всё только на чтение.

Единственный .env beaver-agent

Его читают compose, gateway и config.py. Каждое пустое значение задокументировано инлайн. Обязательное: Postgres, ADMIN_USER/ADMIN_PASS/SESSION_SECRET, CLAUDE_CODE_OAUTH_TOKEN, Telegram. Остальное - по рукам, которые хочешь.

Obsidian Sync beaver-agent

Vault приезжает в контейнер официальным клиентом:

docker exec -it beaver-obsidian ob login
docker exec -it beaver-obsidian ob sync-setup --vault "yourvault"
docker restart beaver-obsidian

Пока Sync не забрал vault, промптов нет и gateway рестартует в цикле - это ожидаемо. Права модели на vault выдаёт entrypoint через ACL: Sync пишет под root, а default-ACL даёт runner'у права и на то, что появится позже.

Komodo вокруг

Komodo - self-hosted панель для серверов и docker-compose-стеков. Стек - это compose из git-репозитория на заданном ref: Komodo сам клонирует, собирает образы, поднимает контейнеры и ждёт healthcheck. У меня стек beaver-agent смотрит на ref stable.

Что он даёт Менеджеру: деплой по пушу, а не руками на сервере; API, которым пользуется POST /hooks/deploy (DeployStack); алерты о серверах и контейнерах в /hooks/komodo; и руку komodo с перечислимыми действиями для диспетчера (статус, стеки, контейнеры, логи, exec в контейнер). Ключи - KOMODO_URL, KOMODO_KEY, KOMODO_SECRET в .env. Можно без него: тогда деплой - docker compose up -d руками, а хук и рука просто не появятся.

main работа, stable прод beaver-agent

Komodo деплоит только ref stable, пуш в main ничего не делает. make deploy = git push origin main:stable. Compose ждёт healthcheck на /healthz. Чтобы не уронить тёрн, вместо пуша руками - POST /hooks/deploy.

Caddy beaver-agent

Один reverse_proxy на весь домен, префиксы не срезаются, flush_interval -1 - иначе SSE и стримы буферизуются. PUBLIC_BASE_URL в .env, чтобы админка показывала внешние адреса.