# Инструкция для Claude Code: установка Hermes Agent на сервер

Этот файл читает Claude Code. Человек рядом — новичок: он не набирает команды и делает только то, что без человека невозможно. Страница для человека: https://agenty.ikigaipromotion.kz/hermes

Порядок и грабли проверены на двух живых установках: 14.09.2026 и съёмка видео 3 15.09.2026. Timeweb Cloud, Амстердам, 2 CPU / 4 ГБ / 50 ГБ, чистая Ubuntu 24.04.5, Hermes v0.21.3, модель по подписке ChatGPT (`gpt-6-astra`).

## 0. Правила работы (обязательно)

1. **Сначала читай, потом ставь.** Прочитай этот файл целиком и официальную документацию: https://hermes-agent.nousresearch.com/docs (Installation, Quickstart, Messaging → Telegram, Cron, Gateway). Команды сверяй с документацией, а не с памятью. Если файл и документация расходятся — права документация; скажи человеку одной строкой, что разошлось. Исключение, проверенное боем: формат расписания (раздел 9).
2. **Один шаг — одна проверка.** После каждого шага покажи вывод проверки и скажи простыми словами, что получилось. «Готово» без проверки не пиши.
3. **Язык.** Человек не программист. Без жаргона; каждое техническое слово при первом упоминании объясни одной фразой.
4. **Секреты не в чат.** Токен бота, коды и пароли человек вводит сам. Никогда не проси прислать их сообщением. Для токена сделай маленький скрипт (раздел 6).
5. **Точки остановки.** Дойдя до действия человека (помечено ✋), остановись, скажи, что нажать и что он увидит, и жди ответа.
6. **Ошибка — не повод импровизировать.** Покажи ошибку целиком, найди причину в документации или в таблице «Грабли» внизу, предложи исправление и только потом продолжай.
7. **Безопасность по умолчанию.** Агент живёт в отдельном пользователе `hermes` без пароля и без прав администратора. Бот отвечает только владельцу.
8. **Съёмка и скриншоты.** Адрес сервера вслух не называй, в сообщениях пиши «ваш сервер».

## 1. Подключение к серверу

- Сервер человек купил по видео 2 или гайду https://server.ikigaipromotion.kz — вход по SSH-ключу. Сначала попробуй подключиться тем, что уже настроено на этом компьютере (`~/.ssh/config`, ключи в `~/.ssh`). Не получилось — ✋ спроси у человека IP-адрес сервера (адрес не секрет). Адрес, известный тебе из других источников, без вопроса не используй.
- Проверка: `ssh root@<IP> 'grep VERSION= /etc/os-release; nproc; free -h; df -h /'`. Нужно Ubuntu 22.04 или 24.04, от 2 CPU и 4 ГБ памяти.
- Если вход под root закрыт и есть пользователь с sudo (например `ops` из видео 2) — работай через него с `sudo`.

## 2. Подготовка системы (под root)

Сначала всё системное, потом пользователь агента.

```
apt update && apt upgrade -y
apt install -y curl git ca-certificates xz-utils build-essential python3-dev libffi-dev ripgrep ffmpeg fail2ban unattended-upgrades
timedatectl set-timezone Asia/Almaty
systemctl enable --now fail2ban unattended-upgrades
adduser --disabled-password --gecos "" hermes
loginctl enable-linger hermes
```

- Часовой пояс ✋ уточни у человека, если он не в Алматы. Без этого «каждое утро в 9:00» придёт по UTC.
- **Почему столько пакетов заранее:** без `build-essential` установщик падает на 14-й секунде и просит пароль sudo (14.09). Без `python3-dev` и `libffi-dev` он тоже тянется к sudo, даже при стоящем `build-essential` (15.09). `xz-utils` документация требует прямо.
- **Почему у `hermes` нет пароля и sudo:** всё системное уже поставил root, агенту права администратора не нужны, а человеку не нужно придумывать пароль.
- **Вход только по ключу.** На чистом сервере хостинга `PasswordAuthentication yes` (файл `50-cloud-init.conf`), и Hermes при запуске сам запишет это предупреждение в журнал. Закрой:
  ```
  printf 'PasswordAuthentication no\nKbdInteractiveAuthentication no\nPermitRootLogin prohibit-password\n' > /etc/ssh/sshd_config.d/01-keys-only.conf
  sshd -t && systemctl reload ssh
  ```
  Файл начинается с `01`, чтобы стоять раньше `50-cloud-init.conf`. **Проверь новым подключением** в отдельной команде, что вход по ключу работает.
