تازهوارد؟ ابتدا این را بخوانید 👋
تا حالا اسم Marzban، «VPS» یا «پنل» را نشنیدهاید؟ عالی است — این صفحه کل ایده را با زبان ساده توضیح میدهد. هیچ تجربهای لازم نیست.
در یک جمله: NexusPanel نرمافزاری است که به شما امکان میدهد سرویس VPN خودتان را راه بیندازید و دسترسی به آن را بفروشید — کمی شبیه راهاندازی یک نتفلیکس کوچک خودتان، با این تفاوت که آنچه میفروشید یک اتصال اینترنتی خصوصی، رفعفیلتر و سریعتر است.
یک سرور ارزان اجاره میکنید، NexusPanel را روی آن نصب میکنید و یک داشبورد وب تمیز در اختیار میگیرید. از همان داشبورد مشتری میسازید و هر مشتری یک لینک دریافت میکند که آن را در یک اپلیکیشن رایگان روی گوشیاش وارد میکند. روی «اتصال» میزند — و حالا اینترنتش از طریق سرور شما عبور میکند. شما ماهانه از او پول میگیرید. کل کسبوکار همین است.
تشبیه به یک مغازه
اگر بتوانید راهاندازی یک مغازه کوچک را تصور کنید، NexusPanel را هم میفهمید. کل ماجرا اینجا نقشهبرداری شده است:
صاحب کسبوکار
شما کسبوکار را اداره میکنید، قیمتها را تعیین میکنید و مشتری اضافه میکنید. لازم نیست برنامهنویس باشید.
ساختمان مغازه شما
کامپیوتری که در یک مرکز داده اجاره میکنید (حدود ۵ دلار در ماه). پنل شما اینجا زندگی میکند. ارائهدهندگان: Hetzner، Contabo، DigitalOcean…
صندوق و قفسههای شما
پنل کنترلی که در مرورگر وارد آن میشوید. افزودن مشتری، تماشای ترافیک، دریافت پول — همه از همینجا.
یک شعبه در خارج
یک سرور اضافی مثلاً در آلمان یا فنلاند تا مشتریها بتوانند محل اتصالشان را انتخاب کنند. اختیاری — میتوانید بدون هیچ نودی شروع کنید.
کارت عضویت
یک لینک وب که به هر مشتری میدهید. تمام تنظیمات اتصال او را در خود دارد — تنها چیزی است که او همیشه به آن نیاز دارد.
دروازه مشتری
یک اپلیکیشن رایگان (Happ، v2rayNG، Streisand…). یکبار لینک را وارد میکنند، روی اتصال میزنند، تمام. شما هیچوقت به گوشی آنها دست نمیزنید.
پول واقعاً چطور جریان پیدا میکند
- کسی اینترنت خصوصی یا رفعفیلتر میخواهد و به شما پول میدهد (از طریق ربات Telegram داخلی، رمزارز را بهصورت خودکار دریافت کنید، یا به هر شکلی که دوست دارید پول بگیرید).
- NexusPanel را باز میکنید و برای او یک کاربر میسازید — تعیین میکنید چه مدت معتبر است و چه مقدار داده دریافت میکند. حدود ۱۰ ثانیه طول میکشد.
- لینک اشتراکش را برایش میفرستید.
- آن را در یک اپ رایگان وارد میکند و روی اتصال میزند. حالا از طریق سرور شما آنلاین است.
- ماه بعد دوباره پول میدهد تا فعال بماند. این کار را با هر تعداد مشتری که میخواهید تکرار کنید.
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 یک پنل VPN چندمستأجری است — شما زیرحسابها را میفروشید، مشتریهایتان از طریق هر کلاینت v2ray متصل میشوند و همهچیز را در یک داشبورد نگه میدارید. اگر تازهوارد هستید، سریعترین راه برای دیدن کارکرد آن، نسخه آزمایشی رایگان است. اگر همین حالا Marzban دارید، ابزار مهاجرت همهچیز را با یک دستور منتقل میکند — کاربران، ادمینها، هاستها، گواهیها، و حتی لینکهای اشتراک موجودتان همچنان کار میکنند. از Remnawave میآیید؟ ابزار مشابهی برای آن هم هست.
امتحان نسخه آزمایشی رایگان
ربات Telegram را باز کنید، /start را تایپ کنید و یک لایسنس آزمایشی ۱۴ روزه بگیرید. میتوانید با همان لایسنس پنل خودتان را بالا بیاورید و پیش از پرداخت، با کاربران و نودهای نامحدود روی ترافیک واقعی امتحانش کنید.
نصب روی یک سرور تازه
یک دستور روی یک VPS تمیز با Ubuntu 20.04+ . اسکریپت لایسنس، دامنه و رمز ادمین شما را میپرسد — همین. اگر دامنهای را به سرور اشاره دهید، SSL بهصورت خودکار پیکربندی میشود.
دیدن دستور نصب ↓مهاجرت از Marzban
همان VPS، بدون نیاز به پیکربندی مجدد کلاینتها. ابزار مهاجرت اولاجرایآزمایشی و بازگشتپذیر است — پیش از اینکه چیزی دست بخورد هر تغییری را پیشنمایش میکنید و تا پیش از جابجایی نهایی هر زمان میتوانید برگردید. از Remnawave میآیید؟ مهاجرت Remnawave هم به همین شکل کار میکند.
راهنمای مهاجرت ↓https://your-panel/sub/<token> که کاربرانتان از قبل دارند همچنان پاسخ میدهد.
به چه چیزهایی نیاز دارید
- یک VPS با Ubuntu 20.04+ (یا هر توزیع خانواده Debian)، حداقل ۱ گیگابایت RAM، توصیهشده ۲ گیگابایت
- دسترسی SSH ریشه (root) به آن VPS
- یک دامنه که به VPS اشاره کند (اختیاری — یک گواهی HTTPS واقعی و بدون هشدار میدهد؛ بدون آن هم باز HTTPS خواهید داشت، فقط با یک گواهی خودامضا که یکبار در مرورگر هشدار نشان میدهد)
- یک لایسنس NexusPanel (یکی از ربات Telegram بگیرید، نسخه آزمایشی رایگان ۱۴ روزه هم کار میکند)
چطور کمک بگیریم
اگر چیزی ناموفق بود، اینها را به ترتیب امتحان کنید:
- لاگهای پنل را بررسی کنید:
cd /opt/panel && docker compose logs --tail 100 - بخش مربوطه از این مستندات را بخوانید (نوار کناری در سمت چپ)
- در Telegram به ما پیام دهید — لینک در ربات است، زمان پاسخدهی در حد ساعت است نه روز
NexusPanel چیست
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) |
| Docker | 20.10+ | آخرین نسخه پایدار |
| دامنه | اختیاری | توصیهشده (برای SSL) |
نصب سریع
این دستور واحد را روی یک VPS تازه اجرا کنید تا NexusPanel با تنظیمات پیشفرض نصب شود:
curl -sL https://nexuspanel.store/install | bash
اسکریپت موارد زیر را از شما میپرسد:
- کلید لایسنس و شناسه کلاینت (Client ID) — از @nexuspanelpayment_bot (کلید آزمایشی رایگان ۱۴ روزه هم همینجا کار میکند، اما نصبکننده همیشه به یک کلید نیاز دارد — نصب بدون لایسنس وجود ندارد)
- دامنه — برای SSL از طریق Let's Encrypt (برای حالت فقطIP رد شوید)
- نام کاربری و رمز ادمین — برای داشبورد
- پورت پنل — پیشفرض ۸۴۴۳
سپس کارهای زیر را انجام میدهد:
- در صورت نبود، Docker و Docker Compose را نصب میکند
ghcr.io/haitovs/nexus:latestرا میکشد (ایمیج پروداکشن محافظتشده با Cython)/opt/panel/را همراه با.envوdocker-compose.ymlمیسازد (نام کانتینر:nexus-panel)xray_config.jsonرا با لاگ دسترسی فعال مقداردهی اولیه میکند (برای اعمال محدودیت IP/دستگاه ضروری است)- پنل را اجرا میکند و آدرس داشبورد + اطلاعات ورود را چاپ میکند
nexus update روی سرور آن را اعمال میکنید.
نصب تکدستوری (تفصیلی)
اسکریپت نصب پرچمهای اختیاری برای سفارشیسازی راهاندازی میپذیرد:
# توصیهشده — کلید لایسنس و شناسه کلاینت خود را بدهید (از @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) در دسترس است.
اولین قدمها در پنل
پس از ورود، این سریعترین مسیر برای رسیدن به اولین اتصال کاری است:
- یک کاربر بسازید — داشبورد → Users → Add User. تاریخ انقضا و سقف ترافیک را تنظیم کنید، سپس لینک اشتراک او را کپی کرده و به یک اپ کلاینت (Happ، v2rayNG، Streisand…) بدهید.
- یک نود اضافه کنید (اختیاری) — داشبورد → Nodes → Add New Node، دستور نصب سریع تولیدشده را کپی کنید، آن را روی سرور نود اجرا کنید، سپس برگردید و Name + Address را برای اتصال پر کنید. جزئیات بیشتر در نصب نود.
- دامنه اشتراک را تنظیم کنید — اگر لینکهای اشتراک را از هاست/دامنهای متفاوت از خود پنل ادمین سرو میکنید،
XRAY_SUBSCRIPTION_URL_PREFIXرا در ویرایشگر Env (Settings → Env) تنظیم کنید و از Save & Restart استفاده کنید — این تنظیم فقط پس از راهاندازی مجدد کامل اعمال میشود.
نصب دستی
اسکریپت نصب بالا روش پشتیبانیشده است — خودش در رجیستری خصوصی ایمیج احراز هویت میکند، یک .env کارآمد مینویسد و فایروال را تنظیم میکند. برای انجام دستی این کار:
# ۱. ایمیج خصوصی است — یک `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:
# 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
یک کرونجاب برای تمدید خودکار اضافه کنید:
0 3 * * * certbot renew --quiet && docker compose -C /opt/nexuspanel restart
همراه با PostgreSQL
برای استقرارهای پروداکشن، PostgreSQL نسبت به SQLite توصیه میشود. BACKEND_MODE=modern را تنظیم کنید و از درایوری استفاده کنید که واقعاً در پنل وجود دارد — psycopg2 (سینک)، نه asyncpg:
# در .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 بالا میآورد:
# از پوشه نصب (مثلاً /opt/panel)
cp docker-compose.modern.yml docker-compose.yml
docker compose up -d
psycopg2-binary عرضه میشود، نه asyncpg — یک URL از نوع postgresql+asyncpg:// درایوری پیدا نمیکند. همیشه از postgresql+psycopg2:// استفاده کنید.
نمونههای Docker Compose
Classic (SQLite) — چیزی که نصبکننده واقعاً مینویسد
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_HOST | 0.0.0.0 | آدرس bind برای سرور |
UVICORN_PORT | 8000 | پورت HTTP |
UVICORN_UDS | — | مسیر Unix domain socket (جایگزین host/port) |
UVICORN_SSL_CERTFILE | — | مسیر گواهی SSL (fullchain.pem) |
UVICORN_SSL_KEYFILE | — | مسیر کلید خصوصی SSL |
UVICORN_SSL_CA_TYPE | public | نوع CA: public یا private |
DASHBOARD_PATH | /dashboard/ | مسیر URL برای داشبورد وب |
ALLOWED_ORIGINS | — | منشأهای CORS جداشده با کاما |
SUDO_USERNAME | — | نام کاربری سوپرادمین اولیه |
SUDO_PASSWORD | — | رمز سوپرادمین اولیه |
JWT_ACCESS_TOKEN_EXPIRE_MINUTES | 1440 | انقضای توکن به دقیقه (پیشفرض ۲۴ ساعت) |
پایگاه داده
| متغیر | پیشفرض | توضیح |
|---|---|---|
SQLALCHEMY_DATABASE_URL | sqlite:///db.sqlite3 | رشته اتصال پایگاه داده |
SQLALCHEMY_POOL_SIZE | 10 | اندازه استخر اتصال |
SQLIALCHEMY_MAX_OVERFLOW | 30 | حداکثر اتصال بیش از اندازه استخر |
BACKEND_MODE | classic | classic (SQLite/Postgres، پیشفرض) یا modern (افزودن صف رویداد مبتنی بر Redis) |
REDIS_URL | — | رشته اتصال Redis؛ هنگام BACKEND_MODE=modern الزامی است |
postgresql+asyncpg://user:pass@host:5432/dbname استفاده کنید.
BACKEND_MODE=modern را تنظیم کنید و REDIS_URL را فراهم کنید. از docker-compose.modern.yml استفاده کنید که یک سرویس redis:7 را در کنار پنل ارائه میدهد. اکثر استقرارها به این نیاز ندارند.
Xray
| متغیر | پیشفرض | توضیح |
|---|---|---|
XRAY_JSON | xray_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_PATH | sub | بخش مسیر URL برای اشتراکها |
XRAY_EXCLUDE_INBOUND_TAGS | — | تگهای inbound جداشده با فاصله برای حذف |
XRAY_FALLBACKS_INBOUND_TAG | — | تگ inbound استفادهشده برای مسیریابی fallback |
اشتراک
| متغیر | پیشفرض | توضیح |
|---|---|---|
SUB_PROFILE_TITLE | Subscription | نام نمایشی که در اپهای کلاینت نشان داده میشود |
SUB_SUPPORT_URL | — | لینک پشتیبانی گنجاندهشده در اطلاعات اشتراک |
SUB_UPDATE_INTERVAL | 12 | بازه بهروزرسانی خودکار کلاینت (ساعت) |
EXTERNAL_CONFIG | — | URL پیکربندی خارجی برای یکپارچهسازی کلاینت |
USE_CUSTOM_JSON_DEFAULT | false | فعالسازی پیکربندی JSON سفارشی برای کلاینت پیشفرض |
USE_CUSTOM_JSON_FOR_V2RAYN | false | فعالسازی JSON سفارشی برای V2RayN |
USE_CUSTOM_JSON_FOR_V2RAYNG | false | فعالسازی JSON سفارشی برای V2RayNG |
USE_CUSTOM_JSON_FOR_STREISAND | false | فعالسازی JSON سفارشی برای Streisand |
USE_CUSTOM_JSON_FOR_HAPP | false | فعالسازی JSON سفارشی برای Happ |
SUB_RATE_LIMIT_PER_MINUTE | 60 | حداکثر دریافت اشتراک بهازای هر IP در دقیقه (درونفرایندی، با راهاندازی مجدد بازنشانی میشود) |
SUB_ENABLE_ETAG | true | بازگرداندن ETag / رعایت If-None-Match برای صرفهجویی در پهنای باند روی اشتراکهای بدون تغییر |
SUB_GZIP_MIN_SIZE | 512 | فشردهسازی Gzip پاسخهای اشتراک بزرگتر از این تعداد بایت |
قالبها
| متغیر | پیشفرض | توضیح |
|---|---|---|
CUSTOM_TEMPLATES_DIRECTORY | /var/lib/panel/templates/ | پوشه پایه برای قالبهای سفارشی |
SUBSCRIPTION_PAGE_TEMPLATE | subscription/index.html | قالب صفحه اشتراک کاربر |
HOME_PAGE_TEMPLATE | home/index.html | قالب صفحه اصلی پنل |
CLASH_SUBSCRIPTION_TEMPLATE | clash/default.yml | قالب اشتراک Clash |
CLASH_SETTINGS_TEMPLATE | clash/settings.yml | قالب تنظیمات Clash |
V2RAY_SUBSCRIPTION_TEMPLATE | v2ray/default.json | قالب اشتراک V2Ray |
V2RAY_SETTINGS_TEMPLATE | v2ray/settings.json | قالب تنظیمات V2Ray |
SINGBOX_SUBSCRIPTION_TEMPLATE | singbox/default.json | قالب اشتراک Sing-box |
SINGBOX_SETTINGS_TEMPLATE | singbox/settings.json | قالب تنظیمات Sing-box |
MUX_TEMPLATE | mux/default.json | قالب پیکربندی Multiplex |
USER_AGENT_TEMPLATE | user_agent/default.json | قالب تجزیه User-agent |
GRPC_USER_AGENT_TEMPLATE | user_agent/grpc.json | قالب User-agent برای gRPC |
Telegram
| متغیر | پیشفرض | توضیح |
|---|---|---|
TELEGRAM_API_TOKEN | — | توکن ربات از @BotFather |
TELEGRAM_ADMIN_ID | — | شناسههای کاربری Telegram ادمینها، جداشده با کاما |
TELEGRAM_LOGGER_CHANNEL_ID | — | شناسه کانال برای پیامهای لاگ |
TELEGRAM_DEFAULT_VLESS_FLOW | xtls-rprx-vision | flow پیشفرض VLESS برای کاربران ساختهشده توسط ربات |
TELEGRAM_PROXY_URL | — | URL پروکسی برای اتصالات API تلگرام |
اعلانها
| متغیر | پیشفرض | توضیح |
|---|---|---|
NOTIFY_STATUS_CHANGE | true | اعلان هنگام تغییر وضعیت کاربر |
NOTIFY_USER_CREATED | true | اعلان هنگام ساخت کاربر جدید |
NOTIFY_USER_UPDATED | true | اعلان هنگام ویرایش کاربر |
NOTIFY_USER_DELETED | true | اعلان هنگام حذف کاربر |
NOTIFY_USER_DATA_USED_RESET | true | اعلان هنگام بازنشانی مصرف |
NOTIFY_USER_SUB_REVOKED | true | اعلان هنگام ابطال اشتراک |
NOTIFY_IF_DATA_USAGE_PERCENT_REACHED | true | اعلان هنگام رسیدن به آستانه داده |
NOTIFY_IF_DAYS_LEFT_REACHED | true | اعلان هنگام رسیدن به آستانه انقضا |
NOTIFY_LOGIN | true | اعلان هنگام ورود ادمین |
LOGIN_NOTIFY_WHITE_LIST | — | IPهایی که از اعلانهای ورود مستثنا میشوند |
NOTIFY_DAYS_LEFT | 3,7 | آستانههای روزهای باقیمانده برای اعلان |
NOTIFY_REACHED_USAGE_PERCENT | 80,90 | آستانههای درصد مصرف |
RECURRENT_NOTIFICATIONS_TIMEOUT | 180 | دقیقه بین اعلانهای تکراری |
NUMBER_OF_RECURRENT_NOTIFICATIONS | 3 | حداکثر اعلانهای تکراری بهازای هر رویداد |
DISCORD_WEBHOOK_URL | — | وبهوک Discord برای اعلانهای سبک Telegram |
WEBHOOK_ADDRESS | — | قدیمی: URLهای ثابت وبهوک جداشده با کاما. برای راهاندازیهای جدید، رابط وبهوک داشبورد را ترجیح دهید. |
WEBHOOK_SECRET | — | قدیمی: راز HMAC برای تحویل WEBHOOK_ADDRESS. وبهوکهای داشبورد رازها را بهازای هر اندپوینت مدیریت میکنند. |
برندینگ (وایتلیبل)
| متغیر | پیشفرض | توضیح |
|---|---|---|
BRAND_NAME | Panel | نام پنل که در رابط کاربری و ایمیلها نمایش داده میشود |
BRAND_LOGO_URL | — | URL تصویر لوگوی سفارشی |
BRAND_FAVICON_URL | — | URL فاوآیکون سفارشی |
امنیت
| متغیر | پیشفرض | توضیح |
|---|---|---|
CAPTCHA_PROVIDER | disabled | ارائهدهنده کپچا: disabled، turnstile یا builtin |
TURNSTILE_SITE_KEY | — | کلید سایت Cloudflare Turnstile |
TURNSTILE_SECRET_KEY | — | کلید مخفی Cloudflare Turnstile |
LOGIN_RATE_LIMIT | 10/minute | حداکثر تلاشهای ورود در هر بازه |
LOGIN_LOCKOUT_THRESHOLD | 10 | تلاشهای ناموفق پیش از قفلشدن |
LOGIN_LOCKOUT_DURATION_MINUTES | 30 | مدت قفلشدن به دقیقه |
ثبت رویداد
| متغیر | پیشفرض | توضیح |
|---|---|---|
LOG_LEVEL | INFO | سطح لاگ: DEBUG، INFO، WARNING، ERROR |
LOG_FORMAT | text | قالب لاگ: text یا json |
LOG_FILE_PATH | — | نوشتن لاگ در فایل (علاوه بر stdout) |
LOG_MAX_SIZE_MB | 10 | حداکثر اندازه فایل لاگ پیش از چرخش |
LOG_BACKUP_COUNT | 5 | تعداد فایلهای لاگ چرخشیافته برای نگهداری |
سنجهها (Prometheus)
| متغیر | پیشفرض | توضیح |
|---|---|---|
METRICS_ENABLED | false | فعالسازی اندپوینت /metrics Prometheus |
METRICS_TOKEN | — | توکن Bearer لازم برای جمعآوری سنجهها |
متغیرهای اضافی
| متغیر | پیشفرض | توضیح |
|---|---|---|
ACTIVE_STATUS_TEXT | Active | برچسب سفارشی برای وضعیت فعال |
EXPIRED_STATUS_TEXT | Expired | برچسب سفارشی برای وضعیت منقضی |
LIMITED_STATUS_TEXT | Limited | برچسب سفارشی برای وضعیت محدود |
DISABLED_STATUS_TEXT | Disabled | برچسب سفارشی برای وضعیت غیرفعال |
ONHOLD_STATUS_TEXT | On-Hold | برچسب سفارشی برای وضعیت درانتظار |
USERS_AUTODELETE_DAYS | -1 | حذف خودکار کاربران منقضی پس از N روز (۱- = غیرفعال) |
USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS | false | گنجاندن کاربران محدودشده بهخاطر داده در حذف خودکار |
JOB_CORE_HEALTH_CHECK_INTERVAL | 10 | بازه بررسی سلامت (ثانیه) |
JOB_RECORD_NODE_USAGES_INTERVAL | 30 | بازه ثبت مصرف نود |
JOB_RECORD_USER_USAGES_INTERVAL | 10 | بازه ثبت مصرف کاربر |
JOB_REVIEW_USERS_INTERVAL | 10 | بازه بررسی/انقضای کاربر |
JOB_SEND_NOTIFICATIONS_INTERVAL | 30 | بازه ارسال اعلان |
DISABLE_RECORDING_NODE_USAGE | false | غیرفعالسازی ثبت مصرف نود |
DEBUG | false | فعالسازی حالت دیباگ با بارگذاری مجدد خودکار |
DOCS | false | فعالسازی 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 / Host | TLS Server Name Indication و هدر HTTP Host |
| Security / ALPN / Fingerprint | پروفایل TLS: none / tls / reality؛ h2/http1.1؛ uTLS مرورگرهای Chrome/Firefox/Safari |
| Allow Insecure | رد کردن راستیآزمایی گواهی TLS (فقط پشت CDN که گواهی در معرض دید نیست استفاده شود) |
| Country code | ISO 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:
[{"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 به یک گروه اضافه کنید. هر کاربر حداکثر میتواند در یک گروه باشد.
# 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.
# 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_agent | equals / contains / regex | template / status / headers |
client_os | equals / contains / regex | template / 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 ارزیابی میشوند. اولین تطبیق برنده است.
# 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) تلاش مجدد میکند؛ پس از حداکثر تلاشها، رویداد ناموفق علامتگذاری و رها میشود.
# 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"]
WEBHOOK_ADDRESS (URLهای جداشده با کاما) و WEBHOOK_SECRET همچنان بهعنوان جایگزین ثابت مبتنی بر متغیر محیطی کار میکنند. برای راهاندازیهای جدید از رابط داشبورد استفاده کنید — از رازها، دامنهها و تاریخچه تحویل بهازای هر اندپوینت پشتیبانی میکند.
صفحه کلاینتها
داشبورد → کلاینتها فهرستی گزیده از کلاینتهای VPN توصیهشده را همراه با نشانهای پلتفرم، لینکهای دانلود و یادداشتهای کاربری نشان میدهد. اپراتورها آدرس این صفحه را با کاربران نهایی به اشتراک میگذارند.
| کلاینت | پلتفرمها | یادداشتها |
|---|---|---|
| Happ | iOS / macOS / Windows / Android | توصیهشده — آدرس اشتراک بومی، اتصال HWID، کش آفلاین |
| v2RayTun | iOS / macOS / Android | کلاینت محبوب iOS، پشتیبانی از VLESS-Reality |
| Karing | همه پلتفرمها | مبتنی بر Sing-box، روایت چندپلتفرمی قوی |
| Shadowrocket | iOS | ۲٫۹۹ دلار در App Store آمریکا — iOS بسیار پایدار |
| V2rayNG | Android | کلاینت کلاسیک Android |
| FlClashX | Windows / macOS / Linux / Android | سازگار با Mihomo/Clash |
| Streisand | iOS / 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 واقعاً کار کنند.
چطور کار میکند
- Xray برای هر اتصال پذیرفتهشده، یک خط در
$XRAY_ACCESS_LOGمینویسد. - جاب
enforce_limitsهر ۶۰ ثانیه اجرا میشود، لاگ را دنبال میکند (با ردیابی آفست و آگاه از چرخش) و جفتهای(user_id, client_ip)را از آخرینLIMIT_WINDOW_SECONDS(پیشفرض ۶۰۰ = ۱۰ دقیقه) استخراج میکند. - برای هر کاربر، IPهای یکتا شمارش میشوند. اگر تعداد از
ip_limit(یاdevice_limitدر صورت تنظیمنشدنip_limit) فراتر رود و کاربر در حال حاضرactiveباشد وip_limit_mode == "limit"باشد، وضعیت کاربر بهlimitedتغییر میکند. - همه IPهای دیدهشده در
user_ip_historyنوشته میشوند. IPهای هر کاربر را از طریقGET /api/v1/user/{username}/ipsببینید.
پیکربندی لازم xray
نصب پیشفرض این را بهصورت خودکار فعال میکند. برای نصبهای موجود، پنل هنگام راهاندازی xray_config.json شما را بهصورت خودکار وصله میکند تا مسیر لاگ دسترسی اضافه شود. پیکربندی دستی:
{
"log": {
"loglevel": "warning",
"access": "/var/lib/panel/xray-access.log"
}
}
پارامترهای قابلتنظیم
| متغیر محیطی | پیشفرض | هدف |
|---|---|---|
XRAY_ACCESS_LOG | /var/log/xray/access.log | مسیر فایل لاگ دسترسی Xray |
LIMIT_WINDOW_SECONDS | 600 | پنجره غلتان برای شمارش IP یکتا |
LIMIT_ENFORCE_INTERVAL | 60 | هر چند وقت یکبار (ثانیه) جاب اعمال اجرا میشود |
پشتیبانگیری
NexusPanel هر روز ساعت 03:00 UTC از طریق جاب backup در APScheduler یک پشتیبان خودکار از پایگاه داده میگیرد.
پشتیبانها کجا میروند
- فایلهای محلی:
/var/lib/panel/backups/backup_YYYYMMDD_HHMMSS.sqlite3(یا.sqlبرای PostgreSQL) - ۷ پشتیبان آخر نگه داشته میشود؛ موارد قدیمیتر بهصورت خودکار هرس میشوند
- اگر
TELEGRAM_API_TOKENوTELEGRAM_ADMIN_IDپیکربندی شده باشند، هر پشتیبان بهعنوان یک سند به Telegram شما هم ارسال میشود تا یک نسخه خارج از سرور داشته باشید
پشتیبان دستی
# 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
بازیابی
- پنل را متوقف کنید:
cd /opt/panel && docker compose down - فایل DB را جایگزین کنید:
cp /path/to/backup.sqlite3 /var/lib/panel/db.sqlite3 - راهاندازی مجدد کنید:
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> برمیگردند.
Run Your Business
Your First Customer
- Dashboard → Users → Add User.
- Give them a username, pick an expiry date and a data limit (or leave both unlimited), and pick which protocols they get.
- Save — the panel generates their subscription link immediately.
- 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 در عوض یک دستور تکخطی آمادهچسباندن با گواهی پنل که در آن جاسازی شده تولید میکند. بدون نوشتن دستی فایل گواهی.
- داشبورد ← نودها ← افزودن نود جدید ← تب Manual
- روی کپی دستور نصب بزنید — دستور شامل گواهی، پورت، پورت API و آدرس پنل است
- روی سرور نود بچسبانید و اجرا کنید
- IP و پورتهای نود را در پنل وارد کنید ← افزودن نود
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ذخیره میشود
Docker Compose برای نود
این همان composeای است که نصبکننده در /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 که کاربران به آن وصل میشوند) را مستقیماً روی هاست باز میکند.
چند نود
برای افزودن نود در موقعیتهای مختلف:
- سرویس نود را روی هر سرور با استفاده از دستور تکخطی تولیدشده نصب کنید
- در پنل، هر نود را با IP عمومی و پورتهایش اضافه کنید
- یک پرچم کشور تخصیص دهید — هم شبکه بصری و هم تغییر ترتیب منطقهای اشتراک را هدایت میکند
- برای تعیین ترتیب نمایش در شبکه، بکشید و رها کنید
- یک ضریب مصرف بهازای هر نود تنظیم کنید (مثلاً
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/settings)؛ ssl_target_name = Panel را راستیآزمایی کنید |
| تأخیر بالا | مسیر شبکه بین پنل و نود را بررسی کنید؛ اطمینان حاصل کنید کنترل ازدحام BBR و بافرهای سوکت ۶۴ مگابایتی تنظیم شدهاند |
| کاربران نمیتوانند از طریق نود متصل شوند | راستیآزمایی کنید پورتهای پروکسی (۴۴۳، ۸۰ و غیره) روی فایروال نود به کاربران نهایی باز هستند |
مرجع API
همه اندپوینتهای API زیر /api/v1/ قرار دارند. با تنظیم DOCS=true و بازدید از /docs، رابط تعاملی Swagger را فعال کنید.
احراز هویت
با ارسال اطلاعات ورود، یک توکن دسترسی JWT دریافت کنید:
/api/v1/admin/tokencurl -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 قرار دهید.
POST /api/v1/admin/2fa/setup — تولید راز TOTP + کدهای بازیابیPOST /api/v1/admin/2fa/enable — راستیآزمایی کد و فعالسازی 2FAPOST /api/v1/admin/2fa/disable — غیرفعالسازی 2FA
کاربران
/api/v1/userساخت یک کاربر جدید با پروتکلها، محدودیت داده، انقضا، محدودیت دستگاه و محدودیت IP.
/api/v1/usersفهرست همه کاربران. برای حسابهای غیرsudo بهصورت خودکار بر اساس ادمین محدودهبندی میشود.
/api/v1/user/{username}دریافت اطلاعات تفصیلی کاربر شامل آمار مصرف و لینکهای اشتراک.
/api/v1/user/{username}بهروزرسانی فیلدهای کاربر (محدودیت داده، انقضا، وضعیت، پروتکلها و غیره).
/api/v1/user/{username}حذف دائمی یک کاربر و همه دادههای مرتبط.
عملیات گروهی
/api/v1/users/bulk/update/api/v1/users/bulk/delete/api/v1/users/bulk/resetخروجی
/api/v1/export/usersدانلود همه کاربران بهصورت یک فایل CSV.
/api/v1/export/subscription-linksخروجی همه لینکهای اشتراک بهصورت متن ساده.
ادمینها
/api/v1/adminساخت یک ادمین جدید با نقش (owner، admin، reseller)، max_users و max_traffic_bytes.
/api/v1/adminsفهرست همه حسابهای ادمین.
نودها
/api/v1/inboundsفهرست همه inboundهای پروتکل.
/api/v1/hostsدریافت پیکربندیهای هاست (فقط sudo).
تحلیلها
/api/v1/analytics/summaryآمار مرور کلی داشبورد.
/api/v1/analytics/protocolsتفکیک توزیع پروتکل.
/api/v1/analytics/nodes/loadتعداد اتصال و پهنای باند بهازای هر نود.
/api/v1/analytics/nodes/uptimeدرصد آپتایم نود.
/api/v1/analytics/users/expiring?days=30کاربرانی که ظرف تعداد روزهای مشخصشده منقضی میشوند.
/api/v1/analytics/users/top?limit=10پرمصرفترین کاربران بر اساس مصرف پهنای باند.
نشستها
/api/v1/sessions/active?hours=24نشستهای فعال دستگاه در N ساعت گذشته.
/api/v1/sessions/user/{username}نشستهای یک کاربر مشخص.
/api/v1/sessions/{session_id}قطع اجباری یک نشست دستگاه.
سیستم
/api/v1/systemآمار سیستم شامل CPU، حافظه و پهنای باند. ادمینهای غیرsudo برای سنجههای حساس مقادیر صفر میبینند.
/api/v1/healthاندپوینت بررسی سلامت که وضعیت پایگاه داده و هسته Xray را برمیگرداند.
/metricsاندپوینت سنجههای سازگار با Prometheus. به METRICS_ENABLED=true و METRICS_TOKEN برای احراز هویت نیاز دارد.
DOCS=true را در فایل env. خود فعال کنید و برای رابط تعاملی Swagger به http://your-panel/docs بروید.
ربات Telegram
راهاندازی
- Telegram را باز کنید و به @BotFather پیام دهید
/newbotرا بفرستید و برای ساخت رباتتان دستورها را دنبال کنید- توکن ربات را کپی کنید (مثلاً
123456789:AAAA...) - شناسه کاربری Telegram خود را بگیرید (به @userinfobot پیام دهید)
- به
.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 | فقط وقتی > ۰ |
| محدودیت IP | IP Limit: 5 (limit) | فقط وقتی > ۰؛ حالت بهصورت درونخطی نشان داده میشود |
| محدودیت HWID | HWID Limit: 2 | فقط وقتی > ۰ |
| دارای پلن بعدی | Has Next Plan: True | همیشه |
| یادداشت | Note: Paid in advance 6mo | فقط وقتی غیرخالی است؛ در ۱۲۰ کاراکتر بریده میشود |
DISCORD_WEBHOOK_URL را تنظیم کنید تا همان اعلانها را در یک کانال Discord دریافت کنید. امبدهای Discord همان فیلدهای غنیشده را در بر میگیرند.
کانالهای اشتراک
آدرسهای اشتراک را از طریق زیرساختی تحویل دهید که سانسورچیها نمیتوانند مسدودش کنند.
وقتی دامنه پنل شما در روسیه، ایران، چین یا ترکمنستان مسدود میشود، مشتریها نمیتوانند بهروزرسانیهای اشتراکشان را دریافت کنند. کانالهای اشتراک این مشکل را با انتشار پیکربندی هر کاربر در یک فایل ثابت روی زیرساخت Google / Cloudflare / GitHub / Telegram حل میکنند — نامهای میزبانی که سانسورچیها نمیتوانند بهطور کامل مسدود کنند بدون اینکه اپهای پرکاربردی که میلیونها نفر استفاده میکنند را از کار بیندازند.
چطور کار میکند
- یک یا چند کانال را در تنظیمات → کانالهای اشتراک پیکربندی میکنید.
- هر کاربر یک URL عمومی پایدار روی آن کانال دریافت میکند (مثلاً
https://firebasestorage.googleapis.com/…?alt=media&token=…). - آیکون ⊞ (شبکه) روی هر ردیف کاربر در جدول کاربران، یک پاپاور با همه URLهای موجود باز میکند — مستقیم، رمزنگاریشده Happ و هر کانال پیکربندیشده. در دو کلیک کپی کنید یا QR نشان دهید.
- وقتی هاستها یا پیکربندی Xray را ویرایش میکنید، پنل بهصورت خودکار همه کاربران فعال را ظرف حدود ۱۰ تا ۳۰ ثانیه از طریق کارگر پسزمینه روی Firebase (و کانالهای دیگر) دوباره منتشر میکند. پس از ویرایشهای معمول پیکربندی، نیازی به Backfill دستی نیست.
کانالهای موجود
| کانال | ارائهدهنده | سطح رایگان | بهترین برای |
|---|---|---|---|
| Firebase Storage | حدود ۵۰ هزار دریافت در روز در پلن Spark | کانال اصلی ضدسانسور | |
| Firebase Hosting | همان پلن Spark مربوط به Storage | یک سطح دوم از Firebase (*.web.app) — با SNI و CDN لبهای متفاوت روی همان پروژه، پس وقتی Storage مسدود شود همچنان در دسترس میماند. انتشار بهصورت کلسایت است نه بهازای هر کاربر، پس دستهای منتشر میشود نه با هر ویرایش. | |
| Cloudflare R2 | Cloudflare | ۱۰ گیگابایت در ماه، بدون هزینه خروجی | ثانویه؛ ارائهدهندهای متفاوت از Firebase |
| GitHub Gist | GitHub / Microsoft | gistهای عمومی نامحدود | fallback ساده؛ بسیار بادوام |
| GitLab Snippet | GitLab | اسنیپتهای عمومی نامحدود | حتی در بازههای مسدودسازی شدید در ترکمنستان قابلدسترس بوده — یک آینه دوم در کنار Firebase برای کاربرانی که به آن دسترسی ندارند |
| تحویل با Telegram | Telegram | رایگان | تحویل اضطراری وقتی بقیه از کار افتادهاند |
| استخر Nginx-proxy | VPSهای شما | هزینه VPS | کنترل کامل اپراتور روی رله |
Firebase Storage
کانال اول توصیهشده. سطح رایگان حدود ۵۰ هزار دریافت اشتراک در روز را پوشش میدهد. روی فضای IP گوگل میزبانی میشود — سانسورچیها نمیتوانند بهطور کامل مسدودش کنند بدون اینکه Google Maps، Gmail و بیشمار اپ دیگر را از کار بیندازند.
راهاندازی یکباره در console.firebase.google.com
- ساخت پروژه — افزودن پروژه → نامگذاری (مثلاً
nexus-subs) → پلن Spark (رایگان) → ساخت. - فعالسازی Storage — Build → Storage → «Get started» → «Start in production mode» → انتخاب موقعیت → پایان.
- تنظیم قوانین storage — Storage → Rules → جایگزین کنید با:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /sub_{file=**} {
allow read: if true;
allow write: if false;
}
}
}
- تولید کلید حساب سرویس — Project Settings (⚙) → Service accounts → «Generate new private key» → دانلود. مانند یک رمز با آن رفتار کنید.
- یافتن نام bucket — Storage → بالای صفحه
gs://your-project.firebasestorage.appرا نشان میدهد. بخش بعد ازgs://را کپی کنید.
در پنل
- تنظیمات → کانالهای اشتراک → Firebase Storage → ⚙
- نام bucket و JSON حساب سرویس (کل محتوای فایل) را وارد کنید
- Enabled را روشن کنید، Priority را تنظیم کنید (کمتر = ارجح؛
10شروع خوبی است) - ذخیره → روی آزمایش بزنید (آیکون بازخوانی)
خواندن نتیجه آزمایش
یک آزمایش موفق چنین به نظر میرسد:
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
| مرحله ناموفق | علت محتمل | رفع |
|---|---|---|
creds | JSON حساب سرویس اشتباه یا منقضی | کلید را در کنسول Firebase دوباره تولید کنید |
upload | Storage فعال نیست یا قوانین اشتباه است | مراحل راهاندازی ۲ تا ۳ را دوباره بررسی کنید |
fetch | قانون خواندن عمومی اعمال نشده | قوانین مرحله ۳ را دوباره وارد کنید |
match | کش edge بلاب کهنه سرو کرد (نادر) | معمولاً تلاشهای مجدد این را پنهان میکنند؛ اگر پایدار بود گزارش باگ بدهید |
cleanup | حساب سرویس فقطخواندنی است | بلابهای nexus_test_* را بهصورت دستی حذف کنید |
اعمال روی کاربران موجود
پس از موفقیت آزمایش، روی Backfill در پایین کارت کانالهای اشتراک بزنید. این بلافاصله آپلودهای Firebase را برای همه کاربران فعال از طریق کارگر پسزمینه پخش میکند. برای ۲۰۰ کاربر، ۳۰ تا ۱۲۰ ثانیه برای تکمیل انتظار داشته باشید.
Cloudflare R2
فضای ذخیرهسازی شیء سازگار با S3 بدون هزینه خروجی. بهعنوان یک کانال ثانویه در کنار Firebase استفاده کنید — ارائهدهنده متفاوت یعنی یک مسدودسازی منطقهای روی یکی، هر دو را از کار نمیاندازد.
راهاندازی در dash.cloudflare.com
- R2 (نوار کناری چپ) → Create bucket → نامگذاری (مثلاً
nexus-subs). - باز کردن bucket → Settings → Public access → فعالسازی. URL
https://pub-<id>.r2.devرا کپی کنید. - بالاسمتراست صفحه R2 → Manage R2 API tokens → Create token → Object Read & Write (محدود به bucket خود) → ذخیره Access Key ID + Secret.
- Account ID شما همان hex ۳۲ کاراکتری در پایینسمتراست صفحه داشبورد R2 است.
در پنل
تنظیمات → کانالهای اشتراک → Cloudflare R2 → ⚙:
| فیلد | محل یافتن آن |
|---|---|
| Cloudflare account ID | hex ۳۲ کاراکتری از مرحله ۴ |
| نام bucket | مثلاً nexus-subs |
| Access key ID | از مرحله ۳ |
| Secret access key | از مرحله ۳ (یکبار نشان داده میشود) |
| Public URL base | https://pub-<id>.r2.dev از مرحله ۲ |
pub-<id>.r2.dev از همان اهرم ضدمسدودسازی Firebase بهره میبرد — با هزاران bucket دیگر R2 به اشتراک گذاشته شده است.
GitHub Gist
رایگان، میزبانیشده روی GitHub (IPهای Microsoft). بسیار بادوام — یک fallback کماولویت خوب که هیچ هزینهای ندارد.
راهاندازی
- github.com/settings/tokens → Personal access tokens → Tokens (classic) → Generate new token.
- نام:
nexus-gists. دامنه: فقط gist را علامت بزنید. انقضا: ۱ سال (یک تمدید را در تقویم بگذارید). - توکن
ghp_…را کپی کنید — دیگر نمیتوانید آن را ببینید.
در پنل
تنظیمات → کانالهای اشتراک → GitHub Gist → ⚙ → PAT را وارد کنید → ذخیره → آزمایش.
تحویل با Telegram
در ایران/روسیه/ترکمنستان دقیقاً در همان بازههایی در دسترس است که کانالهای دیگر نیستند. این کانال «پنل آتش گرفته و کاربر چیز دیگری ندارد» است.
t.me/<bot>?start=sub_<token> دریافت میکند، نه یک URL خودبهروزرسان. یکبار روی آن میزند، ربات یک فایل .txt با پیکربندی او را بهصورت پیام خصوصی میفرستد. تنها در صورتی Priority را خیلی بالا بگذارید (عدد اولویت پایین) که هندلر /start ربات را سیمکشی کرده باشید — وگرنه به رباتی میرود که پاسخ نمیدهد.
راهاندازی — ربات اختصاصی (توصیهشده)
- در Telegram به
@BotFatherپیام دهید →/newbot→ یک نام و نامکاربری انتخاب کنید (باید بهbotختم شود). - توکنی که BotFather به شما میدهد را کپی کنید.
- تنظیمات → کانالهای اشتراک → Telegram → ⚙:
- نامکاربری ربات: بدون @
- توکن ربات: از BotFather وارد کنید
- ذخیره → آزمایش. آزمایش
getMeرا فراخوانی میکند و مطمئن میشود نامکاربری بازگشتی با آنچه وارد کردهاید مطابقت دارد.
اگر از قبل یک TELEGRAM_API_TOKEN در .env برای تحویل اعلانها تنظیم کردهاید، میتوانید فیلد توکن ربات را خالی بگذارید — کانال به آن متغیر محیطی برمیگردد. از نظر امنیتی توصیه نمیشود: نشت توکن ربات اعلانها، فایلهای اشتراک را هم در معرض دید قرار میدهد.
استخر Nginx-Proxy
وقتی همه کانالهای ذخیرهسازی ثابت از کار میافتند یا بهصورت منطقهای مسدود میشوند، به ناوگان VPSهای رله ارزان خودتان پناه ببرید. هر هاست در استخر دامنه مخصوص خودش را دریافت میکند؛ پنل کاربران را بر اساس وزن میان هاستها توزیع میکند.
پیشآمادهسازی
VPSهای ارزان بالا بیاورید (Hetzner CCX13 / Contabo و غیره — هرکدام ۴ تا ۵ یورو در ماه). روی هرکدام:
# Run as root on each fresh proxy host curl -sSL https://your-panel.tld/setup_proxy.sh | bash
در پنل
تنظیمات → کانالهای اشتراک → Nginx-proxy → ⚙. پیکربندی بهصورت 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 / Gist | URLهای ذخیرهسازی ثابت از کانالهای فعال | کپی + QR |
| Telegram | دیپلینک به تحویل ربات | فقط کپی |
| Nginx-proxy | URL رله | فقط کپی |
URLها هنگام باز شدن پاپاور از پیش دریافت میشوند تا کپی ایمن از نظر ژست باشد — بدون تأخیر ناهمگام بین کلیک و نوشتن در کلیپبورد.
نشانهای سلامت کانال
هر ردیف کانال در تنظیمات → کانالهای اشتراک، یک نشان سلامت از آخرین بررسی نشان میدهد. کرون هر ۱۵ دقیقه اجرا میشود. هر زمان با دکمه آزمایش یک بررسی تازه را اجبار کنید.
انتشار خودکار مجدد هنگام تغییر پیکربندی
ویرایش هاستها یا پیکربندی هسته Xray یک پخش خودکار راه میاندازد: همه کاربران فعالی که محتوای اشتراکشان تغییر کرده، ظرف حدود ۱۰ تا ۳۰ ثانیه روی هر کانال پیکربندیشده دوباره منتشر میشوند. کارگر کاربرانی که پیکربندی رندرشدهشان تغییر نکرده را رد میکند (مدارگیری کوتاه با هش محتوا)، بنابراین ویرایش هاستی که فقط روی ۵۰ نفر از ۲۰۰ کاربر اثر میگذارد فقط ۵۰ نوشتن در Firebase ایجاد میکند.
Backfill
دکمه Backfill (در پایین کارت کانالهای اشتراک) بلافاصله همه کاربران فعال را روی همه کانالهای فعال آپلود میکند. یکبار پس از افزودن یک کانال جدید از آن استفاده کنید — پس از آن، انتشار خودکار مجدد همهچیز را بهروز نگه میدارد.
Hysteria2
Hysteria2 یک پروتکل مبتنی بر QUIC/UDP است که روی شبکههای آخرینمایل پرافتوخیز (موبایل، 4G کشورهای CIS، ایران) ۳ تا ۵ برابر توان عبوری TCP را ارائه میدهد. بهصورت یک دیمن جداگانه در کنار Xray اجرا میشود — نه بهعنوان یک inbound در Xray — چون Xray-core بهصورت بومی از پروتکل hysteria2 پشتیبانی نمیکند.
سطح لایسنس لازم: استاندارد و بالاتر. سطح آزمایشی میتواند ورودیهای اشتراک hy2 را ببیند اما نمیتواند inbound بسازد یا مدیریت کند.
2053) در پنل کنترل ارائهدهنده میزبانی شما باز است — Contabo، Aeza و PTR همگی بهصورت پیشفرض UDP را محدود میکنند.
افزودن یک Inbound برای Hysteria2
داشبورد → تنظیمات → Hysteria2 → افزودن Inbound
| فیلد | مقدار | یادداشتها |
|---|---|---|
| Tag | hy2-main | هر نام یکتا |
| Listen port | 2053 | UDP — باید در فایروال باز باشد |
| Obfs type | salamander | توصیهشده — UDP را از DPI در چین/ایران/روسیه پنهان میکند |
| Obfs password | تصادفی قوی | openssl rand -hex 24 |
| Masquerade URL | https://www.bing.com | سایت HTTPS که hysteria برای بررسیهای DPI خود را شبیه آن جلوه میدهد |
| SNI | bing.com | TLS SNI ارائهشده به کلاینتها |
| TLS cert / key | برای خودکار خالی بگذارید | در صورت حذف، پنل بهصورت خودکار یک گواهی خودامضای ۱۰ ساله تولید میکند |
ساخت inbound پیکربندی را با هر نود متصل همگام میکند و دیمن hysteria را روی هرکدام بالا میآورد. به SSH نیازی نیست.
افزودن هاست بهازای هر نود
داشبورد → هاستها → روی کارت inbound مربوط به Hysteria2 بزنید → افزودن هاست
برای هر نودی که میخواهید hy2 را روی آن در دسترس قرار دهید، یک ردیف هاست اضافه کنید:
| فیلد | مثال | الزامی |
|---|---|---|
| Remark | DE Frankfurt hy2 | بله |
| Address | de.example.com | بله — دامنه یا IP عمومی نود |
| Port | 2053 | بله — پورت UDP روی آن نود |
| Country code | DE | توصیهشده — تغییر ترتیب منطقهای اشتراک را هدایت میکند |
رندرکنندههای اشتراک بهصورت خودکار ورودیهای hy2:// را برای هر هاست فعال در کنار لینکهای موجود VLESS/VMess قرار میدهند. کلاینتها آن را در بازخوانی بعدی اشتراک میبینند.
از طریق API (نیازمند اطلاعات ورود ادمین sudo):
# 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 از بیرون مرکز داده. پورت در فایروال ارائهدهنده باز نیست. |
| تایماوت UDP | ISP یا میدلباکس UDP را میخورد — obfs salamander یا پورت دیگری را امتحان کنید |
| خطای TLS | گواهی خودامضا: اطمینان حاصل کنید کلاینت allowinsecure: true دارد یا اثرانگشت گواهی را تأمین کنید |
| دیمن روی نود راه نمیافتد | docker logs nexus-node 2>&1 | grep hysteria روی سرور نود |
سرور میانی (رله NAT)
یک سرور میانی، یک VPS ارزان است که بین کاربران شما و نودهایتان قرار میگیرد. ترافیک را از طریق iptables DNAT رله میکند، بنابراین کاربران صرفنظر از اینکه کدام نود آنها را سرویس میدهد، به یک IP پایدار متصل میشوند. زمانی مفید است که IP یک نود در کشوری مسدود شود — نود را تعویض کنید، NAT را روی سرور میانی دوباره تولید کنید، یک ورودی هاست را بهروزرسانی کنید.
راهاندازی اولیه
یک دستور نصب یکباره از پنل تولید کنید، سپس آن را روی VPS تازه بهعنوان root بچسبانید:
- در پنل، به تنظیمات ← سرورهای میانی بروید و روی تولید دستور نصب بزنید.
- دستور نشاندادهشده را کپی کنید — چیزی شبیه این است:
curl -fsSLk https://panel.example.com:8443/api/v1/middle-server/i/<token> | sudo 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 سرور میانی و پورت چاپشده اضافه کنید.
تعویض به یک سرور میانی جدید
وقتی سرور میانی کنونی مسدود شد یا میخواهید به VPS دیگری بروید:
- با SSH به VPS جدید وارد شوید و همان دستور واحد بالا را اجرا کنید
- در پنل ← صفحه هاستها، هر هاستی که آدرسش به IP سرور میانی قدیمی اشاره میکند را ویرایش و آن را به IP جدید تغییر دهید. پورتها ثابت میمانند.
- تمام — بدون تغییر نود، بدون نیاز به پیکربندی مجدد کاربر
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: Healthy → Suspect (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
ابزار nexus cli migrate یک نصب زنده Marzban را با صفر پیکربندی مجدد کاربر نهایی به NexusPanel منتقل میکند. روی همان میزبان Nexus اجرا میشود، پوشه داده Marzban را مستقیماً میخواند و از یک ماشین حالت اتمیک ۹ مرحلهای با بازگشت کامل تا دستور finalize استفاده میکند.
JWT_SECRET_KEY مربوط به Marzban را استخراج میکند و آن را بهعنوان MARZBAN_LEGACY_JWT_SECRET در env. مربوط به Nexus ذخیره میکند. هر آدرس اشتراک موجود Marzban از روز اول همچنان کار میکند — کاربران هرگز چیزی را دوباره وارد نمیکنند.
پیشنیازها
- نسخه Marzban بین ۰٫۶٫۰ تا ۰٫۸٫۴ (اسکریپت نصب رسمی،
marzbanیاmarzban_cli) - NexusPanel روی همان میزبان نصب شده باشد، یا بتواند
/var/lib/marzban/را بخواند - فضای دیسک آزاد برای یک اسنپشات از پایگاه داده SQLite مربوط به Marzban
مرحله ۱: اجرای آزمایشی
همیشه اول اجرای آزمایشی کنید. این کار از پایگاه داده Marzban اسنپشات میگیرد، هر وارد کردن را روی یک کپی موقت بازپخش میکند و در عرض چند ثانیه تمام میشود. هیچ چیزی روی Nexus یا Marzban نوشته نمیشود.
# 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 را تأیید کنید. پیش از ادامه، هر خطای علامتگذاریشده را رفع کنید.
مرحله ۲: جابجایی زنده
# 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 را بررسی کنید، سپس دوباره اجرا کنید.
# 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 جدولی از هاستهای منتقلشده چاپ میکند. آنها را راستیآزمایی کنید و سپس:
- یک آدرس اشتراک قدیمی Marzban را آزمایش کنید — باید یک پیکربندی معتبر برگرداند (بررسی سازگاری JWT)
- تعداد کاربران را بررسی کنید:
docker exec nexus-panel sqlite3 /var/lib/panel/db.sqlite3 'SELECT COUNT(*) FROM users;' nexus cli migrate post-cutoverرا اجرا کنید تا دیمنهای کهنه Marzban (marzguard، هوکهای کرون certbot) اسکن شوند- اگر از Hysteria2 استفاده میکنید: یک inbound + یک هاست بهازای هر نود اضافه کنید (به بخش Hysteria2 مراجعه کنید)
- نودها را از طریق داشبورد → نودها دوباره اضافه کنید (گواهی جدید، پورتهای 62060/62061)
- پس از پایدار شدن،
nexus cli migrate finalizeرا اجرا کنید تا اسنپشات آزاد شود
# 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
ابزار nexus cli migrate remnawave برخلاف مهاجرت از Marzban، مستقیم به پایگاه داده دست نمیزند — از طریق REST API پنل Remnawave متصل میشود، پس فقط به آدرس پنل و یک نامکاربری/رمز ادمین نیاز دارید:
# 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 و غیره):
- در داشبورد به تنظیمات بروید
- روی فعالسازی 2FA بزنید
- کد QR را با اپ احرازکننده خود اسکن کنید
- کد ۶ رقمی را برای تأیید وارد کنید
- کدهای بازیابی را در محلی امن ذخیره کنید
از طریق API:
# 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
CAPTCHA_PROVIDER="turnstile" TURNSTILE_SITE_KEY="0x4AAAAAAA..." TURNSTILE_SECRET_KEY="0x4AAAAAAA..."
کپچای داخلی
CAPTCHA_PROVIDER="builtin"
کپچای داخلی به هیچ سرویس خارجی نیاز ندارد و چالشهای ریاضی ساده تولید میکند.
محدودسازی نرخ
محدودسازی نرخ اندپوینت ورود بهصورت پیشفرض فعال است:
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
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 استفاده کنید:
curl -X PUT /api/v1/admin/admin \ -H "Authorization: Bearer TOKEN" \ -H "Content-Type: application/json" \ -d '{"password": "newSecurePassword123"}'
چطور پشتیبان بگیریم
SQLite
# 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
docker compose exec db pg_dump -U nexus nexuspanel > /backups/db-$(date +%Y%m%d).sql
.env، xray_config.json و هر قالب سفارشی خود پشتیبان بگیرید.
چطور بهروزرسانی کنیم
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
مهاجرتهای پایگاه داده بهصورت خودکار هنگام راهاندازی اجرا میشوند. همیشه پیش از بهروزرسانی از پایگاه داده خود پشتیبان بگیرید.
چطور قالبهای سفارشی اضافه کنیم
قالبهای سفارشی به شما امکان میدهند خروجی اشتراک را برای کلاینتهای مختلف کنترل کنید:
- فایلهای قالب خود را در پوشه قالبها بسازید:
mkdir -p /var/lib/nexuspanel/templates/clash nano /var/lib/nexuspanel/templates/clash/custom.yml
- قالب را در
.envارجاع دهید:
CUSTOM_TEMPLATES_DIRECTORY="/var/lib/panel/templates/" CLASH_SUBSCRIPTION_TEMPLATE="clash/custom.yml"
قالبها از نحو Jinja2 با دسترسی به داده کاربر، پیکربندی پروکسی و تنظیمات پنل پشتیبانی میکنند.
سفارشیسازی صفحه اشتراک
صفحه اشتراک رو به کاربر (که هنگام بازدید از یک لینک اشتراک در مرورگر نشان داده میشود) کاملاً قابل سفارشیسازی است:
- قالب پیشفرض را بهعنوان نقطه شروع کپی کنید:
cp -r /opt/nexuspanel/app/templates/subscription \ /var/lib/nexuspanel/templates/subscription
/var/lib/nexuspanel/templates/subscription/index.htmlرا ویرایش کنید- در
.envتنظیم کنید:
SUBSCRIPTION_PAGE_TEMPLATE="subscription/index.html"
متغیرهای قالب موجود شامل: user، sub_url، clash_url، singbox_url، usage، expire_date و brand_name است.
مستندات NexusPanel — با دقت ساخته شده است.