mistgate مستندات
FA
199

نصب پنل

Mistgate را دانلود یا بسازید، پنل را با mistgate setup آماده کنید، زیر systemd اجرا کنید و برای اولین بار وارد شوید.

در این صفحه

این صفحه یک سرور Linux تازه را تا پنلی در حال اجرا با حساب مالک پیش می‌برد. مثال‌ها از panel.example.com استفاده می‌کنند؛ اول پیش‌نیازها را ببینید. فرمان‌های سرور پنل با root اجرا می‌شوند. ایجنت هوش مصنوعی‌ای که به سرور دسترسی SSH دارد می‌تواند همین مرحله‌ها را برایتان انجام دهد: پرامپت نصب را در راهنمای ایجنت هوش مصنوعی ببینید.

نکته

این صفحه برای پنل روی سرور شخصی است. برای اجرای پنل روی Cloudflare Workers به‌جای سرور (پیش‌نمایش)، نصب نسخهٔ Cloudflare را ببینید.

نصب تک‌خطی#

برای یک سرور Linux تازه روی amd64 یا arm64 با systemd، این را با root اجرا کنید. دامنه باید مستقیم به سرور اشاره کند و پورت‌های TCP 80 و 443 باید آزاد باشند. راستی‌آزمایی امضا یا openssh-client با پشتیبانی از ssh-keygen -Y verify لازم دارد یا OpenSSL نسخهٔ 3.2 یا جدیدتر. نصب‌کننده آخرین ریلیز را دانلود می‌کند، فایل اجرایی را با SHA256SUMS و مانیفست امضاشدهٔ پنل می‌سنجد، سپس setup را اجرا می‌کند و سرویس systemd را نصب می‌کند. قانون‌های فایروال را تغییر نمی‌دهد؛ اگر UFW یا firewalld فعال باشد قانون‌هایی را که باید اضافه کنید چاپ می‌کند.

Shell
curl -fsSL https://mistgate.app/install.sh | sudo bash -s -- --public-url https://panel.example.com

نصب‌کننده به‌طور پیش‌فرض برای میزبانِ آن URL از Let's Encrypt گواهی می‌گیرد. پیش از هر تغییر می‌پرسد؛ برای اجرای بدون پرسش --yes را اضافه کنید. با --dry-run ریلیز را بدون تغییر میزبان دانلود و راستی‌آزمایی می‌کند، و با --version vX.Y.Z یک ریلیز مشخص نصب می‌شود. --admin-host، --admin-listen، --acme-domain و --data-dir گزینه‌های setup و سرویس را که در ادامه آمده‌اند انتخاب می‌کنند.

وقتی تمام شد، لینک راه‌اندازی یک‌بارمصرف را در مرورگر باز کنید و حساب مالک را بسازید. لینک 30 دقیقه اعتبار دارد. سپس از نودها ← افزودن نود یک نود اضافه کنید.

نصب دستی#

1. گرفتن فایل اجرایی#

پنل یک فایل اجرایی ایستای Linux برای amd64 یا arm64 است که برنامهٔ وب پنل مدیریت در آن جاسازی شده. اگر دلیلی برای ساختن نسخهٔ خودتان ندارید از ریلیز رسمی استفاده کنید.

از GitHub Releases (پیشنهادی)#

هر ریلیز در GitHub Releases پنل (mistgate-linux-amd64، mistgate-linux-arm64)، ایجنت نود (mistgate-node-linux-amd64، mistgate-node-linux-arm64)، SHA256SUMS، BUILDINFO و دو مانیفست امضاشده دارد: manifest.json با manifest.sig برای ایجنت‌های نود و panel-manifest.json با panel-manifest.sig و panel-manifest.sshsig برای پنل. فایل‌های اجرایی رسمی کلید ریلیز پروژه را در خود دارند؛ پس پنلی که از آن‌ها نصب شود ایجنت‌های امضاشدهٔ نود را خودش دانلود می‌کند و می‌تواند از ریلیزهای بعدی خودش را به‌روز کند (به به‌روزرسانی‌ها نگاه کنید).

