Деплой
Один 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, чтобы админка показывала внешние адреса.