رابط وب

Throne را با thronectl web از مرورگر مدیریت کنید: راه‌اندازی آن با Docker، یونیت systemd یا به‌صورت دستی، دسترسی از طریق تونل SSH، HTTPS یا پروکسی معکوس، و امن نگه داشتن آن.

thronectl web یک رابط وب برای Throne ارائه می‌دهد. در مرورگر می‌توانید اتصال را ببینید و عوض کنید، نمایه‌ها را انتخاب و تست کنید، نمایه وارد کنید و اشتراک‌ها را به‌روزرسانی کنید، ترافیک و گزارش‌ها را دنبال کنید، تنظیمات را تغییر دهید، و پشتیبان بگیرید و بازیابی کنید. این رابط با Throne بدون رابط گرافیکی و با Throne دسکتاپی که Throne API در آن روشن است کار می‌کند. Throne برای Android، Throne API ندارد، بنابراین رابط وب نمی‌تواند آن را مدیریت کند.

رابط وب بخشی از thronectl است، نه Throne. thronectl web یک وب‌سرور کوچک است، یعنی دروازه (gateway): مرورگر شما با دروازه صحبت می‌کند و دروازه از طریق Throne API با Throne، با همان نشانی و کلیدی که فرمان‌های دیگر thronectl به کار می‌برند. خود Throne هیچ صفحهٔ وبی ارائه نمی‌دهد.

وقتی می‌خواهید ببینید و کلیک کنید، برای مثال از یک گوشی یا از رایانه‌ای بدون thronectl، از رابط وب استفاده کنید. برای اسکریپت‌ها، کلیدهای میان‌بر و خودکارسازی، از فرمان‌های thronectl استفاده کنید. هر دو هم‌زمان کار می‌کنند.

شروع سریع

روشی را انتخاب کنید که با نحوهٔ اجرای Throne جور است. در هر کدام، دروازه روی همان دستگاه Throne اجرا می‌شود، جایی که Throne به همهٔ درخواست‌های آن، از جمله درخواست‌های مدیریتی، پاسخ می‌دهد.

Docker

ایمیج Docker وقتی THRONE_WEB_LISTEN تنظیم شده باشد، دروازه را در کنار Throne و در همان کانتینر اجرا می‌کند. در فایل compose.yaml از مخزن Throne، این متغیر را به سرویس throne اضافه کنید و پورت را منتشر کنید:

services:
  throne:
    environment:
      THRONE_WEB_LISTEN: "*:9096"
    ports: ["2080:2080", "9096:9096"]

روی میزبانی که از اینترنت قابل دسترسی است، فقط نشانی LAN را منتشر کنید، برای مثال "192.168.1.2:9096:9096". با docker run، -e THRONE_WEB_LISTEN='*:9096' -p 9096:9096 را اضافه کنید. سپس کانتینر را شروع کنید و گزارشش را بخوانید:

docker compose up -d
docker compose logs throne

گزارش، گذرواژه و اثر انگشت گواهی خودامضا را نشان می‌دهد. https://<host>:9096/ را باز کنید، اثر انگشت را همان‌طور که در شبکهٔ محلی آمده مقایسه کنید و وارد شوید.

  • نقطهٔ ورود (entrypoint) کانتینر، به‌محض اینکه API در Throne پاسخ دهد، thronectl web را در کنار Throne شروع می‌کند و نشانی و کلید API را خودش پیدا می‌کند. وقتی دروازه خارج شود، نقطهٔ ورود 3 ثانیه بعد آن را دوباره شروع می‌کند؛ بنابراین یک مقدار نادرست در THRONE_WEB_* هر 3 ثانیه یک بار در گزارش دیده می‌شود. دروازه همراه با کانتینر هم دوباره راه‌اندازی می‌شود.
  • دروازه وضعیت خود را در /var/lib/throne/web روی volume داده‌ها نگه می‌دارد.
  • متغیرهای دیگر THRONE_WEB_*، مانند THRONE_WEB_TLS، THRONE_WEB_ALLOW_HOST یا THRONE_WEB_PASSWORD_FILE (گزینه‌ها را ببینید)، در همان بخش environment: قرار می‌گیرند.