روی سرور پنل، با root (uname -m برای amd64 مقدار x86_64 و برای arm64 مقدار aarch64 را چاپ می‌کند):

Shell
ARCH=amd64    # arm64 on an ARM server
cd /root
for f in "mistgate-linux-$ARCH" SHA256SUMS panel-manifest.json; do
  curl -fsSLO "https://github.com/Mistgate/mistgate/releases/latest/download/$f"
done
sha256sum --check --ignore-missing SHA256SUMS
grep -q "$(sha256sum "mistgate-linux-$ARCH" | cut -d' ' -f1)" panel-manifest.json && echo "listed in panel-manifest.json"
install -m 0755 "mistgate-linux-$ARCH" /usr/local/bin/mistgate
mistgate version

این بررسی‌ها چه چیزی را ثابت می‌کنند و چه چیزی را نه:

  • sha256sum --check ثابت می‌کند فایل سالم رسیده و با چکسام‌های منتشرشده همراه ریلیز می‌خواند. SHA256SUMS را workflow ریلیز می‌نویسد و امضا نشده است؛ پس ثابت نمی‌کند فایل اجرایی را چه کسی ساخته.
  • همین SHA-256 در panel-manifest.json هم فهرست شده است که نگهدارندهٔ پروژه پس از ساخت دوبارهٔ همهٔ فایل‌های اجرایی از روی تگ، آن را آفلاین با کلید ریلیز امضا می‌کند. نصب‌کنندهٔ تک‌خطی panel-manifest.sshsig را با ssh-keygen -Y verify ترجیح می‌دهد و در غیر این صورت به panel-manifest.sig با OpenSSL نسخهٔ 3.2 یا جدیدتر برمی‌گردد. در این مسیر دستی، grep فقط یک بررسی سازگاری است.
  • از آن به بعد پنل خودش امضاها را بررسی می‌کند: ریلیز پنل را نصب می‌کند و بستهٔ نود را به ایجنت‌ها می‌دهد، فقط وقتی امضا با کلید ریلیزِ کامپایل‌شده در آن تأیید شود. mistgate version نسخه و اثرانگشت آن کلید را چاپ می‌کند.

از روی سورس#

روی یک ماشین ساخت که ابزارهای فهرست‌شده در پیش‌نیازها را دارد:

Shell
git clone https://github.com/Mistgate/mistgate.git
cd mistgate
make build
scp bin/mistgate-linux-amd64 root@panel.example.com:/root/
ssh root@panel.example.com 'install -m 0755 /root/mistgate-linux-amd64 /usr/local/bin/mistgate'

bin/ ایجنت‌های نود (mistgate-node-linux-amd64، mistgate-node-linux-arm64) را هم دارد؛ آن‌ها را برای نصب دستی نود نگه دارید.

هشدار

بیلد بدون RELEASE_KEY کلید ریلیز ندارد: ایجنت‌های نودش هرگز خودشان را به‌روز نمی‌کنند، پنل نمی‌تواند ریلیز پنل نصب کند، و نصب از راه SSH بستهٔ ایجنت مورد اعتمادی برای نصب ندارد. بیلدی با کلید خودتان فقط به ریلیزهایی اعتماد می‌کند که شما امضا کرده‌اید. کلید را پیش از اولین بیلد بسازید: نسخه‌ها و امضا را ببینید.

2. انتخاب راه رسیدن به پنل مدیریت#

نشانی عمومی به همه یک سایت پوششی نشان می‌دهد. به پنل مدیریت به یکی از سه راه می‌رسید، که فقط یک بار، هنگام اجرای mistgate setup، انتخاب می‌شود:

حالت پرچم‌های setup نشانی پنل مدیریت چه وقت انتخابش کنید
پیشوند مسیر مخفی (پیش‌فرض) --public-url https://panel.example.com https://panel.example.com/<secret>/، که secret شامل 24 نویسهٔ تصادفی است ساده‌ترین: یک نام میزبان، یک گواهی.
میزبان مخفی --public-url https://panel.example.com --admin-host <secret host> https://<secret host>/ پنل مدیریت را روی نام میزبانی می‌خواهید که هیچ‌کس نتواند حدس بزند. رکورد DNS و گواهی‌ای می‌خواهد که آن را بپوشاند.
listener جداگانه --public-url https://panel.example.com --admin-listen 127.0.0.1:8081 http://localhost:8081/، از راه یک تونل SSH پنل مدیریت اصلاً روی پورت عمومی ظاهر نمی‌شود.
  • درخواست‌هایی که با پنل مدیریت نمی‌خوانند (پیشوند اشتباه، میزبان ناشناخته، مسیر ناشناخته) همه سایت پوششی را می‌گیرند؛ پس کسی که کورکورانه کاوش می‌کند نمی‌تواند حدس نزدیک به واقعیت را از حدس تصادفی تشخیص دهد.

  • همیشه --public-url را بدهید. پایهٔ هر لینک اشتراک است و نشانی‌ای است که فرمان‌های نصب نود حمل می‌کنند. بدون آن پنل هیچ لینک اشتراکی نمی‌دهد، و افزودن نود شکست می‌خورد مگر اینکه serve پرچم --agent-addr را بگیرد.

  • --admin-host و --admin-listen با هم ترکیب نمی‌شوند.

  • listener جداگانهٔ پنل مدیریت HTTP ساده صحبت می‌کند. آن را روی loopback bind کنید و از راه SSH به آن برسید:

    Shell
    ssh -N -L 8081:127.0.0.1:8081 root@panel.example.com

    سپس http://localhost:8081/ را در مرورگر باز کنید. از همان پورت در سمت خودتان استفاده کنید: کلیدهای عبور به نشانی http://localhost:<port> که setup ذخیره کرده بسته می‌شوند.

  • --rp-id و --rp-origins تنظیم‌های WebAuthn را که setup از نشانی پنل مدیریت می‌سازد بازنویسی می‌کنند. به‌ندرت به آن‌ها نیاز پیدا می‌کنید.

هشدار

setup این نشانی‌ها را فقط یک بار ذخیره می‌کند. اجرای دوباره‌اش آن‌ها را نگه می‌دارد و Mistgate فرمانی برای تغییرشان بعداً ندارد. پیش از ادامه انتخاب کنید؛ از نو شروع کردن یعنی پوشهٔ داده‌ای تازه و ثبت دوبارهٔ همهٔ نودها.

3. اجرای setup#

Shell
mistgate setup --public-url https://panel.example.com

این را چاپ می‌کند:

متن
Data dir:   /var/lib/mistgate
Admin URL:  https://panel.example.com/<secret>/
Setup link: https://panel.example.com/<secret>/setup#<token>
The link works once and expires in 30 minutes. Open it in a browser and create your admin (a passkey, or a password with an authenticator code).

setup این کارها را می‌کند:

  1. پوشهٔ داده /var/lib/mistgate را با حالت 0700 می‌سازد (--data-dir مسیر را عوض می‌کند).
  2. فایل master.key را می‌سازد، 32 بایت تصادفی با حالت 0600. هر رازی را که پنل ذخیره می‌کند رمزگذاری می‌کند.
  3. پایگاه داده mistgate.db را می‌سازد و schema را اعمال می‌کند.
  4. نشانی‌های حالت انتخاب‌شده را ذخیره می‌کند و دو راز دیگر می‌سازد: نام TLS که ایجنت‌های نود برای رسیدن به پنل استفاده می‌کنند، و پیشوند مسیر مخفی لینک‌های اشتراک.
  5. یک لینک راه‌اندازی یک‌بارمصرف چاپ می‌کند که 30 دقیقه اعتبار دارد.

