SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor

Cara Mengakses Agent Hermes dari Ponsel

Akses dashboard Hermes di VPS dari ponsel melalui mesh privat, HTTPS publik, atau SSH. Pelajari pilihan akses dan cara mencabutnya saat ponsel hilang.

Tiga cara mengakses agent Hermes dari ponsel

Untuk mengakses agent Hermes dari ponsel, Anda menggunakan dashboard web. Keputusan utamanya adalah menentukan apa yang ditempatkan di depan dashboard tersebut. Opsi pertama adalah jaringan mesh privat. Dashboard hanya mendengarkan pada alamat Tailscale, dan tidak ada port yang menghadap Internet. Opsi kedua adalah endpoint publik di belakang reverse proxy dengan TLS (keamanan lapisan transport) dan login. Login tersebut menjadi satu-satunya perlindungan untuk terminal menuju server Anda. Opsi ketiga adalah SSH (secure shell) dari aplikasi terminal. Opsi ini memerlukan konfigurasi paling sedikit dan memberikan akses paling luas.

Panduan ini dimulai dari bagian menjalankan agent Hermes pada VPS milik Anda sendiri. Agent sudah terpasang, merespons melalui command line, dan kini Anda ingin mengaksesnya dari ponsel.

Perintah di bawah ditulis untuk tag v2026.8.3, yang dipublikasikan pada 3 August 2026 dan diberi label v0.20.0 dalam catatan rilis. Hermes sering merilis versi baru, jadi tetapkan mesin pada suatu tag, bukan mengikuti main. Installer menerima sebuah commit:

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

hermes --version menampilkan apa yang benar-benar terpasang. Bandingkan hasilnya dengan tag tersebut sebelum mempercayai flag apa pun di halaman ini.

Apa yang disediakan repository, dan apa yang tidak

Tidak ada aplikasi iOS atau Android di repository Hermes. Klien native adalah hermes desktop (alias hermes gui), aplikasi Electron untuk macOS, Windows, dan Linux. Klien ini dapat terhubung ke agent remote, bukan agent lokal: tetapkan URL remote ke http://<server-address>:9119 di Settings pada bagian Gateway, atau export HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 sebelum menjalankannya. Ini menyelesaikan kebutuhan untuk laptop kedua. Namun, ini tidak menyediakan akses dari ponsel.

Antarmuka yang digunakan dari ponsel adalah hermes dashboard, yaitu antarmuka browser. Antarmuka ini mengelola konfigurasi, sesi, cron job, skill, log, dan platform messaging, serta menyertakan terminal: server menjalankan hermes --tui di balik PTY (pseudo-terminal) dan mengalirkan output ke halaman. Pada layar sempit, pemilih sesi dilipat menjadi panel slide-over sehingga tata letaknya tetap dapat digunakan di ponsel.

Secara default, dashboard listen pada 127.0.0.1:9119 dan membuka tab browser pada server itu sendiri. Ini tidak berguna pada VPS (virtual private server) headless. Jalankan dashboard tanpa browser, lalu periksa socket:

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

Listener pada 127.0.0.1:9119 hanya dapat diakses dari server. Listener pada 0.0.0.0:9119 dapat diakses dari setiap jaringan yang terhubung ke mesin tersebut, termasuk jaringan publik. Satu baris itu menentukan seberapa terekspos server Anda. Karena itu, baca hasilnya dan jangan mengandalkan asumsi.

Opsi 1: mesh privat dengan Tailscale

Pilih opsi ini kecuali Anda memiliki alasan untuk tidak menggunakannya. Tailscale adalah VPN mesh (virtual private network) yang dibangun di atas WireGuard. Setiap perangkat yang Anda daftarkan mendapatkan alamat stabil dan berkomunikasi langsung dengan perangkat lain. Ponsel Anda bergabung ke mesh yang sama, sehingga dashboard sama sekali tidak memerlukan port publik.

Di server:

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