بسته‌های Linux (systemd)

بسته‌های .deb و .rpm، thronectl را با نام /usr/bin/thronectl و یک یونیت دوم به نام throne-web.service را نصب می‌کنند که thronectl web را در کنار throne.service اجرا می‌کند. این یونیت با root اجرا نمی‌شود: systemd به آن یک کاربر پویا (dynamic user) مخصوص خودش می‌دهد، کلید Throne یعنی /var/lib/throne/config/api.key را به‌عنوان یک credential به آن می‌دهد و وضعیت آن را در /var/lib/throne-web نگه می‌دارد. بسته آن را فعال نمی‌کند:

sudo systemctl enable --now throne-web
sudo journalctl -u throne-web | grep 'web UI password'

تا وقتی نخستین شروع Throne فایل کلید را نساخته باشد، یونیت شکست می‌خورد و systemd هر 5 ثانیه آن را دوباره شروع می‌کند، همان‌طور که پس از هر شکست دیگری. روی 127.0.0.1:9096 گوش می‌دهد: آن را از طریق یک تونل SSH باز کنید. برای تغییر گزینه‌هایش، متغیرهای /etc/throne/web.env را از حالت توضیح خارج کنید (گزینه‌ها را ببینید) و sudo systemctl restart throne-web را اجرا کنید. ارتقاها تغییرات شما را نگه می‌دارند. هرگز کلید یا گذرواژه را در این فایل نگذارید. کاربر یونیت نمی‌تواند فایل‌هایی را بخواند که فقط root می‌تواند بخواند، مانند کلیدی در جای دیگر، کلید TLS یا فایل گذرواژه؛ /etc/throne/web.env نشان می‌دهد چگونه آن‌ها را با LoadCredential= بدهید (sudo systemctl edit throne-web). پورتی پایین‌تر از 1024 به CAP_NET_BIND_SERVICE در AmbientCapabilities= و CapabilityBoundingSet= یونیت نیاز دارد.

به‌صورت دستی، روی هر سیستمی

thronectl را روی دستگاهی که Throne را اجرا می‌کند نصب کنید (نصب thronectl را ببینید)، آن را مانند هر فرمان دیگری به Throne متصل کنید (اتصال thronectl به Throne را ببینید)، و دروازه را شروع کنید:

export THRONE_KEY_FILE=~/.config/throne/api-key
thronectl web

دروازه گذرواژه را یک بار چاپ می‌کند، و اینکه کجا ارائه می‌شود:

thronectl web: created the web UI password: k7mfq-2xhpa-9tnwe-c3rjd
thronectl web: change it with 'thronectl web passwd'
thronectl web: serving on http://127.0.0.1:9096/ for Throne at 127.0.0.1:9095

http://127.0.0.1:9096/ را در مرورگری روی همان دستگاه باز کنید و با آن گذرواژه وارد شوید. thronectl web تا وقتی که Ctrl+C را بزنید اجرا می‌شود. بدون Throne هم شروع می‌شود: تا وقتی Throne پاسخ ندهد، رابط وب می‌گوید که Throne در دسترس نیست.

برای Throne دسکتاپ، ابتدا API را روشن کنید (تنظیمات (Settings) ← Integration Settings ← Throne API؛ روشن کردن API در Throne را ببینید) و کلید آن را در یک فایل نگه دارید، همان‌طور که در اتصال thronectl به Throne آمده است. در Windows، در PowerShell:

$env:THRONE_KEY_FILE = "$HOME\throne-api-key.txt"
thronectl web

دسترسی از دستگاه دیگر

به‌طور پیش‌فرض دروازه روی 127.0.0.1:9096 گوش می‌دهد که فقط برنامه‌های روی دستگاه Throne به آن می‌رسند. از دستگاه دیگر، از تونل SSH، از HTTPS در شبکهٔ محلی یا از یک پروکسی معکوس استفاده کنید.

تونل SSH

اگر می‌توانید با SSH وارد دستگاه شوید، دروازه را روی loopback نگه دارید و از رایانهٔ خودتان به آن تونل بزنید:

ssh -L 9096:127.0.0.1:9096 user@host

