تازه‌وارد؟ ابتدا این را بخوانید 👋

تا حالا اسم Marzban، «VPS» یا «پنل» را نشنیده‌اید؟ عالی است — این صفحه کل ایده را با زبان ساده توضیح می‌دهد. هیچ تجربه‌ای لازم نیست.

در یک جمله: NexusPanel نرم‌افزاری است که به شما امکان می‌دهد سرویس VPN خودتان را راه بیندازید و دسترسی به آن را بفروشید — کمی شبیه راه‌اندازی یک نتفلیکس کوچک خودتان، با این تفاوت که آنچه می‌فروشید یک اتصال اینترنتی خصوصی، رفع‌فیلتر و سریع‌تر است.

یک سرور ارزان اجاره می‌کنید، NexusPanel را روی آن نصب می‌کنید و یک داشبورد وب تمیز در اختیار می‌گیرید. از همان داشبورد مشتری می‌سازید و هر مشتری یک لینک دریافت می‌کند که آن را در یک اپلیکیشن رایگان روی گوشی‌اش وارد می‌کند. روی «اتصال» می‌زند — و حالا اینترنتش از طریق سرور شما عبور می‌کند. شما ماهانه از او پول می‌گیرید. کل کسب‌وکار همین است.

تشبیه به یک مغازه

اگر بتوانید راه‌اندازی یک مغازه کوچک را تصور کنید، NexusPanel را هم می‌فهمید. کل ماجرا اینجا نقشه‌برداری شده است:

🧑‍💼
شما

صاحب کسب‌وکار

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

🖥️
VPS

ساختمان مغازه شما

کامپیوتری که در یک مرکز داده اجاره می‌کنید (حدود ۵ دلار در ماه). پنل شما اینجا زندگی می‌کند. ارائه‌دهندگان: Hetzner، Contabo، DigitalOcean…

🎛️
NexusPanel

صندوق و قفسه‌های شما

پنل کنترلی که در مرورگر وارد آن می‌شوید. افزودن مشتری، تماشای ترافیک، دریافت پول — همه از همین‌جا.

🌍
نود

یک شعبه در خارج

یک سرور اضافی مثلاً در آلمان یا فنلاند تا مشتری‌ها بتوانند محل اتصالشان را انتخاب کنند. اختیاری — می‌توانید بدون هیچ نودی شروع کنید.

🔗
لینک اشتراک

کارت عضویت

یک لینک وب که به هر مشتری می‌دهید. تمام تنظیمات اتصال او را در خود دارد — تنها چیزی است که او همیشه به آن نیاز دارد.

📱
اپ کلاینت

دروازه مشتری

یک اپلیکیشن رایگان (Happ، v2rayNG، Streisand…). یک‌بار لینک را وارد می‌کنند، روی اتصال می‌زنند، تمام. شما هیچ‌وقت به گوشی آن‌ها دست نمی‌زنید.

پس «Marzban» چیست؟
Marzban یک ابزار رایگان محبوب است که مردم سال‌هاست دقیقاً برای همین کار از آن استفاده می‌کنند. کار می‌کند — اما شما به‌تنهایی رها می‌شوید: نه پشتیبانی، نه به‌روزرسانی خودکار و هیچ‌یک از قابلیت‌های مدرن ضدمسدودسازی. NexusPanel نسخه بالغ و پشتیبانی‌شده آن است. اگر همین حالا Marzban دارید، می‌توانید همه‌چیز را با یک دستور منتقل کنید و مشتری‌هایتان اصلاً متوجه نمی‌شوند (لینک‌هایشان همچنان کار می‌کند). و اگر هرگز با آن کار نکرده‌اید — حتی بهتر، از نو شروع می‌کنید و بخش‌های دشوار را رد می‌کنید.

پول واقعاً چطور جریان پیدا می‌کند

  1. کسی اینترنت خصوصی یا رفع‌فیلتر می‌خواهد و به شما پول می‌دهد (از طریق ربات Telegram داخلی، رمزارز را به‌صورت خودکار دریافت کنید، یا به هر شکلی که دوست دارید پول بگیرید).
  2. NexusPanel را باز می‌کنید و برای او یک کاربر می‌سازید — تعیین می‌کنید چه مدت معتبر است و چه مقدار داده دریافت می‌کند. حدود ۱۰ ثانیه طول می‌کشد.
  3. لینک اشتراکش را برایش می‌فرستید.
  4. آن را در یک اپ رایگان وارد می‌کند و روی اتصال می‌زند. حالا از طریق سرور شما آنلاین است.
  5. ماه بعد دوباره پول می‌دهد تا فعال بماند. این کار را با هر تعداد مشتری که می‌خواهید تکرار کنید.
لازم نیست فناوری عمیق را بفهمید
واژه‌هایی مانند VLESS، Xray، Reality یا Hysteria فقط انواع مختلف تونل‌هایی هستند که داده از میانشان عبور می‌کند. NexusPanel مقادیر پیش‌فرض معقولی انتخاب می‌کند — می‌توانید یک کسب‌وکار کامل را بدون اینکه هرگز معنایشان را یاد بگیرید اداره کنید. هر وقت کنجکاو شدید، واژه‌نامه هرکدام را در یک خط توضیح می‌دهد.

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

به از کجا شروع کنیم بروید و یکی از سه مسیر را انتخاب کنید: امتحان نسخه آزمایشی رایگان (بدون نصب)، نصب تازه روی یک سرور جدید، یا مهاجرت از Marzban.

واژه‌هایی که خواهید دید 📖

هر اصطلاح تخصصی در این مستندات، در یک جمله ساده توضیح داده شده است. الان نگاهی به آن بیندازید؛ هر وقت واژه‌ای گیجتان کرد برگردید.

VPS سرور مجازی اختصاصی
کامپیوتری که در یک مرکز داده، ماهانه اجاره می‌کنید. جایی است که پنل شما اجرا می‌شود. حدود ۴ تا ۶ دلار در ماه برای شروع کافی است.
پنل
داشبورد وبی که برای اداره همه‌چیز وارد آن می‌شوید — خودِ NexusPanel. روی VPS شما قرار دارد.
نود
یک سرور اضافی در محلی دیگر که به پنل شما متصل است تا مشتری‌ها بتوانند محل اتصالشان را انتخاب کنند. کاملاً اختیاری.
کاربر یا همان مشتری
یک نفر که به او دسترسی می‌فروشید. هرکدام تاریخ انقضا، محدودیت داده و لینک اشتراک مخصوص خود را دارد.
لینک اشتراک «sub link»
تنها آدرسی که به یک مشتری می‌دهید. اپ او آن را می‌خواند تا نحوه اتصال را یاد بگیرد. اگر از Marzban مهاجرت کنید، این لینک‌ها همچنان کار می‌کنند.
اپ کلاینت
اپلیکیشن رایگانی که مشتری نصب می‌کند — مثلاً Happ، v2rayNG، Streisand، Hiddify. یک‌بار لینک اشتراک را در آن وارد می‌کنند.
Marzban
پنل قدیمی‌تر، رایگان و خودت‌انجام‌بده که بسیاری از اپراتورها با آن شروع کردند. NexusPanel جانشین ارتقایافته و پشتیبانی‌شده آن است — و می‌تواند یک راه‌اندازی Marzban را با یک دستور وارد کند.
Remnawave
یک پنل دیگر با هدفی مشابه Marzban. اگر همین حالا Remnawave دارید، ابزار مهاجرت NexusPanel می‌تواند کاربران، ترافیک و لینک‌های اشتراک موجودتان را با یک دستور وارد کند.
لایسنس
کلید شما برای اجرای NexusPanel. یک نسخه آزمایشی رایگان ۱۴ روزه یا یک پلن پولی را از ربات Telegram بگیرید. بدون آن، پنل در حالت آزمایشی اجرا می‌شود.
دامنه
نامی مانند panel.yoursite.com که به VPS شما اشاره می‌کند. برای قفل امنیتی مرورگر (HTTPS) لازم است. اختیاری اما به‌شدت توصیه‌شده.
SSL / HTTPS
همان قفل در مرورگر — رمزنگاری‌ای که ورود به سیستم را ایمن نگه می‌دارد. NexusPanel وقتی دامنه داشته باشید آن را به‌صورت خودکار راه‌اندازی می‌کند.
Xray
موتور رایگانی که در پشت صحنه عملاً ترافیک رمزنگاری‌شده را جابجا می‌کند. به‌ندرت مستقیماً با آن کار دارید.
VLESS / VMess / Trojan / Shadowsocks
انواع مختلف تونل‌هایی که Xray می‌تواند استفاده کند. مانند مدل‌های مختلف خودرو — همه شما را به مقصد می‌رسانند. VLESS معمولاً پیش‌فرض است.
Reality / XHTTP / ECH / Finalmask
ترفندهایی که ترافیک شما را شبیه مرور عادی اینترنت جلوه می‌دهند تا مسدودسازی‌اش دشوارتر شود. برای هر هاست به‌صورت جداگانه فعال می‌شوند؛ مقادیر پیش‌فرض برای شروع کافی‌اند.
Hysteria 2
یک نوع تونل متفاوت و بسیار سریع که روی شبکه‌های ضعیف یا کند‌شده می‌درخشد. اختیاری؛ در کنار Xray اجرا می‌شود.
سرور میانی
یک رله ارزان که جلوی سرور واقعی شما قرار می‌گیرد تا از مسدودسازی فرار کند. پیشرفته — تا وقتی واقعاً به آن نیاز پیدا نکرده‌اید نادیده‌اش بگیرید.
Inbound / هاست
یک «دروازه ورودی» مشخص به سرور شما (یک پروتکل + پورت + تنظیمات). پنل موارد معقولی را به‌صورت آماده ارائه می‌دهد؛ هر وقت خواستید بیشتر اضافه کنید.
ادمین / فروشنده
ورودی‌های اضافی که شما می‌سازید. یک فروشنده مشتری‌های خودش را در محدوده‌هایی که شما تعیین می‌کنید مدیریت می‌کند — وقتی دیگران زیر مجموعه شما می‌فروشند کاربردی است.
محدودیت IP / دستگاه
سقفی برای تعداد گوشی یا کامپیوترهایی که یک مشتری می‌تواند هم‌زمان استفاده کند — جلوی به‌اشتراک‌گذاری رمز و هدررفت پهنای باندتان را می‌گیرد.
بخش سخت تمام شد
اگر این‌ها تقریباً برایتان معنا دارند، به‌اندازه کافی برای اداره NexusPanel می‌دانید. به از کجا شروع کنیم بروید و یک مسیر انتخاب کنید.

از کجا شروع کنیم

سه مسیر. آن‌که با شما جور درمی‌آید را انتخاب کنید و در کمتر از ۱۰ دقیقه راه می‌افتید.

NexusPanel یک پنل VPN چند‌مستأجری است — شما زیرحساب‌ها را می‌فروشید، مشتری‌هایتان از طریق هر کلاینت v2ray متصل می‌شوند و همه‌چیز را در یک داشبورد نگه می‌دارید. اگر تازه‌وارد هستید، سریع‌ترین راه برای دیدن کارکرد آن، نسخه آزمایشی رایگان است. اگر همین حالا Marzban دارید، ابزار مهاجرت همه‌چیز را با یک دستور منتقل می‌کند — کاربران، ادمین‌ها، هاست‌ها، گواهی‌ها، و حتی لینک‌های اشتراک موجودتان همچنان کار می‌کنند. از Remnawave می‌آیید؟ ابزار مشابهی برای آن هم هست.

مسیر الف · بدون نصب

امتحان نسخه آزمایشی رایگان

ربات Telegram را باز کنید، /start را تایپ کنید و یک لایسنس آزمایشی ۱۴ روزه بگیرید. می‌توانید با همان لایسنس پنل خودتان را بالا بیاورید و پیش از پرداخت، با کاربران و نودهای نامحدود روی ترافیک واقعی امتحانش کنید.

⏱ ۲ دقیقه 💳 بدون نیاز به کارت
باز کردن ربات Telegram →
مسیر ب · VPS جدید

نصب روی یک سرور تازه

یک دستور روی یک VPS تمیز با Ubuntu 20.04+ . اسکریپت لایسنس، دامنه و رمز ادمین شما را می‌پرسد — همین. اگر دامنه‌ای را به سرور اشاره دهید، SSL به‌صورت خودکار پیکربندی می‌شود.

⏱ ۵ دقیقه 🖥 حداقل ۱ گیگابایت RAM
دیدن دستور نصب ↓
مسیر ج · در حال آمدن از Marzban

مهاجرت از Marzban

همان VPS، بدون نیاز به پیکربندی مجدد کلاینت‌ها. ابزار مهاجرت اول‌اجرای‌آزمایشی و بازگشت‌پذیر است — پیش از اینکه چیزی دست بخورد هر تغییری را پیش‌نمایش می‌کنید و تا پیش از جابجایی نهایی هر زمان می‌توانید برگردید. از Remnawave می‌آیید؟ مهاجرت Remnawave هم به همین شکل کار می‌کند.

⏱ ۱۰ دقیقه 🔁 از‌سرگیری‌پذیر و بازگشت‌پذیر
راهنمای مهاجرت ↓
چرا مهاجرت ایمن است
این ابزار هرگز روی پایگاه داده Marzban شما نمی‌نویسد. از Marzban یک کپی فقط‌خواندنی می‌گیرد، وضعیت Nexus را از روی آن کپی می‌سازد و فقط در آخرین مرحله کانتینرها را جابجا می‌کند. اگر پیش از آن جابجایی چیزی اشتباه به نظر برسد، عملیات را لغو می‌کنید و Marzban دست‌نخورده به کار خود ادامه می‌دهد. لینک‌های اشتراک موجود شما هم پس از مهاجرت همچنان کار می‌کنند — Nexus کلید JWT مربوط به Marzban را با خود می‌برد، بنابراین هر لینک https://your-panel/sub/<token> که کاربرانتان از قبل دارند همچنان پاسخ می‌دهد.

به چه چیزهایی نیاز دارید

  • یک VPS با Ubuntu 20.04+ (یا هر توزیع خانواده Debian)، حداقل ۱ گیگابایت RAM، توصیه‌شده ۲ گیگابایت
  • دسترسی SSH ریشه (root) به آن VPS
  • یک دامنه که به VPS اشاره کند (اختیاری — یک گواهی HTTPS واقعی و بدون هشدار می‌دهد؛ بدون آن هم باز HTTPS خواهید داشت، فقط با یک گواهی خودامضا که یک‌بار در مرورگر هشدار نشان می‌دهد)
  • یک لایسنس NexusPanel (یکی از ربات Telegram بگیرید، نسخه آزمایشی رایگان ۱۴ روزه هم کار می‌کند)

چطور کمک بگیریم

اگر چیزی ناموفق بود، این‌ها را به ترتیب امتحان کنید:

  1. لاگ‌های پنل را بررسی کنید: cd /opt/panel && docker compose logs --tail 100
  2. بخش مربوطه از این مستندات را بخوانید (نوار کناری در سمت چپ)
  3. در Telegram به ما پیام دهید — لینک در ربات است، زمان پاسخ‌دهی در حد ساعت است نه روز

NexusPanel چیست

به زبان ساده
این همان داشبوردی است که برای اداره یک کسب‌وکار VPN واردش می‌شوید: افزودن مشتری، توزیع لینک‌های اتصال، دیدن اینکه چه کسی آنلاین است و دریافت پول — همه در یک جا. به همه‌چیز تازه‌وارد هستید؟ با تازه‌وارد؟ ابتدا این را بخوانید شروع کنید.

NexusPanel یک پنل مدیریت پروکسی مدرن و پرامکانات است که برای ارائه‌دهندگان VPN و مدیران شبکه ساخته شده است. یک داشبورد یکپارچه برای مدیریت کاربران، نودها، اشتراک‌ها و تحلیل‌ها در چندین سرور فراهم می‌کند.

