SSD Nodes Learn Hosting plans →
راهنماها Matt Connorتوسط Matt Connor · به‌روزرسانی شده 2026-08-13

دسترسی به عامل Hermes روی VPS از طریق موبایل

برای مدیریت عامل Hermes روی VPS از طریق موبایل، از شبکه مش Tailscale یا reverse proxy استفاده کنید. این راهنما برای نسخه v0.20.0 تنظیم شده و امنیت دسترسی را تضمین می‌کند.

سه روش برای دسترسی به عامل Hermes از طریق تلفن همراه

برای دسترسی به عامل Hermes از طریق تلفن همراه، از داشبورد وب آن استفاده می‌کنید؛ تصمیم اصلی این است که چه چیزی در مقابل این داشبورد قرار می‌گیرد. گزینه اول یک شبکه مش خصوصی است که در آن داشبورد فقط روی یک آدرس Tailscale گوش می‌دهد و هیچ پورتی به سمت اینترنت باز نیست. گزینه دوم یک نقطه پایانی عمومی پشت یک reverse proxy با TLS (امنیت لایه انتقال) و یک صفحه ورود است، که در آن همان صفحه ورود تنها محافظ ترمینال سرور شماست. گزینه سوم استفاده از SSH (پوسته امن) از طریق یک اپلیکیشن ترمینال است که کمترین نیاز به تنظیمات را دارد و بیشترین سطح دسترسی را فراهم می‌کند.

این راهنما از جایی شروع می‌شود که اجرای عامل Hermes روی VPS شخصی به پایان می‌رسد. عامل نصب شده است، در خط فرمان پاسخ می‌دهد و اکنون می‌خواهید آن را در جیب خود داشته باشید.

دستورات زیر برای تگ v2026.8.3 نوشته شده‌اند که در تاریخ 3 اوت 2026 منتشر شده و در یادداشت‌های انتشار با عنوان v0.20.0 برچسب‌گذاری شده است. Hermes به‌طور مکرر منتشر می‌شود، بنابراین به جای دنبال کردن main، ماشین خود را روی یک تگ ثابت کنید. نصب‌کننده یک commit را می‌پذیرد:

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

hermes version آنچه را که در واقع نصب شده است چاپ می‌کند. پیش از اعتماد به هر flag در این صفحه، آن را با تگ مقایسه کنید.

محتویات مخزن و عملکرد آن

هیچ اپلیکیشن iOS یا Android در مخزن Hermes وجود ندارد. کلاینت بومی آن hermes desktop (با نام مستعار hermes gui) است، یک اپلیکیشن Electron برای macOS، Windows و Linux. این کلاینت می‌تواند به‌جای یک agent محلی، به یک agent از راه دور متصل شود: برای این کار، در تنظیمات و بخش Gateway، آدرس URL راه دور را روی http://<server-address>:9119 تنظیم کنید یا پیش از اجرای برنامه، متغیر HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 را export کنید. این کار مشکل لپ‌تاپ دوم را حل می‌کند، اما برای گوشی کاربردی ندارد.

رابط کاربری که از طریق گوشی استفاده می‌کنید، hermes dashboard یا همان رابط مرورگر است. این رابط، پیکربندی‌ها، نشست‌ها، cron jobها، مهارت‌ها، لاگ‌ها و پلتفرم‌های پیام‌رسان را مدیریت می‌کند و یک ترمینال داخلی دارد: سرور، برنامه hermes --tui را پشت یک PTY (ترمینال مجازی) اجرا کرده و خروجی آن را به صفحه استریم می‌کند. در صفحه‌های نمایش کوچک، تعویض‌کننده نشست (session switcher) به یک پنل کشویی تبدیل می‌شود، بنابراین چیدمان صفحه در گوشی به‌درستی نمایش داده می‌شود.

به‌صورت پیش‌فرض، داشبورد روی 127.0.0.1:9119 گوش می‌دهد و یک تب مرورگر را روی خود سرور باز می‌کند که در یک VPS (سرور مجازی خصوصی) بدون رابط گرافیکی (headless) کاربردی ندارد. آن را بدون مرورگر اجرا کنید و وضعیت سوکت را بررسی نمایید:

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

یک listener روی 127.0.0.1:9119 فقط از داخل خود سرور قابل دسترسی است. یک listener روی 0.0.0.0:9119 از هر شبکه‌ای که دستگاه به آن متصل است، از جمله شبکه عمومی، قابل دسترسی می‌باشد. همین یک خط تعیین می‌کند که چقدر در معرض دید هستید؛ بنابراین به‌جای فرض کردن، آن را بررسی کنید.