تا وقتی آن نشست باز است، http://localhost:9096/ را روی رایانهٔ خودتان باز کنید (برای روش Docker که با HTTPS ارائه می‌شود، https://). هیچ چیزی در شبکهٔ دستگاه به دروازه نمی‌رسد و SSH ترافیک را رمزگذاری می‌کند. اگر پورت 9096 روی رایانهٔ شما در حال استفاده است، پورت محلی دیگری انتخاب کنید: ssh -L 19096:127.0.0.1:9096 user@host و سپس http://localhost:19096/.

شبکهٔ محلی (HTTPS)

برای اینکه رابط وب را مستقیم از دستگاه‌های دیگر شبکه‌تان باز کنید، اجازه دهید دروازه روی یک نشانی شبکه گوش دهد:

thronectl web --listen '*:9096'

*:9096 روی همهٔ نشانی‌های دستگاه گوش می‌دهد و 192.168.1.2:9096 فقط روی یکی. روی یک نشانی شبکه، دروازه با HTTPS ارائه می‌شود. اگر به آن گواهی ندهید، یک گواهی خودامضا در پوشهٔ وضعیت (state directory) خود می‌سازد و در هر بار شروع، اثر انگشت گواهی را چاپ می‌کند:

thronectl web: created a self-signed TLS certificate in /home/you/.config/thronectl/web/tls
thronectl web: TLS certificate SHA-256 fingerprint: 3F:A1:5C:…:9C
thronectl web: serving on https://localhost:9096/ for Throne at 127.0.0.1:9095
thronectl web: serving on https://192.168.1.2:9096/ for Throne at 127.0.0.1:9095

مرورگر هشدار می‌دهد که گواهی قابل اعتماد نیست، چون هیچ مرجع صدور گواهی آن را امضا نکرده است. پیش از پذیرفتن آن:

  1. جزئیات گواهی را از صفحهٔ هشدار یا از نوار نشانی باز کنید.
  2. اثر انگشت SHA-256 آن را با اثر انگشتی که دروازه چاپ کرده مقایسه کنید.
  3. فقط اگر این دو یکسان بودند گواهی را بپذیرید. اگر فرق داشتند، چیزی میان شما و دستگاه اتصال را رهگیری می‌کند: وارد نشوید.

صفحهٔ System در رابط وب هم اثر انگشت را نشان می‌دهد. پورت 9096 را در فایروال دستگاه، و فقط برای شبکهٔ خودتان، باز کنید.

  • گواهی برای localhost، نام میزبان دستگاه و نشانی‌هایی صادر شده است که دستگاه هنگام ساخت آن توسط دروازه داشت. برای ساختن گواهی جدید، برای مثال پس از تغییر نشانی دستگاه، پوشهٔ tls را در پوشهٔ وضعیت حذف کنید و دروازه را دوباره راه‌اندازی کنید. اثر انگشت هم همراه آن تغییر می‌کند.
  • گواهی خودامضا 10 سال اعتبار دارد. وقتی منقضی شده باشد یا خوانده نشود، دروازه در شروع بعدی یک گواهی جدید می‌سازد.
  • برای استفاده از گواهی خودتان، زنجیرهٔ گواهی و کلید خصوصی را به‌صورت فایل‌های PEM با --tls-cert و --tls-key بدهید. دروازه آن‌ها را هنگام شروع می‌خواند؛ پس از تمدید آن‌ها، دروازه را دوباره راه‌اندازی کنید.

پشت پروکسی معکوس

یک پروکسی معکوس (reverse proxy) مانند nginx یا Caddy می‌تواند رابط وب را با یک نام میزبان متعلق به شما و با گواهی‌ای که مرورگرها به آن اعتماد دارند ارائه دهد. دروازه را روی loopback نگه دارید، جایی که با HTTP ساده و فقط برای برنامه‌های همان دستگاه ارائه می‌شود، و نام میزبان را به آن بدهید:

thronectl web --allow-host throne.example.com