نشانی پنل مدیریت را پیش خودتان نگه دارید. اجرای دوبارهٔ setup بی‌خطر است: پیکربندی موجود را نگه می‌دارد و، تا وقتی مدیری وجود ندارد، لینک راه‌اندازی تازه‌ای چاپ می‌کند.

4. انتخاب گواهی#

گزینه پرچم‌های serve چه می‌شود
Let's Encrypt --acme-domain panel.example.com پنل خودش گواهی را می‌گیرد و تمدید می‌کند (TLS-ALPN-01 روی listener عمومی، پس باید روی پورت 443 در دسترس باشد). listener دومی روی :80 به HTTP-01 پاسخ می‌دهد و HTTP ساده را به HTTPS هدایت می‌کند (--acme-http؛ مقدار خالی آن را خاموش می‌کند). گواهی‌ها در <data-dir>/acme کش می‌شوند. --acme-email یک نشانی تماس اضافه می‌کند. استفاده از آن یعنی پذیرفتن شرایط خدمات Let's Encrypt.
گواهی خودتان --tls-cert /path/fullchain.pem --tls-key /path/privkey.pem پنل فایل‌های PEM شما را ارائه می‌کند و وقتی فایل گواهی تغییر کند دوباره می‌خواندشان (حداکثر هر 30 ثانیه بررسی می‌شود)؛ پس تمدید با ابزار دیگر به راه‌اندازی دوباره نیاز ندارد.
هر دو هر دو دسته پرچم نام‌های فهرست‌شده در --acme-domain گواهی Let's Encrypt می‌گیرند؛ هر نام دیگر گواهی شما را. برای میزبان مخفی پنل مدیریت که زیر پوشش گواهی wildcard خودتان است مفید است.

--acme-domain فقط نام میزبان ساده می‌گیرد، بدون wildcard. می‌توان آن را برای چند نام تکرار کرد.

نکته

گواهی Let's Encrypt برای میزبان مخفی پنل مدیریت آن نام را در گزارش‌های عمومی Certificate Transparency می‌گذارد. برای مخفی ماندنش آن را با گواهی wildcard خودتان بپوشانید.

5. سایت پوششی#

اگر کار دیگری نکنید پنل یک صفحهٔ داخلی «Coming soon» نشان می‌دهد. هر نصب همین صفحه را دارد، پس قابل‌شناسایی است؛ سایت خودتان بهتر است. فایل‌های ایستا را در یک پوشه بگذارید و --decoy-dir را بدهید:

  • / و هر پوشه index.html خودش را ارائه می‌کند.
  • 404.html و 429.html، اگر باشند، صفحه‌های داخلی «پیدا نشد» و «درخواست‌های زیاد» را عوض می‌کنند. هر مسیر ناشناخته، پیشوند اشتباه پنل مدیریت و لینک اشتراک ناشناخته همان 404 را می‌گیرد.
  • robots.txt، اگر نباشد، یک نسخهٔ داخلی است که خزنده‌های هوش مصنوعیِ شناخته‌شده را رد می‌کند.
  • فقط GET و HEAD ارائه می‌شوند. فایل‌ها و پوشه‌هایی که نامشان با نقطه شروع می‌شود هرگز ارائه نمی‌شوند، و پاسخ‌ها سرایند Last-Modified یا ETag ندارند.

پنل این پوشه را فقط می‌خواند. با unit زیر، آن را بیرون از /home و /root نگه دارید (مثلاً در /srv/mistgate-decoy). سایت پوششی خودتان می‌گوید سایت خوب چه شکلی است و پرامپتی دارد که ایجنت هوش مصنوعی را وامی‌دارد سایتی یکتا بسازد.

6. امتحان در پیش‌زمینه#

Shell
mistgate serve --listen :443 --acme-domain panel.example.com

مقدار پیش‌فرض --listen برابر 127.0.0.1:8080 است، پس روی سرور واقعی --listen :443 را بدهید. لاگ به stderr می‌رود؛ دنبال خط‌های listening برای listener عمومی (و acme-http برای پورت 80) بگردید. وقتی کار کرد با Ctrl+C متوقفش کنید.