گزینه 1: یک شبکه مش خصوصی با Tailscale

اگر دلیل خاصی برای عدم استفاده از آن ندارید، این گزینه را انتخاب کنید. Tailscale یک VPN مش (شبکه خصوصی مجازی) است که بر پایه WireGuard ساخته شده است. هر دستگاهی که ثبت می‌کنید یک آدرس پایدار دریافت می‌کند و مستقیماً با سایر دستگاه‌ها ارتباط برقرار می‌کند. گوشی شما نیز به همان شبکه مش متصل می‌شود، بنابراین داشبورد دیگر نیازی به باز کردن پورت عمومی ندارد.

روی سرور:

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

برنامه Tailscale را روی گوشی نصب کرده و با همان حساب کاربری وارد شوید. دستور tailscale status روی سرور، نام گوشی را لیست می‌کند. حالا داشبورد را به آدرسی که tailscale ip -4 چاپ کرده است، متصل (bind) کنید:

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

اتصال به آدرس شبکه مش، به‌جای 0.0.0.0، به این معنی است که سوکت شنونده (listening socket) فقط روی رابط Tailscale وجود دارد. اسکن پورت روی IP عمومی شما هیچ چیزی را روی پورت 9119 پیدا نمی‌کند، زیرا هیچ سرویسی روی آن گوش نمی‌دهد؛ بنابراین فایروال دیگر تنها لایه حفاظتی شما نیست. این موضوع را دوباره با ss -lntp | grep 9119 تأیید کنید.

آدرس bind همچنین تعیین‌کننده احراز هویت است و این بخشی است که معمولاً نادیده گرفته می‌شود. روی 127.0.0.1، داشبورد هیچ لاگینی ندارد. روی هر آدرس دیگری، دروازه احراز هویت اجباری است و اگر ارائه‌دهنده‌ای پیکربندی نشده باشد، سرور از شروع به کار خودداری می‌کند. پروژه به این حالت "شکست امن" (failing closed) می‌گوید. اولین بار آن را به‌صورت تعاملی اجرا کنید تا پیشنهاد دهد همان‌جا یک نام کاربری و رمز عبور تنظیم کنید. نتیجه در ~/.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 مدل شما را نیز نگه می‌دارد، پس با chmod 600 ~/.hermes/.env آن را خصوصی نگه دارید.

پیش از اعتماد به دروازه، آن را از دستگاه دیگری در شبکه مش تست کنید:

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

true به همراه ["basic"] به این معنی است که دروازه فعال است و ارائه‌دهنده رمز عبور پاسخگو است. مستندات خود پروژه درباره این ارائه‌دهنده صریح است: این روش برای یک شبکه مورد اعتماد یا VPN در نظر گرفته شده و برای داشبوردی که رو به اینترنت عمومی است مناسب نیست. در یک شبکه مش، شما دقیقاً در همین وضعیت قرار دارید.

برای HTTPS داخل tailnet، پورت را به Tailscale بسپارید:

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

Tailscale عملیات TLS termination را با گواهی صادر شده برای نام MagicDNS دستگاه انجام می‌دهد، بنابراین مرورگر دیگر هشدار نمی‌دهد و کوکی نشست پرچم Secure خود را دریافت می‌کند. ابتدا MagicDNS و HTTPS Certificates را در صفحه DNS کنسول مدیریت Tailscale فعال کنید و در همان‌جا تأییدیه را بخوانید: نام دستگاه‌های شما و نام DNS شبکه tailnet شما در دفتر کل شفافیت گواهی عمومی منتشر می‌شود که هر کسی می‌تواند آن را بخواند.

هزینه واقعی در اینجا، سرور هماهنگ‌کننده (coordination server) است. ترافیک بین گوشی و VPS شما به‌صورت سرتاسری رمزنگاری شده است و از طریق Tailscale عبور نمی‌کند، اما حسابی که تصمیم می‌گیرد کدام دستگاه‌ها متعلق به شبکه مش هستند، روی سخت‌افزار شما قرار ندارد. اگر این موضوع برایتان مهم است، کنترل پلین (control plane) را خودتان با Headscale، سرور کنترل Tailscale خود-میزبانی شده اجرا کنید و کلاینت‌ها را با استفاده از tailscale up --login-server https://headscale.example.com به آن هدایت کنید. اگر ترجیح می‌دهید شبکه مش را کنار بگذارید و همتایان (peers) را دستی پیکربندی کنید، مقایسه بین WireGuard ساده و Tailscale توضیح می‌دهد که چه چیزهایی را از دست خواهید داد.