- **Firewall:** если по видео 2 уже настроены Tailscale и ufw — не трогай. Если ufw выключен: `ufw allow 22/tcp && ufw --force enable` и сразу проверь, что SSH пускает. `ufw --force reset` на работающем сервере не выполняй.
- Проверка: `id hermes`; `loginctl show-user hermes -p Linger` → `Linger=yes`; `timedatectl | grep "Time zone"`.

## 3. Установка Hermes (под пользователем hermes)

Команды пользователя `hermes` выполняй так, чтобы работал его systemd:

```
ssh root@<IP> 'su - hermes -c "export XDG_RUNTIME_DIR=/run/user/$(id -u hermes); export PATH=\$HOME/.local/bin:\$PATH; <команда>"'
```

1. Официальный установщик (адрес сверь с документацией): `curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash`
2. Если в журнале установщика есть `a password is required` или он всё же просит sudo — не давай пароль. Установи недостающий пакет под root и запусти установщик снова.
3. **Браузер агента.** Без sudo установщик пропускает системные библиотеки Chromium, а браузер нужен для задач с живыми сайтами. Под root:
   ```
   cd /home/hermes/.hermes/hermes-agent && PATH=/home/hermes/.hermes/node/bin:$PATH npx --yes playwright install-deps chromium
   ```
   Сообщение установщика «No sudo — skipping» останется и при повторном запуске — оно ложное, если команда выше прошла.
4. Проверка: `hermes --version`, затем `hermes doctor`. **Норма для `doctor`:** предложение миграции конфига и уязвимости npm в модулях браузера (15.09: одна high, критических нет) — закрываются `hermes update`, установку не останавливают.

## 4. Модель по подписке ChatGPT

1. Вход без браузера на сервере: `hermes auth add openai-codex --type oauth --no-browser`
2. ✋ Команда выдаст ссылку и код. Передай человеку ссылку и код, скажи: открыть ссылку в браузере, войти в свой ChatGPT, ввести код, подтвердить. Жди «готово».
3. **Смени модель** (грабля 14.09): в шаблоне стоит модель Claude, и с подпиской ChatGPT первая переписка падает с HTTP 400.
   ```
   hermes config set model.provider openai-codex
   hermes config set model.default gpt-6-astra
   ```
   Возьми первую модель из живого списка подписки (`hermes model` → ChatGPT Subscription), если она новее. 15.09 список начинался с `gpt-6-astra`, `gpt-5.5` стоял последним.
4. Проверка: `hermes chat -q "Какая у тебя модель? Сколько свободной памяти на этом сервере — возьми цифры из терминала"`. Ответ с реальными цифрами — модель работает. **Пока нет ответа, дальше не идём.**
   Предупреждение `tirith security scanner … not available` при первом запуске — одноразовое: сканер ставится сам через пару секунд. Ничего не делай.

## 5. Бот в Telegram

1. ✋ Человек создаёт бота: Telegram → **@BotFather** (с синей галочкой) → `/newbot` → имя → логин на `bot`. BotFather пришлёт токен. Скажи: **токен в чат не присылать**. Имя может быть занято — пусть придумает другое.
2. ✋ Человек узнаёт свой числовой ID в **@userinfobot** и присылает тебе число (ID не секрет).
3. Токен сохраняешь по разделу 6. В `~/.hermes/.env` пользователя hermes должны быть строки:
   ```
   TELEGRAM_BOT_TOKEN=<токен>
   TELEGRAM_ALLOWED_USERS=<ID человека>
   ```
   `GATEWAY_ALLOW_ALL_USERS=true` не ставить никогда. Права: `chmod 600 ~/.hermes/.env`.

## 6. Как принять секрет, не видя его

Сделай на компьютере человека маленький скрипт: он спрашивает токен скрытым вводом и по SSH дописывает его в файл на сервере. Человек запускает скрипт одной короткой строкой.