در پشت صحنه، مجموعه کامل امکانات شامل موارد زیر است:

  • پشتیبانی چند‌پروتکلی — VMess، VLESS، Trojan، Shadowsocks از طریق Xray-core، به‌علاوه Hysteria 2 به‌صورت یک سایدکار جداگانه. افزونه‌های انتقال و مبهم‌سازی (XHTTP، Reality، ECH، قطعه‌قطعه‌سازی TLS، Finalmask) برای هر هاست در پنل پیکربندی می‌شوند.
  • نودهای توزیع‌شده — اتصال بی‌نهایت سرور راه دور از یک پنل واحد
  • محدودیت‌های واقعی به‌ازای هر کاربر — داده، انقضا، سقف IP و دستگاه که واقعاً از طریق تحلیل لاگ دسترسی Xray اعمال می‌شوند
  • نقش‌های ادمین و محدوده‌بندی هاست — سطوح مالک، ادمین و فروشنده با سهمیه‌های ترافیک؛ تخصیص هاست‌های مشخص به ادمین‌های مشخص
  • REST API — بیش از ۷۵ اندپوینت برای خودکارسازی و یکپارچه‌سازی
  • تحلیل‌های سبک Grafana — ترافیک در طول زمان، رشد کاربران، نمودارهای دایره‌ای پروتکل/وضعیت، پرمصرف‌ترین کاربران، بار پهنای باند نود (به‌روزرسانی خودکار)
  • ربات Telegram — ربات پرداخت رو به مشتری (رمزارز از طریق NOWPayments) به‌علاوه اعلان‌های ادمین
  • سامانه لایسنس — سطوح آزمایشی → پولی با ضربان (heartbeat) شش‌ساعته و اعلان‌های به‌روزرسانی ایمیج‌های Docker
  • لینک‌های رمزنگاری‌شده Happ — دیپ‌لینک‌های واقعی happ://crypt4/ با RSA-4096 که آدرس اشتراک زیرین را پنهان می‌کنند
  • 2FA — TOTP همراه با QR و کدهای بازیابی
  • آماده موبایل — داشبورد واکنش‌گرا با ناوبری نوار پایین و کشوی سرریز
  • محافظت از کد — ماژول‌های حساس پایتون که با Cython به فایل‌های باینری .so کامپایل شده‌اند
  • اعلان‌های قابل‌اقدام درون‌برنامه‌ای — کاربران در آستانه انقضا، سقف داده، نودهای آفلاین، انقضای لایسنس

پیش‌نیازها

مؤلفهحداقلتوصیه‌شده
سیستم‌عاملUbuntu 20.04+ / Debian 11+Ubuntu 22.04 LTS
RAM۱ گیگابایت۲ گیگابایت به بالا
CPU۱ vCPU۲ vCPU
دیسک۱۰ گیگابایت۲۰ گیگابایت به بالا (SSD)
Docker20.10+آخرین نسخه پایدار
دامنهاختیاریتوصیه‌شده (برای SSL)
توجه
اگر Docker و Docker Compose نصب نباشند، اسکریپت نصب سریع آن‌ها را به‌صورت خودکار نصب می‌کند.

نصب سریع

این دستور واحد را روی یک VPS تازه اجرا کنید تا NexusPanel با تنظیمات پیش‌فرض نصب شود:

bash
curl -sL https://nexuspanel.store/install | bash

اسکریپت موارد زیر را از شما می‌پرسد:

  1. کلید لایسنس و شناسه کلاینت (Client ID) — از @nexuspanelpayment_bot (کلید آزمایشی رایگان ۱۴ روزه هم همین‌جا کار می‌کند، اما نصب‌کننده همیشه به یک کلید نیاز دارد — نصب بدون لایسنس وجود ندارد)
  2. دامنه — برای SSL از طریق Let's Encrypt (برای حالت فقط‌IP رد شوید)
  3. نام کاربری و رمز ادمین — برای داشبورد
  4. پورت پنل — پیش‌فرض ۸۴۴۳

سپس کارهای زیر را انجام می‌دهد:

  1. در صورت نبود، Docker و Docker Compose را نصب می‌کند
  2. ghcr.io/haitovs/nexus:latest را می‌کشد (ایمیج پروداکشن محافظت‌شده با Cython)
  3. /opt/panel/ را همراه با .env و docker-compose.yml می‌سازد (نام کانتینر: nexus-panel)
  4. xray_config.json را با لاگ دسترسی فعال مقداردهی اولیه می‌کند (برای اعمال محدودیت IP/دستگاه ضروری است)
  5. پنل را اجرا می‌کند و آدرس داشبورد + اطلاعات ورود را چاپ می‌کند
اعلان‌های به‌روزرسانی
پس از نصب، پنل هر ۶ ساعت به سرور لایسنس شما ضربان می‌فرستد. به‌روزرسانی خودکار به‌طور پیش‌فرض خاموش است: وقتی نسخه جدیدی منتشر شود، پنل اعلان «به‌روزرسانی در دسترس است» را نشان می‌دهد و شما با اجرای nexus update روی سرور آن را اعمال می‌کنید.

نصب تک‌دستوری (تفصیلی)

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

bash
# توصیه‌شده — کلید لایسنس و شناسه کلاینت خود را بدهید (از @nexuspanelpayment_bot)
curl -sL https://nexuspanel.store/install | bash -s -- \
  --license YOUR_LICENSE_KEY \
  --client YOUR_CLIENT_ID \
  --domain panel.example.com \
  --port 8443

# همان کار با متغیرهای محیطی به‌جای پرچم‌ها
curl -sL https://nexuspanel.store/install | LICENSE_ID=YOUR_LICENSE_KEY CLIENT_ID=YOUR_CLIENT_ID DOMAIN=panel.example.com bash

# فقط‌IP (بدون دامنه) — کافی است --domain را حذف کنید، باز هم HTTPS خواهید داشت (گواهی خودامضا)
curl -sL https://nexuspanel.store/install | bash -s -- \
  --license YOUR_LICENSE_KEY \
  --client YOUR_CLIENT_ID

کلید لایسنس و شناسه کلاینت الزامی هستند — آن‌ها را از @nexuspanelpayment_bot بگیرید. برای دیدن همه پرچم‌ها bash -s -- --help را اجرا کنید (--port پیش‌فرض 8443، به‌علاوه --username، --password، --ssl، --migrate).

وقتی اسکریپت تمام شود، آدرس داشبورد، نام کاربری و رمز عبور ادمین را چاپ می‌کند — برای ورود از همان‌ها استفاده کنید. از مقادیر نمونه این مستندات (مثل myadmin/securepass123) استفاده نکنید؛ کار نمی‌کنند.

پنل از طریق https://YOUR_DOMAIN:8443/dashboard/ (یا https://YOUR_IP:8443/dashboard/ برای نصب فقط‌IP) در دسترس است.

