SSD Nodes Learn Hosting plans →
Przewodniki Matt ConnorAutor: Matt Connor

Jak połączyć się z agentem Hermes przez telefon

Skonfiguruj zdalny dostęp do agenta Hermes na VPS za pomocą sieci mesh lub HTTPS. Dowiedz się, jak bezpiecznie zarządzać sesjami i natychmiastowo cofać uprawnienia dla urządzeń.

Trzy sposoby uzyskania dostępu do agenta Hermes z telefonu

Aby uzyskać dostęp do agenta Hermes z telefonu, należy skorzystać z jego panelu internetowego. Kluczową decyzją jest wybór rozwiązania pośredniczącego w dostępie do tego panelu. Pierwszą opcją jest prywatna sieć mesh, w której panel nasłuchuje wyłącznie na adresie Tailscale, a żaden port nie jest wystawiony do Internetu. Drugą opcją jest publiczny punkt końcowy za reverse proxy z TLS (transport layer security) i uwierzytelnianiem, gdzie to logowanie stanowi jedyne zabezpieczenie terminala serwera. Trzecią opcją jest SSH (secure shell) z poziomu aplikacji terminalowej, co wymaga najmniejszej konfiguracji, ale zapewnia najszerszy dostęp.

Niniejszy przewodnik rozpoczyna się w miejscu, w którym kończy się uruchamianie agenta Hermes na własnym VPS. Agent jest zainstalowany, odpowiada w wierszu poleceń, a teraz użytkownik chce mieć do niego dostęp mobilny.

Poniższe polecenia zostały przygotowane dla tagu v2026.8.3, opublikowanego 3 sierpnia 2026 r. i oznaczonego jako v0.20.0 w informacjach o wydaniu. Hermes publikuje nowe wersje często, dlatego należy przypiąć maszynę do konkretnego tagu, zamiast śledzić main. Instalator akceptuje commit:

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --commit 3c27eb6234bf
hermes --version

hermes --version wyświetla aktualnie zainstalowaną wersję. Należy porównać ją z tagiem przed użyciem jakiejkolwiek flagi opisanej na tej stronie.

Co zawiera repozytorium i czego w nim nie ma

W repozytorium Hermes nie ma aplikacji na systemy iOS ani Android. Natywnym klientem jest hermes desktop (alias hermes gui), aplikacja Electron dla systemów macOS, Windows oraz Linux. Może ona łączyć się ze zdalnym agentem zamiast lokalnego: należy ustawić zdalny adres URL na http://<server-address>:9119 w ustawieniach w sekcji Gateway lub wyeksportować HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 przed uruchomieniem. Rozwiązuje to problem drugiego laptopa. Nie dotyczy to jednak telefonów.

Interfejsem używanym na telefonie jest hermes dashboard, czyli panel przeglądarkowy. Zarządza on konfiguracją, sesjami, zadaniami cron, umiejętnościami, logami oraz platformami komunikacyjnymi i zawiera wbudowany terminal: serwer uruchamia hermes --tui za pośrednictwem PTY (pseudo-terminala) i przesyła wyjście na stronę. Na wąskim ekranie przełącznik sesji zwija się do wysuwanego panelu, dzięki czemu układ pozostaje czytelny na telefonie.

Domyślnie pulpit nawigacyjny nasłuchuje na 127.0.0.1:9119 i otwiera kartę przeglądarki na samym serwerze, co jest bezużyteczne w przypadku serwera VPS (virtual private server) bez monitora. Należy uruchomić go bez przeglądarki i sprawdzić gniazdo:

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

Nasłuchiwanie na 127.0.0.1:9119 jest dostępne tylko z poziomu serwera. Nasłuchiwanie na 0.0.0.0:9119 jest dostępne z każdej sieci, do której podłączona jest maszyna, w tym z sieci publicznej. Ta jedna linia decyduje o stopniu ekspozycji, dlatego należy ją sprawdzić, zamiast zakładać jej działanie.

Opcja 1: prywatna sieć mesh z Tailscale

Wybierz to rozwiązanie, chyba że masz powody, by postąpić inaczej. Tailscale to sieć mesh VPN (virtual private network) oparta na protokole WireGuard. Każde zarejestrowane urządzenie otrzymuje stały adres i komunikuje się bezpośrednio z pozostałymi. Twój telefon dołącza do tej samej sieci, więc panel sterowania nie wymaga otwierania portów publicznych.