Instal aplikasi Tailscale di ponsel dan masuk dengan akun yang sama. tailscale status di server kemudian menampilkan ponsel berdasarkan namanya. Sekarang ikat dashboard ke alamat yang ditampilkan oleh tailscale ip -4:

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

Mengikat ke alamat mesh, bukan ke 0.0.0.0, berarti socket listening hanya tersedia pada interface Tailscale. Pemindaian port terhadap alamat IP publik Anda tidak menemukan apa pun pada 9119 karena tidak ada proses yang listening di sana. Firewall Anda tidak lagi menjadi satu-satunya perlindungan. Konfirmasikan kembali dengan ss -lntp | grep 9119.

Alamat bind juga menentukan autentikasi, dan bagian ini sering terlewatkan. Pada 127.0.0.1, dashboard tidak memiliki login. Pada alamat lain, gerbang autentikasi wajib digunakan, dan tanpa provider yang dikonfigurasi, server menolak untuk start. Proyek ini menyebut perilaku tersebut sebagai failing closed. Jalankan secara interaktif untuk pertama kali. Aplikasi akan menawarkan untuk menyiapkan username dan password saat itu juga, lalu menyimpannya sebagai dashboard.basic_auth di ~/.hermes/config.yaml. Anda juga dapat mengonfigurasi provider yang sama melalui ~/.hermes/.env. Itulah cara yang digunakan dalam contoh kerja resmi proyek:

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

Buat secret tersebut dengan openssl rand -hex 32, lalu jangan mengubahnya. Secret itu digunakan untuk menandatangani session cookie, sehingga perubahannya akan mengeluarkan semua perangkat dari sesi. File yang sama menyimpan API key model Anda, jadi lindungi dengan chmod 600 ~/.hermes/.env.

Uji gerbang tersebut dari mesin lain di mesh sebelum mempercayainya:

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

true yang diikuti ["basic"] berarti gerbang aktif dan password provider yang merespons. Dokumentasi resmi proyek menjelaskan provider ini secara tegas: provider ini ditujukan untuk jaringan tepercaya atau VPN, dan tidak sesuai untuk dashboard yang menghadap Internet publik. Pada mesh, itulah situasi Anda.

Untuk HTTPS di dalam tailnet, serahkan port tersebut ke Tailscale:

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

Tailscale melakukan terminasi TLS dengan sertifikat yang diterbitkan untuk nama MagicDNS mesin tersebut. Dengan demikian, browser berhenti menampilkan peringatan dan session cookie mendapatkan flag Secure. Aktifkan MagicDNS dan HTTPS Certificates pada halaman DNS di konsol admin Tailscale terlebih dahulu. Baca juga pernyataan persetujuannya: nama mesin dan nama DNS tailnet Anda dipublikasikan ke ledger transparansi sertifikat publik yang dapat dibaca siapa saja.

Biaya sebenarnya di sini adalah server koordinasi. Trafik antara ponsel dan VPS Anda dienkripsi secara end-to-end dan tidak melewati Tailscale, tetapi akun yang menentukan perangkat mana yang menjadi anggota mesh tidak berada di perangkat keras Anda. Jika hal itu penting, jalankan control plane sendiri dengan Headscale, server kontrol Tailscale yang di-host sendiri, lalu arahkan client ke sana menggunakan tailscale up --login-server https://headscale.example.com. Jika Anda lebih memilih meninggalkan mesh dan mengonfigurasi peer secara manual, perbandingan antara WireGuard biasa dan Tailscale menjelaskan hal-hal yang harus Anda korbankan.

Opsi 2: endpoint HTTPS publik dan jebakan di dalamnya

Terkadang mesh tidak tersedia. Ponsel kantor mungkin tidak mengizinkan Anda memasang klien VPN. Dalam kondisi tersebut, tempatkan dashboard di balik reverse proxy. Pertahankan dashboard pada loopback dan biarkan Caddy menangani sertifikat:

hermes.example.com {
  reverse_proxy 127.0.0.1:9119
}