هشدار «Not Secure» در نصب‌های فقط‌IP
بدون دامنه، پنل همچنان روی HTTPS اجرا می‌شود، اما با یک گواهی خودامضا (چون دامنه‌ای برای صدور گواهی Let's Encrypt وجود ندارد). مرورگر شما یک‌بار هنگام باز کردن داشبورد هشدار «Not Secure» / «اتصال شما خصوصی نیست» نشان می‌دهد — روی Advanced → Proceed (کروم) یا Visit this website (سافاری) کلیک کنید تا ادامه دهید. این طبیعی و بی‌خطر است؛ اتصال همچنان رمزنگاری‌شده است، فقط گواهی توسط یک مرجع عمومی امضا نشده. بعداً می‌توانید یک دامنه اضافه کنید تا گواهی بدون هشدار داشته باشید.

اولین قدم‌ها در پنل

پس از ورود، این سریع‌ترین مسیر برای رسیدن به اولین اتصال کاری است:

  1. یک کاربر بسازید — داشبورد → UsersAdd User. تاریخ انقضا و سقف ترافیک را تنظیم کنید، سپس لینک اشتراک او را کپی کرده و به یک اپ کلاینت (Happ، v2rayNG، Streisand…) بدهید.
  2. یک نود اضافه کنید (اختیاری) — داشبورد → NodesAdd New Node، دستور نصب سریع تولیدشده را کپی کنید، آن را روی سرور نود اجرا کنید، سپس برگردید و Name + Address را برای اتصال پر کنید. جزئیات بیشتر در نصب نود.
  3. دامنه اشتراک را تنظیم کنید — اگر لینک‌های اشتراک را از هاست/دامنه‌ای متفاوت از خود پنل ادمین سرو می‌کنید، XRAY_SUBSCRIPTION_URL_PREFIX را در ویرایشگر Env (Settings → Env) تنظیم کنید و از Save & Restart استفاده کنید — این تنظیم فقط پس از راه‌اندازی مجدد کامل اعمال می‌شود.

نصب دستی

اسکریپت نصب بالا روش پشتیبانی‌شده است — خودش در رجیستری خصوصی ایمیج احراز هویت می‌کند، یک .env کارآمد می‌نویسد و فایروال را تنظیم می‌کند. برای انجام دستی این کار:

bash
# ۱. ایمیج خصوصی است — یک `docker pull` ساده تا وقتی احراز هویت نکنید
#    با خطای "denied" مواجه می‌شود. لایسنس را با یک توکن کوتاه‌مدت pull تعویض کنید:
curl -s -X POST https://nexuspanel.store/api/registry-token \
  -H 'Content-Type: application/json' \
  -d '{"license_id":"YOUR_LICENSE_KEY","client_id":"YOUR_CLIENT_ID"}'
# → {"token": "...", "username": "..."} — با آن وارد شوید:
echo $TOKEN | docker login ghcr.io -u $USERNAME --password-stdin

# ۲. ایمیج را دانلود کنید
docker pull ghcr.io/haitovs/nexus:latest

# ۳. فایل /opt/panel/.env را بنویسید — همه کلیدها را در بخش Env Reference زیر ببینید.
#    حداقل لازم: UVICORN_PORT، SUDO_USERNAME، SUDO_PASSWORD، SQLALCHEMY_DATABASE_URL،
#    LICENSE_ID، CLIENT_ID
mkdir -p /opt/panel /var/lib/panel /var/lib/nexus
nano /opt/panel/.env

# ۴. با docker-compose.yml از بخش «نمونه‌های Docker Compose» زیر اجرا کنید
cd /opt/panel
docker compose up -d

# مشاهده لاگ‌ها
docker compose logs -f

همراه با SSL (Certbot)

برای فعال‌سازی HTTPS با یک گواهی رایگان Let's Encrypt:

bash
# Install certbot
apt install -y certbot

# Obtain certificate (stop panel first if using port 80)
docker compose down
certbot certonly --standalone -d panel.example.com

# Add to .env
UVICORN_SSL_CERTFILE="/etc/letsencrypt/live/panel.example.com/fullchain.pem"
UVICORN_SSL_KEYFILE="/etc/letsencrypt/live/panel.example.com/privkey.pem"

# Mount certs in docker-compose.yml and restart
docker compose up -d

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

bash
0 3 * * * certbot renew --quiet && docker compose -C /opt/nexuspanel restart

همراه با PostgreSQL

برای استقرارهای پروداکشن، PostgreSQL نسبت به SQLite توصیه می‌شود. BACKEND_MODE=modern را تنظیم کنید و از درایوری استفاده کنید که واقعاً در پنل وجود دارد — psycopg2 (سینک)، نه asyncpg:

bash
# در .env تنظیم کنید
BACKEND_MODE=modern
SQLALCHEMY_DATABASE_URL="postgresql+psycopg2://nexus:${POSTGRES_PASSWORD}@127.0.0.1:5432/nexus"
REDIS_URL="redis://127.0.0.1:6379/0"
POSTGRES_PASSWORD=$(openssl rand -hex 24)

فایل compose را دستی ننویسید — از docker-compose.modern.yml نگهداری‌شده در ریشه مخزن استفاده کنید که Postgres 16 + Redis 7 را همراه پنل روی network_mode: host بالا می‌آورد:

bash
# از پوشه نصب (مثلاً /opt/panel)
cp docker-compose.modern.yml docker-compose.yml
docker compose up -d
asyncpg نصب نیست
پنل با psycopg2-binary عرضه می‌شود، نه asyncpg — یک URL از نوع postgresql+asyncpg:// درایوری پیدا نمی‌کند. همیشه از postgresql+psycopg2:// استفاده کنید.

نمونه‌های Docker Compose

Classic (SQLite) — چیزی که نصب‌کننده واقعاً می‌نویسد

yaml — /opt/panel/docker-compose.yml
services:
  panel:
    image: ghcr.io/haitovs/nexus:latest
    container_name: nexus-panel
    restart: always
    env_file: .env
    network_mode: host
    dns: [8.8.8.8, 1.1.1.1]
    volumes:
      - /var/lib/panel:/var/lib/panel
      - /var/lib/nexus:/var/lib/nexus
      - ./.env:/app/env.live
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      NEXUS_HOST_ENV_FILE: /app/env.live
    healthcheck:
      test: ["CMD", "curl", "-skf", "http://127.0.0.1:8443/api/v1/health"]
      interval: 30s
      timeout: 5s
      start_period: 30s
      retries: 3

network_mode: host اجباری است — پنل و هر نود/میدل-ریلی هم‌جانشین، پورت‌ها را مستقیماً روی هاست باز می‌کنند، و مانت (فقط‌خواندنی) سوکت داکر همان چیزی است که نصب یک‌کلیکی SSH نود/میدل‌سرور را ممکن می‌کند. /var/lib/nexus اختیاری نیست: ماژول لایسنس وضعیت خود را همان‌جا کش می‌کند — بدون آن مانت، پنل نمی‌تواند تشخیص دهد که لایسنس دارد. 8443 در healthcheck را با UVICORN_PORT خودتان جایگزین کنید؛ اگر روی یک دامنه سرویس می‌دهید، /etc/letsencrypt:/etc/letsencrypt:ro را هم مانت کنید و UVICORN_SSL_CERTFILE/UVICORN_SSL_KEYFILE را به گواهی صادرشده اشاره دهید.

پشته کامل (PostgreSQL + Redis)

بخش همراه با PostgreSQL در بالا را ببینید — به‌جای نوشتن دستی compose برای Postgres، از docker-compose.modern.yml نگهداری‌شده مخزن استفاده کنید.

مرجع پیکربندی

پیکربندی NexusPanel کاملاً از طریق متغیرهای محیطی انجام می‌شود. آن‌ها را در فایل .env خود تنظیم کنید یا مستقیماً به Docker پاس دهید.

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

سرور

متغیرپیش‌فرضتوضیح
UVICORN_HOST0.0.0.0آدرس bind برای سرور
UVICORN_PORT8000پورت HTTP
UVICORN_UDSمسیر Unix domain socket (جایگزین host/port)
UVICORN_SSL_CERTFILEمسیر گواهی SSL (fullchain.pem)
UVICORN_SSL_KEYFILEمسیر کلید خصوصی SSL
UVICORN_SSL_CA_TYPEpublicنوع CA: public یا private
DASHBOARD_PATH/dashboard/مسیر URL برای داشبورد وب
ALLOWED_ORIGINSمنشأهای CORS جداشده با کاما
SUDO_USERNAMEنام کاربری سوپرادمین اولیه
SUDO_PASSWORDرمز سوپرادمین اولیه
JWT_ACCESS_TOKEN_EXPIRE_MINUTES1440انقضای توکن به دقیقه (پیش‌فرض ۲۴ ساعت)

پایگاه داده

متغیرپیش‌فرضتوضیح
SQLALCHEMY_DATABASE_URLsqlite:///db.sqlite3رشته اتصال پایگاه داده
SQLALCHEMY_POOL_SIZE10اندازه استخر اتصال
SQLIALCHEMY_MAX_OVERFLOW30حداکثر اتصال بیش از اندازه استخر
BACKEND_MODEclassicclassic (SQLite/Postgres، پیش‌فرض) یا modern (افزودن صف رویداد مبتنی بر Redis)
REDIS_URLرشته اتصال Redis؛ هنگام BACKEND_MODE=modern الزامی است
رشته اتصال PostgreSQL
برای PostgreSQL ناهمگام از postgresql+asyncpg://user:pass@host:5432/dbname استفاده کنید.
حالت بک‌اند مدرن
برای فعال‌سازی صف‌بندی رویداد مبتنی بر Redis، BACKEND_MODE=modern را تنظیم کنید و REDIS_URL را فراهم کنید. از docker-compose.modern.yml استفاده کنید که یک سرویس redis:7 را در کنار پنل ارائه می‌دهد. اکثر استقرارها به این نیاز ندارند.

Xray

متغیرپیش‌فرضتوضیح
XRAY_JSONxray_config.jsonمسیر پیکربندی هسته Xray
XRAY_EXECUTABLE_PATH/usr/local/bin/xrayمسیر باینری Xray
XRAY_ASSETS_PATH/usr/local/share/xrayمسیر geoip.dat و geosite.dat
XRAY_SUBSCRIPTION_URL_PREFIXپیشوند URL عمومی برای لینک‌های اشتراک (مثلاً https://sub.example.com). تغییرات فقط پس از راه‌اندازی مجدد کامل پنل اعمال می‌شوند — در ویرایشگر Env از Save & Restart استفاده کنید، نه راه‌اندازی مجدد کانتینر.
XRAY_SUBSCRIPTION_PATHsubبخش مسیر URL برای اشتراک‌ها
XRAY_EXCLUDE_INBOUND_TAGSتگ‌های inbound جداشده با فاصله برای حذف
XRAY_FALLBACKS_INBOUND_TAGتگ inbound استفاده‌شده برای مسیریابی fallback

اشتراک

متغیرپیش‌فرضتوضیح
SUB_PROFILE_TITLESubscriptionنام نمایشی که در اپ‌های کلاینت نشان داده می‌شود
SUB_SUPPORT_URLلینک پشتیبانی گنجانده‌شده در اطلاعات اشتراک
SUB_UPDATE_INTERVAL12بازه به‌روزرسانی خودکار کلاینت (ساعت)
EXTERNAL_CONFIGURL پیکربندی خارجی برای یکپارچه‌سازی کلاینت
USE_CUSTOM_JSON_DEFAULTfalseفعال‌سازی پیکربندی JSON سفارشی برای کلاینت پیش‌فرض
USE_CUSTOM_JSON_FOR_V2RAYNfalseفعال‌سازی JSON سفارشی برای V2RayN
USE_CUSTOM_JSON_FOR_V2RAYNGfalseفعال‌سازی JSON سفارشی برای V2RayNG
USE_CUSTOM_JSON_FOR_STREISANDfalseفعال‌سازی JSON سفارشی برای Streisand
USE_CUSTOM_JSON_FOR_HAPPfalseفعال‌سازی JSON سفارشی برای Happ
SUB_RATE_LIMIT_PER_MINUTE60حداکثر دریافت اشتراک به‌ازای هر IP در دقیقه (درون‌فرایندی، با راه‌اندازی مجدد بازنشانی می‌شود)
SUB_ENABLE_ETAGtrueبازگرداندن ETag / رعایت If-None-Match برای صرفه‌جویی در پهنای باند روی اشتراک‌های بدون تغییر
SUB_GZIP_MIN_SIZE512فشرده‌سازی Gzip پاسخ‌های اشتراک بزرگ‌تر از این تعداد بایت

قالب‌ها

متغیرپیش‌فرضتوضیح
CUSTOM_TEMPLATES_DIRECTORY/var/lib/panel/templates/پوشه پایه برای قالب‌های سفارشی
SUBSCRIPTION_PAGE_TEMPLATEsubscription/index.htmlقالب صفحه اشتراک کاربر
HOME_PAGE_TEMPLATEhome/index.htmlقالب صفحه اصلی پنل
CLASH_SUBSCRIPTION_TEMPLATEclash/default.ymlقالب اشتراک Clash
CLASH_SETTINGS_TEMPLATEclash/settings.ymlقالب تنظیمات Clash
V2RAY_SUBSCRIPTION_TEMPLATEv2ray/default.jsonقالب اشتراک V2Ray
V2RAY_SETTINGS_TEMPLATEv2ray/settings.jsonقالب تنظیمات V2Ray
SINGBOX_SUBSCRIPTION_TEMPLATEsingbox/default.jsonقالب اشتراک Sing-box
SINGBOX_SETTINGS_TEMPLATEsingbox/settings.jsonقالب تنظیمات Sing-box
MUX_TEMPLATEmux/default.jsonقالب پیکربندی Multiplex
USER_AGENT_TEMPLATEuser_agent/default.jsonقالب تجزیه User-agent
GRPC_USER_AGENT_TEMPLATEuser_agent/grpc.jsonقالب User-agent برای gRPC

Telegram

متغیرپیش‌فرضتوضیح
TELEGRAM_API_TOKENتوکن ربات از @BotFather
TELEGRAM_ADMIN_IDشناسه‌های کاربری Telegram ادمین‌ها، جداشده با کاما
TELEGRAM_LOGGER_CHANNEL_IDشناسه کانال برای پیام‌های لاگ
TELEGRAM_DEFAULT_VLESS_FLOWxtls-rprx-visionflow پیش‌فرض VLESS برای کاربران ساخته‌شده توسط ربات
TELEGRAM_PROXY_URLURL پروکسی برای اتصالات API تلگرام

اعلان‌ها

متغیرپیش‌فرضتوضیح
NOTIFY_STATUS_CHANGEtrueاعلان هنگام تغییر وضعیت کاربر
NOTIFY_USER_CREATEDtrueاعلان هنگام ساخت کاربر جدید
NOTIFY_USER_UPDATEDtrueاعلان هنگام ویرایش کاربر
NOTIFY_USER_DELETEDtrueاعلان هنگام حذف کاربر
NOTIFY_USER_DATA_USED_RESETtrueاعلان هنگام بازنشانی مصرف
NOTIFY_USER_SUB_REVOKEDtrueاعلان هنگام ابطال اشتراک
NOTIFY_IF_DATA_USAGE_PERCENT_REACHEDtrueاعلان هنگام رسیدن به آستانه داده
NOTIFY_IF_DAYS_LEFT_REACHEDtrueاعلان هنگام رسیدن به آستانه انقضا
NOTIFY_LOGINtrueاعلان هنگام ورود ادمین
LOGIN_NOTIFY_WHITE_LISTIPهایی که از اعلان‌های ورود مستثنا می‌شوند
NOTIFY_DAYS_LEFT3,7آستانه‌های روزهای باقی‌مانده برای اعلان
NOTIFY_REACHED_USAGE_PERCENT80,90آستانه‌های درصد مصرف
RECURRENT_NOTIFICATIONS_TIMEOUT180دقیقه بین اعلان‌های تکراری
NUMBER_OF_RECURRENT_NOTIFICATIONS3حداکثر اعلان‌های تکراری به‌ازای هر رویداد
DISCORD_WEBHOOK_URLوب‌هوک Discord برای اعلان‌های سبک Telegram
WEBHOOK_ADDRESSقدیمی: URLهای ثابت وب‌هوک جداشده با کاما. برای راه‌اندازی‌های جدید، رابط وب‌هوک داشبورد را ترجیح دهید.
WEBHOOK_SECRETقدیمی: راز HMAC برای تحویل WEBHOOK_ADDRESS. وب‌هوک‌های داشبورد رازها را به‌ازای هر اندپوینت مدیریت می‌کنند.

برندینگ (وایت‌لیبل)

متغیرپیش‌فرضتوضیح
BRAND_NAMEPanelنام پنل که در رابط کاربری و ایمیل‌ها نمایش داده می‌شود
BRAND_LOGO_URLURL تصویر لوگوی سفارشی
BRAND_FAVICON_URLURL فاوآیکون سفارشی

امنیت

متغیرپیش‌فرضتوضیح
CAPTCHA_PROVIDERdisabledارائه‌دهنده کپچا: disabled، turnstile یا builtin
TURNSTILE_SITE_KEYکلید سایت Cloudflare Turnstile
TURNSTILE_SECRET_KEYکلید مخفی Cloudflare Turnstile
LOGIN_RATE_LIMIT10/minuteحداکثر تلاش‌های ورود در هر بازه
LOGIN_LOCKOUT_THRESHOLD10تلاش‌های ناموفق پیش از قفل‌شدن
LOGIN_LOCKOUT_DURATION_MINUTES30مدت قفل‌شدن به دقیقه

ثبت رویداد

متغیرپیش‌فرضتوضیح
LOG_LEVELINFOسطح لاگ: DEBUG، INFO، WARNING، ERROR
LOG_FORMATtextقالب لاگ: text یا json
LOG_FILE_PATHنوشتن لاگ در فایل (علاوه بر stdout)
LOG_MAX_SIZE_MB10حداکثر اندازه فایل لاگ پیش از چرخش
LOG_BACKUP_COUNT5تعداد فایل‌های لاگ چرخش‌یافته برای نگهداری

سنجه‌ها (Prometheus)

متغیرپیش‌فرضتوضیح
METRICS_ENABLEDfalseفعال‌سازی اندپوینت /metrics Prometheus
METRICS_TOKENتوکن Bearer لازم برای جمع‌آوری سنجه‌ها

متغیرهای اضافی

متغیرپیش‌فرضتوضیح
ACTIVE_STATUS_TEXTActiveبرچسب سفارشی برای وضعیت فعال
EXPIRED_STATUS_TEXTExpiredبرچسب سفارشی برای وضعیت منقضی
LIMITED_STATUS_TEXTLimitedبرچسب سفارشی برای وضعیت محدود
DISABLED_STATUS_TEXTDisabledبرچسب سفارشی برای وضعیت غیرفعال
ONHOLD_STATUS_TEXTOn-Holdبرچسب سفارشی برای وضعیت در‌انتظار
USERS_AUTODELETE_DAYS-1حذف خودکار کاربران منقضی پس از N روز (۱- = غیرفعال)
USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTSfalseگنجاندن کاربران محدود‌شده به‌خاطر داده در حذف خودکار
JOB_CORE_HEALTH_CHECK_INTERVAL10بازه بررسی سلامت (ثانیه)
JOB_RECORD_NODE_USAGES_INTERVAL30بازه ثبت مصرف نود
JOB_RECORD_USER_USAGES_INTERVAL10بازه ثبت مصرف کاربر
JOB_REVIEW_USERS_INTERVAL10بازه بررسی/انقضای کاربر
JOB_SEND_NOTIFICATIONS_INTERVAL30بازه ارسال اعلان
DISABLE_RECORDING_NODE_USAGEfalseغیرفعال‌سازی ثبت مصرف نود
DEBUGfalseفعال‌سازی حالت دیباگ با بارگذاری مجدد خودکار
DOCSfalseفعال‌سازی Swagger UI در /docs
VITE_BASE_API/api/v1/مسیر پایه API برای بیلد فرانت‌اند

داشبورد

داشبورد NexusPanel یک اپلیکیشن وب مدرن مبتنی بر React است که در /dashboard/ در دسترس است. رابطی کامل برای مدیریت زیرساخت پروکسی شما فراهم می‌کند.

صفحه مرور کلی

صفحه اصلی داشبورد آمار بلادرنگ را در یک نگاه نمایش می‌دهد:

  • کل کاربران — تعداد فعال، منقضی، محدود، غیرفعال
  • مصرف پهنای باند — مجموع آپلود/دانلود همراه با نمودارهای روند
  • وضعیت نود — نشانگرهای آنلاین/آفلاین با درصد بار
  • فعالیت اخیر — آخرین ساخت کاربران، اتصال‌ها و اقدامات ادمین
  • توزیع پروتکل — نمودار دایره‌ای پروتکل‌های در حال استفاده

مدیریت کاربران

صفحه کاربران از مدیریت کامل چرخه عمر پشتیبانی می‌کند:

  • ساخت کاربر — تعیین نام کاربری، محدودیت داده، تاریخ انقضا، پروتکل‌ها، محدودیت دستگاه، محدودیت IP
  • ویرایش کاربر — تغییر همه فیلدها شامل وضعیت (فعال، غیرفعال، در‌انتظار)
  • عملیات گروهی — انتخاب چند کاربر برای به‌روزرسانی گروهی، بازنشانی مصرف یا حذف
  • جستجو و فیلتر — فیلتر بر اساس وضعیت، ادمین، پروتکل یا جستجو بر اساس نام کاربری
  • لینک‌های اشتراک — کپی آدرس اشتراک، تولید کد QR
  • آمار مصرف — آپلود/دانلود به‌ازای هر کاربر همراه با داده‌های تاریخی

نودها

مدیریت نودهای Xray راه دور متصل به پنل:

  • افزودن نود — ارائه آدرس، پورت و ضریب مصرف
  • وضعیت اتصال — آنلاین/آفلاین بلادرنگ همراه با تأخیر
  • پرچم کشورها — نمایش خودکار پرچم بر اساس موقعیت نود (بیش از ۶۰ کشور)
  • تغییر ترتیب — کشیدن یا استفاده از دکمه‌های فلش برای تعیین ترتیب نمایش
  • گواهی — مشاهده و کپی گواهی SSL نود برای راه‌اندازی راه دور
  • پیگیری آپ‌تایم — درصد آپ‌تایم تاریخی به‌ازای هر نود

هاست‌ها و تنظیمات پیشرفته TLS

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

فیلدهدف
Remarkنام نمایشی که در اپ‌های کلاینت نشان داده می‌شود
Addressدامنه یا IP سرور که کلاینت به آن متصل می‌شود
Portجایگزینی پورت گوش‌دادن inbound
SNI / HostTLS Server Name Indication و هدر HTTP Host
Security / ALPN / Fingerprintپروفایل TLS: none / tls / reality؛ h2/http1.1؛ uTLS مرورگرهای Chrome/Firefox/Safari
Allow Insecureرد کردن راستی‌آزمایی گواهی TLS (فقط پشت CDN که گواهی در معرض دید نیست استفاده شود)
Country codeISO 3166-1 alpha-2 — تغییر ترتیب منطقه‌ای اشتراک را هدایت می‌کند
Allowed / Denied Adminsمحدود کردن هاست به زیرادمین‌های مشخص (خالی = همه ادمین‌ها)

ECH (Encrypted Client Hello)

ECH مقدار SNI را از ناظران منفعل پنهان می‌کند — افزونه دست‌دهی (handshake) TLS با کلید عمومی منتشرشده در DNS رمزنگاری می‌شود. برای هر هاست فعال کنید: ECH را روشن کنید و بلوک ECHConfig را از ارائه‌دهنده CDN/DNS خود وارد کنید. به کلاینتی نیاز دارد که از ECH پشتیبانی کند (Happ، Chrome 117+).

قطعه‌قطعه‌سازی TLS

پیام TLS ClientHello را به قطعات TCP کوچک‌تر تقسیم می‌کند و از تطبیق الگوی DPI روی اولین بسته عبور می‌کند. زمانی استفاده کنید که مسدودسازی مبتنی بر SNI فعال است اما CDN در دسترس نیست.

  • اندازه قطعه — بایت به‌ازای هر قطعه، مثلاً 100-200 (بازه تصادفی)
  • تأخیر قطعه — میلی‌ثانیه بین قطعات، مثلاً 10-20

قطعه‌قطعه‌سازی رکورد TLS

به‌جای TCP در لایه رکورد TLS قطعه‌قطعه می‌کند. تهاجمی‌تر از قطعه‌قطعه‌سازی ClientHello است؛ زمانی استفاده کنید که قطعه‌قطعه‌سازی استاندارد TLS همچنان شناسایی می‌شود.

تنظیمات Noise

پیش از دست‌دهی واقعی TLS بسته‌های نویز تصادفی تزریق می‌کند تا اثرانگشت‌گیری مبتنی بر جریان را خنثی کند. فیلد JSON:

json
[{"type": "rand", "packet": "10-50", "delay": "5-10"}]

نوع rand بایت‌های تصادفی می‌فرستد؛ نوع str یک رشته hex مشخص می‌فرستد. اندازه بسته و تأخیر، نماد بازه را می‌پذیرند.

User-Agent تصادفی

در هر درخواست، HTTP User-Agent را تصادفی می‌کند تا از اثرانگشت‌گیری کلاینت روی انتقال‌های WS/HTTP جلوگیری شود.

نشست‌ها

پایش و مدیریت اتصال‌های فعال دستگاه‌ها:

  • نشست‌های فعال — مشاهده همه دستگاه‌های متصل کنونی
  • نشست‌های به‌ازای کاربر — دیدن اینکه یک کاربر مشخص از چه دستگاه‌هایی استفاده می‌کند
  • قطع اتصال — خاتمه اجباری نشست‌های منفرد
  • تاریخچه IP — پیگیری تاریخچه اتصال کاربر بر اساس IP

تحلیل‌ها

داشبورد تحلیل‌های جامع شامل:

  • خلاصه — کل کاربران، اتصال‌های فعال، پهنای باند، مرور درآمد
  • توزیع پروتکل — تفکیک مصرف بر اساس پروتکل (VMess، VLESS و غیره)
  • بار نود — تعداد اتصال و مصرف پهنای باند به‌ازای هر نود
  • آپ‌تایم نود — درصد آپ‌تایم در بازه‌های ۲۴ ساعت، ۷ روز، ۳۰ روز
  • پرمصرف‌ترین کاربران — مصرف‌کنندگان با بیشترین پهنای باند
  • کاربران در آستانه انقضا — کاربرانی که ظرف روزهای قابل‌پیکربندی منقضی می‌شوند

مدیریت ادمین‌ها

سامانه ادمین مبتنی بر نقش با سه سطح:

نقشتوانمندی‌ها
مالک (Owner)دسترسی کامل: مدیریت ادمین‌ها، نودها، تنظیمات سیستم، همه کاربران
ادمین (Admin)مدیریت کاربران (همه)، مشاهده نودها و تحلیل‌ها، تنظیمات محدود
فروشنده (Reseller)مدیریت فقط کاربران خودش، محدود به سهمیه‌های max_users و max_traffic_bytes

هر ادمین می‌تواند سهمیه داشته باشد:

  • max_users — حداکثر تعداد کاربری که ادمین می‌تواند بسازد
  • max_traffic_bytes — سهمیه کل ترافیک در میان همه کاربرانش

تنظیمات

  • احراز هویت دو‌مرحله‌ای — فعال/غیرفعال‌سازی TOTP 2FA از صفحه تنظیمات
  • پیکربندی هسته Xray — ویرایش JSON خام Xray در چیدمان دو‌ستونه (ویرایشگر در چپ، لاگ‌ها و وضعیت زنده در راست)
  • ویرایشگر Env — ویرایش SMTP، توکن‌ها و پرچم‌های قابلیت به‌صورت درون‌خطی با پوشاندن رازها؛ Save & Restart پنل را خودش راه‌اندازی مجدد می‌کند
  • Hysteria2 — مدیریت inboundهای hy2 از صفحه تنظیمات (Standard به بالا)
  • اطلاعات لایسنس — سطح، روزهای باقی‌مانده، کاربران/نودهای کنونی در برابر حداکثر

گروه‌های کاربری

گروه‌های کاربری (که در Remnawave Squads نامیده می‌شوند) به شما امکان می‌دهند کاربران را برای کنترل نمایش inbound و جایگزینی اشتراک بخش‌بندی کنید. لایسنس Pro، فقط sudo.

هر گروه می‌تواند هرکدام یا همه موارد زیر را انجام دهد:

  • فیلتر inbound (applies_to_inbounds) — CSV از تگ‌های inbound. کاربران گروه فقط ورودی‌های اشتراک مربوط به inboundهای منطبق را دریافت می‌کنند. خالی = همه inboundها.
  • جایگزینی قالب (override_template_id) — استفاده از قالب اشتراک متفاوت برای اعضای این گروه.
  • جایگزینی هاست (override_hosts) — تزریق ردیف‌های هاست متفاوت در اشتراک اعضا (مثلاً دادن یک هاست IP-مستقیم به یک گروه VIP که از همه پنهان است).

کاربران را از صفحه جزئیات کاربر یا از طریق API به یک گروه اضافه کنید. هر کاربر حداکثر می‌تواند در یک گروه باشد.

bash — API
# List groups
curl /api/v1/user-groups -H "Authorization: Bearer TOKEN"

# Create a VIP group that only gets the hy2 + VLESS-Reality inbounds
curl -X POST /api/v1/user-groups \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"VIP","applies_to_inbounds":"hy2-main,vless-reality"}'

# Add user to group
curl -X POST /api/v1/user-groups/1/members \
  -d '{"username":"alice"}' -H "Authorization: Bearer TOKEN"

مجموعه‌های Inbound

یک مجموعه Inbound، یک CSV نام‌گذاری‌شده از تگ‌های inbound است که به یک نود اختصاص می‌دهید. وقتی یک نود مجموعه inbound داشته باشد، فقط همان inboundها روی آن فعال می‌شوند — بقیه سرکوب می‌شوند. از این برای اجرای ترکیب‌های پروتکلی متفاوت به‌ازای هر نود استفاده کنید: مثلاً نود A به VLESS+Trojan و نود B به VLESS+hy2.

لایسنس Pro، فقط sudo.

bash — API
# Create an inbound set
curl -X POST /api/v1/inbound-sets \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"UDP nodes","tags":"hy2-main,vmess-ws"}'