7. اجرا زیر systemd#

این را در /etc/systemd/system/mistgate.service ذخیره کنید و ExecStart را به پرچم‌هایی که انتخاب کرده‌اید تغییر دهید:

/etc/systemd/system/mistgate.serviceINI
[Unit]
Description=Mistgate panel
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mistgate serve --listen :443 --acme-domain panel.example.com
Restart=on-failure
RestartSec=5
TimeoutStopSec=30

# The panel writes only its data directory and only needs to bind ports 443 and 80.
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ProtectSystem=strict
ReadWritePaths=/var/lib/mistgate
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectClock=yes
ProtectControlGroups=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectKernelLogs=yes
ProtectHostname=yes
LockPersonality=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
RestrictNamespaces=yes
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX AF_NETLINK
SystemCallArchitectures=native
SystemCallFilter=@system-service
UMask=0077

[Install]
WantedBy=multi-user.target
Shell
systemctl daemon-reload
systemctl enable --now mistgate
journalctl -u mistgate -f

چرا این شکلی است:

  • mistgate setup با root اجرا شد، پس پوشهٔ داده مال root است و سرویس هم با root اجرا می‌شود. همهٔ قابلیت‌ها جز bind کردن پورت‌های پایین حذف شده‌اند و فقط /var/lib/mistgate قابل نوشتن است. اگر --data-dir دیگری به کار می‌برید ReadWritePaths را عوض کنید.
  • پنل با SIGTERM به‌نرمی متوقف می‌شود. با Restart=on-failure وقتی listener‌ای شکست بخورد systemd دوباره راه‌اندازی‌اش می‌کند، نه وقتی شما متوقفش می‌کنید.
  • هر پرچم یک متغیر محیطی MISTGATE_* دارد، پس می‌توانید پرچم‌ها را به خط‌های Environment= یا یک EnvironmentFile= ببرید. پیکربندی را ببینید.
  • با --decoy-dir، --tls-cert یا --tls-key، فایل‌ها فقط باید قابل‌خواندن باشند.

پشت یک reverse proxy#

اگر وب‌سروری دیگر باید پورت 443 این میزبان را داشته باشد، Mistgate می‌تواند پشت آن اجرا شود:

  • listener عمومی را بدون TLS روی loopback اجرا کنید (--listen 127.0.0.1:8080، بدون --acme-domain و بدون --tls-cert) و بگذارید پروکسی TLS را برای panel.example.com خاتمه دهد و سرایند Host و مسیر را بدون تغییر عبور دهد.
  • --trusted-proxy 127.0.0.1 را اضافه کنید تا محدودیت نرخ، نشست‌ها و لاگ ممیزی نشانی واقعی کلاینت را از X-Forwarded-For یا Forwarded ببینند.
  • ایجنت‌های نود TLS را از خودِ پنل می‌خواهند. listener جداگانه‌ای برایشان بگذارید و نشانی‌اش را در فرمان‌های نصب بنویسید: --agent-listen :8443 --agent-addr panel.example.com:8443. پروکسی نباید به آن پورت دست بزند.

پورت ایجنت آن‌وقت پورتی جداگانه است که فقط به نام TLS مخفی پاسخ می‌دهد؛ روی پورت مشترک 443 پشت سایت پوششی پنهان می‌شود. هر وقت می‌شود، همان نصب ساده بالا را ترجیح دهید.

8. اولین ورود#

