# Хардас для клиента студии — инсталлятор (hardass deploy playbook) Источник: задача t-261002072440-c482ca (голосовое Alex, m-516173358): «поставить хардас клиентам студии, которые уже сталкиваются с проблемами и ждут его; агент сам собирает их потребности и постепенно реализует; Alex дёргать в процессе поменьше». Реплицируется наша собственная живая установка (`/root/simbiot-harness`, проверено на этом хосте 2026-10-02): тот же код, те же юниты, тот же ритм. ## Что ставится | Компонент | Юнит | Что делает | |---|---|---| | scheduler | `simbiot-harness.service` | лестница тактов sec/min/hour/day, задачи, дайджесты | | TG-инбокс | `simbiot-harness-tg.service` | голосовые/сообщения клиента → харнес, ответы, идемпотентная доставка | | портал-канал | `SIMBIOT_PORTAL_CHAT=1` + `harness/portal_channel.py` | чат клиент ↔ харнес через портал кооператива | | аудито-ключ | `/.audit/ed25519.key` 0600 | подпись событий и команд (крипто-цепочка) | ## Шаги (у каждого клиента, отдельный root/venv) 1. **Код**: скопировать репозиторий `simbiot-harness/` (rsync/git) на машину клиента; создать venv: `python3 -m venv venv && venv/bin/pip install -q -r requirements.txt` (или установить deps по импортам: flask, cryptography, requests). 2. **Секреты**: в `/.env`: - `SIMBIOT_TG_TOKEN` — токен **личного** TG-бота клиента (БотФазер, у каждого свой — не наш); - `SIMBIOT_TG_ALLOWED` — TG-ID владельца клиента (его чат, не наш); - `ROUTER_KEY`, `ROUTER_BASE_URL` — доступ к 9router (или свои ключи модели, если хочет свой биллинг); - `SIMBIOT_PORTAL_CHAT=1` + `SIMBIOT_AGENT_NAME=<имя агента на портале>`. 3. **Бот клиента в TG чат**: клиент нажимает «подключить» на портале, вставляет токен бота — портал хранит его в `agents.tg_bot_token` (порядок такой же, как у агентов портала, e-«portal channel»). 4. **Юниты systemd**: положить оба unit-файла (шаблоны ниже), ExecStart с путями клиента, `systemctl daemon-reload && enable --now` обоих. 5. **Инициализация**: `./venv/bin/python cli.py init` → создаёт ES-стор. 6. **Аудит-ключ**: `./venv/bin/python cli.py audit-key` → отпечаток публичного ключа клиента — записать в реестр установок (`docs/hardass/INSTALLS.md`), это его `key_id` для сверки «что сделал харнес». 7. **Проверка**: `./venv/bin/python cli.py verify` → OK; `cli status`; отправить боту «ping» — ответ приходит в его чат сам. 8. **Онбординг потребностей**: запустить `scripts/needs_survey.py survey` (см. SURVEY.md) — опросник уходит клиенту в его чат, ответы копятся в `docs/hardass/needs/`. ## Шаблоны юнитов ```ini # /etc/systemd/system/simbiot-harness.service [Unit] Description=Simbiot Harness (client) After=network-online.target [Service] Type=simple WorkingDirectory=/root/simbiot-harness ExecStart=/root/simbiot-harness/venv/bin/python -m harness.scheduler Restart=always RestartSec=5 Environment=PYTHONUNBUFFERED=1 [Install] WantedBy=multi-user.target # /etc/systemd/system/simbiot-harness-tg.service [Unit] Description=Simbiot Harness TG inbox (client) After=network-online.target simbiot-harness.service [Service] Type=simple WorkingDirectory=/root/simbiot-harness ExecStart=/root/simbiot-harness/venv/bin/python -m harness.tg_inbox Restart=always RestartSec=5 Environment=PYTHONUNBUFFERED=1 [Install] WantedBy=multi-user.target ``` ## Смоук-проверка инсталлятора (сделано 2026-10-02) Бута свежей копии на этом хосте с разделёнными `SIMBIOT_DB` и `SIMBIOT_AUDIT_KEY_DIR`: init → verify OK (подписи и цепочка валидны, ключ клиента отличается от нашего — своя крипто-граница). Параллельный рестарт двух демонов безопасен (init_db идемпотентен, race закрыт t-261002072440). ## Реестр установок — docs/hardass/INSTALLS.md Каждая установка: клиент, машина, дата, key_id (audit-key), TG-бот, статус, потребности (ссылка на needs/).