روی loopback، دروازه فقط به درخواست‌هایی برای localhost، 127.0.0.1، ::1 و نام‌های موجود در --allow-host پاسخ می‌دهد (بررسی Host را ببینید). وقتی پروکسی روی دستگاه دیگر یا در کانتینر دیگری اجرا می‌شود، دروازه باید روی یک نشانی شبکه گوش دهد: آنجا --tls off را اضافه کنید و فقط به پروکسی اجازهٔ رسیدن به آن نشانی را بدهید، چون گذرواژه و نشست بدون رمزگذاری از آن عبور می‌کنند.

پروکسی باید:

  • هدر Host را همان‌طور که مرورگر فرستاده عبور دهد. دروازه تغییراتی را که هدر Origin آن‌ها با هدر Host نمی‌خواند رد می‌کند (403 csrf). nginx این هدر را عوض می‌کند، مگر اینکه آن را تنظیم کنید؛ Caddy آن را نگه می‌دارد.
  • بدنهٔ درخواست‌ها را تا 512 MiB بپذیرد، یعنی بزرگ‌ترین پشتیبانی که رابط وب بازیابی می‌کند. nginx فقط 1 MiB می‌پذیرد، مگر اینکه client_max_body_size را تنظیم کنید.
  • پاسخ‌ها را همان‌طور که می‌رسند عبور دهد. رابط وب به‌روزرسانی‌های زنده و گزارش را به‌صورت جریان (stream) دریافت می‌کند. دروازه X-Accel-Buffering: no را می‌فرستد که بافر کردن nginx را برای آن‌ها خاموش می‌کند.

nginx:

server {
    listen 443 ssl;
    server_name throne.example.com;
    ssl_certificate     /etc/ssl/certs/throne.example.com.pem;
    ssl_certificate_key /etc/ssl/private/throne.example.com.key;

    location / {
        proxy_pass http://127.0.0.1:9096;
        proxy_set_header Host $http_host;
        client_max_body_size 512m;
    }
}

Caddy:

throne.example.com {
    reverse_proxy 127.0.0.1:9096
}

پشت پروکسی، همهٔ مرورگرها از نشانی پروکسی به دروازه می‌رسند، بنابراین ورودهای ناموفق از یک مرورگر، دسترسی بقیه را هم قطع می‌کند.

گذرواژه

رابط وب یک گذرواژه دارد و حساب کاربری ندارد. دروازه در نخستین شروع، یک گذرواژهٔ تصادفی می‌سازد، هش آن (argon2id) را در فایل password در پوشهٔ وضعیت خود ذخیره می‌کند و گذرواژه را یک بار چاپ می‌کند:

thronectl web: created the web UI password: k7mfq-2xhpa-9tnwe-c3rjd
thronectl web: change it with 'thronectl web passwd'
روش راه‌اندازی نخستین گذرواژه کجاست
Docker docker compose logs throne
یونیت systemd sudo journalctl -u throne-web | grep 'web UI password'
دستی ترمینالی که thronectl web را در آن شروع کردید

این خط در آن گزارش می‌ماند، پس پس از نخستین ورود گذرواژه را تغییر دهید:

  • در صفحهٔ System رابط وب. این کار همهٔ مرورگرهای دیگر را از حساب خارج می‌کند.
  • با thronectl web passwd، که با کاربری که دروازه با آن اجرا می‌شود و با همان پوشهٔ وضعیت (--state-dir یا THRONE_WEB_STATE_DIR) اجرا شود. روی ترمینال دو بار می‌پرسد و آنچه را تایپ می‌کنید نشان نمی‌دهد؛ در غیر این صورت یک خط از ورودی استاندارد می‌خواند. دروازهٔ در حال اجرا ظرف 5 ثانیه گذرواژهٔ جدید را می‌بیند و همه را از حساب خارج می‌کند. در روش Docker: docker compose exec throne thronectl web passwd.

گذرواژه دست‌کم 8 نویسه لازم دارد. زیر systemd، آن را با root تنظیم کنید؛ فایل در اختیار کاربر یونیت می‌ماند:

sudo thronectl web passwd --state-dir /var/lib/throne-web

گذرواژهٔ فراموش‌شده. با thronectl web passwd یک گذرواژهٔ جدید بگذارید، یا فایل password را در پوشهٔ وضعیت حذف کنید و دروازه را دوباره راه‌اندازی کنید. در این صورت دروازه یک گذرواژهٔ جدید می‌سازد و آن را چاپ می‌کند.

