Як підключитися до агента Hermes із телефона
Дізнайтеся, як відкрити Hermes на VPS із телефона через приватну mesh-мережу, HTTPS або SSH, а також відкликати доступ у разі втрати телефона.
Три способи підключитися до агента Hermes із телефона
Щоб підключитися до агента Hermes із телефона, використовуйте його вебпанель. Основне рішення полягає в тому, що буде розташовано перед цією панеллю. Варіант 1 — приватна mesh-мережа, у якій панель доступна лише за адресою Tailscale, а жоден порт не відкритий в інтернет. Варіант 2 — публічна кінцева точка за reverse proxy з TLS (безпекою транспортного рівня) і входом у систему. У цьому випадку цей вхід є єдиним захистом термінала, підключеного до вашого сервера. Варіант 3 — SSH (захищена оболонка) із термінальної програми. Він потребує найменше налаштувань і надає найбільший рівень доступу.
Цей посібник починається там, де завершується запуск агента Hermes на власному VPS. Агент уже встановлено, він відповідає в командному рядку, і тепер ви хочете мати доступ до нього з телефона.
Наведені нижче команди перевірено для tag v2026.8.3, опублікованого 3 August 2026 і позначеного як v0.20.0 у release notes. Hermes часто випускає нові версії, тому зафіксуйте машину на певному tag, а не стежте за main. Інсталятор приймає commit:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --commit 3c27eb6234bf
hermes versionhermes version виводить фактично встановлену версію. Порівняйте її з tag, перш ніж довіряти будь-якому flag на цій сторінці.
Що містить репозиторій і чого в ньому немає
У репозиторії Hermes немає застосунку для iOS або Android. Нативний клієнт — hermes desktop (псевдонім hermes gui), застосунок Electron для macOS, Windows і Linux. Він може підключатися до віддаленого агента замість локального: у Settings у розділі Gateway задайте віддалений URL http://<server-address>:9119 або експортуйте HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 перед запуском застосунку. Це вирішує проблему другого ноутбука. Для телефона це нічого не змінює.
Інтерфейс, який ви використовуєте з телефона, — hermes dashboard, тобто браузерний інтерфейс. Він керує конфігурацією, сесіями, завданнями cron, навичками, журналами та платформами обміну повідомленнями, а також містить термінал: сервер запускає hermes --tui через PTY (псевдотермінал) і передає вивід на сторінку. На вузькому екрані перемикач сесій згортається в бічну панель, що виїжджає, тому макет залишається придатним для використання з телефона.
За замовчуванням dashboard прослуховує 127.0.0.1:9119 і відкриває вкладку браузера безпосередньо на сервері. На headless VPS (віртуальному приватному сервері) це не допомагає. Запустіть його без браузера та перевірте socket:
hermes dashboard --no-open
ss -lntp | grep 9119Служба, що прослуховує 127.0.0.1:9119, доступна лише із сервера. Служба, що прослуховує 0.0.0.0:9119, доступна з кожної мережі, до якої підключена машина, зокрема з публічної мережі. Цей один рядок визначає, наскільки відкритим є сервіс, тому перевірте його, а не робіть припущень.
Варіант 1: приватна mesh-мережа з Tailscale
Обирайте цей варіант, якщо немає особливих причин цього не робити. Tailscale — це mesh VPN (віртуальна приватна мережа) на основі WireGuard. Кожен доданий пристрій отримує стабільну адресу та безпосередньо взаємодіє з іншими пристроями. Телефон підключається до тієї самої mesh-мережі, тому для dashboard взагалі не потрібен публічний порт.
На сервері:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4Встановіть застосунок Tailscale на телефон і ввійдіть у той самий обліковий запис. Команда tailscale status на сервері покаже телефон за його ім’ям. Тепер прив’яжіть dashboard до адреси, яку вивела команда tailscale ip -4:
hermes dashboard --host 100.101.102.103 --port 9119 --no-openПрив’язка до адреси mesh-мережі, а не до 0.0.0.0, означає, що listening socket існує лише на інтерфейсі Tailscale. Сканування публічної IP-адреси не виявить порт 9119, оскільки на ньому нічого не слухає. Отже, firewall більше не є вашим єдиним захистом. Ще раз підтвердьте це за допомогою ss -lntp | grep 9119.
Адреса прив’язки також визначає автентифікацію. Саме цю деталь часто пропускають. На 127.0.0.1 dashboard не має входу. Для будь-якої іншої адреси auth gate є обов’язковим. Якщо provider не налаштовано, сервер відмовляється запускатися. Проєкт називає це безпечною відмовою із забороною доступу. Під час першого інтерактивного запуску програма запропонує одразу налаштувати ім’я користувача та пароль. Результат буде записано до ~/.hermes/.env:
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=you
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=scrypt$16384$8$1$...
HERMES_DASHBOARD_BASIC_AUTH_SECRET=a-long-random-stringЗгенеруйте цей секрет за допомогою openssl rand -hex 32 і більше його не змінюйте. Він підписує cookie сеансу, тому після його зміни всі пристрої буде виведено із системи. У цьому самому файлі зберігаються API-ключі вашої моделі, тому захистіть його за допомогою chmod 600 ~/.hermes/.env.
Перш ніж довіряти налаштуванню, перевірте gate з іншої машини в mesh-мережі:
curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'true разом із ["basic"] означає, що gate увімкнено, а відповідає саме password provider. У документації проєкту прямо зазначено обмеження цього provider: він призначений для довіреної мережі або VPN і не підходить для dashboard, доступного з публічного інтернету. У mesh-мережі ви маєте саме таку конфігурацію.
Щоб використовувати HTTPS усередині tailnet, передайте порт Tailscale:
sudo tailscale serve --bg localhost:9119
sudo tailscale serve statusTailscale завершує TLS за допомогою сертифіката, виданого для MagicDNS-імені машини. Тому браузер більше не показує попередження, а cookie сеансу отримує свій прапорець Secure. Спочатку увімкніть MagicDNS і HTTPS Certificates на сторінці DNS в адміністративній консолі Tailscale. Також прочитайте повідомлення про підтвердження: імена ваших машин і DNS-ім’я tailnet публікуються у відкритому реєстрі прозорості сертифікатів, який може прочитати будь-хто.
Справжня плата за цей підхід — coordination server. Трафік між телефоном і VPS шифрується наскрізно та не проходить через Tailscale. Однак обліковий запис, який визначає, які пристрої належать до mesh-мережі, не зберігається на вашому обладнанні. Якщо це важливо, запустіть control plane самостійно за допомогою Headscale, self-hosted control server для Tailscale і вкажіть його клієнтам за допомогою tailscale up --login-server https://headscale.example.com. Якщо ви хочете відмовитися від mesh-мережі та налаштовувати peers вручну, порівняння звичайного WireGuard і Tailscale пояснює, від чого доведеться відмовитися.
Варіант 2: публічна HTTPS-адреса та прихована небезпека
Іноді mesh недоступний. На робочий телефон може бути заборонено встановлювати VPN-клієнт. Тоді dashboard розміщують за reverse proxy. Залиште dashboard доступним лише через loopback, а сертифікат передайте під керування Caddy:
hermes.example.com {
reverse_proxy 127.0.0.1:9119
}Caddy самостійно отримує та поновлює сертифікат. Його reverse_proxy пропускає WebSocket upgrades без додаткових директив. Це потрібно для вбудованого термінала dashboard. У nginx заголовки Upgrade і Connection потрібно додати вручну. У матеріалі отримання сертифіката Let's Encrypt за допомогою Certbot у nginx описано TLS-частину цього завдання. Повідомте Hermes його публічне ім’я, щоб callbacks для входу вказували на правильний хост:
dashboard:
public_url: "https://hermes.example.com"Тепер про приховану небезпеку. Механізм автентифікації перевіряє адресу прив’язки, а не адресу, з якої надійшов запит. Якщо dashboard прив’язаний до 127.0.0.1 і працює за proxy, він бачить loopback, вирішує, що вхід не потрібен, і обслуговує будь-кого, кому proxy надає доступ. Перевірте, що саме ви опублікували:
curl -s https://hermes.example.com/api/status | jq '.auth_required'Якщо команда виведе false, до термінала на сервері можна дістатися з Інтернету за однією URL-адресою. Експлойт не потрібен, і в журналах не буде помилки. Є два способи виправити це. Потрібно застосувати щонайменше один із них. Додайте автентифікацію на proxy, використовуючи Authentik як self-hosted провайдер single sign-on перед ним через forward auth, або налаштуйте власного OIDC (OpenID Connect) провайдера dashboard:
HERMES_DASHBOARD_OIDC_ISSUER=https://auth.example.com/application/o/hermes/
HERMES_DASHBOARD_OIDC_CLIENT_ID=hermes-dashboard
HERMES_DASHBOARD_OIDC_SCOPES="openid profile email"Навіть за правильної конфігурації цей варіант має обмеження, які неможливо усунути. Публічна сторінка входу доступна будь-кому, тому її можуть атакувати. За нею розміщено shell на вашому VPS. Ім’я користувача та пароль забезпечують для цього слабкий захист. Саме тому документація рекомендує OAuth або OIDC для публічних bind-адрес. Обмежте частоту спроб входу, залиште ufw закритим для всього, крім портів proxy і SSH і час від часу переглядайте access log.
Варіант 3: SSH і mosh із мобільного термінала
Найпростіший варіант: встановити на телефон застосунок-термінал, додати до нього ключ SSH і використовувати власний текстовий інтерфейс агента.
ssh you@vps.example.com
tmux new -A -s phone
hermes --tuitmux new -A -s phone підключається до сеансу з назвою phone або створює його, якщо такого сеансу ще немає. Тому агент продовжує працювати після розриву з’єднання, і наступного разу ви повертаєтеся до того самого місця. Такий самий підхід використовується для керування Claude Code із телефона.
Звичайний SSH через мобільну мережу незручний, оскільки з’єднання розривається щоразу, коли телефон змінює адресу або переходить у режим сну. Mosh усуває цю проблему. Він працює через UDP (user datagram protocol) і синхронізує стан термінала, а не потік байтів. Тому сеанс зберігається, коли ви переходите з Wi-Fi на мобільну мережу:
sudo apt install -y mosh
sudo ufw allow 60000:61000/udpНа телефоні виконайте mosh you@vps.example.com. Mosh запускає mosh-server через наявне SSH-підключення, а потім переносить сеанс на UDP у діапазоні від 60000 до 61000. Тому цей діапазон має бути відкритим.
Ризик для безпеки очевидний. Сеанс SSH — це shell, а shell має всі права, доступні цьому обліковому запису. Підказки агента щодо підтвердження дій стають останнім бар’єром між викраденим розблокованим телефоном і вашими файлами. Використовуйте для цього окремий обліковий запис без прав root, лише ключову автентифікацію, а перед додаванням ключа на пристрій, який ви носите із собою, виконайте посилення безпеки SSH на VPS.
Що не працює в мобільній мережі
Є чотири такі проблеми, і жодну з них не можна усунути налаштуваннями.
Панель керування завершує ваш сеанс, коли ви не дивитеся на неї. Термін дії access token становить 15 хвилин (time to live), а поточний API contract не підтримує refresh token. Коли термін дії token спливає, сторінка отримує відповідь 401 і повертається до /login. Відкрийте панель керування, покладіть телефон у кишеню на двадцять хвилин — і після повернення побачите екран входу, а введені дані буде втрачено. Нічого не зламалося. Увійдіть знову.
Вбудований термінал не зберігається у фоновій вкладці. Сервер запускає TUI (text user interface) за PTY і коректно завершує його, коли вкладку закрито. Повторне відкриття запускає новий екземпляр. Мобільні браузери видаляють фонові вкладки, щоб звільнити пам’ять, тому після достатньо тривалого переходу до іншої програми цей термінал завершується. Історія чату зберігається, оскільки сесії зберігаються на сервері, а hermes sessions list і далі показує їх. Сам термінал не можна відновити через повторне підключення. Якщо потрібна сесія, яка зберігається, використовуйте tmux через SSH.
Неактивні з’єднання непомітно розриваються. Мобільні оператори розривають неактивні TCP-з’єднання, щоб звільнити записи в таблиці NAT (network address translation), а після вимкнення екрана телефон майже повністю припиняє обробляти мережевий трафік. WebSocket, який певний час не передавав дані, зазвичай уже розірваний, коли ви розблоковуєте телефон, а сторінка повторно підключається лише після вашої взаємодії з нею. Саме тому mosh на телефоні працює краще за SSH: йому взагалі не потрібне з’єднання, яке можна втратити.
Сповіщення не надходять. Ні панель керування, ні сеанс SSH не можуть розбудити телефон. На пристрої немає програми Hermes, тому немає шляху до push service платформи. Тривалий запуск агента завершується, а ви дізнаєтеся про це наступного разу, коли перевірите телефон.
Сповіщення надходять через шлюз обміну повідомленнями
Виправлення для останньої проблеми — це шлюз. Він використовує зовсім інший спосіб доступу до агента. hermes gateway підключає агента до платформ обміну повідомленнями, зокрема Telegram, Discord, Slack, WhatsApp, Signal та електронної пошти. Після цього ви спілкуєтеся з агентом у застосунку, який уже має push-канал на телефоні, підтримує доставку у фоновому режимі та коректно працює навіть у разі втрати мережевого з’єднання.
hermes gateway setup
hermes gateway install
hermes gateway statushermes gateway install реєструє шлюз як службу systemd, тому після перезавантаження він запускається знову. Інсталятор Hermes не створює для вас unit-файли служб, тому hermes dashboard не запуститься автоматично після перезапуску. Створіть unit для кожного потрібного компонента. Опис самого файла наведено в матеріалі про створення служб і таймерів systemd на VPS.
Заплановане завдання також може передати результат таким самим способом, без участі в діалозі:
hermes send -t telegram -s "Backup report" -f /home/you/report.txtТут за замовчуванням діє заборона. Якщо список дозволених користувачів не задано, а GATEWAY_ALLOW_ALL_USERS не встановлено, усім користувачам буде відмовлено в доступі. Це правильне початкове налаштування. Вкажіть облікові записи, яким потрібно надати доступ, у ~/.hermes/.env:
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789Або увімкніть спарювання за кодом замість вставлення числових ідентифікаторів, встановивши unauthorized_dm_behavior: pair у ~/.hermes/config.yaml. Невідомий обліковий запис, який надсилає повідомлення агенту, отримує восьмизначний код. До його підтвердження нічого іншого не відбувається:
hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789Коди дійсні протягом однієї години. Користувач може запитувати код один раз на десять хвилин. П’ять невдалих спроб блокують цей обліковий запис.
Обмеження масштабу наслідків у разі викрадення телефона
Телефон, який може підключатися до вашого агента, може виконувати команди на сервері. Телефони губляться. Заздалегідь визначте, що зможе зробити людина, у якої опиниться цей телефон.
Не вимикайте підтвердження. approvals.mode має значення за замовчуванням smart. Воно залучає допоміжну модель для оцінювання ризику й автоматично підтверджує лише команди з низьким ризиком. Значення off еквівалентне запуску всіх команд із --yolo, а HERMES_YOLO_MODE=1 робить те саме через середовище. Не носіть із собою телефон, підключений до агента в такому режимі. Установіть approvals.cron_mode: deny, щоб заплановані завдання не могли підтверджувати самі себе, поки ви спите.
approvals:
mode: smart
cron_mode: denyЗменште область, у якій агент може завдати шкоди. terminal.backend: docker виконує команди в контейнері, вилучає всі можливості Linux, крім короткого списку, установлює no-new-privileges і обмежує кількість процесів. Тому межею захисту стає контейнер, а не підказка. terminal.cwd фіксує робочий каталог. HERMES_WRITE_SAFE_ROOT обмежує write_file і patch каталогами, які ви вкажете. Запис за їхні межі блокується, і підтвердження не може це обмеження скасувати.
export HERMES_WRITE_SAFE_ROOT=/home/you/projects:/home/you/.hermesHermes уже блокує запис до ~/.ssh, ~/.aws, ~/.kube і /etc/sudoers, відмовляється записувати файли .env у будь-яке місце на диску та відхиляє команди зі списку небезпечних операцій незалежно від налаштувань підтвердження. Вважайте це мінімальним рівнем захисту, а не готовим планом. Запускайте агента від імені звичайного користувача, ніколи не використовуйте root. Те саме стосується будь-якого coding agent, який працює без нагляду. Докладніші відомості наведено в матеріалі безпечний запуск Claude Code на VPS.
Заздалегідь запишіть порядок відкликання доступу. Видалення пристрою в адміністративній консолі Tailscale одразу припиняє доступ до mesh network. Зміна HERMES_DASHBOARD_BASIC_AUTH_SECRET і перезапуск анулюють усі сесії dashboard на всіх пристроях, оскільки це значення підписує cookie сесії. Видалення публічного ключа телефона з ~/.ssh/authorized_keys припиняє доступ через SSH. hermes pairing revoke telegram <user-id> видаляє обліковий запис у системі обміну повідомленнями. Якщо на пристрої зберігалися дані, за допомогою яких можна було прочитати ключі вашого провайдера, відкличте їх через hermes auth logout <provider> і створіть нові ключі у провайдера.
Перевірте результат, а не покладайтеся на припущення. Це команди для виконання на вашому сервері. Виведені дані залежать від вашої конфігурації:
tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deepЖурнали зберігаються в ~/.hermes/logs/. Читайте їх після інциденту та періодично перевіряйте навіть за відсутності інцидентів.
FAQ
Чи є офіційний мобільний застосунок Hermes для iOS або Android?
Ні. Репозиторій Hermes містить інтерфейс командного рядка, вебпанель і десктопний клієнт Electron для macOS, Windows та Linux. Офіційної збірки для iOS або Android немає. На телефоні можна використовувати вебпанель у браузері, SSH-клієнт або платформу обміну повідомленнями, підключену через hermes gateway. Сторонні мобільні клієнти існують, але це сторонній код, який отримує облікові дані вашого агента, тому перед установленням прочитайте його вихідний код.
Чому вебпанель Hermes виходить із мого облікового запису на телефоні?
Час життя токенів доступу становить 15 хвилин, а поточний API-контракт не підтримує refresh token. Після завершення терміну дії токена сторінка отримує відповідь 401 і переходить до /login. На телефоні це особливо помітно, оскільки двадцяти хвилин в іншому застосунку достатньо, щоб токен втратив чинність. Установіть для HERMES_DASHBOARD_BASIC_AUTH_SECRET стабільне випадкове значення, щоб ключ підпису сесії не змінювався після перезапусків. Це усуне другу причину виходу із системи.
Чи можна безпечно розмістити вебпанель Hermes у публічному інтернеті?
Лише з автентифікацією, яку ви самостійно перевірили. Автентифікація вмикається залежно від адреси прив’язки, тому вебпанель, прив’язана до 127.0.0.1 і розміщена за reverse proxy, не запитує логін у користувачів з інтернету. Виконайте curl -s https://your-host/api/status | jq '.auth_required' і перегляньте результат. Використовуйте OAuth або OIDC замість імені користувача й пароля, оскільки в документації проєкту зазначено, що password provider призначений для довірених мереж і VPN. Приватна mesh-мережа повністю усуває це питання, тому вона є кращим варіантом за замовчуванням.
Чи потрібен обліковий запис Tailscale, чи можна розмістити control plane самостійно?
Ви можете розмістити його самостійно. Headscale — це відкрита реалізація сервера координації Tailscale, до якого офіційні клієнти Tailscale підключаються за допомогою tailscale up --login-server https://headscale.example.com. Після цього ви самостійно керуєте списком пристроїв, яким дозволено підключатися до mesh-мережі. Недолік полягає в тому, що вам доведеться запускати цей сервер і створювати його резервні копії. Поки сервер недоступний, ви не зможете додавати пристрої до мережі або повторно автентифікувати їх.
Як отримати сповіщення на телефон, коли агент завершить завдання?
Використовуйте messaging gateway. Вебпанель і SSH не можуть розбудити телефон, оскільки на пристрої немає застосунку Hermes, який отримував би push-сповіщення. Підключіть агента до Telegram, Signal, Discord або іншої підтримуваної платформи за допомогою hermes gateway setup, а доставлення доручіть власному застосунку цієї платформи. Завдання cron також може надіслати одне повідомлення через hermes send -t telegram -s "Job done" -f /path/to/report.txt. Для цього не потрібно викликати модель.