# Assign to a node (set inbound_set_id on the node)
curl -X PUT /api/v1/node/1 \
  -d '{"inbound_set_id": 2}' -H "Authorization: Bearer TOKEN"

قوانین پاسخ اشتراک

قوانین اشتراک به شما امکان می‌دهند بر اساس کلاینت کاربر، ظاهر پاسخ اشتراک او را سفارشی کنید. قوانین بر اساس ویژگی‌های درخواست تطبیق می‌یابند و یک اقدام اعمال می‌کنند.

فیلد تطبیقعملگرهااقدام‌ها
user_agentequals / contains / regextemplate / status / headers
client_osequals / contains / regextemplate / status / headers

نمونه‌ها:

  • تطبیق user_agent contains "Happ" ← اقدام template = happ-custom — ارائه یک قالب بهینه‌شده برای Happ به کلاینت‌های Happ
  • تطبیق client_os equals "iOS" ← اقدام headers = {"Content-Type": "text/plain"}
  • قوانین سراسری (فقط sudo، admin_id = NULL) صرف‌نظر از اینکه کدام ادمین مالک کاربران است، روی همه آن‌ها اعمال می‌شوند

قوانین به ترتیب صعودی priority ارزیابی می‌شوند. اولین تطبیق برنده است.

bash — API
# Create a rule: serve sing-box template to Karing clients
curl -X POST /api/v1/sub-rules \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Karing","match_field":"user_agent","match_op":"contains",
     "match_value":"Karing","action":"template","action_arg":"singbox-default"}'

وب‌هوک‌ها

NexusPanel رویدادهای HTTP POST امضاشده را به هر URLی که ثبت کنید تحویل می‌دهد. هر تحویل شامل یک هدر X-Nexus-Signature است — HMAC-SHA256 از بدنه با راز اندپوینت شما.

دامنه‌های رویداد

دامنهرویدادها
user.*user.created، user.updated، user.deleted، user.expired، user.disabled، user.data_used_reset
node.*node.connected، node.disconnected، node.reconnecting
service.*service.started، service.stopped
billing.*billing.renewed، billing.expired
errors.*errors.cert_expired، errors.xray_crash
hwid.*hwid.mismatch، hwid.reset

دامنه‌ها را خالی بگذارید تا همه رویدادها را دریافت کنید. تحویل با عقب‌نشینی نمایی (exponential backoff) تلاش مجدد می‌کند؛ پس از حداکثر تلاش‌ها، رویداد ناموفق علامت‌گذاری و رها می‌شود.

bash — API
# Register an endpoint
curl -X POST /api/v1/webhooks \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://my-server/hook","scopes":"user.*,node.*"}'
# Response includes secret (shown once)

# Send a test delivery
curl -X POST /api/v1/webhooks/1/test -H "Authorization: Bearer TOKEN"

# Verify signature in your handler (Python example)
# expected = hmac.new(secret, body, sha256).hexdigest()
# assert expected == request.headers["X-Nexus-Signature"]
رویکرد قدیمی مبتنی بر env
WEBHOOK_ADDRESS (URLهای جداشده با کاما) و WEBHOOK_SECRET همچنان به‌عنوان جایگزین ثابت مبتنی بر متغیر محیطی کار می‌کنند. برای راه‌اندازی‌های جدید از رابط داشبورد استفاده کنید — از رازها، دامنه‌ها و تاریخچه تحویل به‌ازای هر اندپوینت پشتیبانی می‌کند.

صفحه کلاینت‌ها

داشبورد → کلاینت‌ها فهرستی گزیده از کلاینت‌های VPN توصیه‌شده را همراه با نشان‌های پلتفرم، لینک‌های دانلود و یادداشت‌های کاربری نشان می‌دهد. اپراتورها آدرس این صفحه را با کاربران نهایی به اشتراک می‌گذارند.

کلاینتپلتفرم‌هایادداشت‌ها
HappiOS / macOS / Windows / Androidتوصیه‌شده — آدرس اشتراک بومی، اتصال HWID، کش آفلاین
v2RayTuniOS / macOS / Androidکلاینت محبوب iOS، پشتیبانی از VLESS-Reality
Karingهمه پلتفرم‌هامبتنی بر Sing-box، روایت چندپلتفرمی قوی
ShadowrocketiOS۲٫۹۹ دلار در App Store آمریکا — iOS بسیار پایدار
V2rayNGAndroidکلاینت کلاسیک Android
FlClashXWindows / macOS / Linux / Androidسازگار با Mihomo/Clash
StreisandiOS / macOSاز JSON سفارشی پشتیبانی می‌کند — USE_CUSTOM_JSON_FOR_STREISAND=true را تنظیم کنید

سامانه لایسنس

NexusPanel از یک سرور لایسنس مرکزی (nexuspanel.store) برای اعتبارسنجی نصب‌ها و ارسال به‌روزرسانی‌ها استفاده می‌کند. به این روش، کلاینت‌ها سطح‌بندی، صورت‌حساب و به‌روز نگه داشته می‌شوند.

ضربان (heartbeat) چطور کار می‌کند

  • هر ۶ ساعت، پنل POST /api/validate را روی سرور لایسنس فراخوانی می‌کند با license_id، client_id و تله‌متری کامل (نسخه پنل، نسخه Xray، نام میزبان، سیستم‌عامل، IP، کاربران کل/فعال، نودهای کل/فعال، کل ترافیک، آپ‌تایم).
  • سرور لایسنس این داده را ذخیره می‌کند و با {tier, expires_at, latest_version, update_available, docker_image} پاسخ می‌دهد.
  • اگر update_available درست باشد و AUTO_UPDATE فعال باشد (پیش‌فرض)، پنل در پس‌زمینه docker compose pull && docker compose up -d --force-recreate را اجرا می‌کند — لازم نیست کاری کنید.

سطوح

سطحقیمتکاربراننودهامدت
آزمایشی (Trial)رایگاننامحدودنامحدود۱۴ روز
استاندارد (Standard)۱۰ دلار در ماهنامحدود۱۰۳۰ روز در ماه
حرفه‌ای (Pro)۳۰ دلار در ماهنامحدودنامحدود۳۰ روز در ماه

آزمایشی

بدون کارت اعتباری، بدون ثبت‌نام — ربات Telegram را باز کنید و /start را تایپ کنید. یک لایسنس آزمایشی ۱۴ روزه با کاربران و نودهای نامحدود دریافت می‌کنید — همه پروتکل‌ها، تحلیل‌ها و Hysteria 2 را در اختیار دارید. برای ارزیابی روی ترافیک واقعی کافی است.

استاندارد — ۱۰ دلار در ماه

برای اپراتورهایی که پس از پایان نسخه آزمایشی، یک سرویس زنده اجرا می‌کنند. تا ۱۰ نود می‌دهد و شامل موارد زیر است:

  • پروتکل Hysteria 2 روی همه نودها
  • عملیات گروهی (فعال/غیرفعال/بازنشانی/حذف صدها کاربر به‌یکباره)
  • دسترسی API برای خودکارسازی و یکپارچه‌سازی
  • صورت‌حساب چندماهه (۳/۶/۱۲ ماه با ۵٪/۱۰٪/۱۵٪ تخفیف)

حرفه‌ای — ۳۰ دلار در ماه

همه‌چیز در استاندارد، به‌علاوه بدون سقف نود و مجموعه کامل امکانات:

  • نودهای نامحدود در هر تعداد کشور
  • ECH (Encrypted Client Hello) — مقدار SNI را از DPI پنهان می‌کند
  • Finalmask — لایه انتقال ضداثرانگشت
  • برندینگ وایت‌لیبل (دامنه و لوگوی سفارشی پنل)
  • گروه‌های کاربری و مجموعه‌های Inbound برای بخش‌بندی سطح فروشنده
  • رله سرور میانی با قوانین iptables تولیدشده خودکار
  • پشتیبانی اولویت‌دار

مقایسه امکانات

قابلیتآزمایشیاستانداردحرفه‌ای
حداکثر کاربراننامحدودنامحدودنامحدود
حداکثر نودهانامحدود۱۰نامحدود
مدت۱۴ روز۳۰ روز در ماه۳۰ روز در ماه
همه پروتکل‌ها (VLESS، VMess، Trojan، SS)
Hysteria 2
تحلیل‌های سبک Grafana
نمای نشست زنده
لاگ ممیزی
وب‌هوک‌ها
CLI اپراتور
عملیات گروهی
دسترسی API
ECH + Finalmask
برندینگ وایت‌لیبل
گروه‌های کاربری و مجموعه‌های Inbound
رله سرور میانی

خرید لایسنس

@nexuspanelpayment_bot را در Telegram باز کنید. روی مشاهده پلن‌ها بزنید، یک سطح انتخاب کنید، مدت را برگزینید (۱/۳/۶/۱۲ ماه با تخفیف‌های فزاینده)، یک رمزارز انتخاب کنید (USDT TRC20، BTC، ETH، LTC، TRX و بیش از ۲۰۰ مورد دیگر) و مبلغ دقیق نشان‌داده‌شده را به کیف‌پول نمایش‌یافته بفرستید. به‌محض تأیید NOWPayments، ربات License Key و Client ID شما را تحویل می‌دهد.

دوره مهلت (Grace period)

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

اعمال محدودیت IP و دستگاه

NexusPanel محدودیت‌های IP و دستگاه به‌ازای هر کاربر را به‌صورت بلادرنگ و با تحلیل لاگ دسترسی Xray اعمال می‌کند — نه فقط هنگام وارد کردن اشتراک. همین چیزی است که باعث می‌شود ip_limit و device_limit واقعاً کار کنند.

