SSD Nodes Learn Hosting plans →
Посібники Matt ConnorВід Matt Connor

Як підключитися до агента Hermes із телефона

Дізнайтеся, як відкрити Hermes на VPS із телефона через приватну mesh-мережу, HTTPS або SSH, а також відкликати доступ, якщо телефон загублено.

Три способи підключитися до агента Hermes із телефона

Щоб підключитися до агента Hermes із телефона, використовуйте його вебпанель. Основне рішення — що буде розміщено перед цією панеллю. Варіант 1 — приватна mesh-мережа, у якій панель прослуховує лише адресу Tailscale, а жоден порт не доступний з інтернету. Варіант 2 — публічна кінцева точка за reverse proxy з TLS (transport layer security) і входом до системи. У цьому випадку саме облікові дані для входу є єдиним захистом термінала на сервері. Варіант 3 — SSH (secure shell) із термінальної програми. Він потребує найменше налаштувань і надає найбільший рівень доступу.

Цей посібник починається там, де завершується запуск агента 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 --version

hermes --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 jobs, skills, журналами та платформами обміну повідомленнями. Також він містить термінал: сервер запускає hermes --tui за PTY (pseudo-terminal) і передає вивід на сторінку. На вузькому екрані перемикач сесій відкривається як бічна панель, тому макет залишається зручним для телефона.

За замовчуванням dashboard слухає на 127.0.0.1:9119 і відкриває вкладку браузера безпосередньо на сервері. На headless VPS (virtual private server) це не допомагає. Запустіть його без браузера та перевірте socket:

hermes dashboard --no-open
ss -lntp | grep 9119

Listener на 127.0.0.1:9119 доступний лише із самого сервера. Listener на 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 не має login. Для будь-якої іншої адреси auth gate є обов’язковим. Якщо provider не налаштовано, сервер відмовляється запускатися. Проєкт називає таку поведінку fail closed. Першого разу запустіть його в інтерактивному режимі. Програма запропонує одразу налаштувати username і password та збереже їх як dashboard.basic_auth у ~/.hermes/config.yaml. Такий самий 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

Згенеруйте цей secret командою openssl rand -hex 32 і більше його не змінюйте. Він підписує session cookie, тому після його зміни всі пристрої буде виведено із системи. У цьому самому файлі зберігаються API keys вашої моделі, тому захистіть його командою 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: він призначений для trusted network або VPN і не підходить для dashboard, доступного з публічного інтернету. У mesh-мережі саме така ситуація у вас і є.

Для HTTPS усередині tailnet передайте порт Tailscale:

sudo tailscale serve --bg localhost:9119
sudo tailscale serve status

Tailscale завершує TLS за допомогою сертифіката, виданого для імені машини в MagicDNS. Тому браузер більше не показує попередження, а session cookie отримує свій прапорець Secure. Спочатку увімкніть MagicDNS і HTTPS Certificates на сторінці DNS в адміністративній консолі Tailscale. Також прочитайте повідомлення-підтвердження: імена ваших машин та DNS-ім’я tailnet публікуються у відкритому журналі certificate transparency, який може прочитати будь-хто.

Чесна ціна цього рішення — coordination server. Трафік між телефоном і вашим VPS шифрується end to end і не проходить через 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 upgrade без додаткових директив. Це потрібно для вбудованого термінала dashboard. У nginx потрібно самостійно додати заголовки Upgrade і Connection. У матеріалі отримання сертифіката Let’s Encrypt за допомогою Certbot у nginx описано TLS-частину цього завдання. Вкажіть Hermes його публічне ім’я, щоб callback після входу спрямовував на правильний хост:

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-провайдера dashboard (OpenID Connect):

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 --tui

tmux new -A -s phone підключається до сесії з назвою phone або створює її, якщо такої сесії немає. Тому агент продовжує працювати після розриву з’єднання, а наступного разу ви повертаєтеся в те саме місце. Такий самий підхід використовується для керування Claude Code із телефона.