Na serwerze:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4

Zainstaluj aplikację Tailscale na telefonie i zaloguj się na to samo konto. Polecenie tailscale status na serwerze wyświetli listę urządzeń, w tym telefon. Teraz przypisz panel sterowania do adresu wskazanego przez tailscale ip -4:

hermes dashboard --host 100.101.102.103 --port 9119 --no-open

Powiązanie z adresem sieci mesh, zamiast z 0.0.0.0, sprawia, że gniazdo nasłuchujące istnieje tylko na interfejsie Tailscale. Skanowanie portów publicznego adresu IP nie wykaże aktywności na porcie 9119, ponieważ usługa tam nie nasłuchuje; firewall przestaje być jedynym zabezpieczeniem. Potwierdź to ponownie za pomocą ss -lntp | grep 9119.

Adres powiązania decyduje również o uwierzytelnianiu, co jest często pomijanym aspektem. Na 127.0.0.1 panel sterowania nie wymaga logowania. Na każdym innym adresie bramka uwierzytelniania jest obowiązkowa, a bez skonfigurowanego dostawcy serwer odmawia uruchomienia. Projekt nazywa to bezpiecznym domyślnym stanem (failing closed). Uruchom usługę interaktywnie za pierwszym razem, a otrzymasz propozycję ustawienia nazwy użytkownika i hasła, które zostaną zapisane jako dashboard.basic_auth w ~/.hermes/config.yaml. Tego samego dostawcę można skonfigurować za pomocą ~/.hermes/.env, co jest zgodne z oficjalnym przykładem projektu:

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

Wygeneruj ten sekret za pomocą openssl rand -hex 32 i nie modyfikuj go. Służy on do podpisywania ciasteczek sesji, więc jego zmiana wyloguje wszystkie urządzenia. Ten sam plik przechowuje klucze API modelu, więc zabezpiecz go za pomocą chmod 600 ~/.hermes/.env.

Przed rozpoczęciem użytkowania sprawdź bramkę z innego urządzenia w sieci mesh:

curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'

true w połączeniu z ["basic"] oznacza, że bramka jest aktywna i odpowiada dostawca haseł. Dokumentacja projektu jasno określa przeznaczenie tego dostawcy: jest on przeznaczony dla zaufanych sieci lub VPN i nie nadaje się do paneli wystawionych na publiczny Internet. W sieci mesh sytuacja jest właśnie taka.

Aby uzyskać HTTPS wewnątrz sieci tailnet, przekaż port do Tailscale:

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

Tailscale kończy połączenie TLS certyfikatem wystawionym dla nazwy MagicDNS urządzenia, dzięki czemu przeglądarka przestaje wyświetlać ostrzeżenia, a ciasteczko sesji otrzymuje flagę Secure. Włącz MagicDNS oraz HTTPS Certificates na stronie DNS w konsoli administracyjnej Tailscale i zapoznaj się z informacją: nazwy urządzeń oraz nazwa sieci tailnet są publikowane w publicznym rejestrze przejrzystości certyfikatów, który jest dostępny dla każdego.

Realnym kosztem jest tutaj serwer koordynujący. Ruch między telefonem a VPS jest szyfrowany end-to-end i nie przechodzi przez Tailscale, ale konto decydujące o przynależności urządzeń do sieci mesh nie znajduje się na Twoim sprzęcie. Jeśli ma to znaczenie, uruchom własną płaszczyznę sterowania za pomocą Headscale, samodzielnie hostowanego serwera kontrolnego Tailscale i wskaż klientom ten serwer za pomocą tailscale up --login-server https://headscale.example.com. Jeśli wolisz zrezygnować z sieci mesh i skonfigurować partnerów ręcznie, porównanie standardowego WireGuard i Tailscale wyjaśnia, z czego w takim przypadku rezygnujesz.

Opcja 2: publiczny punkt końcowy HTTPS i związane z nim zagrożenie

Czasami sieć mesh nie jest dostępna. Telefon służbowy może nie pozwalać na instalację klienta VPN. Wówczas panel sterowania umieszcza się za reverse proxy. Należy pozostawić panel na interfejsie loopback i pozwolić Caddy na obsługę certyfikatu:

hermes.example.com {
  reverse_proxy 127.0.0.1:9119
}

Caddy samodzielnie pobiera i odnawia certyfikat, a jego reverse_proxy przekazuje żądania WebSocket bez dodatkowych dyrektyw, co jest niezbędne dla wbudowanego terminala panelu. W przypadku nginx konieczne jest samodzielne dodanie nagłówków Upgrade oraz Connection, a kwestię TLS opisuje wydawanie certyfikatu Let's Encrypt za pomocą Certbot na nginx. Należy poinformować Hermes o jego publicznej nazwie, aby wywołania zwrotne logowania wskazywały właściwy host:

dashboard:
  public_url: "https://hermes.example.com"

A teraz zagrożenie. Mechanizm uwierzytelniania opiera się na adresie powiązania (bind address), a nie na adresie, z którego nadeszło żądanie. Panel powiązany z 127.0.0.1 za proxy widzi adres loopback, uznaje, że logowanie nie jest wymagane i udostępnia zasoby każdemu, kogo przepuści proxy. Należy sprawdzić, co faktycznie zostało opublikowane:

curl -s https://hermes.example.com/api/status | jq '.auth_required'

Jeśli polecenie zwróci false, dostęp do terminala na serwerze z Internetu ogranicza się do jednego adresu URL. Nie jest wymagany żaden exploit, a dzienniki nie wykażą żadnych błędów. Istnieją dwa rozwiązania i należy zastosować przynajmniej jedno z nich. Można umieścić uwierzytelnianie w samym proxy, wykorzystując Authentik jako samodzielnie hostowanego dostawcę SSO poprzez forward auth, lub skonfigurować własnego dostawcę OIDC (OpenID Connect) w panelu:

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"

Nawet przy poprawnej konfiguracji, ta opcja posiada minimalny poziom ryzyka, którego nie da się wyeliminować. Publiczna strona logowania jest dostępna dla każdego, kto może ją zaatakować, a za nią znajduje się powłoka systemowa na VPS. Nazwa użytkownika i hasło stanowią słabą ochronę, dlatego dokumentacja zaleca stosowanie OAuth lub OIDC w przypadku publicznych powiązań. Należy ograniczyć częstotliwość logowania (rate limit), utrzymać ufw zamknięte dla wszystkiego poza portami proxy i SSH oraz okresowo przeglądać dziennik dostępu.

Opcja 3: SSH i mosh z terminala mobilnego

Najmniej wymagająca metoda: zainstaluj aplikację terminala na telefonie, wczytaj do niej klucz SSH i korzystaj z interfejsu tekstowego agenta.

ssh you@vps.example.com
tmux new -A -s phone
hermes --tui

tmux new -A -s phone łączy się z sesją o nazwie phone lub tworzy ją, jeśli nie istnieje. Dzięki temu agent działa nadal po zerwaniu połączenia, a użytkownik wraca do tego samego miejsca. Schemat jest identyczny jak w przypadku obsługi Claude Code z telefonu.

Zwykłe SSH w sieci mobilnej jest niekomfortowe, ponieważ połączenie zrywa się przy każdej zmianie adresu IP telefonu lub przejściu w tryb uśpienia. Mosh rozwiązuje ten problem. Działa w oparciu o UDP (user datagram protocol) i synchronizuje stan terminala zamiast strumienia bajtów, dzięki czemu sesja przetrwa przejście z sieci Wi-Fi na komórkową:

sudo apt install -y mosh
sudo ufw allow 60000:61000/udp

Z poziomu telefonu uruchom mosh you@vps.example.com. Mosh uruchamia mosh-server w ramach istniejącego logowania SSH, a następnie przenosi sesję na protokół UDP w zakresie portów od 60000 do 61000. Z tego powodu zakres ten musi być otwarty.

Koszt bezpieczeństwa jest oczywisty. Sesja SSH to powłoka, a powłoka daje dostęp do wszystkich uprawnień danego konta. Monity o zatwierdzenie w agencie stanowią ostatnią linię obrony między skradzionym, odblokowanym telefonem a Twoimi plikami. Używaj do tego celu dedykowanego konta bez uprawnień root, loguj się wyłącznie kluczem i zapoznaj się z zabezpieczaniem SSH na VPS przed umieszczeniem klucza na urządzeniu mobilnym.