چطور کار می‌کند

  1. Xray برای هر اتصال پذیرفته‌شده، یک خط در $XRAY_ACCESS_LOG می‌نویسد.
  2. جاب enforce_limits هر ۶۰ ثانیه اجرا می‌شود، لاگ را دنبال می‌کند (با ردیابی آفست و آگاه از چرخش) و جفت‌های (user_id, client_ip) را از آخرین LIMIT_WINDOW_SECONDS (پیش‌فرض ۶۰۰ = ۱۰ دقیقه) استخراج می‌کند.
  3. برای هر کاربر، IPهای یکتا شمارش می‌شوند. اگر تعداد از ip_limit (یا device_limit در صورت تنظیم‌نشدن ip_limit) فراتر رود و کاربر در حال حاضر active باشد و ip_limit_mode == "limit" باشد، وضعیت کاربر به limited تغییر می‌کند.
  4. همه IPهای دیده‌شده در user_ip_history نوشته می‌شوند. IPهای هر کاربر را از طریق GET /api/v1/user/{username}/ips ببینید.

پیکربندی لازم xray

نصب پیش‌فرض این را به‌صورت خودکار فعال می‌کند. برای نصب‌های موجود، پنل هنگام راه‌اندازی xray_config.json شما را به‌صورت خودکار وصله می‌کند تا مسیر لاگ دسترسی اضافه شود. پیکربندی دستی:

json
{
  "log": {
    "loglevel": "warning",
    "access": "/var/lib/panel/xray-access.log"
  }
}

پارامترهای قابل‌تنظیم

متغیر محیطیپیش‌فرضهدف
XRAY_ACCESS_LOG/var/log/xray/access.logمسیر فایل لاگ دسترسی Xray
LIMIT_WINDOW_SECONDS600پنجره غلتان برای شمارش IP یکتا
LIMIT_ENFORCE_INTERVAL60هر چند وقت یک‌بار (ثانیه) جاب اعمال اجرا می‌شود

پشتیبان‌گیری

NexusPanel هر روز ساعت 03:00 UTC از طریق جاب backup در APScheduler یک پشتیبان خودکار از پایگاه داده می‌گیرد.

پشتیبان‌ها کجا می‌روند

  • فایل‌های محلی: /var/lib/panel/backups/backup_YYYYMMDD_HHMMSS.sqlite3 (یا .sql برای PostgreSQL)
  • ۷ پشتیبان آخر نگه داشته می‌شود؛ موارد قدیمی‌تر به‌صورت خودکار هرس می‌شوند
  • اگر TELEGRAM_API_TOKEN و TELEGRAM_ADMIN_ID پیکربندی شده باشند، هر پشتیبان به‌عنوان یک سند به Telegram شما هم ارسال می‌شود تا یک نسخه خارج از سرور داشته باشید

پشتیبان دستی

bash
# SQLite
docker exec nexus-panel cp /var/lib/panel/db.sqlite3 /var/lib/panel/backups/manual.sqlite3

# Or grab the file directly from the host
cp /var/lib/panel/db.sqlite3 ~/panel-backup-$(date +%F).sqlite3

بازیابی

  1. پنل را متوقف کنید: cd /opt/panel && docker compose down
  2. فایل DB را جایگزین کنید: cp /path/to/backup.sqlite3 /var/lib/panel/db.sqlite3
  3. راه‌اندازی مجدد کنید: docker compose up -d
پارامترهای قابل‌تنظیم
BACKUP_DIR — محل نوشتن پشتیبان‌ها (پیش‌فرض /var/lib/panel/backups)
BACKUP_RETENTION — تعداد پشتیبان‌های اخیر برای نگهداری (پیش‌فرض 7)

اشتراک‌های رمزنگاری‌شده Happ

دکمه «H» به‌ازای هر کاربر در داشبورد، یک دیپ‌لینک واقعی happ://crypt4/<base64> با استفاده از RSA-4096 PKCS1v15 و کلید عمومی رسمی Happ تولید می‌کند. پس از افزودن به یک کلاینت Happ، کاربر نمی‌تواند آدرس اشتراک زیرین را مشاهده، ویرایش یا به اشتراک بگذارد.

آدرس‌های اشتراک طولانی‌تر از ۵۰۱ بایت (محدودیت RSA-4096 + PKCS1v15) به‌صورت خودکار به قالب ساده happ://add/<base64> برمی‌گردند.

TODO — هنوز به فارسی ترجمه نشده
این بخش («اداره کسب‌وکار») هنوز ترجمه نشده است. نسخه انگلیسی در ادامه آمده تا چیزی از قلم نیفتد.

Run Your Business

Your First Customer

  1. Dashboard → UsersAdd User.
  2. Give them a username, pick an expiry date and a data limit (or leave both unlimited), and pick which protocols they get.
  3. Save — the panel generates their subscription link immediately.
  4. Send them the link. They paste it into a client app and they're connected.

Everything here is also available over the Users API for automation.

Device & IP Limits

Device and IP limits (see how enforcement works) aren't just an anti-abuse tool — they're a pricing lever: sell a Personal plan at 1–2 devices, a Family/Team plan at 4–6, and an Unlimited plan at 0 (off) for a premium price.

Set device_limit (or ip_limit) per user. Customers who exceed it are flipped to limited automatically.

Admins & Resellers

Give anyone selling under you their own admin login instead of sharing yours — see Admin Management. Owner sees everything; Admin manages users only; Reseller manages only their own users, capped by max_users and max_traffic_bytes.

Self-Service via Telegram

Once the Telegram bot is connected, customers check usage (/usage), re-fetch their link (/sub), and see connected devices (/devices) without messaging you.

Pricing Your Service

NexusPanel doesn't set your prices. Factor in your costs (VPS, nodes, your NexusPanel license), your differentiation (device slots, node locations, support), and your market. Collect payment however suits you, including a storefront that calls the Users API to provision accounts automatically.

نودها

نود چیست

به زبان ساده
یک نود فقط سرور دیگری در کشوری دیگر است که پنل شما آن را کنترل می‌کند. یکی در آلمان اضافه کنید و مشتری‌هایتان می‌توانند «از طریق آلمان» متصل شوند. همه آن‌ها را از همان داشبورد مدیریت می‌کنید. برای شروع به هیچ نودی نیاز ندارید — سرور اولتان به‌تنهایی به مشتری‌ها سرویس می‌دهد.

یک نود، سرور راه دوری است که هسته Xray را اجرا می‌کند و به نمونه NexusPanel شما متصل می‌شود. نودها به شما امکان می‌دهند اندپوینت‌های پروکسی را در چندین سرور و موقعیت جغرافیایی توزیع کنید، در حالی که همه‌چیز را از یک داشبورد واحد مدیریت می‌کنید.

پنل از طریق یک اتصال امن gRPC با استفاده از TLS متقابل با نودها ارتباط برقرار می‌کند. پیکربندی‌های کاربر و داده‌های ترافیک از طریق این کانال جریان می‌یابند.

نصب نود

داشبورد ← نودهاافزودن نود جدید پنجره‌ای با دو تب باز می‌کند — بسته به اینکه پنل به سرور نود دسترسی SSH دارد یا نه، یکی را انتخاب کنید.

Auto install (پیشنهادی)

IP یک VPS تازه و اطلاعات ورود SSH (رمز root یا کلید خصوصی) را وارد کنید — پنل بقیه کار را انجام می‌دهد: از طریق SSH وصل می‌شود، Docker و ایجنت نود را همراه با گواهی mTLS جاسازی‌شده نصب می‌کند، نود را ثبت می‌کند و منتظر اتصال می‌ماند. هیچ دستوری برای کپی یا اجرا نیست — رمز/کلید SSH فقط همان یک‌بار استفاده می‌شود و هرگز ذخیره نمی‌شود.

Manual (روش جایگزین — وقتی پنل نمی‌تواند از طریق SSH به نود برسد)

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

  1. داشبورد ← نودهاافزودن نود جدید ← تب Manual
  2. روی کپی دستور نصب بزنید — دستور شامل گواهی، پورت، پورت API و آدرس پنل است
  3. روی سرور نود بچسبانید و اجرا کنید
  4. IP و پورت‌های نود را در پنل وارد کنید ← افزودن نود
bash — نمونه دستور تولیدشده
curl -sL https://nexuspanel.store/install-node | bash -s -- \
  --port 62060 \
  --api-port 62061 \
  --panel-url 'https://panel.example.com:8443' \
  --cert-b64 '<base64-cert>'

نصب‌کننده به‌صورت خودکار منتظر قفل‌های apt/dpkg می‌ماند — اجرا روی یک VPS تازه‌راه‌اندازی‌شده بی‌خطر است. --panel-url را حذف نکنید: بدون آن، احراز هویت Hysteria 2 روی آن نود تا تنظیم بعدی غیرفعال می‌ماند.

گواهی و پورت‌ها

NexusNode با استفاده از گواهی امضاکننده پنل، نزد پنل احراز هویت می‌کند:

  • پورت اتصال پنل: 62060
  • پورت API Xray: 62061
  • CN گواهی: Panel — مقدار ssl_target_name در پیکربندی نود باید با آن مطابقت داشته باشد
  • گواهی یک‌بار از GET /api/v1/node/settings دریافت می‌شود (یا توسط دستور نصب جاسازی می‌شود) و در /var/lib/nexus-panel-node/ssl_client_cert.pem ذخیره می‌شود
فایروال
روی سرور نود، TCP 62060 و TCP 62061 ورودی را به IP پنل باز کنید. همچنین هر پورت پروکسی (۴۴۳، ۸۰ و غیره) را به کاربران نهایی باز کنید.

Docker Compose برای نود

این همان compose‌ای است که نصب‌کننده در /opt/nexus-panel-node/docker-compose.yml می‌سازد — برای مرجع، اگر می‌خواهید آن را دستی تنظیم کنید:

yaml — /opt/nexus-panel-node/docker-compose.yml
services:
  node:
    image: ghcr.io/haitovs/nexus-node:latest
    container_name: nexus-panel-node
    restart: always
    network_mode: host
    environment:
      SERVICE_PORT: 62060
      XRAY_API_PORT: 62061
      SSL_CERT_FILE: /var/lib/nexus-panel-node/ssl_cert.pem
      SSL_KEY_FILE: /var/lib/nexus-panel-node/ssl_key.pem
      SSL_CLIENT_CERT_FILE: /var/lib/nexus-panel-node/ssl_client_cert.pem
      # Hysteria2 سایدکار — خالی یعنی غیرفعال، تا زمانی که --panel-url داده شود
      PANEL_HY2_AUTH_URL: "https://panel.example.com:8443/api/v1/hy2-auth"
    volumes:
      - /var/lib/nexus-panel-node:/var/lib/nexus-panel-node
      - /etc/hysteria:/etc/hysteria

network_mode: host یعنی هیچ بخش ports: در Docker وجود ندارد — نود همه پورت‌ها (سرویس، API و هر inbound از Xray/Hysteria که کاربران به آن وصل می‌شوند) را مستقیماً روی هاست باز می‌کند.

چند نود

برای افزودن نود در موقعیت‌های مختلف:

  1. سرویس نود را روی هر سرور با استفاده از دستور تک‌خطی تولیدشده نصب کنید
  2. در پنل، هر نود را با IP عمومی و پورت‌هایش اضافه کنید
  3. یک پرچم کشور تخصیص دهید — هم شبکه بصری و هم تغییر ترتیب منطقه‌ای اشتراک را هدایت می‌کند
  4. برای تعیین ترتیب نمایش در شبکه، بکشید و رها کنید
  5. یک ضریب مصرف به‌ازای هر نود تنظیم کنید (مثلاً 1.5 یعنی ترافیک ۱٫۵ برابر حساب می‌شود)
تغییر ترتیب منطقه‌ای اشتراک
لینک‌های اشتراک به‌صورت خودکار بر اساس کشور مشترک مرتب می‌شوند: ابتدا نزدیک‌ترین نود، سپس همان قاره، بعد بقیه. از طریق CF-IPCountry (Cloudflare) یا پایگاه داده محلی MaxMind تشخیص داده می‌شود. برای فعال‌سازی، country_code را روی هر ردیف هاست تنظیم کنید.

عیب‌یابی نود