فایل گذرواژه. --password-file FILE (یا THRONE_WEB_PASSWORD_FILE) گذرواژه را به‌جای هش ذخیره‌شده، به‌صورت متن ساده از یک فایل می‌گیرد، برای مثال از یک Docker secret. یک شکست خط در انتها نادیده گرفته می‌شود؛ فایل خالی خطاست. دروازه هر 5 ثانیه فایل را بررسی می‌کند و وقتی تغییر کند همه را از حساب خارج می‌کند. اگر فایل خالی یا ناخوانا شود، دروازه آخرین گذرواژه را نگه می‌دارد و این را در گزارش خود می‌نویسد. با فایل گذرواژه، صفحهٔ System نمی‌تواند گذرواژه را تغییر دهد، و thronectl web passwd هم تا وقتی THRONE_WEB_PASSWORD_FILE تنظیم شده نمی‌تواند: به‌جای آن خود فایل را تغییر دهید.

services:
  throne:
    environment:
      THRONE_WEB_LISTEN: "*:9096"
      THRONE_WEB_PASSWORD_FILE: /run/secrets/throne_web_password
    secrets: [throne_web_password]
secrets:
  throne_web_password:
    file: ./web-password.txt

نشست‌ها. یک ورود تا وقتی معتبر است که مرورگر 12 ساعت بی‌کار نمانده باشد، و حداکثر 7 روز. Sign out در صفحهٔ System آن را پایان می‌دهد. دروازه نشست‌ها را در حافظه نگه می‌دارد، پس راه‌اندازی دوبارهٔ آن همه را از حساب خارج می‌کند. دروازه حداکثر 64 نشست نگه می‌دارد؛ یک ورود بیشتر، نشستی را پایان می‌دهد که زمان بیشتری از آخرین استفاده‌اش گذشته است.

رابط وب چه چیزهایی را پوشش می‌دهد

صفحه کارهایی که می‌توانید انجام دهید
Status دیدن وضعیت، نمایهٔ در حال اجرا، کیل‌سوییچ و سرعت فعلی؛ اتصال و قطع اتصال؛ روشن و خاموش کردن TUN و پروکسی سیستم (پروکسی سیستم فقط در Throne دسکتاپ)؛ انتخاب نمایهٔ مسیریابی؛ راه‌اندازی دوبارهٔ نمایه وقتی یک تنظیم آن را لازم دارد؛ دنبال کردن و لغو تست‌ها.
Profiles مرور گروه‌ها و نمایه‌ها با نتایج تست، فیلتر و مرتب کردن آن‌ها؛ اتصال یک نمایه یا بهترین نمایهٔ یک گروه؛ تست تأخیر، IP و سرعت؛ پاک کردن نتایج؛ حذف نمایه‌ها. وارد کردن لینک‌های اشتراک‌گذاری، یک فایل یا یک URL. افزودن گروه‌ها و اشتراک‌ها، به‌روزرسانی و حذف آن‌ها.
Traffic سرعت دو دقیقهٔ گذشته، و مجموع ترافیک بر اساس نمایه یا برنامه برای 24 ساعت، 7 روز یا 30 روز.
Logs گزارش Throne همان‌طور که نوشته می‌شود، با توقف موقت، فیلتر متنی، زمان خطوط، کپی کردن و رنگ برای هشدارها و خطاها. صفحه جدیدترین 5000 خط را نگه می‌دارد.
Settings تنظیماتی که API مدیریت می‌کند، فایل‌های geo، و مجموعه‌قوانین نمایهٔ در حال اجرا.
Backup دانلود پشتیبانی از بخش‌هایی که انتخاب می‌کنید. بارگذاری یک آرشیو، دیدن محتوای آن و بازیابی بخش‌هایی که انتخاب می‌کنید؛ Throne دوباره راه‌اندازی می‌شود و رابط وب منتظر آن می‌ماند.
System نسخه‌های Throne و دروازه، اینکه دروازه دسترسی مدیریتی دارد یا نه، اثر انگشت گواهی، گذرواژه، خروج از حساب، راه‌اندازی دوبارهٔ Throne و خاموش کردن آن.