Co przestaje działać w sieciach mobilnych

Cztery elementy, z których żaden nie jest błędem możliwym do usunięcia poprzez konfigurację.

Panel sterowania wylogowuje użytkownika podczas bezczynności. Czas do wylogowania zależy od dostawcy logowania. Dostawca nazwy użytkownika i hasła wydaje sesje ważne domyślnie przez 12 godzin, co jest ustawione przez session_ttl_seconds w dashboard.basic_auth. Dostawca OAuth Nous Portal wydaje tokeny dostępu z czasem życia (TTL) wynoszącym 15 minut, a jego obecna umowa API nie przewiduje tokenów odświeżania. Gdy token wygasa, strona otrzymuje odpowiedź 401 i przekierowuje użytkownika do /login. Przy 15-minutowym tokenie wystarczy otworzyć panel, schować telefon do kieszeni na dwadzieścia minut, a po powrocie zobaczyć ekran logowania z utratą wpisywanych danych. Nic nie jest uszkodzone. Należy zalogować się ponownie.

Wbudowany terminal nie przetrwa przejścia karty w tło. Serwer uruchamia TUI (tekstowy interfejs użytkownika) za PTY i zamyka go poprawnie po zamknięciu karty, a ponowne otwarcie inicjuje nową sesję. Przeglądarki mobilne usuwają karty działające w tle w celu odzyskania pamięci, więc przełączenie na inną aplikację na dłuższy czas kończy działanie terminala. Historia czatu jest bezpieczna, ponieważ sesje są przechowywane na serwerze, a hermes sessions list nadal je wyświetla. Do samego terminala nie można ponownie dołączyć. Jeśli wymagana jest sesja odporna na rozłączenie, należy użyć tmux przez SSH.

Bezczynne połączenia są cicho zrywane. Operatorzy sieci mobilnych zrywają bezczynne połączenia TCP w celu odzyskania wpisów w tablicy NAT (network address translation), a telefon niemal całkowicie przestaje obsługiwać sieć po wygaszeniu ekranu. WebSocket, który pozostawał nieaktywny przez pewien czas, jest zazwyczaj martwy w momencie odblokowania urządzenia, a strona nawiązuje połączenie ponownie dopiero po interakcji użytkownika. Dlatego mosh sprawia wrażenie lepszego rozwiązania niż SSH na telefonie: nigdy nie posiadał połączenia, które mógłby utracić.

Brak powiadomień push. Ani panel sterowania, ani sesja SSH nie mogą wybudzić telefonu. Na urządzeniu nie ma aplikacji Hermes, więc nie istnieje ścieżka do usługi powiadomień platformy. Długotrwałe zadanie agenta kończy się, a użytkownik dowiaduje się o tym dopiero przy następnym sprawdzeniu.

Powiadomienia docierają przez bramkę przesyłania wiadomości

Rozwiązaniem ostatniego problemu jest bramka, która stanowi całkowicie odmienny sposób komunikacji z agentem. hermes gateway łączy agenta z platformami komunikacyjnymi, takimi jak Telegram, Discord, Slack, WhatsApp, Signal oraz poczta elektroniczna. Komunikacja z agentem odbywa się wówczas wewnątrz aplikacji, która posiada już skonfigurowany kanał powiadomień push na telefonie, obsługuje dostarczanie w tle oraz radzi sobie z przerwami w łączności sieciowej.

hermes gateway setup
hermes gateway install
hermes gateway status

hermes gateway install rejestruje bramkę jako usługę systemd, dzięki czemu uruchamia się ona automatycznie po restarcie systemu. Etap instalacji bramki może wykonać ten krok za użytkownika, jednak instalator nie tworzy jednostki dla hermes dashboard, więc panel sterowania nie uruchomi się samoczynnie po restarcie. Należy utworzyć jednostkę dla wszystkich wymaganych komponentów, a artykuł tworzenie usług i timerów systemd na VPS zawiera szczegółowe informacje na temat samego pliku.

Zaplanowane zadanie może przesłać wynik w ten sam sposób, bez konieczności prowadzenia konwersacji:

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