مشکلراه‌حل
نود «آفلاین» نشان می‌دهدبررسی کنید فایروال اجازه TCP 62060 از پنل را می‌دهد؛ گواهی را در /var/lib/nexus-panel-node/ssl_client_cert.pem راستی‌آزمایی کنید
اتصال رد شد (Connection refused)اطمینان حاصل کنید کانتینر Docker در حال اجراست: docker compose ps
خطای گواهیگواهی را دوباره از پنل کپی کنید (GET /api/v1/node/settingsssl_target_name = Panel را راستی‌آزمایی کنید
تأخیر بالامسیر شبکه بین پنل و نود را بررسی کنید؛ اطمینان حاصل کنید کنترل ازدحام BBR و بافرهای سوکت ۶۴ مگابایتی تنظیم شده‌اند
کاربران نمی‌توانند از طریق نود متصل شوندراستی‌آزمایی کنید پورت‌های پروکسی (۴۴۳، ۸۰ و غیره) روی فایروال نود به کاربران نهایی باز هستند

مرجع API

همه اندپوینت‌های API زیر /api/v1/ قرار دارند. با تنظیم DOCS=true و بازدید از /docs، رابط تعاملی Swagger را فعال کنید.

احراز هویت

با ارسال اطلاعات ورود، یک توکن دسترسی JWT دریافت کنید:

POST /api/v1/admin/token
bash
curl -X POST https://panel.example.com:8443/api/v1/admin/token \
  -d "username=admin&password=admin&grant_type=password"

# Response:
# {"access_token": "eyJ...", "token_type": "bearer"}

# Use the token in subsequent requests:
curl -H "Authorization: Bearer eyJ..." https://panel.example.com:8443/api/v1/system

اگر برای ادمین 2FA فعال باشد، کد TOTP را در هدر X-TOTP-Code قرار دهید.

اندپوینت‌های 2FA
POST /api/v1/admin/2fa/setup — تولید راز TOTP + کدهای بازیابی
POST /api/v1/admin/2fa/enable — راستی‌آزمایی کد و فعال‌سازی 2FA
POST /api/v1/admin/2fa/disable — غیرفعال‌سازی 2FA

کاربران

POST /api/v1/user

ساخت یک کاربر جدید با پروتکل‌ها، محدودیت داده، انقضا، محدودیت دستگاه و محدودیت IP.

GET /api/v1/users

فهرست همه کاربران. برای حساب‌های غیر‌sudo به‌صورت خودکار بر اساس ادمین محدوده‌بندی می‌شود.

GET /api/v1/user/{username}

دریافت اطلاعات تفصیلی کاربر شامل آمار مصرف و لینک‌های اشتراک.

PUT /api/v1/user/{username}

به‌روزرسانی فیلدهای کاربر (محدودیت داده، انقضا، وضعیت، پروتکل‌ها و غیره).

DELETE /api/v1/user/{username}

حذف دائمی یک کاربر و همه داده‌های مرتبط.

عملیات گروهی

POST /api/v1/users/bulk/update
POST /api/v1/users/bulk/delete
POST /api/v1/users/bulk/reset

خروجی

GET /api/v1/export/users

دانلود همه کاربران به‌صورت یک فایل CSV.

GET /api/v1/export/subscription-links

خروجی همه لینک‌های اشتراک به‌صورت متن ساده.

ادمین‌ها

POST /api/v1/admin

ساخت یک ادمین جدید با نقش (owner، admin، reseller)، max_users و max_traffic_bytes.

GET /api/v1/admins

فهرست همه حساب‌های ادمین.

نودها

GET /api/v1/inbounds

فهرست همه inboundهای پروتکل.

GET /api/v1/hosts

دریافت پیکربندی‌های هاست (فقط sudo).

تحلیل‌ها

GET /api/v1/analytics/summary

آمار مرور کلی داشبورد.

GET /api/v1/analytics/protocols

تفکیک توزیع پروتکل.

GET /api/v1/analytics/nodes/load

تعداد اتصال و پهنای باند به‌ازای هر نود.

GET /api/v1/analytics/nodes/uptime

درصد آپ‌تایم نود.

GET /api/v1/analytics/users/expiring?days=30

کاربرانی که ظرف تعداد روزهای مشخص‌شده منقضی می‌شوند.

GET /api/v1/analytics/users/top?limit=10

پرمصرف‌ترین کاربران بر اساس مصرف پهنای باند.

نشست‌ها

GET /api/v1/sessions/active?hours=24

نشست‌های فعال دستگاه در N ساعت گذشته.

GET /api/v1/sessions/user/{username}

نشست‌های یک کاربر مشخص.

DELETE /api/v1/sessions/{session_id}

قطع اجباری یک نشست دستگاه.

سیستم

GET /api/v1/system

آمار سیستم شامل CPU، حافظه و پهنای باند. ادمین‌های غیر‌sudo برای سنجه‌های حساس مقادیر صفر می‌بینند.

GET /api/v1/health

اندپوینت بررسی سلامت که وضعیت پایگاه داده و هسته Xray را برمی‌گرداند.

GET /metrics

اندپوینت سنجه‌های سازگار با Prometheus. به METRICS_ENABLED=true و METRICS_TOKEN برای احراز هویت نیاز دارد.

مستندات کامل API
برای دیدن طرح‌واره‌های کامل درخواست/پاسخ، DOCS=true را در فایل env. خود فعال کنید و برای رابط تعاملی Swagger به http://your-panel/docs بروید.

ربات Telegram

راه‌اندازی

  1. Telegram را باز کنید و به @BotFather پیام دهید
  2. /newbot را بفرستید و برای ساخت ربات‌تان دستورها را دنبال کنید
  3. توکن ربات را کپی کنید (مثلاً 123456789:AAAA...)
  4. شناسه کاربری Telegram خود را بگیرید (به @userinfobot پیام دهید)
  5. به .env خود اضافه کنید:
env
TELEGRAM_API_TOKEN="123456789:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
TELEGRAM_ADMIN_ID="987654321"
TELEGRAM_LOGGER_CHANNEL_ID=-1001234567890

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

دستورهای ربات

دستورتوضیح
/usageبررسی مصرف داده و سهمیه باقی‌مانده
/subدریافت لینک اشتراک و کد QR
/statsآمار پنل (فقط ادمین)
/devicesمشاهده دستگاه‌های متصل
/helpفهرست همه دستورهای موجود
/broadcastارسال پیام به همه کاربران (فقط ادمین)

تنظیمات اعلان

ربات Telegram در صورت پیکربندی، برای رویدادهای گوناگون اعلان می‌فرستد. هر نوع اعلان را به‌صورت جداگانه از طریق متغیرهای .env کنترل کنید (به پیکربندی اعلان‌ها مراجعه کنید).

اعلان‌ها به این مقصدها ارسال می‌شوند:

  • شناسه‌های ادمین — پیام مستقیم به هر ادمین در TELEGRAM_ADMIN_ID
  • کانال لاگر — همه رویدادها به TELEGRAM_LOGGER_CHANNEL_ID

فیلدهای گنجانده‌شده در هشدارهای ساخت / ویرایش

اعلان‌های «کاربر ساخته شد» و «کاربر ویرایش شد» در صورت تنظیم روی کاربر، فیلدهای زیر را در بر می‌گیرند:

فیلدنمایش به‌صورتچه زمانی گنجانده می‌شود
نام کاربریUsername: aliceهمیشه
محدودیت ترافیکTraffic Limit: 50 GBهمیشه (اگر تنظیم نشده باشد «Unlimited» نشان می‌دهد)
تاریخ انقضاExpire Date: 2026-06-01همیشه (اگر تنظیم نشده باشد «Never» نشان می‌دهد)
پروتکل‌هاProxies: vless, trojanهمیشه
بازنشانی محدودیت دادهData Limit Reset Strategy: monthlyهمیشه
محدودیت دستگاهDevice Limit: 3فقط وقتی > ۰
محدودیت IPIP Limit: 5 (limit)فقط وقتی > ۰؛ حالت به‌صورت درون‌خطی نشان داده می‌شود
محدودیت HWIDHWID Limit: 2فقط وقتی > ۰
دارای پلن بعدیHas Next Plan: Trueهمیشه
یادداشتNote: Paid in advance 6moفقط وقتی غیرخالی است؛ در ۱۲۰ کاراکتر بریده می‌شود
یکپارچه‌سازی Discord
DISCORD_WEBHOOK_URL را تنظیم کنید تا همان اعلان‌ها را در یک کانال Discord دریافت کنید. امبدهای Discord همان فیلدهای غنی‌شده را در بر می‌گیرند.

کانال‌های اشتراک

آدرس‌های اشتراک را از طریق زیرساختی تحویل دهید که سانسورچی‌ها نمی‌توانند مسدودش کنند.

وقتی دامنه پنل شما در روسیه، ایران، چین یا ترکمنستان مسدود می‌شود، مشتری‌ها نمی‌توانند به‌روزرسانی‌های اشتراکشان را دریافت کنند. کانال‌های اشتراک این مشکل را با انتشار پیکربندی هر کاربر در یک فایل ثابت روی زیرساخت Google / Cloudflare / GitHub / Telegram حل می‌کنند — نام‌های میزبانی که سانسورچی‌ها نمی‌توانند به‌طور کامل مسدود کنند بدون اینکه اپ‌های پرکاربردی که میلیون‌ها نفر استفاده می‌کنند را از کار بیندازند.

نیاز لایسنس
کانال‌های اشتراک به سطح لایسنس Pro نیاز دارند. داشبورد روی سطوح پایین‌تر یک بنر دیوار پرداخت نشان می‌دهد.

چطور کار می‌کند

  1. یک یا چند کانال را در تنظیمات → کانال‌های اشتراک پیکربندی می‌کنید.
  2. هر کاربر یک URL عمومی پایدار روی آن کانال دریافت می‌کند (مثلاً https://firebasestorage.googleapis.com/…?alt=media&token=…).
  3. آیکون ⊞ (شبکه) روی هر ردیف کاربر در جدول کاربران، یک پاپ‌اور با همه URLهای موجود باز می‌کند — مستقیم، رمزنگاری‌شده Happ و هر کانال پیکربندی‌شده. در دو کلیک کپی کنید یا QR نشان دهید.
  4. وقتی هاست‌ها یا پیکربندی Xray را ویرایش می‌کنید، پنل به‌صورت خودکار همه کاربران فعال را ظرف حدود ۱۰ تا ۳۰ ثانیه از طریق کارگر پس‌زمینه روی Firebase (و کانال‌های دیگر) دوباره منتشر می‌کند. پس از ویرایش‌های معمول پیکربندی، نیازی به Backfill دستی نیست.

کانال‌های موجود

کانالارائه‌دهندهسطح رایگانبهترین برای
Firebase StorageGoogleحدود ۵۰ هزار دریافت در روز در پلن Sparkکانال اصلی ضدسانسور
Firebase HostingGoogleهمان پلن Spark مربوط به Storageیک سطح دوم از Firebase (*.web.app) — با SNI و CDN لبه‌ای متفاوت روی همان پروژه، پس وقتی Storage مسدود شود همچنان در دسترس می‌ماند. انتشار به‌صورت کل‌سایت است نه به‌ازای هر کاربر، پس دسته‌ای منتشر می‌شود نه با هر ویرایش.
Cloudflare R2Cloudflare۱۰ گیگابایت در ماه، بدون هزینه خروجیثانویه؛ ارائه‌دهنده‌ای متفاوت از Firebase
GitHub GistGitHub / Microsoftgistهای عمومی نامحدودfallback ساده؛ بسیار بادوام
GitLab SnippetGitLabاسنیپت‌های عمومی نامحدودحتی در بازه‌های مسدودسازی شدید در ترکمنستان قابل‌دسترس بوده — یک آینه دوم در کنار Firebase برای کاربرانی که به آن دسترسی ندارند
تحویل با TelegramTelegramرایگانتحویل اضطراری وقتی بقیه از کار افتاده‌اند
استخر Nginx-proxyVPSهای شماهزینه VPSکنترل کامل اپراتور روی رله
از سمت پنل آزمایش کنید، نه از لپ‌تاپتان
دکمه آزمایش (آیکون بازخوانی روی هر ردیف کانال) یک بلاب آزمایشی واقعی را آپلود می‌کند و آن را از شبکه خروجی پنل دوباره دریافت می‌کند — نه از مرورگر شما. این مهم است: DNS محلی شما ممکن است خوب باشد در حالی که منطقه مشتری‌هایتان آن URL را مسدود می‌کند. آنچه آزمایش اندازه‌گیری می‌کند این است که آیا سرور پنل می‌تواند به URL برسد یا نه، و همین تعیین می‌کند که آیا به‌روزرسانی اشتراک تحویل داده می‌شود.

Firebase Storage

کانال اول توصیه‌شده. سطح رایگان حدود ۵۰ هزار دریافت اشتراک در روز را پوشش می‌دهد. روی فضای IP گوگل میزبانی می‌شود — سانسورچی‌ها نمی‌توانند به‌طور کامل مسدودش کنند بدون اینکه Google Maps، Gmail و بی‌شمار اپ دیگر را از کار بیندازند.

راه‌اندازی یک‌باره در console.firebase.google.com

  1. ساخت پروژه — افزودن پروژه → نام‌گذاری (مثلاً nexus-subs) → پلن Spark (رایگان) → ساخت.
  2. فعال‌سازی Storage — Build → Storage → «Get started» → «Start in production mode» → انتخاب موقعیت → پایان.
  3. تنظیم قوانین storage — Storage → Rules → جایگزین کنید با:
firebase rules
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /sub_{file=**} {
      allow read: if true;
      allow write: if false;
    }
  }
}
  1. تولید کلید حساب سرویس — Project Settings (⚙) → Service accounts → «Generate new private key» → دانلود. مانند یک رمز با آن رفتار کنید.
  2. یافتن نام bucket — Storage → بالای صفحه gs://your-project.firebasestorage.app را نشان می‌دهد. بخش بعد از gs:// را کپی کنید.

در پنل

  1. تنظیمات → کانال‌های اشتراک → Firebase Storage → ⚙
  2. نام bucket و JSON حساب سرویس (کل محتوای فایل) را وارد کنید
  3. Enabled را روشن کنید، Priority را تنظیم کنید (کمتر = ارجح؛ 10 شروع خوبی است)
  4. ذخیره → روی آزمایش بزنید (آیکون بازخوانی)

خواندن نتیجه آزمایش

یک آزمایش موفق چنین به نظر می‌رسد:

result
firebase: end-to-end OK in 1840ms
✓ creds   (180ms): bucket reachable
✓ upload  (650ms): published to https://firebasestorage.googleapis.com/…
✓ fetch   (820ms): GET 200 (87 bytes, attempt 1)
✓ match     (1ms): content matches
✓ cleanup (180ms): test blob deleted
مرحله ناموفقعلت محتملرفع
credsJSON حساب سرویس اشتباه یا منقضیکلید را در کنسول Firebase دوباره تولید کنید
uploadStorage فعال نیست یا قوانین اشتباه استمراحل راه‌اندازی ۲ تا ۳ را دوباره بررسی کنید
fetchقانون خواندن عمومی اعمال نشدهقوانین مرحله ۳ را دوباره وارد کنید
matchکش edge بلاب کهنه سرو کرد (نادر)معمولاً تلاش‌های مجدد این را پنهان می‌کنند؛ اگر پایدار بود گزارش باگ بدهید
cleanupحساب سرویس فقط‌خواندنی استبلاب‌های nexus_test_* را به‌صورت دستی حذف کنید

اعمال روی کاربران موجود

پس از موفقیت آزمایش، روی Backfill در پایین کارت کانال‌های اشتراک بزنید. این بلافاصله آپلودهای Firebase را برای همه کاربران فعال از طریق کارگر پس‌زمینه پخش می‌کند. برای ۲۰۰ کاربر، ۳۰ تا ۱۲۰ ثانیه برای تکمیل انتظار داشته باشید.

URLهای پایدار در میان تغییر پلن‌ها
URL مربوط به Firebase برای یک کاربر مشخص هرگز تغییر نمی‌کند — فقط محتوای بلاب بازنویسی می‌شود. مشتری‌ها یک‌بار URL را در کلاینت VPN خود وارد می‌کنند و در هر تغییر پلن، بدون هیچ اقدامی از سوی آن‌ها، به‌صورت خودکار به‌روز می‌شود.

Cloudflare R2

فضای ذخیره‌سازی شیء سازگار با S3 بدون هزینه خروجی. به‌عنوان یک کانال ثانویه در کنار Firebase استفاده کنید — ارائه‌دهنده متفاوت یعنی یک مسدودسازی منطقه‌ای روی یکی، هر دو را از کار نمی‌اندازد.

راه‌اندازی در dash.cloudflare.com

  1. R2 (نوار کناری چپ) → Create bucket → نام‌گذاری (مثلاً nexus-subs).
  2. باز کردن bucket → Settings → Public access → فعال‌سازی. URL https://pub-<id>.r2.dev را کپی کنید.
  3. بالا‌سمت‌راست صفحه R2 → Manage R2 API tokens → Create token → Object Read & Write (محدود به bucket خود) → ذخیره Access Key ID + Secret.
  4. Account ID شما همان hex ۳۲ کاراکتری در پایین‌سمت‌راست صفحه داشبورد R2 است.

در پنل

تنظیمات → کانال‌های اشتراک → Cloudflare R2 → ⚙:

فیلدمحل یافتن آن
Cloudflare account IDhex ۳۲ کاراکتری از مرحله ۴
نام bucketمثلاً nexus-subs
Access key IDاز مرحله ۳
Secret access keyاز مرحله ۳ (یک‌بار نشان داده می‌شود)
Public URL basehttps://pub-<id>.r2.dev از مرحله ۲
دامنه سفارشی را به R2 وصل نکنید
دامنه‌های سفارشی در لایه DNS مسدود می‌شوند. نام میزبان مشترک pub-<id>.r2.dev از همان اهرم ضدمسدودسازی Firebase بهره می‌برد — با هزاران bucket دیگر R2 به اشتراک گذاشته شده است.

GitHub Gist

رایگان، میزبانی‌شده روی GitHub (IPهای Microsoft). بسیار بادوام — یک fallback کم‌اولویت خوب که هیچ هزینه‌ای ندارد.

راه‌اندازی

  1. github.com/settings/tokens → Personal access tokens → Tokens (classic) → Generate new token.
  2. نام: nexus-gists. دامنه: فقط gist را علامت بزنید. انقضا: ۱ سال (یک تمدید را در تقویم بگذارید).
  3. توکن ghp_… را کپی کنید — دیگر نمی‌توانید آن را ببینید.

در پنل

تنظیمات → کانال‌های اشتراک → GitHub Gist → ⚙ → PAT را وارد کنید → ذخیره → آزمایش.

تحویل با Telegram

در ایران/روسیه/ترکمنستان دقیقاً در همان بازه‌هایی در دسترس است که کانال‌های دیگر نیستند. این کانال «پنل آتش گرفته و کاربر چیز دیگری ندارد» است.

این تحویل است، نه به‌روزرسانی خودکار
کاربر یک دیپ‌لینک t.me/<bot>?start=sub_<token> دریافت می‌کند، نه یک URL خودبه‌روزرسان. یک‌بار روی آن می‌زند، ربات یک فایل .txt با پیکربندی او را به‌صورت پیام خصوصی می‌فرستد. تنها در صورتی Priority را خیلی بالا بگذارید (عدد اولویت پایین) که هندلر /start ربات را سیم‌کشی کرده باشید — وگرنه به رباتی می‌رود که پاسخ نمی‌دهد.