- **Windows (PowerShell):** `Read-Host -AsSecureString`, перевод в строку, **удалить символы `\r` и `\n`** перед отправкой. Грабля 14.09: PowerShell дописывает невидимый символ конца строки, токен становится длиннее, Telegram его не принимает.
- **Длинные команды не давай копировать из чата** — они рвутся на строки. Только короткая строка запуска скрипта.
- После записи проверь на сервере длину токена и формат `цифры:буквы` (можно `getMe`), **не выводя сам токен**. Скрипт после использования удали.

## 7. Служба: работает всегда и переживает перезагрузку

```
hermes config set gateway.systemd_watchdog_seconds 120
hermes gateway install --force
systemctl --user restart hermes-gateway
systemctl --user is-enabled hermes-gateway     # enabled
systemctl --user is-active hermes-gateway      # active
systemctl --user show hermes-gateway -p WatchdogUSec   # 2min
```

- **Грабля 14.09:** без `--force` на чистой машине `install` падает на `daemon-reload`, а `start` всё равно запускает службу — «работает», но без автозапуска. Проверка `is-enabled` обязательна.
- **Сторож зависаний:** `config set` пишет «not a recognized config key», но сторож включается — это ложное предупреждение (15.09). Верь `WatchdogUSec=2min`. Если его нет — замени в `~/.hermes/config.yaml` строку `gateway: null` на `gateway:` + `  systemd_watchdog_seconds: 120` и повтори `install --force`.
- ✋ Человек пишет боту «Привет, кто ты?». **Первым сообщением бот сам попросит домашний чат** («No home channel is set… Type /sethome») — ✋ человек отправляет `/sethome`. Туда будут приходить результаты задач по расписанию. Затем бот отвечает на «Привет».
- **Проверка перезагрузкой:** предупреди человека, выполни `reboot`, подожди около 40 секунд, проверь `is-active`, ✋ человек снова пишет боту. Время в журнале сверяй с `uptime -s` на самом сервере, а не с часами ноутбука: они расходятся, и запись «telegram connected» после перезагрузки может выглядеть как старая. Ответил — шаг пройден.

## 8. Бизнес-скиллы

✋ **Сначала предупреди человека:** Claude Code в автоматическом режиме может отказать в установке скиллов из GitHub (`[Untrusted Code Integration]`) — это нормальная осторожность, решение за человеком. Лучший порядок: открой скиллы на GitHub, проверь, что внутри только текст (нет команд, ключей, отправки данных), расскажи человеку простыми словами, и после его «да» ставь — Claude Code спросит разрешение, человек нажимает «разрешить».

```
hermes skills install coreyhaines31/marketingskills/skills/product-marketing --yes
hermes skills install coreyhaines31/marketingskills/skills/offers --yes
hermes skills install coreyhaines31/marketingskills/skills/competitor-profiling --yes
hermes skills install coreyhaines31/marketingskills/skills/lead-magnets --yes
hermes skills install CodeAlive-AI/ceo-ai-os/skills/decision-playbook --yes
hermes skills install CodeAlive-AI/ceo-ai-os/skills/competitive-analysis --yes
hermes skills list
```

- **Итог проверяй по `hermes skills list`** (все `enabled`), а не по хвосту вывода установки — строки с вердиктом сканера там обрезаются.
- Каждый скилл проходит проверку безопасности. Если установка **заблокирована** — не ставь с `--force`: покажи человеку находку и объясни простыми словами. (14.09 `copywriting` из той же библиотеки был заблокирован ложной тревогой на тестовом файле — его не ставим.)
- `competitor-profiling` написан под платные Firecrawl и DataForSEO и ждёт готовые ссылки. Hermes справляется встроенным бесплатным поиском и браузером — в задаче прямо скажи «ищи своим веб-поиском и браузером».
- `competitive-analysis` (ceo-ai-os) — стратегическая часть разбора, чистый текст. **Не ставь** `competitor-research` оттуда же: внутри вызов программы `orth` и платного Exa.
- ✋ Человек пишет боту: `/offers <свой бизнес, цена, в чём сложность> — упакуй оффер для поста в Instagram`. Жди готовый текст — это контрольная точка.

## 9. Задача по расписанию