Autoryzacja działa tutaj w oparciu o domyślną odmowę dostępu. Jeśli lista dozwolonych użytkowników nie jest skonfigurowana, a GATEWAY_ALLOW_ALL_USERS pozostaje nieustawione, każdy użytkownik otrzymuje odmowę dostępu, co stanowi właściwy punkt wyjścia. Należy wskazać konta, które mają otrzymać dostęp, w pliku ~/.hermes/.env:

TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789

Alternatywnie można zastosować parowanie oparte na kodzie zamiast wklejania identyfikatorów numerycznych. Jest to ustawienie domyślne dla platform komunikacyjnych typu DM, które można wymusić za pomocą unauthorized_dm_behavior: pair w pliku ~/.hermes/config.yaml. Nieznane konto, które wyśle wiadomość do agenta, otrzyma ośmioznakowy kod i żadna inna akcja nie zostanie podjęta do momentu zatwierdzenia użytkownika:

hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789

Kody wygasają po godzinie, użytkownik może żądać nowego kodu co dziesięć minut, a pięć nieudanych prób skutkuje zablokowaniem danego konta.

Ograniczanie skutków kradzieży telefonu

Telefon z dostępem do agenta to urządzenie zdolne do wykonywania poleceń na serwerze, a telefony bywają gubione. Należy zawczasu określić zakres uprawnień osoby trzeciej wchodzącej w posiadanie urządzenia.

Pozostaw włączone zatwierdzanie poleceń. approvals.mode domyślnie przyjmuje wartość smart, co zleca pomocniczemu modelowi ocenę ryzyka i automatyczne zatwierdzanie wyłącznie poleceń o niskim stopniu zagrożenia. Ustawienie off jest równoznaczne z uruchamianiem wszystkiego z flagą --yolo, a HERMES_YOLO_MODE=1 realizuje to poprzez zmienne środowiskowe. Nie należy korzystać z telefonu komunikującego się z agentem w takim stanie. Ustaw approvals.cron_mode: deny, aby zaplanowane zadania nie mogły zatwierdzać się automatycznie podczas Twojej nieobecności.

approvals:
  mode: smart
  cron_mode: deny

Ogranicz środowisko pracy agenta. terminal.backend: docker uruchamia polecenia w kontenerze, który odrzuca wszystkie Linux capabilities poza krótką listą, ustawia no-new-privileges oraz ogranicza liczbę procesów, dzięki czemu granicą bezpieczeństwa staje się kontener, a nie powłoka systemowa. terminal.cwd blokuje katalog roboczy. HERMES_WRITE_SAFE_ROOT ogranicza write_file oraz patch do wskazanych katalogów, a każda próba zapisu poza nimi jest blokowana bez możliwości obejścia przez zatwierdzenie.

export HERMES_WRITE_SAFE_ROOT=/home/you/projects:/home/you/.hermes

Hermes domyślnie blokuje zapis do ~/.ssh, ~/.aws, ~/.kube oraz /etc/sudoers, a także do własnych magazynów sekretów, takich jak ~/.hermes/.env. Pliki projektu .env znajdujące się w innych lokalizacjach na dysku mają zablokowany odczyt, ale pozostają zapisywalne. System odrzuca również sztywną listę poleceń destrukcyjnych, niezależnie od ustawień zatwierdzania. Traktuj to jako poziom podstawowy, a nie jako pełny plan zabezpieczeń. Uruchamiaj agenta jako zwykły użytkownik, nigdy jako root. Ta sama zasada dotyczy każdego agenta programistycznego pozostawionego bez nadzoru, a bezpieczne uruchamianie Claude Code na VPS omawia to zagadnienie bardziej szczegółowo.

Przygotuj procedurę unieważnienia dostępu, zanim zajdzie taka potrzeba. Usunięcie urządzenia w konsoli administracyjnej Tailscale natychmiast przerywa dostęp do sieci mesh. Zmiana HERMES_DASHBOARD_BASIC_AUTH_SECRET i restart unieważniają wszystkie sesje panelu na każdym urządzeniu, ponieważ wartość ta służy do podpisywania plików cookie sesji. Usunięcie klucza publicznego telefonu z ~/.ssh/authorized_keys kończy dostęp SSH. hermes pairing revoke telegram <user-id> usuwa konto komunikatora. Jeśli urządzenie posiadało dostęp do kluczy dostawcy, należy je unieważnić za pomocą hermes auth logout <provider> i wygenerować nowe u dostawcy.