Caddy mengambil dan memperbarui sertifikat secara mandiri. `reverse_proxy meneruskan upgrade WebSocket tanpa direktif tambahan, yang diperlukan oleh terminal tertanam pada dashboard. Pada nginx, Anda harus menambahkan header Upgrade dan Connection` sendiri. Penerbitan sertifikat Let's Encrypt dengan Certbot pada nginx membahas bagian TLS dari pekerjaan tersebut. Beri tahu Hermes nama publiknya agar callback login mengarah ke host yang benar:

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

Sekarang jebakannya. Gerbang autentikasi menggunakan alamat bind, bukan alamat asal permintaan. Dashboard yang terikat pada `127.0.0.1` di balik proxy akan melihat loopback, menganggap login tidak diperlukan, lalu melayani siapa pun yang diizinkan oleh proxy. Periksa apa yang benar-benar Anda publikasikan:

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

Jika hasilnya `false`, Internet hanya berjarak satu URL dari terminal pada server Anda. Tidak ada exploit yang diperlukan dan tidak ada apa pun dalam log yang akan melaporkannya. Ada dua perbaikan, dan Anda sebaiknya menerapkan setidaknya salah satunya. Pertama, tempatkan autentikasi pada proxy, dengan Authentik sebagai penyedia single sign-on yang di-host sendiri di depannya melalui forward auth. Kedua, konfigurasikan penyedia OIDC (OpenID Connect) milik 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"

Meskipun dikonfigurasikan dengan benar, opsi ini memiliki batas minimum yang tidak dapat Anda turunkan. Halaman login publik adalah halaman yang dapat dijangkau dan diserang siapa pun, sedangkan di baliknya terdapat shell pada VPS Anda. Nama pengguna dan kata sandi merupakan perlindungan yang lemah untuk kondisi tersebut. Karena itu, dokumentasi merekomendasikan OAuth atau OIDC untuk bind publik. Batasi laju login, pertahankan ufw tertutup untuk semua koneksi kecuali port proxy dan SSH, lalu baca access log sesekali.

Opsi 3: SSH dan mosh dari terminal seluler

Cara dengan upaya paling rendah: instal aplikasi terminal pada ponsel, muat kunci SSH ke dalamnya, lalu gunakan antarmuka teks milik agent.

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

tmux new -A -s phone menghubungkan ke sesi bernama phone, atau membuatnya jika sesi tersebut belum ada. Dengan demikian, agent tetap berjalan saat koneksi terputus dan Anda kembali ke tempat yang sama pada waktu berikutnya. Polanya sama dengan yang digunakan untuk menjalankan Claude Code dari ponsel.

SSH biasa melalui jaringan seluler tidak nyaman karena koneksi terputus setiap kali ponsel berganti alamat atau masuk mode tidur. Mosh mengatasi masalah ini. Mosh berjalan melalui UDP (user datagram protocol) dan menyinkronkan status terminal, bukan aliran byte. Dengan demikian, sesi tetap bertahan saat Anda berpindah dari wifi ke jaringan seluler:

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

Dari ponsel, jalankan mosh you@vps.example.com. Mosh memulai mosh-server melalui login SSH yang sudah ada, lalu memindahkan sesi ke UDP pada rentang 60000 hingga 61000. Karena itu, rentang tersebut harus dibuka.

Risiko keamanannya bersifat langsung. Sesi SSH adalah shell, dan shell dapat melakukan semua hal yang diizinkan oleh akun tersebut. Prompt persetujuan agent menjadi satu-satunya penghalang antara ponsel yang dicuri dalam keadaan tidak terkunci dan file Anda. Gunakan akun non-root khusus untuk keperluan ini, gunakan kunci saja, dan lakukan hardening SSH pada VPS sebelum memasang kunci pada perangkat yang Anda bawa sehari-hari.

Yang rusak pada jaringan seluler

Ada empat hal, dan tidak satu pun dapat diperbaiki hanya dengan mengubah konfigurasi.