تغییراتی که جای دیگری انجام می‌شوند، در پنجرهٔ Throne، با thronectl یا با به‌روزرسانی یک اشتراک، ظرف چند ثانیه در رابط وب دیده می‌شوند: دروازه از Throne می‌پرسد چه چیزی تغییر کرده (GET /v1/events) و صفحه فقط همان را دوباره بارگذاری می‌کند.

آنچه در دسکتاپ می‌ماند

رابط وب این‌ها را ویرایش نمی‌کند:

  • قوانین نمایه‌های مسیریابی (فقط یک نمایهٔ مسیریابی را فعال می‌کند)،
  • WARP و حساب‌های OTP،
  • تنظیمات خود یک نمایه، مانند سرور، پورت‌ها یا TLS آن،
  • فهرست زندهٔ اتصال‌ها،
  • تنظیماتی که API مدیریت نمی‌کند.

این‌ها را در یک Throne دسکتاپ تنظیم کنید و با یک پشتیبان منتقل کنید: آن را در برنامهٔ دسکتاپ بسازید، سپس در صفحهٔ Backup یا با thronectl backup restore بازیابی کنید، همان‌طور که در انتقال پیکربندی دسکتاپ آمده است. Throne آرشیوهایی را که نمایه‌هایی دارند که روی دستگاه آن برنامه اجرا می‌کنند یا فایل می‌خوانند، مانند نمایه‌های هستهٔ اضافی (Extra Core)، رد می‌کند (invalid_archive).

گزینه‌ها

thronectl web [--listen ADDR] [--state-dir DIR] [--tls auto|on|off] [--tls-cert FILE --tls-key FILE]
              [--allow-host LIST] [--password-file FILE]
thronectl web passwd [--state-dir DIR]

هر گزینه یک متغیر محیطی دارد. پرچم (flag) بر متغیر خودش مقدم است.

پرچم متغیر پیش‌فرض و معنا
--listen ADDR THRONE_WEB_LISTEN 127.0.0.1:9096. PORT (روی 127.0.0.1)، IP:PORT، [IPv6]:PORT و *:PORT (همهٔ نشانی‌ها) را می‌پذیرد، همان‌طور که --api-listen در Throne می‌پذیرد. نام میزبان پذیرفته نمی‌شود.
--state-dir DIR THRONE_WEB_STATE_DIR پوشه‌ای برای هش گذرواژه و گواهی خودامضا، که دروازه آن را طوری می‌سازد که فقط کاربر خودش بتواند آن را بخواند. پیش‌فرض: $STATE_DIRECTORY از systemd، وگرنه thronectl/web در پوشهٔ پیکربندی شما: ~/.config/thronectl/web در Linux، ~/Library/Application Support/thronectl/web در macOS، %AppData%\thronectl\web در Windows.
--tls auto|on|off THRONE_WEB_TLS auto (پیش‌فرض): HTTPS روی نشانی شبکه، HTTP ساده روی loopback. on: HTTPS روی loopback هم. off: HTTP ساده؛ روی نشانی شبکه فقط پشت یک پروکسی معکوس با TLS. off همراه با یک گواهی خطاست.
--tls-cert FILE، --tls-key FILE THRONE_WEB_TLS_CERT، THRONE_WEB_TLS_KEY زنجیرهٔ گواهی و کلید خصوصی خودتان در قالب PEM، به‌جای گواهی خودامضا. هر دو را بدهید. با auto، روی loopback هم HTTPS را روشن می‌کنند.
--allow-host LIST THRONE_WEB_ALLOW_HOST نام‌های میزبان دیگری که مرورگرها می‌توانند با آن‌ها به دروازه برسند، جداشده با ویرگول یا فاصله، مانند نام یک پروکسی معکوس. بررسی Host را ببینید.
--password-file FILE THRONE_WEB_PASSWORD_FILE گذرواژه به‌صورت متن ساده، مانند یک Docker secret، به‌جای هش ذخیره‌شده. گذرواژه را ببینید.