راه‌اندازی — ربات اختصاصی (توصیه‌شده)

  1. در Telegram به @BotFather پیام دهید → /newbot → یک نام و نام‌کاربری انتخاب کنید (باید به bot ختم شود).
  2. توکنی که BotFather به شما می‌دهد را کپی کنید.
  3. تنظیمات → کانال‌های اشتراک → Telegram → ⚙:
    • نام‌کاربری ربات: بدون @
    • توکن ربات: از BotFather وارد کنید
  4. ذخیره → آزمایش. آزمایش getMe را فراخوانی می‌کند و مطمئن می‌شود نام‌کاربری بازگشتی با آنچه وارد کرده‌اید مطابقت دارد.

اگر از قبل یک TELEGRAM_API_TOKEN در .env برای تحویل اعلان‌ها تنظیم کرده‌اید، می‌توانید فیلد توکن ربات را خالی بگذارید — کانال به آن متغیر محیطی برمی‌گردد. از نظر امنیتی توصیه نمی‌شود: نشت توکن ربات اعلان‌ها، فایل‌های اشتراک را هم در معرض دید قرار می‌دهد.

استخر Nginx-Proxy

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

پیش‌آماده‌سازی

VPSهای ارزان بالا بیاورید (Hetzner CCX13 / Contabo و غیره — هرکدام ۴ تا ۵ یورو در ماه). روی هرکدام:

bash
# Run as root on each fresh proxy host
curl -sSL https://your-panel.tld/setup_proxy.sh | bash

در پنل

تنظیمات → کانال‌های اشتراک → Nginx-proxy → ⚙. پیکربندی به‌صورت JSON است:

json
{
  "hosts": [
    { "host": "alpha.shop",  "subscription_path": "sub", "weight": 1 },
    { "host": "beta.shop",   "subscription_path": "sub", "weight": 1 },
    { "host": "gamma.shop",  "subscription_path": "sub", "weight": 5 }
  ]
}

هاست با weight: 5 پنج برابر سهم کاربر هاست weight: 1 را دریافت می‌کند. ذخیره → آزمایش، دست‌دهی TLS را برای هر عضو استخر راستی‌آزمایی می‌کند.

کانال‌های اشتراک — رابط داشبورد

پاپ‌اور اشتراک (به‌ازای هر کاربر)

هر ردیف در جدول کاربران یک آیکون ⊞ (شبکه) دارد. کلیک روی آن یک پاپ‌اور باز می‌کند که هر URLی را که اپراتور می‌تواند به مشتری بدهد فهرست می‌کند:

ردیفچیستکپی + QR
مستقیمURL ساده /sub/<token> که توسط پنل سرو می‌شودفقط کپی
Happ (رمزنگاری‌شده)فرم رمزنگاری‌شده AES-256-CBC از طریق /user/<u>/encrypt-subفقط کپی
Firebase / R2 / GistURLهای ذخیره‌سازی ثابت از کانال‌های فعالکپی + QR
Telegramدیپ‌لینک به تحویل رباتفقط کپی
Nginx-proxyURL رلهفقط کپی

URLها هنگام باز شدن پاپ‌اور از پیش دریافت می‌شوند تا کپی ایمن از نظر ژست باشد — بدون تأخیر ناهمگام بین کلیک و نوشتن در کلیپ‌بورد.

نشان‌های سلامت کانال

هر ردیف کانال در تنظیمات → کانال‌های اشتراک، یک نشان سلامت از آخرین بررسی نشان می‌دهد. کرون هر ۱۵ دقیقه اجرا می‌شود. هر زمان با دکمه آزمایش یک بررسی تازه را اجبار کنید.

انتشار خودکار مجدد هنگام تغییر پیکربندی

ویرایش هاست‌ها یا پیکربندی هسته Xray یک پخش خودکار راه می‌اندازد: همه کاربران فعالی که محتوای اشتراکشان تغییر کرده، ظرف حدود ۱۰ تا ۳۰ ثانیه روی هر کانال پیکربندی‌شده دوباره منتشر می‌شوند. کارگر کاربرانی که پیکربندی رندرشده‌شان تغییر نکرده را رد می‌کند (مدارگیری کوتاه با هش محتوا)، بنابراین ویرایش هاستی که فقط روی ۵۰ نفر از ۲۰۰ کاربر اثر می‌گذارد فقط ۵۰ نوشتن در Firebase ایجاد می‌کند.

Backfill

دکمه Backfill (در پایین کارت کانال‌های اشتراک) بلافاصله همه کاربران فعال را روی همه کانال‌های فعال آپلود می‌کند. یک‌بار پس از افزودن یک کانال جدید از آن استفاده کنید — پس از آن، انتشار خودکار مجدد همه‌چیز را به‌روز نگه می‌دارد.

Hysteria2

Hysteria2 یک پروتکل مبتنی بر QUIC/UDP است که روی شبکه‌های آخرین‌مایل پرافت‌وخیز (موبایل، 4G کشورهای CIS، ایران) ۳ تا ۵ برابر توان عبوری TCP را ارائه می‌دهد. به‌صورت یک دیمن جداگانه در کنار Xray اجرا می‌شود — نه به‌عنوان یک inbound در Xray — چون Xray-core به‌صورت بومی از پروتکل hysteria2 پشتیبانی نمی‌کند.

سطح لایسنس لازم: استاندارد و بالاتر. سطح آزمایشی می‌تواند ورودی‌های اشتراک hy2 را ببیند اما نمی‌تواند inbound بسازد یا مدیریت کند.

فایروال UDP لازم است
Hysteria2 از UDP استفاده می‌کند. پیش از افزودن یک هاست برای یک نود، اطمینان حاصل کنید که پورت UDP (مثلاً 2053) در پنل کنترل ارائه‌دهنده میزبانی شما باز است — Contabo، Aeza و PTR همگی به‌صورت پیش‌فرض UDP را محدود می‌کنند.

افزودن یک Inbound برای Hysteria2

داشبورد → تنظیماتHysteria2افزودن Inbound

ادمین sudo لازم است
inboundهای Hysteria2 فقط توسط یک ادمین sudo (سوپر) قابل ساخت و مدیریت هستند. ادمین‌های غیر‌sudo نمی‌توانند inboundهای hy2 را ببینند یا ویرایش کنند.
فیلدمقداریادداشت‌ها
Taghy2-mainهر نام یکتا
Listen port2053UDP — باید در فایروال باز باشد
Obfs typesalamanderتوصیه‌شده — UDP را از DPI در چین/ایران/روسیه پنهان می‌کند
Obfs passwordتصادفی قویopenssl rand -hex 24
Masquerade URLhttps://www.bing.comسایت HTTPS که hysteria برای بررسی‌های DPI خود را شبیه آن جلوه می‌دهد
SNIbing.comTLS SNI ارائه‌شده به کلاینت‌ها
TLS cert / keyبرای خودکار خالی بگذاریددر صورت حذف، پنل به‌صورت خودکار یک گواهی خودامضای ۱۰ ساله تولید می‌کند

ساخت inbound پیکربندی را با هر نود متصل همگام می‌کند و دیمن hysteria را روی هرکدام بالا می‌آورد. به SSH نیازی نیست.

افزودن هاست به‌ازای هر نود

داشبورد → هاست‌ها → روی کارت inbound مربوط به Hysteria2 بزنید → افزودن هاست

برای هر نودی که می‌خواهید hy2 را روی آن در دسترس قرار دهید، یک ردیف هاست اضافه کنید:

فیلدمثالالزامی
RemarkDE Frankfurt hy2بله
Addressde.example.comبله — دامنه یا IP عمومی نود
Port2053بله — پورت UDP روی آن نود
Country codeDEتوصیه‌شده — تغییر ترتیب منطقه‌ای اشتراک را هدایت می‌کند

رندرکننده‌های اشتراک به‌صورت خودکار ورودی‌های hy2:// را برای هر هاست فعال در کنار لینک‌های موجود VLESS/VMess قرار می‌دهند. کلاینت‌ها آن را در بازخوانی بعدی اشتراک می‌بینند.

از طریق API (نیازمند اطلاعات ورود ادمین sudo):

bash
# 1. Get a token using your superadmin username and password
TOKEN=$(curl -s -X POST /api/v1/admin/token \
  -d "username=YOUR_ADMIN&password=YOUR_PASSWORD" \
  | jq -r .access_token)

# 2. List hy2 inbounds
curl /api/v1/hy2-inbounds -H "Authorization: Bearer $TOKEN"

# 3. Add a host to inbound id=1
curl -X POST /api/v1/hy2-inbounds/1/hosts \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"remark":"DE Frankfurt","address":"de.example.com","port":2053,"country_code":"DE"}'

بررسی و عیب‌یابی

پس از افزودن یک هاست، یک URL اشتراک دریافت کنید — باید یک ورودی hy2:// در کنار لینک‌های VLESS ببینید. در Nekobox، sing-box یا Happ وارد کنید و متصل شوید.

مشکلتشخیص
بدون hy2:// در اشتراکبررسی کنید هاست فعال است و country_code تنظیم شده؛ راستی‌آزمایی کنید سطح لایسنس استاندارد به بالاست
اتصال UDP رد شدآزمایش: nc -vu <node> 2053 از بیرون مرکز داده. پورت در فایروال ارائه‌دهنده باز نیست.
تایم‌اوت UDPISP یا میدل‌باکس UDP را می‌خورد — obfs salamander یا پورت دیگری را امتحان کنید
خطای TLSگواهی خودامضا: اطمینان حاصل کنید کلاینت allowinsecure: true دارد یا اثرانگشت گواهی را تأمین کنید
دیمن روی نود راه نمی‌افتدdocker logs nexus-node 2>&1 | grep hysteria روی سرور نود

سرور میانی (رله NAT)

یک سرور میانی، یک VPS ارزان است که بین کاربران شما و نودهایتان قرار می‌گیرد. ترافیک را از طریق iptables DNAT رله می‌کند، بنابراین کاربران صرف‌نظر از اینکه کدام نود آن‌ها را سرویس می‌دهد، به یک IP پایدار متصل می‌شوند. زمانی مفید است که IP یک نود در کشوری مسدود شود — نود را تعویض کنید، NAT را روی سرور میانی دوباره تولید کنید، یک ورودی هاست را به‌روزرسانی کنید.

قراردادهای پورت
inboundهای TCP: پورت میانی ۵۰۰۳۱ تا ۵۰۰۳۶ ← پورت نود ۳۱ تا ۳۶ (با شناسه نود مطابقت دارد). inboundهای UDP مربوط به Hysteria2: پورت‌های ۵۰۰۴۱ به بالا به‌ازای هر inbound اختصاص می‌یابند. همه از وضعیت پایگاه داده پنل به‌صورت خودکار تولید می‌شوند — هرگز این‌ها را دستی ویرایش نمی‌کنید.

راه‌اندازی اولیه

یک دستور نصب یک‌باره از پنل تولید کنید، سپس آن را روی VPS تازه به‌عنوان root بچسبانید:

  1. در پنل، به تنظیمات ← سرورهای میانی بروید و روی تولید دستور نصب بزنید.
  2. دستور نشان‌داده‌شده را کپی کنید — چیزی شبیه این است:
bash
curl -fsSLk https://panel.example.com:8443/api/v1/middle-server/i/<token> | sudo bash

توکن یک‌بارمصرف است و ظرف ۳۰ دقیقه منقضی می‌شود. هیچ اطلاعات ورودی در تاریخچه شل ظاهر نمی‌شود.

نصب دستی / اسکریپتی (بدون دسترسی به رابط پنل)
bash
read -p "Panel URL: " _P
read -p "Admin username: " _U
read -sp "Admin password: " _W; echo
curl -fsSL -k -u "$_U:$_W" "$_P/api/v1/middle-server/bootstrap.sh" | sudo bash
unset _P _U _W

اسکریپت از فهرست نودها + inboundهای Hysteria 2 کنونی شما تولید می‌شود، بنابراین هر زمان یکی از این‌ها را اضافه یا حذف کردید، آن را دوباره اجرا کنید.

اسکریپت کارهای زیر را انجام می‌دهد:

  • نصب iptables-persistent
  • اعمال تنظیم هسته (BBR، بافرهای بزرگ، conntrack)
  • ساخت همه قوانین DNAT از وضعیت کنونی پایگاه داده پنل
  • چاپ جدولی از ورودی‌های هاست برای افزودن در پنل

پس از تکمیل اسکریپت، به صفحه هاست‌ها بروید و به‌ازای هر ردیفی که اسکریپت چاپ کرده، یک ورودی هاست با استفاده از IP سرور میانی و پورت چاپ‌شده اضافه کنید.

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

تعویض به یک سرور میانی جدید

وقتی سرور میانی کنونی مسدود شد یا می‌خواهید به VPS دیگری بروید:

  1. با SSH به VPS جدید وارد شوید و همان دستور واحد بالا را اجرا کنید
  2. در پنل ← صفحه هاست‌ها، هر هاستی که آدرسش به IP سرور میانی قدیمی اشاره می‌کند را ویرایش و آن را به IP جدید تغییر دهید. پورت‌ها ثابت می‌مانند.
  3. تمام — بدون تغییر نود، بدون نیاز به پیکربندی مجدد کاربر
هاست‌های Hysteria2 را فراموش نکنید
اگر هاست‌های Hysteria2 دارید که از طریق سرور میانی مسیریابی می‌شوند، آن آدرس‌ها را هم به‌روزرسانی کنید.
TODO — هنوز به فارسی ترجمه نشده
این بخش («فرانتینگ و ضد فیلترینگ») هنوز ترجمه نشده است. نسخه انگلیسی در ادامه آمده تا چیزی از قلم نیفتد.

Fronting & Censorship Resistance

Fronting makes your customers' traffic look like it's going to Cloudflare, Amazon, Google, Fastly, or Bunny — not to your VPS. NexusPanel's IP-Defender (Dashboard → Defender) watches every fronted host and swaps a blocked one for a healthy one, automatically or with one click. The Defender page is a pipeline: Start here (Overview) → Pipeline (Sources → IP Pool → Hosts) → Infrastructure (Shield status board + Setup for credentials). Provider pages live under Shield.

The IP-Defender

It continuously probes each host: HealthySuspect (a sustained run of failed probes, not just one) → Blocked (auto-swap to a healthy address of the same kind) → Cooldown (the old address rests before reuse). Cloudflare, AWS, and Google swap in seconds; Fastly and Bunny don't fast-rotate — re-create the CDN with new edge IPs instead.

Cloudflare

Add a credential under Defender → Setup (provider cloudflare). To front VPN traffic, add a host under Defender → Hosts pointed at your Cloudflare-proxied domain. The separate Shield → Cloudflare card manages the subscription-delivery domain, not VPN fronting.

AWS CloudFront

Create an IAM user with CloudFront + Route 53 permissions, add the access key under Setup (provider aws), then use Defender → Shield → AWS CloudFront to provision a distribution.

Google (Cloud Run)

Create a service account with Cloud Run + DNS permissions, add its JSON key under Setup (provider google), then use Defender → Shield → Google Cloud Run.

Fastly

One-click, like Cloudflare/AWS/Google. Create an API token with global scope, add it under Setup (provider fastly), then Defender → Shield → Fastly → paste your edge IPs and click Create CDN. No fast rotation — re-create with new edge IPs if blocked.

Bunny CDN