گزینه 2: یک endpoint عمومی HTTPS و تله‌ای که در آن نهفته است

گاهی اوقات دسترسی به mesh امکان‌پذیر نیست. ممکن است تلفن کاری شما اجازه نصب کلاینت VPN را ندهد. در این صورت، داشبورد پشت یک reverse proxy قرار می‌گیرد. داشبورد را روی loopback نگه دارید و اجازه دهید Caddy گواهی را مدیریت کند:

hermes.example.com {
  reverse_proxy 127.0.0.1:9119
}

Caddy گواهی را به‌طور خودکار دریافت و تمدید می‌کند و reverse_proxy آن، ارتقاهای WebSocket را بدون نیاز به دستورالعمل اضافی عبور می‌دهد؛ قابلیتی که ترمینال تعبیه‌شده در داشبورد به آن نیاز دارد. در nginx باید هدرهای Upgrade و Connection را شخصاً اضافه کنید و صدور گواهی Let's Encrypt با Certbot روی nginx بخش TLS این کار را پوشش می‌دهد. نام عمومی Hermes را به آن اعلام کنید تا callbackهای ورود به host صحیح اشاره کنند:

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

و اما تله. دروازه احراز هویت بر اساس آدرس bind عمل می‌کند، نه آدرسی که درخواست از آن آمده است. داشبوردی که روی 127.0.0.1 پشت یک پروکسی bind شده باشد، آدرس loopback را می‌بیند، تشخیص می‌دهد که نیازی به ورود نیست و به هر کسی که پروکسی اجازه عبور دهد، سرویس می‌دهد. بررسی کنید چه چیزی را واقعاً منتشر کرده‌اید:

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