لینک راه‌اندازی مرحلهٔ 3 را در مرورگر باز کنید، کل لینک را، با بخش بعد از #.

  1. زبان. انگلیسی، روسی، چینی ساده، فارسی یا ترکی را انتخاب کنید. بعداً می‌توانید عوضش کنید.
  2. ساخت مدیر. فیلد نام کاربری (که با admin شروع می‌شود) همان نام ورود شما و نامی است که پنل نشان می‌دهد. سپس:
    • ساخت کلید عبور: مرورگر اثر انگشت، چهره، PIN یا کلید امنیتی می‌خواهد. کلید روی دستگاه شما می‌ماند. راه پیشنهادی همین است.
    • رمز عبور + کد برنامهٔ احراز هویت: رمز عبوری دست‌کم 12 نویسه‌ای، سپس کد QR را با یک برنامهٔ احراز هویت (Google Authenticator، 1Password، Aegis و مانند آن‌ها) اسکن کنید، کد 6 رقمی را بنویسید و ساخت مدیر را بزنید.
  3. تمام شد. افزودن اولین نود یا بعداً، اول یک نگاهی می‌اندازم را انتخاب کنید.

اولین مدیر، مالک است. جادوگر راه‌اندازی یک گروه خالی «همه» هم برای اولین کاربرانتان می‌سازد.

  • نام ورود 3 تا 64 نویسه است: a–z، 0–9 و . _ @ -.
  • لینک فقط وقتی مصرف می‌شود که مدیر ساخته شود. اگر منقضی شد یا چیزی خراب شد، برای لینک تازه دوباره mistgate setup را اجرا کنید.
  • کلید عبور فقط روی نشانی پنل مدیریتی کار می‌کند که setup ذخیره کرده است. «مرورگر کلید عبور را برای این آدرس نپذیرفت» یعنی صفحه با نشانی دیگری باز شده بود.

بعداً در نشانی پنل مدیریت با ورود با کلید عبور وارد می‌شوید، یا با روش دیگر: نام ورود، رمز عبور و کد. پنج رمز عبور اشتباه در یک ساعت آن نام ورود را 15 دقیقه قفل می‌کند. اگر گوشی یا کلید عبورتان را گم کردید: امنیت فرمان mistgate auth reset-login را توضیح می‌دهد.

9. همین حالا نسخهٔ پشتیبان بگیرید#

هر چیزی که پنل می‌داند در پوشهٔ داده است:

فایل چیست
mistgate.db, mistgate.db-wal, mistgate.db-shm پایگاه داده: مدیرها، نودها، پروفایل‌ها، کاربران، دستگاه‌ها، ترافیک، رویدادها، لاگ ممیزی. رازهای داخلش با کلید اصلی رمزگذاری شده‌اند.
master.key کلیدی که رازهای ذخیره‌شده را رمزگذاری می‌کند، از جمله کلید CA پنل که هر نود به آن اعتماد دارد.
acme/ حساب و گواهی‌های Let's Encrypt (فقط با --acme-domain).

همین حالا یک نسخه بگیرید، با پنلِ متوقف‌شده تا پایگاه داده سازگار باشد:

Shell
systemctl stop mistgate
tar czf mistgate-backup-$(date +%F).tgz -C /var/lib mistgate
systemctl start mistgate
هشدار

این نسخه کلید اصلی را دارد: هر کس آن را داشته باشد می‌تواند همهٔ رازهای پنل را بخواند. آن را رمزگذاری‌شده و بیرون از سرور نگه دارید. بدون پوشهٔ داده، هر نود باید دوباره ثبت شود و هر کاربر، لینک و کلید از بین رفته است.

برای نسخه‌های منظم، نسخه‌های پشتیبان رمزگذاری‌شده را در تنظیمات ← نسخه‌های پشتیبان روشن کنید: پنل یک اسنپ‌شات سازگار را با کلید بازیابی آفلاین شما رمزگذاری می‌کند و طبق زمان‌بندی در سطل Cloudflare R2 شما بارگذاری می‌کند. اگر پنل را با کلید ریلیز خودتان ساخته‌اید، آن فایل کلید را هم آفلاین و پشتیبان‌گرفته نگه دارید.

بعدش#

افزودن نود: خودکار از راه SSH یا با فرمانی که خودتان اجرا می‌کنید.

ویرایش این صفحه در GitHub