Different model: you create the pull zone on bunny.net yourself (Standard tier, WebSockets on, one per-node Edge Rule pointing Host == bunny-<node>.<domain> at http://<node-ip>:2009), add a bunny credential under Setup, then Defender → Shield → Bunny CDN → click Auto-wire per node to adopt it. No fast rotation, same as Fastly.

Azure

Not a CDN front — a rotatable relay VM (like a Middle Server). Create a Service Principal, connect it directly on Defender → Shield → Azure (its own credential form, not through Setup), pick a region, click Create relay, then install the middle agent on the returned IP. Rotate IP swaps it later if blocked.

مهاجرت از Marzban

به زبان ساده
همین حالا Marzban دارید؟ این کار همه‌چیز را با یک دستور به NexusPanel منتقل می‌کند — مشتری‌هایتان، تنظیماتتان و حتی لینک‌های موجودشان. مشتری‌های شما هیچ کاری نمی‌کنند و هیچ چیزی متوجه نمی‌شوند. این ابزار ابتدا هر تغییر را پیش‌نمایش می‌دهد و تا آخرین مرحله قابل بازگشت است، پس امتحانش بی‌خطر است.

ابزار nexus cli migrate یک نصب زنده Marzban را با صفر پیکربندی مجدد کاربر نهایی به NexusPanel منتقل می‌کند. روی همان میزبان Nexus اجرا می‌شود، پوشه داده Marzban را مستقیماً می‌خواند و از یک ماشین حالت اتمیک ۹ مرحله‌ای با بازگشت کامل تا دستور finalize استفاده می‌کند.

سازگاری JWT
ابزار مهاجرت JWT_SECRET_KEY مربوط به Marzban را استخراج می‌کند و آن را به‌عنوان MARZBAN_LEGACY_JWT_SECRET در env. مربوط به Nexus ذخیره می‌کند. هر آدرس اشتراک موجود Marzban از روز اول همچنان کار می‌کند — کاربران هرگز چیزی را دوباره وارد نمی‌کنند.

پیش‌نیازها

  • نسخه Marzban بین ۰٫۶٫۰ تا ۰٫۸٫۴ (اسکریپت نصب رسمی، marzban یا marzban_cli)
  • NexusPanel روی همان میزبان نصب شده باشد، یا بتواند /var/lib/marzban/ را بخواند
  • فضای دیسک آزاد برای یک اسنپ‌شات از پایگاه داده SQLite مربوط به Marzban

مرحله ۱: اجرای آزمایشی

همیشه اول اجرای آزمایشی کنید. این کار از پایگاه داده Marzban اسنپ‌شات می‌گیرد، هر وارد کردن را روی یک کپی موقت بازپخش می‌کند و در عرض چند ثانیه تمام می‌شود. هیچ چیزی روی Nexus یا Marzban نوشته نمی‌شود.

bash
# Inspect what was found
nexus cli migrate discover

# Rehearse: snapshot + import + verify on scratch DB, no side effects
nexus cli migrate run --dry-run

گزارش اجرای آزمایشی را در /var/lib/nexus/migration/dryrun-<ts>.json بخوانید. تعداد کاربران، فهرست ادمین‌ها و استخراج‌شدن MARZBAN_LEGACY_JWT_SECRET را تأیید کنید. پیش از ادامه، هر خطای علامت‌گذاری‌شده را رفع کنید.

مرحله ۲: جابجایی زنده

bash
# Live run — stops Marzban, imports, restarts Nexus
nexus cli migrate run --yes

مسیر بحرانی (MARZBAN_STOP → NEXUS_RESTART) حدود ۱۵ تا ۳۰ ثانیه طول می‌کشد. ترافیک VPN نودها بدون وقفه ادامه می‌یابد — نودها مستقل از پنل اجرا می‌شوند. فقط اندپوینت آدرس اشتراک به‌طور کوتاه در دسترس نیست.

اگر VERIFY ناموفق باشد، بازگشت خودکار فعال می‌شود: پیکربندی‌های Nexus بازیابی و Marzban دوباره راه‌اندازی می‌شود. برای علت ریشه‌ای docker logs nexus-panel --tail 200 را بررسی کنید، سپس دوباره اجرا کنید.

bash
# After watching prod for a few hours:
nexus cli migrate finalize    # frees snapshot, closes the run

# If you need to undo (pre-finalize only):
nexus cli migrate rollback

چه چیزهایی منتقل می‌شود

دادهمنتقل می‌شودیادداشت‌ها
کاربران (نام کاربری، داده، انقضا)بلههمه پروفایل‌ها، سهمیه‌ها و UUIDها حفظ می‌شوند
پروکسی‌ها / پروتکل‌های کاربربلهVMess، VLESS، Trojan، Shadowsocks
حساب‌های ادمینبلهرمزها منتقل می‌شوند
هاست‌ها (اندپوینت‌های پروکسی)بلههمه ردیف‌های هاست کپی می‌شوند، فیلدهای مخصوص Nexus به‌صورت پیش‌فرض خاموش‌اند
inboundهای Xrayبلهاز xray_config.json مربوط به Marzban کپی می‌شوند
توکن ربات Telegram، پرچم‌های NOTIFY_*بلهدر .env مربوط به Nexus نوشته می‌شوند
راز JWT (سازگاری آدرس اشتراک)بلهبه‌عنوان MARZBAN_LEGACY_JWT_SECRET ذخیره می‌شود — آدرس‌های اشتراک موجود همچنان کار می‌کنند
تاریخچه یادآوری اعلان‌هابلهاز شلیک مجدد هشدارهای «۳ روز تا انقضا» جلوگیری می‌کند
پیکربندی‌های نودخیرNexus از پورت‌های 62060/62061 استفاده می‌کند؛ نودها را از طریق داشبورد با گواهی تازه دوباره اضافه کنید
routing/dns/outbounds مربوط به Xrayخیرفقط inboundها؛ پس از مهاجرت، بلوک‌های سفارشی را در تنظیمات → ویرایشگر هسته وارد کنید
هاست‌های Hysteria2خیرMarzban hy2 ندارد — پس از مهاجرت از طریق داشبورد → هاست‌ها اضافه کنید

چک‌لیست پس از مهاجرت

پس از تکمیل nexus cli migrate run --yes، CLI جدولی از هاست‌های منتقل‌شده چاپ می‌کند. آن‌ها را راستی‌آزمایی کنید و سپس:

  1. یک آدرس اشتراک قدیمی Marzban را آزمایش کنید — باید یک پیکربندی معتبر برگرداند (بررسی سازگاری JWT)
  2. تعداد کاربران را بررسی کنید: docker exec nexus-panel sqlite3 /var/lib/panel/db.sqlite3 'SELECT COUNT(*) FROM users;'
  3. nexus cli migrate post-cutover را اجرا کنید تا دیمن‌های کهنه Marzban (marzguard، هوک‌های کرون certbot) اسکن شوند
  4. اگر از Hysteria2 استفاده می‌کنید: یک inbound + یک هاست به‌ازای هر نود اضافه کنید (به بخش Hysteria2 مراجعه کنید)
  5. نودها را از طریق داشبورد → نودها دوباره اضافه کنید (گواهی جدید، پورت‌های 62060/62061)
  6. پس از پایدار شدن، nexus cli migrate finalize را اجرا کنید تا اسنپ‌شات آزاد شود
bash — quick verify
# Health
curl -sk https://<your-domain>/api/v1/health

# Legacy sub URL must return 200 with config content
curl -sk "https://<your-domain>/sub/<marzban-token>" | head -c 200

# Scan for Marzban leftovers
nexus cli migrate post-cutover

مهاجرت از Remnawave

به زبان ساده
همین حالا Remnawave دارید؟ درست مثل Marzban، یک دستور کاربران، محدودیت‌های ترافیک، انقضا و اعتبارنامه‌های هر پروتکل را به NexusPanel منتقل می‌کند — و لینک اشتراک موجود هر مشتری همچنان کار می‌کند.

ابزار nexus cli migrate remnawave برخلاف مهاجرت از Marzban، مستقیم به پایگاه داده دست نمی‌زند — از طریق REST API پنل Remnawave متصل می‌شود، پس فقط به آدرس پنل و یک نام‌کاربری/رمز ادمین نیاز دارید:

bash
# Dry run (default) — connects, extracts, reports what would be imported, writes nothing
nexus cli migrate remnawave run --url https://your-remnawave-panel --username ADMIN --password ...

# Apply it for real
nexus cli migrate remnawave run --url https://your-remnawave-panel --username ADMIN --password ... --run

بدون پرچم --run، دستور فقط یک اجرای آزمایشی است: به پنل Remnawave متصل می‌شود، داده را استخراج می‌کند و دقیقاً گزارش می‌دهد چه چیزی وارد خواهد شد — همراه با هر برخورد نام‌کاربری — بدون نوشتن هیچ چیزی. --run آن را واقعاً اعمال می‌کند.

  • --yes — فقط وقتی لازم است که یک نام‌کاربری از قبل در NexusPanel وجود داشته باشد؛ بدون آن، اجرای زنده به‌جای رونویسی روی آن، امتناع می‌کند.
  • --insecure — اعتبارسنجی TLS را رد می‌کند (برای گواهی خودامضای Remnawave).
  • --page-size — صفحه‌بندی API را تنظیم می‌کند (پیش‌فرض ۲۵۰).

برای بازگشت: nexus cli migrate remnawave rollback دقیقاً همان کاربران و نام‌مستعارهایی را که این اجرا ساخته حذف می‌کند و داده‌های از‌پیش‌موجود را دست‌نخورده می‌گذارد.

چه چیزی منتقل می‌شود

کاربران، محدودیت‌های ترافیک، ترافیک مصرف‌شده، انقضا، وضعیت و اعتبارنامه‌های هر پروتکل (UUID مربوط به VLESS، رمز Trojan، رمز Shadowsocks). لینک‌های اشتراک Remnawave از یک شناسه کوتاه مبهم استفاده می‌کنند؛ NexusPanel همان شناسه را ذخیره می‌کند تا لینک قدیمی /sub/ همچنان پاسخ دهد و مشتری‌ها هرگز کلاینتشان را دوباره پیکربندی نکنند.

شناسه Telegram کاربر منتقل نمی‌شود (چنین فیلدی روی کاربر NexusPanel وجود ندارد — به‌صورت هشدار گزارش می‌شود)، و هاست‌ها/نودها هم منتقل نمی‌شوند — شما inboundهای خودِ NexusPanel را وصل می‌کنید و اعتبارنامه‌های مهاجرت‌شده روی همان‌ها کار می‌کنند.

امنیت

احراز هویت دو‌مرحله‌ای (2FA)

NexusPanel از 2FA مبتنی بر TOTP پشتیبانی می‌کند (سازگار با Google Authenticator، Authy و غیره):

  1. در داشبورد به تنظیمات بروید
  2. روی فعال‌سازی 2FA بزنید
  3. کد QR را با اپ احرازکننده خود اسکن کنید
  4. کد ۶ رقمی را برای تأیید وارد کنید
  5. کدهای بازیابی را در محلی امن ذخیره کنید

از طریق API:

bash
# Generate TOTP secret and recovery codes
curl -X POST /api/v1/admin/2fa/setup -H "Authorization: Bearer TOKEN"

# Activate 2FA (provide TOTP code to verify)
curl -X POST /api/v1/admin/2fa/enable \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"code": "123456"}'

# Login with 2FA
curl -X POST /api/v1/admin/token \
  -H "X-TOTP-Code: 123456" \
  -d "username=admin&password=admin&grant_type=password"

محافظت با کپچا

از صفحه ورود در برابر حملات brute-force با کپچا محافظت کنید:

Cloudflare Turnstile

env
CAPTCHA_PROVIDER="turnstile"
TURNSTILE_SITE_KEY="0x4AAAAAAA..."
TURNSTILE_SECRET_KEY="0x4AAAAAAA..."

کپچای داخلی

env
CAPTCHA_PROVIDER="builtin"

کپچای داخلی به هیچ سرویس خارجی نیاز ندارد و چالش‌های ریاضی ساده تولید می‌کند.

محدودسازی نرخ

محدودسازی نرخ اندپوینت ورود به‌صورت پیش‌فرض فعال است:

env
LOGIN_RATE_LIMIT="10/minute"
LOGIN_LOCKOUT_THRESHOLD=10
LOGIN_LOCKOUT_DURATION_MINUTES=30

پس از ۱۰ تلاش ناموفق، IP به‌مدت ۳۰ دقیقه قفل می‌شود. محدودکننده نرخ درون‌حافظه‌ای است (به‌ازای هر فرایند) و با راه‌اندازی مجدد سرور بازنشانی می‌شود.

SSL / TLS

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

  • SSL مستقیمUVICORN_SSL_CERTFILE و UVICORN_SSL_KEYFILE را تنظیم کنید
  • پروکسی معکوس — از Nginx یا Caddy در جلو با خاتمه SSL استفاده کنید
  • Cloudflare — از طریق Cloudflare با حالت Full (Strict) SSL پروکسی کنید

نمونه پروکسی معکوس Nginx

nginx
server {
    listen 443 ssl http2;
    server_name panel.example.com;

    ssl_certificate     /etc/letsencrypt/live/panel.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/panel.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

پرسش‌های متداول

چطور رمز ادمین را تغییر دهیم

گزینه ۱: متغیر محیطی SUDO_PASSWORD را به‌روزرسانی کنید و پنل را راه‌اندازی مجدد کنید.

گزینه ۲: از API استفاده کنید:

bash
curl -X PUT /api/v1/admin/admin \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"password": "newSecurePassword123"}'

چطور پشتیبان بگیریم

SQLite

bash
# Stop the panel first for a clean backup
docker compose stop panel
cp /var/lib/nexuspanel/db.sqlite3 /backups/db-$(date +%Y%m%d).sqlite3
docker compose start panel

# Or use SQLite online backup (no downtime)
sqlite3 /var/lib/nexuspanel/db.sqlite3 ".backup /backups/db-$(date +%Y%m%d).sqlite3"

PostgreSQL

bash
docker compose exec db pg_dump -U nexus nexuspanel > /backups/db-$(date +%Y%m%d).sql
نکته
همچنین از .env، xray_config.json و هر قالب سفارشی خود پشتیبان بگیرید.

چطور به‌روزرسانی کنیم

bash
cd /opt/nexuspanel

# Pull latest images
docker compose pull

# Restart with new version
docker compose up -d

# Check logs for migration status
docker compose logs -f panel

مهاجرت‌های پایگاه داده به‌صورت خودکار هنگام راه‌اندازی اجرا می‌شوند. همیشه پیش از به‌روزرسانی از پایگاه داده خود پشتیبان بگیرید.

چطور قالب‌های سفارشی اضافه کنیم

قالب‌های سفارشی به شما امکان می‌دهند خروجی اشتراک را برای کلاینت‌های مختلف کنترل کنید:

  1. فایل‌های قالب خود را در پوشه قالب‌ها بسازید:
bash
mkdir -p /var/lib/nexuspanel/templates/clash
nano /var/lib/nexuspanel/templates/clash/custom.yml
  1. قالب را در .env ارجاع دهید:
env
CUSTOM_TEMPLATES_DIRECTORY="/var/lib/panel/templates/"
CLASH_SUBSCRIPTION_TEMPLATE="clash/custom.yml"

قالب‌ها از نحو Jinja2 با دسترسی به داده کاربر، پیکربندی پروکسی و تنظیمات پنل پشتیبانی می‌کنند.

سفارشی‌سازی صفحه اشتراک

صفحه اشتراک رو به کاربر (که هنگام بازدید از یک لینک اشتراک در مرورگر نشان داده می‌شود) کاملاً قابل سفارشی‌سازی است:

  1. قالب پیش‌فرض را به‌عنوان نقطه شروع کپی کنید:
bash
cp -r /opt/nexuspanel/app/templates/subscription \
  /var/lib/nexuspanel/templates/subscription
  1. /var/lib/nexuspanel/templates/subscription/index.html را ویرایش کنید
  2. در .env تنظیم کنید:
env
SUBSCRIPTION_PAGE_TEMPLATE="subscription/index.html"

متغیرهای قالب موجود شامل: user، sub_url، clash_url، singbox_url، usage، expire_date و brand_name است.


مستندات NexusPanel — با دقت ساخته شده است.