دروازه Throne را همان‌طور پیدا می‌کند که هر فرمان thronectl: نشانی را از --addr یا THRONE_ADDR (پیش‌فرض 127.0.0.1:9095)، و کلید را از --key-file، THRONE_KEY یا THRONE_KEY_FILE، یا زیر systemd از credential به نام api.key (LoadCredential=api.key:/path/to/key). --timeout روی آن اثری ندارد.

thronectl web با این کدها خارج می‌شود:

کد چه زمانی
0 با Ctrl+C یا SIGTERM متوقف شده است. ظرف 5 ثانیه خاموش می‌شود.
2 یک گزینه یا متغیر نادرست، نبود کلید، فایل گذرواژهٔ خالی یا ناخوانا، فایل password آسیب‌دیده، یا گواهی‌ای که بارگذاری نمی‌شود.
3 نمی‌تواند گوش دهد، برای مثال چون برنامهٔ دیگری پورت را گرفته است، یا خطای دیگری رخ داده است.

بررسی Host

یک صفحهٔ وب می‌تواند مرورگر شما را وادار کند با نام میزبان خود آن صفحه به دروازه درخواست بفرستد (DNS rebinding). به همین دلیل دروازه نام میزبان هر درخواست را بررسی می‌کند:

  • روی یک نشانی loopback، localhost، 127.0.0.1، ::1 و نام‌های موجود در --allow-host را می‌پذیرد.
  • روی یک نشانی شبکه، هر نامی را می‌پذیرد، مگر اینکه --allow-host تنظیم شده باشد. در آن صورت همان نام‌ها، نام‌های loopback و نشانی‌های IP را می‌پذیرد.

به نام‌های دیگر با 421 Misdirected Request پاسخ می‌دهد.

امنیت

  • رابط وب یک کلاینت مدیریتی است. هر کسی که وارد شود می‌تواند همان کارهایی را بکند که thronectl می‌کند، از جمله درخواست‌های مدیریتی: وارد کردن و حذف نمایه‌ها، تغییر تنظیمات، دانلود پشتیبان‌ها که اطلاعات ورود نمایه‌ها و رمزهای OTP شما را به‌صورت متن ساده دارند، بازیابی پشتیبان‌ها، و راه‌اندازی دوباره یا خاموش کردن Throne. گذرواژه را فقط به کسانی بدهید که اجازهٔ مدیریت Throne را دارند.
  • کلید API نزد دروازه می‌ماند. مرورگر هرگز آن را دریافت نمی‌کند. فقط یک کوکی نشست و یک توکن نشست می‌گیرد، و هر درخواست به هر دو نیاز دارد.
  • محدودیت‌های ورود. پس از 5 ورود ناموفق در 5 دقیقه از یک نشانی (برای IPv6، از یک شبکهٔ ‎/64)، دروازه ورود از آن نشانی را به مدت 60 ثانیه رد می‌کند، و پس از هر شکست بعدی دو برابر بیشتر، تا حداکثر 15 دقیقه. وقتی در مجموع بیش از 30 ورود در یک دقیقه ناموفق باشد، هر ورودی را تا پایان آن دقیقه رد می‌کند. یک ورود موفق، شکست‌های نشانی خودش را پاک می‌کند. یک ورود ناموفق دست‌کم نیم ثانیه طول می‌کشد، و گزارش دروازه نشانی‌های مسدودشده را نام می‌برد.
  • نخستین گذرواژه در گزارش می‌ماند. journal در systemd را root و اعضای گروه‌هایی مانند adm یا systemd-journal می‌توانند بخوانند؛ گزارش کانتینر را هر کسی که اجازهٔ اجرای docker را دارد. پس از نخستین ورود گذرواژه را تغییر دهید.
  • loopback و تونل SSH را ترجیح دهید. روی شبکه از HTTPS استفاده کنید و اثر انگشت گواهی را بررسی کنید، یا از گواهی‌ای استفاده کنید که مرورگرها به آن اعتماد دارند. HTTP ساده روی یک نشانی شبکه، گذرواژه و نشست را بدون رمزگذاری می‌فرستد؛ دروازه هنگام شروع دربارهٔ آن هشدار می‌دهد.
  • دروازه را روی دستگاه Throne اجرا کنید. در این صورت API در Throne می‌تواند روی loopback بماند. دروازه‌ای روی دستگاه دیگر به API روی شبکه نیاز دارد، و برای درخواست‌های مدیریتی به --api-admin-lan.