Dashboard mengeluarkan Anda saat Anda tidak melihatnya. Waktunya bergantung pada penyedia login. Penyedia username dan password menerbitkan session yang secara default berlaku selama 12 jam, yang ditetapkan oleh session_ttl_seconds di bawah dashboard.basic_auth. Penyedia OAuth Nous Portal menerbitkan access token dengan TTL (time to live) 15 menit, dan kontrak API saat ini tidak memiliki refresh token. Saat token kedaluwarsa, halaman menerima respons 401 lalu mengarahkan Anda kembali ke /login. Dengan token yang berlaku selama 15 menit, buka dashboard, masukkan ponsel ke saku selama dua puluh menit, lalu Anda akan kembali ke layar login dengan apa pun yang sedang Anda ketik telah hilang. Tidak ada yang rusak. Login kembali.

Terminal tertanam tidak bertahan saat tab berada di latar belakang. Server menjalankan TUI (text user interface) di balik PTY dan mengakhirinya dengan bersih saat tab ditutup. Membuka kembali tab akan menjalankan instance baru. Browser seluler membuang tab di latar belakang untuk mengosongkan memori. Karena itu, berpindah ke aplikasi lain cukup lama akan mengakhiri terminal tersebut. Riwayat chat Anda tetap aman karena session disimpan di server dan hermes sessions list masih menampilkannya. Namun, terminal itu sendiri tidak dapat disambungkan kembali. Jika memerlukan session yang bertahan, gunakan tmux melalui SSH.

Koneksi yang idle terputus tanpa pesan. Operator seluler memutus koneksi TCP yang idle untuk mengosongkan entri tabel NAT (network address translation), dan ponsel hampir sepenuhnya berhenti melayani jaringan saat layar mati. WebSocket yang tidak aktif selama beberapa waktu biasanya sudah mati saat Anda membuka kunci ponsel, dan halaman baru tersambung kembali setelah Anda menyentuhnya. Karena itu, mosh terasa lebih baik daripada SSH di ponsel: mosh tidak pernah memiliki koneksi yang dapat terputus.

Tidak ada notifikasi yang dikirim secara push. Dashboard maupun session SSH tidak dapat membangunkan ponsel Anda. Tidak ada aplikasi Hermes di perangkat tersebut, sehingga tidak ada jalur menuju layanan push platform. Proses agent yang berjalan lama akan selesai, dan Anda baru mengetahuinya saat memeriksa ponsel kembali.

Notifikasi diterima melalui messaging gateway

Solusi untuk masalah terakhir tersebut adalah gateway, yaitu cara lain untuk mengakses agent. hermes gateway menghubungkan agent ke platform messaging, termasuk Telegram, Discord, Slack, WhatsApp, Signal, dan email. Anda kemudian berkomunikasi dengan agent melalui aplikasi yang sudah memiliki push channel di ponsel, sudah menangani pengiriman di latar belakang, dan sudah dapat mengatasi koneksi jaringan yang terputus.

hermes gateway setup
hermes gateway install
hermes gateway status

hermes gateway install mendaftarkan gateway sebagai service systemd sehingga service tersebut kembali berjalan setelah reboot. Tahap gateway pada installer dapat menjalankan langkah tersebut untuk Anda, tetapi installer tidak membuat unit untuk hermes dashboard. Karena itu, dashboard tidak akan kembali berjalan secara otomatis setelah restart. Buat unit untuk setiap komponen yang Anda gunakan. penulisan service dan timer systemd pada VPS menjelaskan file unit tersebut.

Scheduled job dapat mengirimkan hasil dengan cara yang sama, tanpa memerlukan percakapan:

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

Otorisasi di sini menggunakan penolakan secara default. Jika allowlist belum diatur dan GATEWAY_ALLOW_ALL_USERS belum ditetapkan, semua user akan ditolak. Ini adalah konfigurasi awal yang tepat. Cantumkan account yang diizinkan di ~/.hermes/.env:

TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789

Anda juga dapat menggunakan pairing berbasis kode sebagai pengganti menempelkan ID numerik. Metode ini adalah default untuk platform DM bergaya chat. Anda dapat menetapkannya secara eksplisit dengan unauthorized_dm_behavior: pair di ~/.hermes/config.yaml. Account yang belum dikenal dan mengirim pesan kepada agent akan menerima kode delapan karakter. Tidak ada tindakan lain yang dilakukan sampai Anda menyetujuinya:

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

Kode kedaluwarsa setelah satu jam. User dapat meminta kode sekali setiap sepuluh menit. Lima percobaan yang gagal akan mengunci account tersebut.

Membatasi dampak dari ponsel yang dicuri

Ponsel yang dapat menjangkau agent Anda juga dapat menjalankan perintah pada server Anda, dan ponsel dapat hilang. Tentukan sekarang hal-hal yang dapat dilakukan oleh orang yang memegangnya.

Biarkan persetujuan tetap aktif. approvals.mode secara default bernilai smart, yang meminta model tambahan untuk menilai risiko dan menyetujui otomatis hanya perintah berisiko rendah. Menetapkannya ke off sama dengan menjalankan semuanya menggunakan --yolo, dan HERMES_YOLO_MODE=1 melakukannya melalui environment. Jangan membawa ponsel yang terhubung ke agent dalam kondisi tersebut. Tetapkan approvals.cron_mode: deny agar scheduled job tidak dapat menyetujui perintahnya sendiri saat Anda tidur.

approvals:
  mode: smart
  cron_mode: deny

Batasi ruang gerak agent agar dampak kerusakannya lebih kecil. terminal.backend: docker menjalankan perintah di dalam container yang menghapus semua kapabilitas Linux kecuali daftar singkat, menetapkan no-new-privileges, dan membatasi jumlah proses. Dengan demikian, container menjadi batas keamanan, bukan prompt. terminal.cwd menetapkan working directory. HERMES_WRITE_SAFE_ROOT membatasi write_file dan patch ke direktori yang Anda tentukan, dan penulisan di luar direktori tersebut diblokir tanpa opsi persetujuan untuk mengesampingkannya.

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

Hermes sudah memblokir penulisan ke ~/.ssh, ~/.aws, ~/.kube, dan /etc/sudoers, serta ke penyimpanan rahasianya sendiri seperti ~/.hermes/.env. File .env project di lokasi lain pada disk diblokir agar tidak dapat dibaca, tetapi tetap dapat ditulisi. Hermes juga menolak daftar perintah destruktif yang ketat, apa pun pengaturan persetujuan Anda. Anggap ini sebagai batas minimum, bukan sebagai rencana Anda. Jalankan agent sebagai pengguna biasa, jangan pernah sebagai root. Pertimbangan yang sama berlaku untuk coding agent apa pun yang dibiarkan berjalan tanpa pengawasan, dan menjalankan Claude Code dengan aman pada VPS membahasnya secara lebih terperinci.

Selanjutnya, tuliskan langkah-langkah pencabutan akses sebelum Anda membutuhkannya. Menghapus perangkat dari konsol admin Tailscale langsung memutus akses mesh. Mengubah HERMES_DASHBOARD_BASIC_AUTH_SECRET lalu melakukan restart membatalkan setiap session dashboard pada semua perangkat, karena nilai tersebut digunakan untuk menandatangani session cookie. Menghapus public key ponsel dari ~/.ssh/authorized_keys mengakhiri akses SSH. hermes pairing revoke telegram <user-id> menghapus akun messaging. Jika perangkat tersebut menyimpan sesuatu yang dapat membaca provider key Anda, cabut key tersebut menggunakan hermes auth logout <provider> dan terbitkan key baru pada provider.

Periksa hasilnya, jangan hanya menganggap semuanya sudah benar. Perintah berikut dijalankan pada mesin Anda sendiri, dan hasil yang ditampilkan bergantung pada setup Anda:

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

