SSD Nodes Learn Hosting plans →
راهنماها Matt Connorتوسط Matt Connor

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

با استفاده از Tailscale یا reverse proxy به Hermes agent روی VPS متصل شوید. این راهنما برای نسخه v0.20.0 تنظیم شده و روش‌های ایمن‌سازی دسترسی و ابطال فوری آن را آموزش می‌دهد.

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

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

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

دستورات زیر برای تگ v2026.8.3 نوشته شده‌اند که در تاریخ 3 اوت 2026 منتشر شده و در یادداشت‌های انتشار با عنوان v0.20.0 برچسب‌گذاری شده است. Hermes به‌طور مکرر عرضه می‌شود، بنابراین به‌جای دنبال کردن main، ماشین خود را روی یک تگ خاص قفل (pin) کنید. نصب‌کننده یک 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 از راه دور متصل شود: برای این کار، URL مقصد را در بخش Settings و زیرمنوی Gateway روی http://<server-address>:9119 تنظیم کنید یا پیش از اجرای برنامه، متغیر HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 را export کنید. این روش مشکل استفاده از لپ‌تاپ دوم را حل می‌کند، اما برای گوشی کاربردی ندارد.

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

به‌صورت پیش‌فرض، داشبورد روی 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" می‌گوید. برای اولین بار آن را به‌صورت تعاملی اجرا کنید تا پیشنهاد دهد همان‌جا یک نام کاربری و رمز عبور تنظیم کنید که در dashboard.basic_auth واقع در ~/.hermes/config.yaml ذخیره می‌شود. شما می‌توانید همین ارائه‌دهنده را از طریق ~/.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) استفاده می‌شود، بنابراین تغییر آن باعث خروج (logout) تمام دستگاه‌ها خواهد شد. همین فایل کلیدهای 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 شما در دفتر کل شفافیت گواهی‌های عمومی (public certificate transparency ledger) منتشر می‌شود که برای همه قابل مشاهده است.

هزینه واقعی در اینجا، سرور هماهنگ‌کننده (coordination server) است. ترافیک بین گوشی و VPS شما به‌صورت سرتاسری (end-to-end) رمزنگاری شده است و از طریق 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 در آن بارگذاری کنید و از رابط متنی خودِ 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، آخرین سد دفاعی بین یک گوشی سرقت‌شده و بازشده با فایل‌های شما هستند. برای این کار از یک حساب کاربری اختصاصی (غیر از root) استفاده کنید، فقط با کلید وارد شوید و پیش از قرار دادن کلید روی دستگاهی که همیشه همراه دارید، مراحل ایمن‌سازی SSH روی VPS را انجام دهید.

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

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

داشبورد در حالی که به آن نگاه نمی‌کنید، شما را از سیستم خارج (logout) می‌کند. زمان این اتفاق به ارائه‌دهنده ورود (login provider) بستگی دارد. ارائه‌دهنده نام کاربری و رمز عبور، نشست‌هایی صادر می‌کند که به‌طور پیش‌فرض 12 ساعت اعتبار دارند و توسط session_ttl_seconds در dashboard.basic_auth تنظیم شده‌اند. ارائه‌دهنده OAuth در Nous Portal، توکن‌های دسترسی با TTL (زمان ماندگاری) 15 دقیقه صادر می‌کند و قرارداد API فعلی آن فاقد refresh token است. هنگامی که توکن منقضی می‌شود، صفحه پاسخ 401 را دریافت کرده و به /login بازمی‌گردد. با یک توکن 15 دقیقه‌ای، اگر داشبورد را باز کنید و گوشی را برای بیست دقیقه در جیب خود بگذارید، هنگام بازگشت با صفحه ورود مواجه می‌شوید و هر چه در حال تایپ آن بودید از بین می‌رود. هیچ چیزی خراب نشده است. دوباره وارد شوید.

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

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

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

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

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

hermes gateway setup
hermes gateway install
hermes gateway status

hermes gateway install، این درگاه را به عنوان یک سرویس systemd ثبت می‌کند تا پس از reboot دوباره اجرا شود. مرحلهٔ gateway در نصب‌کننده می‌تواند این کار را برای شما انجام دهد، اما هیچ بخشی از نصب‌کننده برای hermes dashboard یک unit ایجاد نمی‌کند؛ بنابراین 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

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

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

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

محدود کردن دامنه آسیب در صورت سرقت گوشی

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

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

approvals:
  mode: smart
  cron_mode: deny

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

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

این موضوع به ارائه‌دهنده ورود (login provider) بستگی دارد. ارائه‌دهنده OAuth در Nous Portal، توکن‌های دسترسی با TTL 15 دقیقه‌ای صادر می‌کند و قرارداد API فعلی آن فاقد refresh token است؛ بنابراین وقتی توکن منقضی می‌شود، صفحه خطای 401 دریافت کرده و به /login هدایت می‌شود. وقتی مرورگر در گوشی به پس‌زمینه می‌رود، این موضوع کاملاً مشهود است، زیرا 20 دقیقه کار با اپلیکیشنی دیگر برای رسیدن به این زمان کافی است. ارائه‌دهنده نام کاربری و رمز عبور به‌صورت پیش‌فرض از نشست 12 ساعته استفاده می‌کند که توسط session_ttl_seconds تنظیم می‌شود. با آن ارائه‌دهنده، مقدار HERMES_DASHBOARD_BASIC_AUTH_SECRET را روی یک مقدار تصادفی ثابت تنظیم کنید تا کلید امضای نشست در طول راه‌اندازی‌های مجدد ثابت بماند؛ این کار دومین دلیل خروج ناخواسته از حساب را برطرف می‌کند.

آیا می‌توانم داشبورد 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 یک پیام تکی ارسال کند که بدون فراخوانی مدل، تحویل داده می‌شود.