عیب‌یابی

نشانه علت و راه‌حل
Throne is not reachable. Retrying… (throne_unreachable) Throne اجرا نمی‌شود، API آن خاموش است، یا دروازه نشانی نادرستی دارد. --addr یا THRONE_ADDR را بررسی کنید و thronectl status را با تنظیمات دروازه اجرا کنید. رابط وب هر 2 ثانیه دوباره تلاش می‌کند و وقتی Throne پاسخ دهد بارگذاری می‌شود.
Throne refuses the web UI یا Throne refused the connection (throne_rejected) کلید دروازه نادرست است. کلید فعلی Throne (config/api.key در پوشهٔ داده‌های Throne بدون رابط گرافیکی) را به دروازه بدهید و آن را دوباره راه‌اندازی کنید. دروازه‌ای روی دستگاه دیگر ممکن است پس از 5 تلاش ناموفق از نشانی‌اش، به مدت 60 ثانیه هم رد شود، برای مثال به‌خاطر کلاینت دیگری با کلید قدیمی در همان نشانی.
The web UI's connection to Throne lacks admin rights (forbidden): گزارش، وارد کردن، تنظیمات، حذف، پشتیبان‌ها، راه‌اندازی دوباره و خاموش کردن شکست می‌خورند دروازه روی دستگاه Throne اجرا نمی‌شود، و Throne فقط از همان‌جا به درخواست‌های مدیریتی پاسخ می‌دهد. دروازه را روی دستگاه Throne اجرا کنید، یا اجازه دهید Throne از شبکه به درخواست‌های مدیریتی پاسخ دهد: --api-admin-lan (THRONE_API_ADMIN_LAN=1) برای Throne بدون رابط گرافیکی، اجازهٔ مدیریت از شبکهٔ محلی (Allow management from the local network) در برنامهٔ دسکتاپ. صفحهٔ System نشان می‌دهد که آیا دروازه دسترسی مدیریتی دارد یا نه.
421 Misdirected Request: this host name is not accepted بررسی Host: دروازه را با نامی باز کرده‌اید که آن را نمی‌پذیرد. از localhost یا یک نشانی IP استفاده کنید، یا نام را با --allow-host اضافه کنید.
پشت پروکسی معکوس، ورود شکست می‌خورد: The web UI server refused the request because it came from another origin (403 csrf) پروکسی هدر Host را تغییر می‌دهد. آن را بدون تغییر عبور دهید، برای مثال با proxy_set_header Host $http_host; در nginx.
Too many failed attempts. Try again in … s. (rate_limited) صبر کنید تا شمارش معکوس تمام شود. امنیت را ببینید.
مرورگر دربارهٔ گواهی هشدار می‌دهد با گواهی خودامضا این انتظار می‌رود. اثر انگشت‌ها را همان‌طور که در شبکهٔ محلی آمده مقایسه کنید.
thronectl web خارج می‌شود: address already in use; --listen picks another address برنامهٔ دیگری، یا یک thronectl web دیگر، پورت 9096 را گرفته است. آن را متوقف کنید، یا --listen دیگری بدهید.
بازیابی پشتیبان از طریق nginx با 413 شکست می‌خورد client_max_body_size 512m; را تنظیم کنید.
صفحهٔ Logs می‌گوید This Throne is too old to share its log with the web UI، یا تغییراتی که در پنجرهٔ Throne انجام می‌شوند تا 30 ثانیه بعد دیده می‌شوند Throne از دروازه قدیمی‌تر است و GET /v1/logs یا GET /v1/events را ندارد. بدون رویدادها، دروازه وضعیت Throne را هر 2 ثانیه و بقیه را هر 30 ثانیه می‌خواند. Throne را به‌روزرسانی کنید.
The password comes from a password file فایلی را که --password-file نام می‌برد تغییر دهید. دروازه ظرف 5 ثانیه تغییر را می‌بیند.