№ настройки сигнала
Гермес остается к Сигналу через демон signal-cli, работая в HTTP-режиме. Адаптер передаёт сообщения в мгновение ока через SSE (события, отправленные сервером) и отправляет ответы через JSON-RPC.
Сигнал — самый ориентированный на конфиденциальность массовый мессенджер: сквозное шифрование по умолчанию, протокол с открытым исходным кодом, сбор метаданных. Это делает его усиление для агента безопасности технологических процессов.
ℹ️ Info
Без новых зависимостей Python Адаптер Signal используетhttpx (уже является основной зависимостью Hermes) для всей коммуникации. Дополнительные пакеты Python не требуются. Вам нужно установить signal-cli только извне.Предварительные требования
- signal-cli — Java-клиент Signal (GitHub)
- Java 17+ — выполнение среды, необходимое для signal-cli
- Номер телефона с установленным сигналом (для привязки в качестве вторичного устройства)
Установка signal-cli
# macOS
brew install signal-cli
# Linux (скачать последний релиз)
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} \
https://github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz"
sudo tar xf "signal-cli-${VERSION}.tar.gz" -C /opt
sudo ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/
```:::осторожно
signal-cli **отсутствует** в репозиториях apt или snap. Установка для Linux выше загружается напрямую из [релизов GitHub](https://github.com/AsamK/signal-cli/releases).</div>
---
## Шаг 1: Привяжите свою учётную запись Signal
Signal-cli работает как **связанное устройство** — как WhatsApp Web, но для Signal. Ваш телефон остается основным устройством.
```bash
# Сгенерировать URI для привязки (отображает QR-код или ссылку)
signal-cli link -n "HermesAgent"
- Откройте Сигнал на телефоне.
- Перейдите в ** Настройки → Связанные устройства**.
- Нажмите Связать новое устройство
- Отсканируйте QR-код или введите URI.
Шаг 2: Запустить демон signal-cli
# Замените +1234567890 на ваш номер телефона Signal (формат E.164)
signal-cli --account +1234567890 daemon --http 127.0.0.1:8080
```:::совет
Держите это работающим на фоне. Вы можете использовать `systemd`, `tmux`, `screen` или запустить как сервис.</div>
Проверьте, что он работает:
```bash
curl http://127.0.0.1:8080/api/v1/check
# Должен вернуть: {"versions":{"signal-cli":...}}
Шаг 3: Настраиваем Гермес
Самый простой способ:
hermes gateway setup
Выберите Сигнал в меню платформы. Мастер:
- Проверить, установлен ли signal-cli
- Запросить HTTP URL (по умолчанию:
http://127.0.0.1:8080) - Проверить связь с демоном.
- Запросить номер телефона вашей учетной записи.
- Настроить разрешённые пользователи и политику доступа.
Ручная настройка
Добавьте в ~/.hermes/.env:
# Обязательно
SIGNAL_HTTP_URL=http://127.0.0.1:8080
SIGNAL_ACCOUNT=+1234567890
# Безопасность (рекомендуется)
SIGNAL_ALLOWED_USERS=+1234567890,+0987654321 # Разделённые запятыми номера E.164 или UUID
# Опционально
SIGNAL_GROUP_ALLOWED_USERS=groupId1,groupId2 # Включить группы (опустите для отключения, * для всех)
SIGNAL_HOME_CHANNEL=+1234567890 # Цель доставки по умолчанию для задач cron
Затем запустите шлюз:
hermes gateway # На переднем плане
hermes gateway install # Установить как пользовательский сервис
sudo hermes gateway install --system # Только Linux: системный сервис при загрузке
Контроль доступа
Доступ к ЛС
Доступ к ЛС следует тому же шаблону, что и для всех других платформ Hermes:
SIGNAL_ALLOWED_USERSустановлен → только эти пользователи могут писать- Белый список не задан → неизвестные пользователи получают код привязки DM (одобрите через
hermes pairing approve signal CODE) SIGNAL_ALLOW_ALL_USERS=true→ любой может писать (используйте с осторожностью)
Доступ к группам
Доступ к группам контролируется переменной окружения SIGNAL_GROUP_ALLOWED_USERS:
| Конфигурация | Поведение |
|---|---|
| Не задана (по умолчанию) | Все групповые сообщения игнорируются. Бот отвечает только в ЛС. |
| Задана с ID групп | Отслеживаются только перечисленные группы (например, groupId1,groupId2). |
Задана как * |
Бот отвечает в любой группе, где он состоит. |
Возможности
Вложения
Адаптер поддерживает отправку и получение медиа в обоих направлениях.
Входящие (пользователь → агент):
- Изображения — PNG, JPEG, GIF, WebP (автоматически определяются по магическим байтам)
- Аудио — MP3, OGG, WAV, M4A (голосовые сообщения транскрибируются, если настроен Whisper)
- Документы — PDF, ZIP и другие типы файлов
Исходящие (агент → пользователь):
Агент может отправлять медиафайлы через теги MEDIA: в ответах. Поддерживаются следующие способы доставки:
- Изображения —
send_multiple_imagesиsend_image_fileотправляют PNG, JPEG, GIF, WebP как родные вложения Signal - Голос —
send_voiceотправляет аудиофайлы (OGG, MP3, WAV, M4A, AAC) как вложения - Видео —
send_videoотправляет видеофайлы MP4 - Документы —
send_documentотправляет файлы любого типа (PDF, ZIP и т.д.)
Все исходящие медиа проходят через стандартный API вложений Signal. В отличие от некоторых платформ, Signal не различает голосовые сообщения и вложения файлов на уровне протокола.
Ограничение размера вложений: 100 МБ (в обоих направлениях).
⚠️ Warning
Серверы Signal будут ограничивать скорость загрузки вложений, адаптер использует планировщик для отправки нескольких изображений, группируя изображения в пакеты по 32 и регулируя загрузки в соответствии с политикой сервера Signal.Нативное форматирование, цитаты ответов и реакции
Сообщения Signal отображаются с нативным форматированием вместо буквальных символов markdown. Адаптер преобразует markdown (**жирный**, *курсив*, `код`, ~~зачёркнутый~~, ||спойлер||, заголовки) в bodyRanges Signal, так что текст отображается с реальным стилем на клиенте получателя, а не как видимые символы ** / `.
Цитаты ответов. Когда Hermes отвечает на конкретное сообщение, он теперь публикует нативный ответ, цитирующий оригинал — тот же элемент интерфейса, который видят пользователи Signal, когда сами используют "Ответить". Это автоматически для ответов, сгенерированных на входящее сообщение.
Реакции. Агент может реагировать на сообщения через стандартный API реакций; реакции отображаются в Signal как эмодзи-реакции на указанное сообщение, а не как дополнительный текст.
Ничто из этого не требует дополнительной настройки — это работает по умолчанию в последних сборках signal-cli. Если ваша версия signal-cli слишком старая, Hermes возвращается к обычной текстовой доставке и записывает одноразовое предупреждение в лог.
Индикаторы набора текста
Бот отправляет индикаторы набора текста во время обработки сообщений, обновляя каждые 8 секунд.
Сокрытие номеров телефонов
Все номера телефонов автоматически скрываются в логах:
- +15551234567 → +155****4567
- Это относится как к логам шлюза Hermes, так и к глобальной системе сокрытия
Заметка для себя (настройка с одним номером)
Если вы запускаете signal-cli как связанное вторичное устройство на своём собственном номере телефона (а не на отдельном номере бота), вы можете взаимодействовать с Hermes через функцию "Заметка для себя" в Signal.
Просто отправьте сообщение самому себе с телефона — signal-cli подхватывает его, и Hermes отвечает в той же беседе.
Как это работает:
- Сообщения "Заметка для себя" приходят как конверты syncMessage.sentMessage
- Адаптер определяет, когда они адресованы собственной учётной записи бота, и обрабатывает их как обычные входящие сообщения
- Защита от эха (отслеживание временных меток отправки) предотвращает бесконечные циклы — собственные ответы бота автоматически отфильтровываются
Никакой дополнительной настройки не требуется. Это работает автоматически, если SIGNAL_ACCOUNT совпадает с вашим номером телефона.
Мониторинг здоровья
Адаптер отслеживает SSE-соединение и автоматически переподключается, если: - Соединение разрывается (с экспоненциальной задержкой: 2с → 60с) - Нет активности в течение 120 секунд (пингует signal-cli для проверки)
Устранение неполадок
| Проблема | Решение |
|---|---|
| "Cannot reach signal-cli" во время настройки | Убедитесь, что демон signal-cli запущен: signal-cli --account +YOUR_NUMBER daemon --http 127.0.0.1:8080 |
| Сообщения не получены | Проверьте, что SIGNAL_ALLOWED_USERS включает номер отправителя в формате E.164 (с префиксом +) |
| "signal-cli not found on PATH" | Установите signal-cli и убедитесь, что он находится в PATH, или используйте Docker |
| Соединение постоянно разрывается | Проверьте логи signal-cli на наличие ошибок. Убедитесь, что установлена Java 17+. |
| Групповые сообщения игнорируются | Настройте SIGNAL_GROUP_ALLOWED_USERS с конкретными ID групп или * для разрешения всех групп. |
| Бот никому не отвечает | Настройте SIGNAL_ALLOWED_USERS, используйте привязку DM или явно разрешите всех пользователей через политику шлюза, если нужен более широкий доступ. |
| Дублирующиеся сообщения | Убедитесь, что только один экземпляр signal-cli прослушивает ваш номер телефона |
Безопасность⚠️ Warning
Всегда настраивайте контроль доступа. Бот по умолчанию имеет доступ к терминалу. Без SIGNAL_ALLOWED_USERS или привязки DM шлюз отклоняет все входящие сообщения в качестве меры безопасности.
- Номера телефонов скрываются во всех выводах логов
- Используйте привязку DM или явные белые списки для безопасного подключения новых пользователей
- Держите группы отключёнными, если вам не нужна поддержка групп, или внесите в белый список только те группы, которым доверяете
- Сквозное шифрование Signal защищает содержимое сообщений при передаче
- Данные сессии signal-cli в ~/.local/share/signal-cli/ содержат учётные данные учётной записи — защищайте их как пароль
Справочник переменных окружения
⚠️ Warning
Всегда настраивайте контроль доступа. Бот по умолчанию имеет доступ к терминалу. Без SIGNAL_ALLOWED_USERS или привязки DM шлюз отклоняет все входящие сообщения в качестве меры безопасности.
| Переменная | Обязательно | По умолчанию | Описание |
|---|---|---|---|
SIGNAL_HTTP_URL |
Да | — | HTTP-конечная точка signal-cli |
SIGNAL_ACCOUNT |
Да | — | Номер телефона бота (E.164) |
SIGNAL_ALLOWED_USERS |
Нет | — | Разделённые запятыми номера телефонов/UUID |
SIGNAL_GROUP_ALLOWED_USERS |
Нет | — | ID групп для мониторинга или * для всех (опустите для отключения групп) |
SIGNAL_ALLOW_ALL_USERS |
Нет | false |
Разрешить любому пользователю взаимодействовать (пропустить белый список) |
SIGNAL_HOME_CHANNEL |
Нет | — | Цель доставки по умолчанию для задач cron |