Реле, агент и человек в одной комнате: как устроен пилот на Buzz
Реле переехало с моего десктопа на VPS и поселилось за уже работающий nginx, агент поднят там же отдельной службой. Разбираю по шагам, как собран пилот Buzz и почему все решения получились максимально скучными.
На словах пилот простой: общий канал, в нём рядом человек и агент. Агент при этом живёт на своей машине и держится там сам, без запущенного десктопа. Дальше начинается инженерия, и вся она про то, куда что поселить.
Три участника
- Реле — точка сбора, через которую участники находят друг друга.
- Агент — Claude Code, подключённый к каналу через ACP-мост. Работает на подписке claude.ai, отдельный API-ключ тут не участвует.
- Человек — я. И друг, которого я позвал проверить главный сценарий: каждый приводит своего агента со своим харнессом и своей базой знаний.
Реле съехало с моего компьютера
Сначала реле жило на десктопе. Работает это ровно до момента, когда компьютер нужно выключить или перезагрузить — канал сразу теряет точку сбора.
Теперь реле стоит на VPS NeonMailer (64.188.57.113) и снаружи доступно по wss://64-188-57-113.sslip.io. Трафик закрыт настоящим сертификатом, самоподписанных костылей нет.
Почему не отдельный Caddy на 80/443
Порты заняты. Их держит контейнер neonmailer-nginx-1, который обслуживает два боевых домена — neonmailer.neon.boutique и zadrotometr.ru. Порт 3000 занят самим NeonMailer.
Снести и поставить своё — плохая идея, домены боевые. Поэтому реле подселено за существующий nginx отдельным виртуальным хостом. Что это дало:
- один TLS-терминатор на весь сервер;
- один certbot, который уже умеет продлевать сертификаты;
- чужие конфиги остались нетронутыми: поломка реле не утащит за собой домены.
Скучное решение, зато сервер после него выглядит так же, как выглядел до.
Почему sslip.io
Свой домен — это DNS-запись и ожидание распространения. Ждать не хотелось. 64-188-57-113.sslip.io резолвится в 64.188.57.113 сразу, без единой настройки, и сертификат на это имя выписывается штатно. Для пилота хватает. Переехать на нормальное имя можно потом, когда схема устоится.
Агент на сервере, рядом с реле
На том же VPS поднята служба buzz-acp. Она держит агента по проекту /opt/steam-psycho — это репозиторий ragastar/steam-psycho, сайт zadrotometr.ru. В канал агент приходит полноправным участником.
Перед запуском я проверил, что сервер к этому готов:
| Проверка | Результат |
|---|---|
claude auth status |
loggedIn: true, подписка claude.ai |
| node / npm | v20.20.1 / 10.8.2 |
Важная деталь: агент работает на той же подписке, что и мой обычный Claude Code. Мост ACP разговаривает с CLI, поэтому ключ API заводить не пришлось.
Что было до этого
Пилот начался с чтения чужого кода:
- upstream
block/buzzподтянут до69107dc3b— 104 коммита за неделю, проект движется быстро; - разбор архитектуры лёг в
ИССЛЕДОВАНИЕ.mdвнутри чекаута buzz; - инфраструктура вынесена в приватный репозиторий
ragastar/buzz-lab; - попутно вылечен Docker Desktop: осиротевший сокет
userAnalyticsOtlpHttp.sockлечится переименованием%LOCALAPPDATA%\Docker\run.
Последний пункт к Buzz отношения не имеет, но час он у меня забрал честно.
Что стоит учесть, если повторяете
- Сначала посмотрите, кто держит 80, 443 и 3000. Выбор схемы с TLS зависит именно от этого, остальное вторично.
- Реле должно переживать перезагрузку сервера, поэтому его место — в службе, не в терминале по ssh.
- Имя от sslip.io привязано к IP. Сменится адрес — сменится имя, и сертификат придётся выписывать заново.
Что проверяет этот пилот
Гипотеза одна: агент живёт на своей машине, со своим окружением и своим контекстом, и приходит в общий канал как участник. Если схема держится у меня, то же самое собирается у друзей — каждый приносит агента, настроенного под свои задачи, и они встречаются в одном канале.
Дальше по плану — позвать друга в канал и посмотреть, как ведут себя рядом два агента с разными базами знаний. Об этом напишу, когда проверю руками.