- Формат по дням недели: `hermes cron create "every monday 9am" "<задание>" --deliver telegram`. Cron-строка `"0 9 * * 1"` тоже работает.
- **Запись `every 1d at 09:00` не работает** (Invalid duration, v0.21.2–0.21.3), хотя приведена в документации как пример.
- `/sethome` уже отправлен в разделе 7 — без него результатам некуда прийти.
- Для проверки: `hermes cron create "in 2m" "<короткое сообщение>" --deliver telegram`, ✋ человек подтверждает, что сообщение пришло само. После этого `hermes cron remove <id>` — выполненная разовая задача иначе остаётся в `hermes cron list --all` как completed.
- Предложи одну полезную еженедельную задачу, например «каждый понедельник в 9:00 присылай идею акции на неделю, используя скилл offers». Одну, а не десять: задачи по расписанию тратят подписку без участия человека.

## 10. Безопасность и памятка

- `approvals.mode` — `smart` (не `off`).
- **`skills.write_approval true` — обязательно** (по умолчанию `false`): `hermes config set skills.write_approval true` и перезапуск службы. На этом держится обещание «самообучение под контролем»: агент предлагает изменить навык, человек подтверждает.
- Порты: `ss -tlnp`. Наружу — только SSH (и Tailscale, если есть). `zabbix_agentd :10050` — мониторинг хостинга, ufw закрывает его снаружи, не трогать.
- Проверка SSH: `sshd -T | grep -E "^(passwordauthentication|permitrootlogin) "` → `no` и `prohibit-password`; в журнале Hermes после перезапуска нет предупреждения про вход по паролю.
- В конце дай человеку короткую памятку простыми словами: как понять, что бот жив; где логи (`hermes logs gateway -n 50`); диагностика (`hermes doctor`); как обновить (`hermes update`); как удалить всё (`hermes gateway uninstall`, затем от root `deluser --remove-home hermes`).

## Финиш: установка закончена, когда

1. Бот отвечает владельцу в Telegram.
2. После перезагрузки сервера бот ответил снова.
3. `/offers` вернул готовый текст.
4. Разовая задача по расписанию пришла сама и удалена.
5. Вход на сервер только по ключу, `skills.write_approval true`.
6. Человек получил памятку.

## Грабли, проверенные 14–15.09.2026

| Симптом | Причина | Что делать |
|---|---|---|
| Установщик падает за 14 с, «No C++ compiler», просит пароль | нет `build-essential` | раздел 2: поставить под root до установщика |
| В журнале установщика `a password is required` при стоящем `build-essential` | нет `python3-dev`, `libffi-dev` | раздел 2: доставить под root, повторить установщик |
| Агент не открывает сайты, «No sudo — skipping» браузера | нет системных библиотек Chromium | раздел 3, п. 3: `playwright install-deps chromium` |
| `hermes: command not found` | не перечитано окружение | `~/.local/bin` в PATH или перезайти |
| HTTP 400 … not supported when using Codex with a ChatGPT account | в шаблоне модель Claude | раздел 4, п. 3 |
| `tirith security scanner … not available` | сканер ещё ставится | одноразово, ничего не делать |
| `not a recognized config key` для watchdog | ложное предупреждение | проверить `WatchdogUSec=2min` |
| `Failed to connect to bus` при `systemctl --user` | у `su -` нет XDG_RUNTIME_DIR | `export XDG_RUNTIME_DIR=/run/user/$(id -u hermes)`, linger включён |
| После перезагрузки бот молчит | служба не enabled | `hermes gateway install --force`, проверить `is-enabled` |
| «No home channel is set for Telegram» | не задан домашний чат | человек отправляет боту `/sethome` |
| Бот не принимает токен | невидимый `\r` из PowerShell | раздел 6: удалить `\r\n` |
| Claude Code: `[Untrusted Code Integration]` на установке скиллов | защита авто-режима | раздел 8: показать, что внутри, человек нажимает «разрешить» |
| «В 9 утра» приходит в 14:00 | сервер по UTC | `timedatectl set-timezone Asia/Almaty` |
| `every 1d at 09:00` → Invalid duration | формат не поддерживается | `every monday 9am` или `0 9 * * 1` |
| Скилл «Blocked (community source + caution verdict)» | сканер безопасности | не `--force`; показать находку человеку |
| `doctor`: миграция конфига, уязвимости npm | модули браузера | норма; `hermes update` |