Weryfikuj wyniki zamiast zakładać ich poprawność. Poniższe polecenia należy uruchomić na własnej maszynie, a ich wynik zależy od konfiguracji:

tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deep

Logi znajdują się w ~/.hermes/logs/. Przeglądaj je po wystąpieniu incydentu oraz okresowo w ramach rutynowej kontroli.

FAQ

Czy istnieje oficjalna aplikacja mobilna Hermes na systemy iOS lub Android?

Nie. Repozytorium Hermes dostarcza interfejs wiersza poleceń, panel webowy oraz desktopowego klienta Electron dla systemów macOS, Windows i Linux. Nie ma oficjalnej kompilacji na systemy iOS lub Android. Z poziomu telefonu należy korzystać z panelu webowego w przeglądarce, klienta SSH lub platformy komunikacyjnej połączonej przez hermes gateway. Istnieją klienci mobilni firm trzecich, jednak jest to oprogramowanie zewnętrzne, które przechowuje dane uwierzytelniające do agenta, dlatego przed instalacją należy zapoznać się z kodem źródłowym.

Dlaczego panel Hermes wylogowuje mnie na telefonie?

Zależy to od dostawcy logowania. Dostawca OAuth Nous Portal wydaje tokeny dostępu z czasem życia (TTL) wynoszącym 15 minut, a jego obecny kontrakt API nie przewiduje tokenów odświeżania. Gdy token wygasa, strona otrzymuje błąd 401 i przekierowuje do /login. Przełączenie przeglądarki w telefonie do tła sprawia, że jest to zauważalne, ponieważ dwadzieścia minut w innej aplikacji wystarcza do przekroczenia tego czasu. Dostawca logowania za pomocą nazwy użytkownika i hasła domyślnie ustawia sesję na 12 godzin, co jest konfigurowane przez session_ttl_seconds. W przypadku tego dostawcy należy ustawić HERMES_DASHBOARD_BASIC_AUTH_SECRET na stabilną, losową wartość, aby klucz podpisywania sesji pozostawał niezmienny po restartach, co eliminuje drugą przyczynę wylogowywania.

Czy mogę bezpiecznie wystawić panel Hermes do publicznego Internetu?

Tylko z uwierzytelnianiem, które zostało samodzielnie zweryfikowane. Mechanizm bramy uwierzytelniania aktywuje się w zależności od adresu powiązania (bind address), więc panel powiązany z 127.0.0.1 za reverse proxy nigdy nie będzie wymagał logowania z Internetu. Uruchom curl -s https://your-host/api/status | jq '.auth_required' i sprawdź wynik. Należy używać OAuth lub OIDC zamiast nazwy użytkownika i hasła, ponieważ dokumentacja projektu wskazuje, że dostawca haseł jest przeznaczony dla zaufanych sieci i połączeń VPN. Prywatna sieć typu mesh całkowicie rozwiązuje ten problem, dlatego jest to zalecane ustawienie domyślne.

Czy potrzebuję konta Tailscale, czy mogę samodzielnie hostować płaszczyznę sterowania?

Można ją hostować samodzielnie. Headscale to otwarta implementacja serwera koordynującego Tailscale, a oficjalni klienci Tailscale łączą się z nim za pomocą tailscale up --login-server https://headscale.example.com. Wówczas użytkownik zarządza listą urządzeń dopuszczonych do sieci mesh. Kosztem tego rozwiązania jest konieczność utrzymywania i tworzenia kopii zapasowych tego serwera; w czasie jego niedostępności nie można zarejestrować ani ponownie uwierzytelnić urządzenia.

Jak otrzymywać powiadomienia na telefon po zakończeniu zadania przez agenta?

Należy użyć bramy komunikacyjnej. Panel oraz SSH nie mają możliwości wybudzenia telefonu, ponieważ na urządzeniu nie ma aplikacji Hermes, która mogłaby odebrać powiadomienie push. Połącz agenta z Telegram, Signal, Discord lub inną wspieraną platformą za pomocą hermes gateway setup, a następnie pozwól aplikacji danej platformy dostarczyć powiadomienie. Zadanie cron może również wysłać pojedynczą wiadomość za pomocą hermes send -t telegram -s "Job done" -f /path/to/report.txt, co zostanie dostarczone bez wywoływania modelu.