Log tersimpan di bawah ~/.hermes/logs/. Baca log tersebut setelah terjadi insiden, dan baca juga secara berkala ketika tidak ada insiden.

FAQ

Apakah ada aplikasi seluler Hermes resmi untuk iOS atau Android?

Tidak. Repositori Hermes menyediakan antarmuka baris perintah, dasbor web, dan klien desktop Electron untuk macOS, Windows, dan Linux. Tidak ada build iOS atau Android resmi dari pengembang Hermes. Dari ponsel, Anda dapat menggunakan dasbor web melalui browser, klien SSH, atau platform perpesanan yang terhubung melalui hermes gateway. Klien seluler pihak ketiga memang tersedia. Klien tersebut merupakan kode pihak ketiga yang menyimpan kredensial ke agent Anda. Baca kode sumbernya sebelum menginstalnya.

Mengapa dasbor Hermes mengeluarkan saya dari sesi di ponsel?

Hal ini bergantung pada penyedia login. Penyedia OAuth Nous Portal menerbitkan access token dengan TTL 15 menit dan kontrak API saat ini tidak memiliki refresh token. Karena itu, saat token kedaluwarsa, halaman menerima 401 dan berpindah ke /login. Menempatkan browser di latar belakang pada ponsel membuat hal ini mudah terlihat. Berada di aplikasi lain selama 20 menit sudah cukup untuk memicunya. Penyedia username dan password menggunakan sesi 12 jam secara default, yang ditetapkan oleh session_ttl_seconds. Dengan penyedia tersebut, tetapkan HERMES_DASHBOARD_BASIC_AUTH_SECRET ke nilai acak yang stabil agar kunci penandatanganan sesi tetap sama setelah restart. Dengan demikian, alasan kedua sesi berakhir juga teratasi.

Apakah saya dapat menempatkan dasbor Hermes di Internet publik dengan aman?

Hanya jika Anda telah memverifikasi autentikasinya sendiri. Auth gate diaktifkan berdasarkan alamat bind. Karena itu, dasbor yang terikat ke 127.0.0.1 di belakang reverse proxy tidak akan meminta login kepada pengguna dari Internet. Jalankan curl -s https://your-host/api/status | jq '.auth_required' dan baca hasilnya. Gunakan OAuth atau OIDC, bukan username dan password, karena dokumentasi proyek menyatakan bahwa penyedia password ditujukan untuk jaringan tepercaya dan VPN. Private mesh menghilangkan kebutuhan untuk menjawab pertanyaan ini. Karena itu, private mesh merupakan pilihan default yang lebih baik.

Apakah saya memerlukan akun Tailscale, atau dapat meng-host control plane sendiri?

Anda dapat meng-host-nya sendiri. Headscale adalah implementasi terbuka dari server koordinasi Tailscale, dan klien Tailscale resmi dapat terhubung ke sana dengan tailscale up --login-server https://headscale.example.com. Dengan demikian, Anda mengelola sendiri daftar perangkat yang diizinkan masuk ke mesh. Konsekuensinya, Anda harus menjalankan dan mencadangkan server tersebut. Selama server tidak aktif, Anda tidak dapat mendaftarkan atau mengautentikasi ulang perangkat.

Bagaimana cara menerima notifikasi di ponsel saat agent menyelesaikan tugas?

Gunakan gateway perpesanan. Dasbor dan SSH tidak dapat membangunkan ponsel karena tidak ada aplikasi Hermes pada perangkat yang menerima push notification. Hubungkan agent ke Telegram, Signal, Discord, atau platform lain yang didukung melalui hermes gateway setup, lalu biarkan aplikasi platform tersebut mengirimkan notifikasi. Cron job juga dapat mengirim satu pesan melalui hermes send -t telegram -s "Job done" -f /path/to/report.txt. Cara ini mengirimkan pesan tanpa memanggil model.