Звичайний SSH через мобільну мережу незручний, оскільки з’єднання розривається щоразу, коли телефон змінює адресу або переходить у режим сну. Mosh вирішує цю проблему. Він працює через UDP (user datagram protocol) і синхронізує стан термінала, а не потік байтів, тому сесія зберігається під час переходу з wifi на мобільну мережу:

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.

Що виходить з ладу в мобільній мережі

Чотири речі. І жодну з них не можна виправити налаштуваннями.

Панель керування завершує сеанс, коли ви не дивитеся на екран. Час залежить від постачальника автентифікації. Постачальник автентифікації за іменем користувача та паролем за замовчуванням видає сеанси тривалістю 12 годин. Це визначає параметр session_ttl_seconds у dashboard.basic_auth. Постачальник OAuth Nous Portal видає access token із TTL (time to live) 15 хвилин, а поточний API contract не підтримує refresh token. Коли token спливає, сторінка отримує відповідь 401 і переходить назад до /login. Якщо token діє 15 хвилин, відкрийте панель керування, покладіть телефон у кишеню на двадцять хвилин — і повернетеся до екрана входу з утраченим текстом, який ви вводили. Нічого не зламалося. Увійдіть знову.

Вбудований термінал не зберігається у фоновій вкладці. Сервер запускає TUI (text user interface) за PTY і коректно завершує його, коли вкладка закривається. Повторне відкриття запускає новий екземпляр. Мобільні браузери вивантажують фонові вкладки, щоб звільнити пам’ять. Тому після достатньо тривалого перемикання на іншу програму цей термінал завершується. Історія чату зберігається, оскільки сеанси зберігаються на сервері, а hermes sessions list і надалі їх показує. Сам термінал не можна відновити через reattach. Якщо потрібен сеанс, який зберігається, використовуйте tmux через SSH.

Неактивні з’єднання непомітно розриваються. Мобільні оператори видаляють неактивні TCP-з’єднання, щоб звільняти записи в таблиці NAT (network address translation). Коли екран вимкнено, телефон майже повністю припиняє обробляти мережевий трафік. WebSocket, який певний час не передавав дані, зазвичай уже не працює, коли ви розблоковуєте телефон. Сторінка повторно підключається лише після вашої взаємодії з нею. Саме тому mosh на телефоні працює краще за SSH: йому не потрібне з’єднання, яке можна втратити.

Жодне сповіщення не надходить автоматично. Ні панель керування, ні SSH-сеанс не можуть розбудити телефон. На пристрої немає застосунку Hermes, тому немає шляху до push service платформи. Тривалий запуск агента завершується, а ви дізнаєтеся про це лише наступного разу, коли перевірите телефон.

Сповіщення надходять через messaging gateway

Рішенням для останнього випадку є gateway — інший спосіб взаємодії з agent. hermes gateway підключає agent до таких messaging platforms, як Telegram, Discord, Slack, WhatsApp, Signal та email. Після цього ви спілкуєтеся з agent у застосунку, який уже має push-канал на вашому телефоні, підтримує доставку у фоновому режимі та коректно працює навіть у разі втрати мережевого з’єднання.

hermes gateway setup
hermes gateway install
hermes gateway status

hermes gateway install реєструє gateway як службу systemd, тому після перезавантаження він запускається знову. Цей крок може виконати етап gateway в інсталяторі, але інсталятор не створює unit для hermes dashboard. Тому dashboard не запуститься автоматично після перезапуску. Створіть unit для кожного компонента, від якого ви залежите. Опис самого файла наведено в розділі створення служб і таймерів systemd на VPS.

Заплановане завдання також може передати результат у такий самий спосіб без участі в діалозі:

hermes send -t telegram -s "Backup report" -f /home/you/report.txt

Авторизація тут працює за принципом заборони за замовчуванням. Якщо allowlist не налаштовано, а GATEWAY_ALLOW_ALL_USERS не задано, усім користувачам буде відмовлено в доступі. Це правильний початковий стан. Вкажіть облікові записи, яким потрібен доступ, у ~/.hermes/.env:

TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789

Замість вставлення числових ID можна використовувати pairing на основі коду. Це типовий режим для chat-платформ із прямими повідомленнями. Його можна явно налаштувати через unauthorized_dm_behavior: pair у ~/.hermes/config.yaml. Невідомий обліковий запис, який надсилає повідомлення agent, отримує восьмизначний код. До моменту його схвалення нічого іншого не відбувається:

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/.hermes

Hermes уже блокує запис до ~/.ssh, ~/.aws, ~/.kube і /etc/sudoers, а також до власних сховищ секретів, зокрема ~/.hermes/.env. Файли .env проєкту в інших каталогах диска заборонено читати, але до них дозволено запис. Агент також відхиляє фіксований список руйнівних команд незалежно від параметрів підтвердження. Вважайте це мінімальним рівнем захисту, а не власним планом безпеки. Запускайте агент від імені звичайного користувача, ніколи не використовуйте root. Та сама логіка стосується будь-якого coding agent, який працює без нагляду; докладніше це описано в матеріалі безпечний запуск Claude Code на VPS.

Заздалегідь запишіть кроки відкликання доступу. Видалення пристрою в адміністративній консолі Tailscale одразу припиняє доступ до mesh-мережі. Зміна 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 виходить із мого облікового запису на телефоні?

Це залежить від провайдера автентифікації. Провайдер OAuth Nous Portal видає access token із TTL 15 хвилин. Його поточний API contract не має refresh token, тому після завершення терміну дії token сторінка отримує 401 і переходить до /login. На телефоні це особливо помітно: двадцяти хвилин в іншому застосунку достатньо, щоб виникла така ситуація. Провайдер з іменем користувача та паролем за замовчуванням використовує сеанс тривалістю 12 годин, визначений через session_ttl_seconds. Для цього провайдера задайте HERMES_DASHBOARD_BASIC_AUTH_SECRET як стабільне випадкове значення, щоб signing key сеансу не змінювався після перезапусків. Це усуває другу причину виходу з облікового запису.

Чи можна безпечно розмістити панель Hermes у публічному інтернеті?

Лише якщо ви самостійно перевірили автентифікацію. Auth gate вмикається залежно від bind address, тому панель, прив’язана до 127.0.0.1 і розміщена за reverse proxy, не запитує login у користувачів з інтернету. Виконайте curl -s https://your-host/api/status | jq '.auth_required' і перегляньте результат. Використовуйте OAuth або OIDC замість імені користувача та пароля, оскільки в документації проєкту зазначено, що password provider призначений для trusted networks і VPN. Приватна mesh-мережа повністю усуває це питання, тому є кращим варіантом за замовчуванням.

Чи потрібен мені обліковий запис Tailscale, або control plane можна розмістити самостійно?

Ви можете розмістити його самостійно. Headscale — це відкрита реалізація coordination server Tailscale. Офіційні клієнти Tailscale підключаються до нього через tailscale up --login-server https://headscale.example.com. Після цього ви самі керуєте списком пристроїв, яким дозволено підключатися до mesh-мережі. Недолік полягає в тому, що тепер ви відповідаєте за роботу та резервне копіювання цього сервера. Поки він недоступний, ви не зможете додавати пристрої або повторно автентифікувати їх.

Як отримати сповіщення на телефоні, коли агент завершить завдання?

Використовуйте messaging gateway. Панель і SSH не можуть розбудити телефон, оскільки на пристрої немає застосунку Hermes для отримання push-сповіщень. Підключіть агента до Telegram, Signal, Discord або іншої підтримуваної платформи через hermes gateway setup, а доставлення доручіть власному застосунку цієї платформи. Cron job також може надіслати одне повідомлення через hermes send -t telegram -s "Job done" -f /path/to/report.txt. Воно доставляється без виклику моделі.