اگر خروجی false باشد، اینترنت تنها به اندازه یک URL با یک ترمینال روی سرور شما فاصله دارد. هیچ اکسپلویتی در کار نیست و هیچ موردی در لاگ‌ها هشدار نمی‌دهد. دو راه حل وجود دارد و شما حداقل به یکی از آن‌ها نیاز دارید. یا احراز هویت را در پروکسی قرار دهید، با استفاده از Authentik به عنوان یک ارائه‌دهنده single sign-on خودمیزبان که از طریق forward auth در مقابل آن قرار می‌گیرد، یا ارائه‌دهنده OIDC (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 شما قرار دارد. نام کاربری و رمز عبور محافظت ضعیفی برای این وضعیت است، به همین دلیل است که مستندات برای bindهای عمومی، استفاده از OAuth یا OIDC را توصیه می‌کنند. نرخ ورود (rate limit) را محدود کنید، ufw را برای همه چیز به جز پورت‌های پروکسی و SSH ببندید و هر از گاهی لاگ دسترسی را بررسی کنید.

گزینه 3: استفاده از SSH و mosh از طریق ترمینال موبایل

کم‌دردسرترین روش: یک اپلیکیشن ترمینال روی گوشی نصب کنید، یک SSH key در آن بارگذاری کنید و از رابط متنی خودِ agent استفاده کنید.

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

tmux new -A -s phone به نشست (session) با نام phone متصل می‌شود یا اگر وجود نداشته باشد آن را ایجاد می‌کند؛ بنابراین با قطع اتصال، agent همچنان در حال اجرا باقی می‌ماند و دفعه بعد دقیقاً به همان نقطه بازمی‌گردید. این الگو مشابه همان روشی است که برای هدایت Claude Code از طریق گوشی استفاده می‌شود.

استفاده از SSH معمولی روی شبکه موبایل آزاردهنده است، زیرا با هر بار تغییر آدرس IP گوشی یا به خواب رفتن آن، اتصال قطع می‌شود. Mosh این مشکل را حل می‌کند. این ابزار روی پروتکل UDP (user datagram protocol) اجرا می‌شود و به‌جای جریان بایت، وضعیت ترمینال را همگام‌سازی می‌کند؛ در نتیجه نشست شما هنگام جابه‌جایی بین وای‌فای و شبکه دیتای موبایل زنده می‌ماند:

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 به معنای دسترسی به تمام قابلیت‌های آن حساب کاربری است. در این حالت، درخواست‌های تأیید (approval prompts) در agent، آخرین سد دفاعی بین یک گوشی سرقت‌شده و بازشده (unlocked) و فایل‌های شما هستند. برای این کار از یک حساب کاربری اختصاصی (غیر از root) استفاده کنید، فقط با کلید وارد شوید و پیش از قرار دادن کلید روی دستگاهی که همیشه همراه دارید، مراحل ایمن‌سازی SSH روی VPS را انجام دهید.

چه مواردی در شبکه موبایل دچار اختلال می‌شوند

چهار مورد وجود دارد و هیچ‌کدام از آن‌ها باگ‌هایی نیستند که بتوانید با پیکربندی رفعشان کنید.

داشبورد در حالی که به آن نگاه نمی‌کنید، شما را خارج (Logout) می‌کند. توکن‌های دسترسی دارای TTL (زمان بقا) 15 دقیقه‌ای هستند و قرارداد API فعلی فاقد توکن بازنشانی (refresh token) است. هنگامی که توکن منقضی می‌شود، صفحه پاسخ 401 را دریافت کرده و به /login بازمی‌گردد. داشبورد را باز کنید، گوشی را برای بیست دقیقه در جیب خود بگذارید؛ وقتی برمی‌گردید با صفحه ورود مواجه می‌شوید و هر چه در حال تایپ آن بودید از بین رفته است. هیچ چیز خراب نشده است. دوباره وارد شوید.

ترمینال تعبیه‌شده (embedded terminal) با رفتن به تب پس‌زمینه باقی نمی‌ماند. سرور رابط کاربری متنی (TUI) را پشت یک PTY ایجاد می‌کند و هنگام بسته شدن تب، آن را به‌طور کامل پاکسازی می‌کند؛ بازگشایی مجدد، یک نمونه جدید ایجاد می‌کند. مرورگرهای موبایل برای بازیابی حافظه، تب‌های پس‌زمینه را حذف می‌کنند، بنابراین سوئیچ کردن به یک برنامه دیگر برای مدتی طولانی، آن ترمینال را خاتمه می‌دهد. تاریخچه چت شما امن است، زیرا نشست‌ها روی سرور ذخیره می‌شوند و hermes sessions list همچنان آن‌ها را نمایش می‌دهد. خود ترمینال چیزی نیست که بتوانید دوباره به آن متصل شوید. اگر به نشستی نیاز دارید که باقی بماند، از tmux روی SSH استفاده کنید.

اتصال‌های بلااستفاده (Idle) بی‌سروصدا قطع می‌شوند. اپراتورهای موبایل اتصال‌های TCP بلااستفاده را برای بازیابی ورودی‌های جدول NAT (ترجمه آدرس شبکه) قطع می‌کنند و گوشی پس از خاموش شدن صفحه، تقریباً به‌طور کامل سرویس‌دهی به شبکه را متوقف می‌کند. یک WebSocket که مدتی ساکت بوده، معمولاً هنگام باز کردن قفل گوشی از قبل مرده است و صفحه فقط پس از لمس کردن شما دوباره متصل می‌شود. به همین دلیل است که mosh روی گوشی حس بهتری نسبت به SSH دارد: mosh هرگز اتصالی نداشته که بخواهد آن را از دست بدهد.

هیچ‌چیز اعلان (Notification) ارسال نمی‌کند. نه داشبورد و نه نشست SSH نمی‌توانند گوشی شما را بیدار کنند. هیچ برنامه Hermes روی دستگاه وجود ندارد، بنابراین مسیری به سرویس Push پلتفرم وجود ندارد. اجرای طولانی یک Agent به پایان می‌رسد و شما دفعه بعد که به گوشی نگاه می‌کنید، از آن مطلع می‌شوید.

اعلان‌ها از طریق درگاه پیام‌رسان ارسال می‌شوند

راهکار مشکل قبلی استفاده از درگاه (gateway) است که روشی کاملاً متفاوت برای دسترسی به agent محسوب می‌شود. hermes gateway عامل را به پلتفرم‌های پیام‌رسان از جمله Telegram، Discord، Slack، WhatsApp، Signal و ایمیل متصل می‌کند. در این حالت، شما با عامل خود در برنامه‌ای گفتگو می‌کنید که از قبل یک کانال push روی گوشی شما دارد، تحویل پیام در پس‌زمینه را مدیریت می‌کند و با قطع و وصل شدن شبکه نیز سازگار است.

hermes gateway setup
hermes gateway install
hermes gateway status

hermes gateway install درگاه را به عنوان یک سرویس systemd ثبت می‌کند تا پس از reboot دوباره اجرا شود. نصب‌کننده Hermes هیچ unit سرویسی برای شما ایجاد نمی‌کند، بنابراین hermes dashboard پس از راه‌اندازی مجدد سیستم به‌طور خودکار بالا نمی‌آید. برای هر بخشی که به آن وابسته هستید یک unit بنویسید؛ نوشتن سرویس‌ها و تایمرهای systemd روی VPS نحوه ایجاد فایل مربوطه را توضیح می‌دهد.

یک job زمان‌بندی‌شده می‌تواند نتیجه را به همان روش و بدون نیاز به گفتگو ارسال کند:

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

مجوزدهی در اینجا به‌صورت پیش‌فرض بر پایه مسدودسازی (deny by default) است. وقتی هیچ allowlist تنظیم نشده و GATEWAY_ALLOW_ALL_USERS مقداردهی نشده باشد، دسترسی همه کاربران رد می‌شود که نقطه شروع مناسبی است. نام حساب‌هایی که می‌خواهید مجاز باشند را در ~/.hermes/.env وارد کنید:

TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789

یا می‌توانید به‌جای کپی کردن IDهای عددی، جفت‌سازی مبتنی بر کد را با تنظیم unauthorized_dm_behavior: pair در ~/.hermes/config.yaml فعال کنید. یک حساب ناشناس که به عامل پیام می‌دهد، یک کد هشت‌کاراکتری دریافت می‌کند و تا زمانی که شما آن را تأیید نکنید، هیچ اتفاق دیگری نمی‌افتد:

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

کدها پس از یک ساعت منقضی می‌شوند، کاربر می‌تواند هر ده دقیقه یک‌بار درخواست کد جدید کند و پنج تلاش ناموفق منجر به قفل شدن آن حساب می‌شود.

محدود کردن شعاع انفجار در صورت سرقت گوشی

گوشی‌ای که به agent شما دسترسی دارد، می‌تواند روی سرور شما دستور اجرا کند و گوشی‌ها ممکن است گم شوند. همین حالا تصمیم بگیرید که فردی که گوشی را در اختیار دارد، چه کارهایی می‌تواند انجام دهد.

تأییدیه‌ها را فعال نگه دارید. approvals.mode به‌طور پیش‌فرض روی smart تنظیم شده است که از یک مدل کمکی برای ارزیابی ریسک استفاده می‌کند و فقط دستورات با ریسک پایین را به‌طور خودکار تأیید می‌کند. تنظیم آن روی off مشابه اجرای همه دستورات با --yolo است و HERMES_YOLO_MODE=1 این کار را از طریق متغیرهای محیطی انجام می‌دهد. گوشی‌ای را که در این وضعیت با agent در ارتباط است، همراه خود نبرید. مقدار approvals.cron_mode: deny را طوری تنظیم کنید که کارهای زمان‌بندی‌شده (scheduled jobs) نتوانند در زمانی که خواب هستید، خودشان را تأیید کنند.

approvals:
  mode: smart
  cron_mode: deny

دنیای کوچکتری برای خرابکاری در اختیار agent قرار دهید. terminal.backend: docker دستورات را داخل یک container اجرا می‌کند که تمام قابلیت‌های Linux (Linux capabilities) را به‌جز لیست کوتاهی حذف می‌کند، no-new-privileges را تنظیم کرده و تعداد پردازش‌ها را محدود می‌کند؛ بنابراین container به جای یک prompt، مرز دسترسی می‌شود. 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 را مسدود می‌کند، از نوشتن فایل‌های .env در هر جای دیسک خودداری می‌کند و فارغ از تنظیمات تأییدیه شما، لیستی از دستورات مخرب را رد می‌کند. این را به عنوان حداقل سطح امنیت در نظر بگیرید، نه به عنوان کل برنامه امنیتی خود. agent را به عنوان یک کاربر معمولی اجرا کنید، هرگز آن را با دسترسی root اجرا نکنید. همین منطق برای هر agent کدنویسی که بدون نظارت رها می‌شود نیز صدق می‌کند و اجرای ایمن Claude Code روی VPS این موضوع را با جزئیات بیشتری بررسی می‌کند.

سپس مراحل ابطال دسترسی را پیش از آنکه به آن‌ها نیاز پیدا کنید، یادداشت کنید. حذف دستگاه از کنسول مدیریتی Tailscale، دسترسی آن به شبکه mesh را بلافاصله قطع می‌کند. تغییر HERMES_DASHBOARD_BASIC_AUTH_SECRET و راه‌اندازی مجدد، تمام نشست‌های (session) داشبورد را در همه دستگاه‌ها باطل می‌کند، زیرا این مقدار کوکی نشست را امضا می‌کند. حذف کلید عمومی گوشی از ~/.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 استفاده کنید. کلاینت‌های موبایل شخص‌ثالث وجود دارند، اما این‌ها کدهای غیررسمی هستند که به اعتبارنامه‌های agent شما دسترسی دارند؛ بنابراین پیش از نصب، حتماً سورس‌کد آن‌ها را بررسی کنید.

چرا داشبورد Hermes در گوشی من را از حساب خارج (log out) می‌کند؟

توکن‌های دسترسی دارای TTL پانزده دقیقه‌ای هستند و قرارداد API فعلی فاقد refresh token است. هنگامی که توکن منقضی می‌شود، صفحه خطای 401 دریافت کرده و به /login هدایت می‌شود. در گوشی، به دلیل اینکه مرورگر به پس‌زمینه می‌رود، این موضوع کاملاً مشهود است؛ چرا که بیست دقیقه کار با اپلیکیشنی دیگر برای منقضی شدن توکن کافی است. مقدار HERMES_DASHBOARD_BASIC_AUTH_SECRET را روی یک مقدار تصادفی ثابت تنظیم کنید تا کلید امضای نشست (session signing key) در طول راه‌اندازی‌های مجدد ثابت بماند؛ این کار دومین دلیل خروج از حساب را برطرف می‌کند.

آیا می‌توانم داشبورد Hermes را با امنیت کامل روی اینترنت عمومی قرار دهم؟

فقط در صورتی که احراز هویت را خودتان تأیید کرده باشید. دروازه احراز هویت بر اساس آدرس bind فعال می‌شود؛ بنابراین داشبوردی که روی 127.0.0.1 و پشت یک reverse proxy قرار دارد، هرگز از اینترنت درخواست ورود نمی‌کند. دستور curl -s https://your-host/api/status | jq '.auth_required' را اجرا کنید و خروجی آن را بخوانید. به جای نام کاربری و رمز عبور از OAuth یا OIDC استفاده کنید، زیرا مستندات پروژه تأکید دارند که ارائه‌دهنده رمز عبور فقط برای شبکه‌های مورد اعتماد و VPNها مناسب است. یک شبکه mesh خصوصی این مسئله را به‌طور کامل حل می‌کند و به همین دلیل گزینه پیش‌فرض بهتری است.

آیا به حساب کاربری Tailscale نیاز دارم یا می‌توانم control plane را خودم میزبانی کنم؟

شما می‌توانید آن را خودتان میزبانی کنید. Headscale یک پیاده‌سازی متن‌باز از سرور هماهنگ‌کننده Tailscale است و کلاینت‌های رسمی Tailscale با استفاده از tailscale up --login-server https://headscale.example.com به آن متصل می‌شوند. در این حالت، شما مالک لیست دستگاه‌های مجاز در شبکه mesh هستید. هزینه این کار این است که اکنون باید آن سرور را مدیریت و از آن پشتیبان‌گیری کنید؛ همچنین تا زمانی که آن سرور در دسترس نباشد، نمی‌توانید دستگاه جدیدی را ثبت یا احراز هویت کنید.

چگونه می‌توانم هنگام پایان یافتن یک job توسط agent، در گوشی خود اعلان دریافت کنم؟

از درگاه پیام‌رسان استفاده کنید. داشبورد و SSH راهی برای بیدار کردن گوشی ندارند، زیرا هیچ اپلیکیشن Hermes روی دستگاه برای دریافت push وجود ندارد. agent را با استفاده از hermes gateway setup به Telegram، Signal، Discord یا هر پلتفرم پشتیبانی‌شده دیگری متصل کنید تا اپلیکیشن همان پلتفرم اعلان را به شما برساند. همچنین یک cron job می‌تواند با استفاده از hermes send -t telegram -s "Job done" -f /path/to/report.txt یک پیام تکی ارسال کند که بدون فراخوانی مدل، تحویل داده می‌شود.