Skip to content

RosPanel

RosPanel

پنل مدیریت VPN خودمیزبان بر پایهٔ Xray-core — از یک سرور شخصی تا شبکه‌ای از نودها.

Release Downloads Go Xray-core React Platform Deploy

English · Русский · 简体中文 · العربية · فارسی · مستندات

RosPanel چیست · سرور را از کجا تهیه کنیم · شروع سریع · امکانات · CLI · معماری · سلب مسئولیت · توسعه · حمایت


RosPanel چیست

RosPanel یک پنل مدیریت VPN خودمیزبان است که بر پایهٔ Xray-core ساخته شده. یک پردازه هم‌زمان چند پروتکل را سرویس می‌دهد و پنل یک رابط وب برای کاربران، اشتراک‌ها، طرح‌ها و پرداخت‌ها، مسیریابی، آمار، پشتیبان‌ها و برندینگ در اختیارتان می‌گذارد — بدون ویرایش دستی فایل‌های پیکربندی. وقتی یک سرور دیگر کافی نباشد، همین پنل به یک شبکهٔ سرورها تبدیل می‌شود: نود اضافه کنید تا هر کاربر از طریق همهٔ آن‌ها سرویس بگیرد.

خودبسنده: یک فایل اجرایی ایستا — بدون nginx، بدون certbot، بدون اسکریپت‌های شخص ثالث. پنل گواهی TLS خود را از طریق ACME صادر می‌کند و دامنه اختیاری است: گواهی برای یک IP خالی هم صادر می‌شود. پنل بلافاصله پس از نصب روی نشانی خودش در دسترس است — بدون DNS، بدون reverse proxy، بدون تونل SSH. پیکربندی Xray از وضعیت پنل تولید می‌شود (هرگز دستی به JSON دست نمی‌زنید)، کاربران بدون قطع اتصال دیگران در لحظه اضافه و حذف می‌شوند، و اگر پایگاه داده خراب شود، پنل خودش را از آخرین پشتیبان بالا می‌آورد.

Note

این یک لایهٔ کنترل است، نه کلاینت VPN. سرور خود شما را پیکربندی و اداره می‌کند. این پروژه برای استفادهٔ آموزشی و پژوهشی در نظر گرفته شده است (نگاه کنید به سلب مسئولیت).


🖥️ سرور را از کجا تهیه کنیم

ارزان‌ترین VPS کافی است: 1 vCPU، 1 GB RAM، هر توزیع Linux — این برای پنل و Xray با ده‌ها کاربر بس است.

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

VDSina · Aeza · NetGrid · Serv.host · u1Host · Waicore

از همهٔ کسانی که از این طریق ثبت‌نام می‌کنند سپاسگزاریم 🙏


🚀 شروع سریع

گزینهٔ 1 — اسکریپت نصب (توصیه‌شده)

یک فرمان: نسخهٔ منتشرشده را دانلود می‌کند، سرویس systemd و nftables (اگر نباشد) را نصب می‌کند، آن را راه می‌اندازد و اطلاعات ورود را چاپ می‌کند.

curl -Ls https://raw.githubusercontent.com/AppsGanin/rospanel/main/install.sh | sudo bash

دامنه اختیاری است. اسکریپت آن را می‌پرسد: اگر دامنه دارید واردش کنید؛ اگر ندارید فقط Enter بزنید تا پنل روی IP سرور بالا بیاید. در هر دو حالت گواهی Let's Encrypt می‌گیرد — گواهی برای نشانی‌های IP هم صادر می‌شود، پس مرورگر هشداری نمی‌دهد.

می‌توانید دامنه را از پیش تعیین کنید و از پرسش بگذرید: curl -Ls … | sudo ROSPANEL_HOST=vpn.example.com bash.

گزینهٔ 2 — فایل اجرایی و systemd به‌صورت دستی

# آخرین نسخه را دانلود کنید (برای سرورهای ARM به‌جای amd64 بنویسید arm64)
curl -fsSL -o rospanel \
  https://github.com/AppsGanin/rospanel/releases/latest/download/rospanel-linux-amd64
chmod +x rospanel

# نصب به‌عنوان سرویس (فایل اجرایی را در /usr/local/bin کپی می‌کند، واحد systemd را می‌نویسد و راه‌اندازی می‌کند)
sudo ./rospanel install
#   همراه با دامنه از همان ابتدا:  sudo ROSPANEL_HOST=vpn.example.com ./rospanel install

# اطلاعات ورود و مسیر مخفی فقط یک بار چاپ می‌شوند:
journalctl -u rospanel | grep -A6 FIRST-RUN

گزینهٔ 3 — Docker

docker run -d --name rospanel \
  --network host \
  --cap-add NET_ADMIN \
  --device /dev/net/tun \
  -v rospanel-data:/data \
  ghcr.io/appsganin/rospanel:latest

docker logs rospanel | grep -A6 FIRST-RUN

Note

--network host لازم است تا Xray مستقیماً روی 443/TCP، 80/TCP و پورت‌های UDP مربوط به Hysteria2 گوش دهد؛ NET_ADMIN به پنل اجازه می‌دهد قواعد فایروال را مدیریت کند: port hopping، محدودیت اتصال‌ها و مسدودسازی حملات brute-force (nftables). --device /dev/net/tun چیزی است که مسیر AmneziaWG برای ساختن تونلش لازم دارد — کانتینر بدون آن هیچ دستگاه TUN دریافت نمی‌کند و capability به‌تنهایی کافی نیست. این گزینه را فقط وقتی حذف کنید که هرگز آن مسیر را فعال نمی‌کنید.

🔑 اطلاعات ورود پیش‌فرض

فیلد مقدار
نام کاربری admin
رمز عبور admin
مسیر پنل /rospanel/

بلافاصله پس از نصب، پنل در https://<domain-or-IP>/rospanel/ در دسترس است. پیوند دقیق در لاگ هم هست (journalctl -u rospanel | grep -A6 FIRST-RUN یا docker logs rospanel | grep -A6 FIRST-RUN).

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

Important

پس از تغییر، پنل فقط از طریق مسیر مخفی در دسترس است — ریشه یک صفحهٔ پوششی نشان می‌دهد. بدون دانستن /<secret>/ هیچ فرم ورودی برای یافتن وجود ندارد.

🌐 افزودن نود

نود یک سرور Ubuntu تمیز است که همین فایل اجرایی را در حالت نود اجرا می‌کند: پنل پیکربندی آن را تولید می‌کند و چیزی برای راه‌اندازی جداگانه وجود ندارد. همه‌چیز از رابط کاربری شروع می‌شود: سرورها ← افزودن نود، جایی که نام و دامنه یا IP نود را وارد می‌کنید. از آنجا دو گزینه دارید.

گزینهٔ 1 — فرمان نصب. پنل یک فرمان یک‌خطی آماده نشان می‌دهد؛ آن را روی سرور نود با کاربر root اجرا کنید:

curl -Ls https://raw.githubusercontent.com/AppsGanin/rospanel/main/install.sh \
  | sudo bash -s -- --join 'https://<panel>/<node-api-path>/v1/join#<token>'

فرمان را کامل و از همان پنجره کپی کنید — نشانی و توکن هر دو خودکار پر می‌شوند. توکن یک بار نمایش داده می‌شود و 24 ساعت اعتبار دارد؛ <node-api-path> بخشی جداگانه و غیرقابل‌حدس برای همگام‌سازی نودهاست (نه مسیر پنل است و نه مسیر REST API: تغییر هیچ‌کدام نودهای شما را جدا نمی‌کند). اگر پنل روی IP خالی اجرا شود (گواهی از یک CA عمومی نیست)، پنل خودش --insecure را به فرمان اضافه می‌کند.

گزینهٔ 1b — Docker. همان ایمیج پنل، در حالت نود. node install یک واحد systemd می‌نویسد که کانتینر جایی برای آن ندارد، پس پیوستن از طریق متغیرهای محیطی انجام می‌شود: فقط وقتی به کار می‌رود که volume هنوز node.json ندارد، بنابراین کانتینر را هر وقت خواستید می‌توانید دوباره بسازید و توکنِ مصرف‌شده در فایل compose چیزی را تغییر نمی‌دهد.

services:
  node:
    image: ghcr.io/appsganin/rospanel:latest
    command: node run
    network_mode: host          # Xray پورت‌های 443/TCP، 80/TCP و پورت‌های UDP مربوط به Hysteria2 را می‌گیرد
    cap_add: [NET_ADMIN]        # nftables: محدودیت به‌ازای هر IP، port hopping
    devices: [/dev/net/tun]     # تونل AmneziaWG؛ اگر آن مسیر خاموش می‌ماند حذفش کنید
    environment:
      ROSPANEL_JOIN: 'https://<panel>/<node-api-path>/v1/join#<token>'
      # ROSPANEL_JOIN_INSECURE: "1"   # فقط اگر پنل هنوز گواهی خودامضا دارد
    volumes: [rospanel-node:/data]
    restart: unless-stopped
volumes:
  rospanel-node:

دکمهٔ به‌روزرسانی نود در پنل فایل اجرایی را داخل کانتینر جایگزین می‌کند و خارج می‌شود، پس راه‌اندازی مجدد نسخهٔ ایمیج را برمی‌گرداند — نود Docker را با docker pull و یک کانتینر تازه به‌روز کنید. volume هویت نود را نگه می‌دارد، پس دوباره نمی‌پیوندد.

گزینهٔ 2 — نصب از طریق SSH. زبانهٔ «نصب از طریق SSH» در همان پنجره: پنل خودش وارد سرور می‌شود (نشانی، پورت، کاربر + رمز عبور یا کلید خصوصی PEM)، فایل اجرایی خودش را بارگذاری و عامل را نصب می‌کند — با لاگ زندهٔ نصب. نسخهٔ نود تضمیناً با نسخهٔ پنل یکسان است. اطلاعات SSH هرگز ذخیره نمی‌شود.

چند ثانیه پس از نصب، نود در فهرست به‌صورت آنلاین ظاهر می‌شود: نود از طریق HTTPS خروجی به پنل وصل می‌شود، پس پنل به دسترسی ورودی به آن نیاز ندارد و چیزی برای forward کردن وجود ندارد.

systemctl status rospanel-node        # سرویس نود
journalctl -u rospanel-node -f        # لاگ عامل
rospanel node status                  # وضعیت محلی

Note

هر سرور یا پنل است یا نود: هر دو از پورت 443 استفاده می‌کنند. اگر سرویس پنل از قبل روی دستگاه باشد، node install آن را غیرفعال می‌کند.


✨ امکانات

🔐 پروتکل‌ها، استتار، TLS

یک پیکربندی، یک مجموعه اطلاعات ورود: VLESS-Vision (TCP/443 + uTLS)، VLESS-XHTTP-REALITY (استتار به‌صورت TLS سایتی دیگر)، Hysteria2 (UDP + port hopping). علاوه بر این — ورودی‌های سفارشی روی هر سرور: VLESS / Trojan / Hysteria2 روی هر انتقالی (TCP، WebSocket، XHTTP، gRPC، HTTPUpgrade) و Shadowsocks-2022 (TCP خام) با پورت، کلیدهای REALITY و بازهٔ hop مخصوص خود و تنظیم دقیق انتقال (extra در XHTTP، استتار HTTP، sockopt، فیلدهای اضافی TLS) — به‌صورت فیلدهای جداگانه یا JSON خام؛ پیکربندی پیش از ذخیره روی خود دستگاه مقصد اعتبارسنجی می‌شود (xray -test + اتصال به پورت)، و ترکیب‌هایی که کلاینت از پسشان برنمی‌آید بی‌صدا از اشتراک‌های Clash/sing-box کنار گذاشته می‌شوند. دکمهٔ «بازگشت به تنظیمات کارخانه» در ویرایشگر اتصال‌ها پروتکل‌ها، پورت‌ها، اثرانگشت‌ها و ضد DPI را به وضعیت یک نصب تازه برمی‌گرداند و ورودی‌های سفارشی سرور را حذف می‌کند (کلیدهای REALITY/AmneziaWG و دهندهٔ REALITY و پورت آن می‌مانند؛ سرور اصلی پیش از آن از پیکربندی خود snapshot می‌گیرد). پنل پشت یک مسیر مخفی پنهان است؛ هر مسیر دیگری یک سایت پوششی (12 قالب) نشان می‌دهد. تشخیص کاوش IPی را که دنبال پنل پنهان می‌گردد — یعنی مسیرهای متمایز زیادی را درخواست می‌کند که سایت پوششی ندارد — شناسایی و برای بررسی مدیر ثبت می‌کند؛ پاسخ هرگز تغییر نمی‌کند، پس اسکنر همچنان فقط سایت پوششی را می‌بیند و استتار پابرجا می‌ماند. به‌طور اختیاری IP را در فایروال مسدود (nftables) و/یا خلاصهٔ روزانه‌ای از اسکنرهای جدید ارسال می‌کند — هر دو به‌طور پیش‌فرض خاموش‌اند و ثبت به‌تنهایی مبنای امن است. TLS از همان ابتدا — ACME (Let's Encrypt / ZeroSSL) با تمدید خودکار؛ گواهی را می‌توان برای یک IP خالی، بدون دامنه و بدون DNS هم صادر کرد.

آنچه اسکنر می‌بیند. سایت پوششی روی HTTP/3 هم پاسخ می‌دهد: Hysteria2 همان سایتی را روی UDP سرویس می‌دهد که روی TCP هست، اما این را با Alt-Svc اعلام نمی‌کند — مرورگری که از HTTP/3 باخبر شود، درخواست‌های پنل و /sub/ را هم به آنجا می‌فرستد، و آنجا فقط سایت پوششی پاسخ می‌دهد. هر نصب تازه دهندهٔ REALITY خود را تصادفی انتخاب می‌کند و کانال را روی 443 می‌گذارد — پورتی که کم‌تر از همه مسدود می‌شود. آنجا سرویس جلویی هر دو شنونده را می‌برد: ClientHello با یکی از دامنه‌های استتار REALITY به REALITY می‌رود و بقیه (نام خود سرور یا نشانی بی‌نام) به سایت طعمه، پس REALITY با دامنه استتار پنهان می‌شود نه با نام خود سرور. کانال روی پورت مستقل، دامنهٔ خود سرور را SNI می‌گیرد و کاوشگر گواهی واقعی سرور را می‌بیند. عیب‌یابی دربارهٔ چیزهایی که سرور را لو می‌دهند هشدار می‌دهد: گواهی خودامضا و دامنه‌ای که واژه‌هایی مثل vpn یا proxy در آن است — نام در لاگ‌های عمومی certificate transparency ثبت می‌شود.

مبهم‌سازی Hysteria2 (Salamander). Hysteria2 همان QUIC است و دست‌دهی QUIC تنها چیزی است که دستگاه DPI پیش از جریان یافتن هر ترافیکی می‌تواند از این مسیر تشخیص دهد. با روشن کردن آن، هر دیتاگرام با یک کلید از پیش مشترک XOR می‌شود، پس هیچ چیز روی سیم شبیه دست‌دهی نیست. کلید توسط پنل تولید می‌شود، نه تایپ — مانند مواد REALITY — و در هر پیوند و پروفایلی که پنل ارائه می‌دهد قرار می‌گیرد، پس کلاینت‌ها در به‌روزرسانی بعدی اشتراک آن را دریافت می‌کنند. روی مسیر داخلی و روی هر ورودی سفارشی Hysteria2، هر کدام با کلید خودش، در دسترس است.

AmneziaWG 3.1 چهارمین مسیر داخلی است: WireGuardی که دست‌دهی‌اش پشت بسته‌های زائد و سرآیندهای تصادفی‌نما پنهان است، برای اپ‌های AmneziaVPN و AmneziaWG. نسخهٔ 3.1 حفاظت از سرآیند را اضافه می‌کند — بخش‌هایی از سرآیند بسته که آشکار می‌ماندند اثرانگشتی ثابت بودند که دستگاه DPI می‌توانست بدون دیدن دست‌دهی تطبیقش دهد — به‌اضافهٔ padding روی هر چهار نوع پیام، سرآیندهایی که از یک بازه انتخاب می‌شوند نه ثابت، و زمان‌سنج‌هایی پراکنده به‌جای ثابت، تا نشست هیچ دوره‌ای برای قفل شدن روی آن نداشته باشد. پیش از هر دست‌دهی، کلاینت زنجیرهٔ کوتاهی از دیتاگرام‌های پوششی (I1/I2) هم می‌فرستد که شکل یک پروتکل معمولی UDP را دارند — یک QUIC Initial، یک پرس‌وجوی DNS یا یک STUN binding request، یک پروفایل برای هر سرور — تا نخستین بستهٔ یک جریان تازه چیزی باشد که دستگاه DPI می‌شناسد، نه یک دادهٔ ناشناخته. پنل آن‌ها را تولید می‌کند؛ چیزی برای چسباندن نیست، و بخش‌هایی که پروتکل آزاد می‌گذارد (شناسه‌های اتصال، نام‌های پرس‌وجو، شناسه‌های تراکنش) در هر بسته از نو انتخاب می‌شوند، نه یک بار ضبط‌شده. به Amnezia VPN 5.0.1.5 یا جدیدتر نیاز دارد؛ سروری که پارامترهایش پیش از 3.1 تولید شده‌اند تا زمانی که آن را بازتولید کنید بدون تغییر با همان‌ها کار می‌کند، و بازتولید، مثل همیشه، پیکربندی‌هایی را که برای آن سرور داده شده‌اند باطل می‌کند. موتور پروتکل (amneziawg-go) درون پردازهٔ پنل اجرا می‌شود — بدون daemon، بدون فایل اجرایی اضافه — یک تونل برای هر سرور (سرور اصلی و هر نود)، هر کدام با جفت‌کلید و پارامترهای مبهم‌سازی خودش که پنل تولید می‌کند؛ کاربر روی هر سروری که اجازه دارد یک peer است، با یک جفت‌کلید و یک نشانی تونل در همه‌جا. آن را در اتصال‌ها مانند هر مسیر دیگری روشن کنید (پورت UDP به‌جای 51820، که بدون هیچ دست‌دهی‌ای شناسایی می‌شود، بالا و تصادفی انتخاب می‌شود)؛ کاربران پیکربندی را به‌صورت فایل یا QR در صفحهٔ اشتراک و در کارت خود دریافت می‌کنند، و گروه‌های دسترسی، محدودیت دستگاه، حسابرسی ترافیک و وضعیت آنلاین دقیقاً مانند مسیرهای Xray با آن رفتار می‌کنند. به /dev/net/tun و CAP_NET_ADMIN نیاز دارد که سرویس نصب‌شده آن‌ها را دارد؛ در Docker خودتان آن‌ها را بدهید (--device /dev/net/tun --cap-add NET_ADMIN)، چون کانتینر به‌طور پیش‌فرض دستگاه TUN ندارد. nftables برای NAT تونل.

NaiveProxy یک مسیر داخلی روی پورت VLESS-TCP-TLS است: کلاینتی با پشتهٔ شبکهٔ Chrome که سایت پوششی پشت :443 با همان گواهی آن را سرویس می‌دهد. مسیریابی، حسابرسی ترافیک، محدودیت‌ها و قطع اتصال مانند مسیرهای دیگر کار می‌کنند. نام کاربری u<id> و رمز عبور UUID کاربر است. در اشتراک به کلاینت‌هایی می‌رسد که آن را وارد می‌کنند — Shadowrocket (به‌صورت http2://)، v2rayN، Karing، Throne، Exclave — وقتی گواهی معتبر باشد (دامنه یا گواهی IP از Let's Encrypt).

mieru یک مسیر داخلی روی پورت TCP مخصوص خودش است که خودکار انتخاب می‌شود. نام کاربری u<id> و رمز عبور UUID کاربر است؛ مسیریابی، حسابرسی ترافیک، محدودیت‌ها و قطع اتصال مانند مسیرهای دیگر کار می‌کنند. در اشتراک به کلاینت‌هایی می‌رسد که آن را وارد می‌کنند — پروفایل Clash برای کلاینت‌هایی که نسخه‌شان ثابت می‌کند هسته‌شان آن را دارد (خود mihomo، FlClash، FlClashX، Koala Clash، Clash Verge Rev، Mihomo Party، Sparkle، ClashMetaForAndroid، ClashMi)، و پیوند mierus:// برای Shadowrocket، Throne، Exclave و Karing.

AnyTLS یک مسیر داخلی روی پورت VLESS-TCP-TLS است، پشت همان گواهی و سایت پوششی؛ رمز عبور UUID کاربر است. به کلاینت‌های sing-box، پروفایل Clash (هسته‌های mihomo که آن را دارند)، v2rayN، Shadowrocket، Throne، Exclave، Karing و NekoBox می‌رسد، وقتی گواهی معتبر باشد.

MTProto (پروکسی Telegram) یک مسیر داخلی روی پورت TCP مخصوص خودش است که خودکار انتخاب می‌شود و به‌طور پیش‌فرض روشن است: خود Telegram از طریق سرور وصل می‌شود و برنامهٔ VPN لازم نیست. ‏fake TLS با سکرتی جدا برای هر کاربر که از UUID او ساخته می‌شود — کاربر غیرفعال آن را از دست می‌دهد و بازنشانی UUID آن را عوض می‌کند. سکرت دامنهٔ سرور (SNI یا میزبان آن) را دارد، یا اگر دامنه ندارد نامی که به نشانی آن اشاره می‌کند (<ip>.sslip.io) — نه نام سایتی دیگر، که DPI چنین SNI را مسدود می‌کند؛ این نام در اولین اجرا ذخیره می‌شود و فقط در «اتصال‌ها» تغییر می‌کند، چون هر پروکسی که کاربران اضافه کرده‌اند آن را دارد. هر اتصالی که کلاینت پروکسی نباشد به همان سایت سپرده می‌شود. ترافیک از طریق Xray خارج می‌شود، پس مسیریابی، شمارش، محدودیت‌ها و قطع اتصال مثل مسیرهای دیگر کار می‌کنند. در صفحهٔ اشتراک برای هر سرور پروکسی هست: QR، «افزودن به Telegram» و لینک t.me.

TURN-VK (WireGuard روی تماس‌ها) (آزمایشی: ممکن است در نسخه‌های آینده تغییر کند یا حذف شود) یک پروتکل ورودی سفارشی برای شبکه‌های موبایلی است که جز یک فهرست سفید چیزی را عبور نمی‌دهند. از نگاه شبکه یک تماس است. رله با قالب استتارشدهٔ Free Turn Proxy حرف می‌زند — هر دیتاگرام به شکل صدای RTP/Opus یک تماس WebRTC بسته‌بندی می‌شود (rtpopus3، با کلیدی که پنل تولید می‌کند) — چون VK ترافیک TURNی را که شبیه رسانهٔ یک تماس نیست محدود می‌کند؛ DTLS سادهٔ vk-turn-proxy هم همچنان روی همان پورت سرویس داده می‌شود. پنل خودش رله را اجرا می‌کند (درون پردازه، روی سرور اصلی و روی نودها) و بسته‌ها را روی loopback به ورودی WireGuard خود Xray تحویل می‌دهد، پس این مسیر مانند هر ورودی دیگری یک ورودی Xray است: افزودن و حذف زندهٔ کاربران بدون دست زدن به نشست دیگران، گروه‌های دسترسی، مسیریابی (WARP، مسیرهای پراکسی، مسدودسازی)، ترافیک به‌ازای هر کاربر و وضعیت آنلاین. کاربران با همان کلید و نشانی تونلی که در AmneziaWG دارند peer هستند — چیز تازه‌ای برای صدور نیست. آن را در اتصال‌ها ← ورودی‌های سفارشی بسازید (پروتکل TURN-VK، پورت UDP پیش‌فرض 56000، پیوند تماس VK اختیاری برای ارائه)؛ در صفحهٔ اشتراک کاربران پیوندهای وارد کردن با یک لمس دریافت می‌کنند که کل سرور را به اپی با WireGuard داخلی اضافه می‌کنند — vkturnproxy:// برای VK Turn Proxy روی iOS (TestFlight)، freeturn:// برای Free Turn Proxy روی Android (و کلاینت خط فرمان آن روی رایانه‌ها)، و wingsv:// برای WINGS V روی Android و WINGS V DeX روی Windows و Linux، که قالب استتار را نمی‌شناسد و بدون استتار وصل می‌شود — و در بخش راه‌اندازی دستی، نشانی رله، پیوند تماس و یک پیکربندی سادهٔ WireGuard که به یک کلاینت TURN اشاره می‌کند.

👤 کاربران

محدودیت ترافیک و زمان با غیرفعال‌سازی خودکار و بازنشانی خودکار سهمیه (روزانه/هفتگی/ماهانه/سالانه). کاربر غیرفعال، یا کاربری که ترافیکش تمام شده، اتصال‌هایی را هم که از قبل باز نگه داشته از دست می‌دهد؛ سهمیه‌ها هر 10 ثانیه، روی سرور اصلی و روی نودها، بررسی می‌شوند. همچنین، به‌جای تاریخ پایان، مدتی که با نخستین اتصال آغاز می‌شود: N روز که تا وقتی کلید استفاده نشده سپری نمی‌شوند و با نخستین اتصال شروع می‌شوند (تمدید، روزها را به چنین مدتی اضافه می‌کند و طرح، مدت خودش را جایگزین آن می‌کند)، محدودیت دستگاه (برای اینکه دقیقاً چه چیزی شمرده می‌شود، اتصال دستگاه را در ادامه ببینید) و سقف سرعت به‌ازای هر کاربر. حسابرسی ترافیک از طریق Xray Stats، وضعیت آنلاین، فهرست اتصال‌ها؛ کاربران منقضی‌شده را می‌توان خودکار حذف کرد. هر کاربر یک یادداشت مدیر (از کجا آمده، چه توافقی شده — فقط در پنل و API، هرگز به کلاینت نشان داده نمی‌شود) و برچسب‌ها (vip، reseller-a) دارد که فهرست بر اساس آن‌ها فیلتر می‌شود و جست‌وجو آن‌ها را پوشش می‌دهد، همراه با شناسهٔ کلاینت Xray (u12) که کنار نام نمایش داده می‌شود تا هر خط لاگ در یک نگاه به یک حساب نگاشت شود. ورود و خروج داده: صفحهٔ کاربران پایگاه دادهٔ Marzban یا dump مربوط به GET /api/users، پایگاه Marzneshin، پایگاه Rebecca، خروجی Remnawave، فایل x-ui.db از 3x-ui و خروجی خود این پنل را می‌خواند — و آن خروجی را با یک دکمه می‌نویسد. کاربران با همان UUIDها و رمزهای عبور (در Marzneshin UUID تازه ساخته می‌شود و کلید به‌عنوان توکن اشتراک می‌ماند، پس کلاینت خودکار به‌روزرسانی می‌شود)، محدودیت‌ها، انقضا (از جمله مدتی که با نخستین اتصال آغاز می‌شود — on_hold در Marzban و «شروع پس از نخستین استفاده» در 3x-ui)، ترافیک مصرف‌شده، یادداشت‌ها و برچسب‌ها منتقل می‌شوند، پس هیچ‌کس لازم نیست سرور را دوباره در اپ خود اضافه کند؛ توکن اشتراک هم هر جا منبع آن را داشته باشد منتقل می‌شود (subId در 3x-ui، dump مربوط به Marzban، و همیشه از خروجی خود این پنل)، پس انتقال یک دامنه به نصب تازه همهٔ پیوندهای اشتراک موجود را کارا نگه می‌دارد. کاربری که از قبل اینجا هست (همان UUID) رد می‌شود، پس اجرای دوبارهٔ فایل کسی را تکراری نمی‌کند، توکنی که کاربر دیگری دارد به‌جای رد شدن جایگزین می‌شود، و فایل بارگذاری‌شده همان لحظه که خوانده شد حذف می‌شود. جست‌وجو و فیلترها با صدها کاربر سریع می‌مانند، و عملیات گروهی (فعال/غیرفعال‌سازی/بازنشانی/تمدید/حذف) با یک بار بارگذاری مجدد Xray انجام می‌شوند. داشبورد CPU / RAM / swap / دیسک و ترافیک VPN را به‌صورت زنده نشان می‌دهد. نقشهٔ اتصال‌ها نشان می‌دهد کلاینت‌ها از کجا وصل می‌شوند — IPهای مبدأ متمایز به‌تفکیک کشور (از همان پایگاه دادهٔ geoip که Xray با آن مسیریابی می‌کند) و به‌تفکیک اپراتور شبکه / ASN (از جدول رایگان iptoasn که پنل خودش دریافت می‌کند)؛ بدون سرویس خارجی.

محدودیت دستگاه — چه چیزی را می‌شمارد. محدودیت دستگاه کاربر (یا محدودیتی که طرحش تعیین می‌کند) یک عدد است که به دو روش اعمال می‌شود. به‌تنهایی، سقف IPهای مبدأ یکتای هم‌زمان را تعیین می‌کند: کاربری که در بازهٔ آنلاین از نشانی‌های متمایز بیشتری از حد مجاز وصل شود، تا زمانی که دوباره زیر حد برگردد از تونل‌ها کنار گذاشته می‌شود — شمارش روی همهٔ سرورها (سرور اصلی و نودها) انجام می‌شود، نه به‌ازای هر سرور. 0 یعنی بدون سقف IP.

قطع فوری نیست. حد باید دو و نیم دقیقه، کمی بیشتر از بازهٔ آنلاین، فراتر رفته بماند؛ پنل هر 30 ثانیه محدودیت‌های دستگاه را بررسی می‌کند، پس قطع دو و نیم تا سه و نیم دقیقه پس از ظاهر شدن دستگاه اضافه رخ می‌دهد. دلیلش این است که دو رایج‌ترین راه فراتر رفتن از حد اصلاً اشتراک‌گذاری نیستند: گوشی‌ای که شبکه عوض می‌کند نشانی قبلی‌اش را رها می‌کند، در حالی که آن نشانی تا وقتی بازه آن را کنار بگذارد هنوز تازه دیده‌شده به شمار می‌رود، و اپراتور موبایل نشانی عمومی را درون مخزن خودش بی‌هیچ اقدامی از سوی کاربر می‌چرخاند (یک حساب واقعی در یک ماه هفت نشانی در یک 176.15.0.0/16 نشان می‌دهد). تنها راه تشخیص هر کدام از دستگاه دوم این است که ببینیم آیا نشانی قبلی همچنان استفاده می‌شود — یعنی کاربر را قطع نکنیم، چون قطع کردن همان چیزی است که مانع داوری دربارهٔ ترافیک می‌شود. پس حد منتظر می‌ماند و نشانی رهاشده خودش از بازه خارج می‌شود. نشانی‌هایی که واقعاً هم‌زمان استفاده می‌شوند وقتی انتظار تمام شد همه هنوز آنجا هستند و قطع مانند قبل اعمال می‌شود.

تنظیمات ← اشتراک‌ها ← شمارش دستگاه‌ها بر اساس ← فقط HWID شمارش نشانی‌ها را کاملاً کنار می‌گذارد — به قیمت از دست دادن تنها چیزی که سقف تعداد جاهایی را تعیین می‌کند که یک پیوند هم‌زمان استفاده می‌شود، چون HWID سقف کسانی را تعیین می‌کند که می‌توانند اشتراک را دریافت کنند، نه کسانی که می‌توانند وصل شوند. پیش‌فرض هر دو را می‌شمارد.

اتصال دستگاه (HWID). با روشن کردن آن، همان عدد سقف نصب‌های متمایز را هم تعیین می‌کند. کلاینت‌هایی که از قرارداد سرآیند اشتراک پیروی می‌کنند (Happ، v2RayTun) یک شناسهٔ نصب پایدار می‌فرستند؛ پنل در نخستین دریافت آن را به حساب متصل می‌کند و در برابر حد می‌شمارد. وقتی حد پر شد، به نصب تازه اشتراک داده نمی‌شود در حالی که نصب‌های متصل‌شده همچنان به‌روز می‌شوند — بررسی و درج یک تراکنش‌اند، پس دو کلاینت نمی‌توانند هر دو آخرین جای خالی را بگیرند. (وقتی حد خود کاربر 0 باشد، HWID به‌جای آن از یک حد جایگزین سراسری پنل استفاده می‌کند.) دستگاه‌ها در کارت کاربر، در ربات کلاینت (به‌صورت خط‌های جداگانهٔ بر اساس IP و بر اساس HWID وقتی هر دو اعمال شوند) و در صفحهٔ اشتراک فهرست می‌شوند، جایی که صاحب حساب می‌تواند خودش یکی را آزاد کند به‌جای نوشتن به پشتیبانی؛ دستگاه بیکار پس از TTL قابل‌تنظیم جای خود را آزاد می‌کند، و چرخاندن پیوند اشتراک همه را آزاد می‌کند. به‌طور پیش‌فرض خاموش است (تنظیمات ← اشتراک‌ها)؛ وقتی روشن شود، کلاینتی که هیچ شناسه‌ای نفرستد اصلاً اشتراک دریافت نمی‌کند — سقفی که بتوان با رفتن به اپی ساکت‌تر از آن فرار کرد سقف نیست — با کلیدی برای سرویس دادن به آن کلاینت‌ها در هر حال (شمارش بر اساس نشانی، مانند قبل) اگر برخی از کاربرانتان از آن‌ها استفاده می‌کنند.

محدودیت سرعت. سقفی به‌ازای هر کاربر بر حسب kbit/s، که دستی یا توسط طرح تعیین می‌شود. Xray محدودیت پهنای باند به‌ازای هر کاربر ندارد، پس زیر آن اعمال می‌شود — با زمان‌بند خود کرنل (HTB)، بر اساس نشانی‌هایی که کاربر در حال حاضر از آن‌ها وصل است، در هر دو جهت. یعنی همهٔ پروتکل‌ها را یک‌جا پوشش می‌دهد، همهٔ کسانی که پشت یک نشانی NAT هستند یک سقف مشترک دارند، و برای Hysteria2 (که کنترل ازدحامش عمداً اتلاف بسته را نادیده می‌گیرد) رسیدن به سقف به شکل اتلاف بسته دیده می‌شود نه کندی نرم. نودها ترافیک خودشان را بر اساس دید خودشان از اینکه چه کسی وصل است شکل می‌دهند.

گروه‌های دسترسی تعیین می‌کنند کاربر چه اتصال‌هایی بگیرد: مسیرهای داخلی و ورودی‌های سفارشی به‌ازای هر سرور تیک زده می‌شوند، کاربر بدون گروه همه‌چیز را می‌گیرد، و کاربر عضو چند گروه اجتماع اتصال‌های آن‌ها را می‌گیرد. این محدودیت سمت سرور است — حساب اصلاً به ورودی‌های ممنوع Xray اضافه نمی‌شود (به‌جای اینکه در رابط کاربری پنهان شود)، پس هم اشتراک و هم پیوندی که دستی ساخته شده فقط آنچه مجاز است را ارائه می‌دهند. عضویت از هر دو سو قابل‌ویرایش است — در کارت کاربر و در خود گروه — و گروه‌های کاربر در کارت او و در فهرست دیده می‌شوند. گروه می‌تواند سقف سرعت هم داشته باشد: اگر تعیین شود، بر سقف طرح و سقف شخصی اعضا اولویت دارد (عضو چند گروه بیشترین را می‌گیرد)، و محدودسازی ترافیک مشکوک با آن برداشته نمی‌شود. طرحی که چنین گروهی را اعطا کند همان سرعت را به کاربرانش می‌دهد. گروهی که بدون تیک هیچ اتصالی ذخیره شود دسترسی را محدود نمی‌کند — یک ردهٔ سرعت در یک فیلد. گروهی که اتصال‌هایش خودبه‌خود از بین رفته‌اند (یک ورودی یا نود حذف شده) همچنان اعضایش را محدود می‌کند، به‌جای اینکه همه‌چیز را برایشان باز کند.

📲 اشتراک‌ها

/<path>/<token> — یک فهرست base64 به‌اضافهٔ صفحه‌ای با کد QR، پیوندهای مستقیم و وارد کردن در کلاینت‌های محبوب (سرآیندهای مسیریابی خودکار برای Happ / INCY / Mihomo)، با نام‌های دلخواه شما برای نودها. پیوند را می‌توان بازنشانی کرد (چرخش توکن) بدون تغییر UUIDها و رمزهای عبور. اعلان درون کلاینت (Happ، v2RayTun) متنی کوتاه را مستقیماً در اپ نشان می‌دهد. پیوند رمزنگاری‌شده برای Happ (تنظیمات ← اشتراک‌ها): دکمهٔ Happ اشتراک را از طریق happ://crypt4/… اضافه می‌کند، پس اپ هرگز نشانی آن را نشان نمی‌دهد؛ همین پیوند را می‌توان از کارت کاربر کپی کرد.

دستیار اتصال در 3 گام: سکو تشخیص داده می‌شود، سپس دانلود رسمی Happ (App Store روسیه برای iPhone جداگانه)، سپس اشتراک با یک لمس اضافه می‌شود. وقتی به صفحهٔ اصلی اضافه شود، صفحه مانند یک اپ باز می‌شود. درون Telegram بخشی از آن به نظر می‌رسد: رنگ سرآیند، دکمهٔ Back سیستم، بازخورد لمسی. مدت‌ها قیمت هر روز و میزان صرفه‌جویی را نشان می‌دهند.

Mini App در یک نشانی ثابت (تصادفی برای هر نصب، نمایش‌داده‌شده در تنظیمات ← Telegram) — بدون توکن در پیوند: Telegram دادهٔ کاربر را امضا می‌کند، پنل حساب او را پیدا می‌کند و صفحه‌اش را باز می‌کند. دکمهٔ منوی ربات به اینجا می‌رود. با تنظیم نشانی در @BotFather (Configure Mini App)، پیوندهای t.me/<bot>?startapp=ref_… و ?startapp=<tag> یک دعوت و یک برچسب منبع را حمل می‌کنند؛ کاربر تازه، تا وقتی ثبت‌نام باز است، همان‌جا ثبت می‌شود.

متغیرها در نام اتصال‌ها. نام یک مسیر یا ورودی سفارشی می‌تواند {server}، {user}، {used}، {left}، {total}، {expire} و {days} داشته باشد؛ پنل هنگام ساختن اشتراک آن‌ها را برای هر کاربر جایگذاری می‌کند، پس کلاینت می‌تواند «Amsterdam · 75 GB left» را نشان دهد بی‌آنکه مدیر برای هر نفر یک نام نگه دارد. نامی که خودش {server} را جایی قرار دهد، به‌جای اینکه پیشوند خودکار «server · lane» به آن اضافه شود، جایگزین آن پیشوند می‌شود. پیش از استفاده از {left} یا {days} بدانید: نامی که تغییر می‌کند در هر به‌روزرسانی اشتراک برای کلاینت نام سروری تازه است، که سرور انتخاب‌شدهٔ کاربر را بازنشانی می‌کند — نام پایدار {server} است.

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

قالب‌های پروفایل (تنظیمات ← اشتراک‌ها) به شما امکان می‌دهند سند تولیدشده برای mihomo/Clash، sing-box و Xray JSON را با سند خودتان جایگزین کنید — DNS خودتان، گروه‌های خودتان، مجموعه قواعد خودتان — و سرورهای پنل در جایی که علامت می‌زنید درج شوند ({{proxies}}، {{tags}}، {{group}} برای sing-box، {{outbounds}} و {{remarks}} برای Xray JSON، نشانگرهای آشنای # LEAVE THIS LINE! برای mihomo). ساختن سرورها همچنان کار پنل است، پس قالب نمی‌تواند مدخلی تولید کند که کلاینت ردش کند. قالب هنگام ذخیره بررسی می‌شود، و اگر روزی در زمان رندر شکست بخورد، پنل به‌جای آن پروفایل تولیدشده را سرویس می‌دهد — کلاینتی که نتواند پروفایلی را تجزیه کند همهٔ سرورهای آن را کنار می‌گذارد، پس پروفایل خراب هرگز نباید به کلاینت برسد. پروفایل تولیدشدهٔ sing-box برای sing-box 1.12 و بالاتر است (سرورهای DNS با type/server مشخص، نام سرورها از طریق route.default_domain_resolver resolve می‌شوند). قالب sing-box که از فیلدی استفاده کند که 1.13/1.14 دیگر بارگذاری نمی‌کنند (dns.servers[].address، outbound از نوع dns/wireguard، sniff در inbound، geosite/geoip و مانند آن) هنگام ذخیره رد می‌شود، و قالبی که پیش‌تر ذخیره شده با پروفایل تولیدشده جایگزین می‌شود و یک خط در لاگ ثبت می‌شود.

قواعد پاسخ اشتراک را برای کلاینت‌های منطبق تغییر می‌دهند: فهرستی مرتب از قواعد مدیر که با درخواست تطبیق داده می‌شوند (User-Agent یا یک سرآیند HWID؛ شامل، برابر، پیشوند، regex). یک قاعده قالبی را تحمیل می‌کند، پروتکل‌های جداگانه را می‌دهد یا پنهان می‌کند (مسیرهای داخلی، ورودی‌های سفارشی، VLESS Encryption)، یا کلاینت را مسدود می‌کند (سایت پوششی به او داده می‌شود). نخستین قاعدهٔ منطبق برنده است؛ اگر هیچ قاعده‌ای منطبق نباشد، تشخیص بر اساس User-Agent انجام می‌شود. ویرایشگر نشان می‌دهد یک کلاینت مشخص چه چیزی دریافت می‌کند.

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

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

مسیر ازکارافتاده — AmneziaWG، mieru، MTProto یا رلهٔ TURN که نتوانست پورتش را بگیرد — پس از دو دقیقه از اشتراک خارج می‌شود و به محض بالا آمدن برمی‌گردد. سرور هر دقیقه دوباره تلاش می‌کند، و به مدیران هنگام رفتن و برگشتن آن خبر داده می‌شود.

ترتیب سرورها (تنظیمات ← اشتراک‌ها) تعیین می‌کند کلاینت کدام سرور را اول ببیند — و اینکه سرور پر اصلاً نشان داده شود یا نه. هر سرور یک وزن دستی و یک ظرفیت بر حسب کاربر دارد که روی کارتش در سرورها تنظیم می‌شود. سه حالت: دستی (وزن، سپس فهرست)، کم‌بارترین اول (کاربران آنلاین نسبت به ظرفیت) و تصادفی — ترتیبی تازه در هر به‌روزرسانی، تا کلاینت‌هایی که به نخستین سرور وصل می‌شوند بین همهٔ سرورها پخش شوند. سروری که با پنهان کردن هنگام پر بودن علامت خورده تا وقتی به ظرفیتش رسیده از اشتراک خارج می‌شود — هرگز آخرین سرور، چون اشتراک خالی همهٔ کلاینت‌ها را سرگردان می‌کند. بار به‌ازای هر سرور از همان مشاهده‌هایی شمرده می‌شود که محدودیت دستگاه را تغذیه می‌کنند، و صفحهٔ سرورها عدد زنده را کنار هر ظرفیت نشان می‌دهد.

دور زدن DPI در سمت کلاینت (تنظیمات ← اشتراک‌ها) همان چیزی است که اشتراک به اپ می‌گوید با دست‌دهی TLS پیش از اینکه دستگاه DPI آن را ببیند چه کند — سرور دست‌نخورده می‌ماند. برای اپ‌های Xray-core (Happ، v2rayNG، v2rayN، Streisand) یک قالب اشتراک Xray JSON وجود دارد: یک پیکربندی کامل برای هر مسیر، برگرفته از همان پیوند اشتراک‌گذاری که پنل از قبل می‌سازد، با یک outbound از نوع freedom که پراکسی از طریق آن شماره‌گیری می‌کند و fragment (تقسیم ClientHello: tlshello / نخستین بسته‌ها، طول قطعه، فاصله) و noise (بسته‌های تصادفی، رشته‌ای یا base64 پیش از داده) را حمل می‌کند. پس از روشن شدن خودکار به آن اپ‌ها داده می‌شود، و همیشه از طریق ?format=xray-json یا یک قاعدهٔ پاسخ در دسترس است. برای sing-box، record fragment ClientHello را علاوه بر fragmentation سطح بسته که در اتصال‌ها تنظیم می‌شود، به چند رکورد TLS تقسیم می‌کند.

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

🧭 مسیریابی و خروجی

دسته‌های block / direct / WARP / Opera با اولویت، پیش‌تنظیم‌های geosite/geoip با دانلود خودکار پایگاه داده‌ها، خروجی از طریق Cloudflare WARP (WireGuard) و Opera VPN رایگان با انتخاب منطقه. مسیر WARP روی چند endpoint از Cloudflare به‌طور هم‌زمان قرار دارد — بازه‌های نشانی متفاوت و پورت‌های UDP متفاوت، با بررسی سلامت، پس ارائه‌دهنده‌ای که یک بازه یا یک پورت را مسدود کند هزینه‌ای برای مسیر ندارد. peerهای آن به‌صورت نشانی نوشته می‌شوند، هرگز نام میزبان: Xray یک endpoint از WireGuard را از طریق سرورهای DNS خودش resolve می‌کند، و مسیری که به آن‌ها وابسته باشد هر جا که فیلتر شده باشند بی‌صدا از کار می‌افتد. مسیرهای پراکسی خروجی‌های مستقلی هستند، هر کدام با upstreamها و قواعد منطقهٔ خود، که بین هر آنچه زنده است متوازن می‌شوند (Observatory). upstream یک پراکسی socks5/http یا سرور VPN شخصی دیگر است: یک پیوند vless:// / trojan:// / ss:// / vmess:// / hysteria2://، یا یک اشتراک کامل (https://…، happ://crypt…، base64) — پنل آن را رمزگشایی می‌کند و مدام دوباره می‌خواند. وقتی مسیری نتواند ترافیکش را حمل کند — همهٔ upstreamها در بررسی شکست بخورند، هیچ upstreamی resolve نشود، کمک‌کنندهٔ Opera در دسترس نباشد، WARP بدون حساب فعال باشد — آن ترافیک به‌طور پیش‌فرض به direct برمی‌گردد تا جریان ادامه یابد، از نشانی خود سرور. «هنگام از کار افتادن مسیر هرگز به direct برنگرد» (به‌ازای هر سرور، زیر ترتیب مسیریابی) به‌جای آن ترافیک را کنار می‌گذارد، برای کلاینت‌هایی که دقیقاً از طریق یک مسیر هدایت می‌شوند تا ترافیکشان از آن نشانی خارج نشود. مسیرهای خاموش تحت تأثیر نیستند. فهرست پراکسی‌ای که میزبانش در به‌روزرسانی شکست بخورد، به‌جای خالی کردن مسیر، پراکسی‌هایی را که دفعهٔ قبل برگردانده بود نگه می‌دارد — اینکه آن‌ها هنوز کار می‌کنند یا نه را بررسی سلامت، روی خود پراکسی‌ها، تعیین می‌کند.

آبشارها. upstreamهای یک مسیر می‌توانند سرورهای خود ما باشند (منبع «سرورها»): کاربران به این سرور وصل می‌شوند و از طریق سرورهای انتخاب‌شده به اینترنت می‌رسند. این ورودی برای کشوری با فهرست سفید است، جایی که سرور محلی در دسترس است و سرور خارجی نه. هر خروجی از طریق اتصالی به انتخاب شما در دسترس قرار می‌گیرد: VLESS-XHTTP-REALITY، VLESS-TCP-TLS یا Hysteria2. پنل کلید پل را خودش می‌سازد، و خروجی آن را فقط از نشانی‌های ورودی می‌پذیرد. ترافیک روی ورودی شمرده می‌شود و هرگز از نشانی آن به اینترنت نمی‌رود. خروجی‌ای که آبشاری از آن می‌گذرد قابل خاموش کردن یا حذف نیست. اینکه چه کسی ورودی را بگیرد به گروه‌های دسترسی بستگی دارد.

snapshotهای پیکربندی (زبانهٔ Snapshots در تنظیمات سرور) تاریخچه‌ای برای بازگردانی کل پیکربندی سرور فراهم می‌کنند — پروتکل‌ها، پورت‌ها، REALITY، مسیریابی، خروجی، DNS، سایت پوششی و ورودی‌ها: یک نقطهٔ بازیابی را دستی ذخیره کنید، و اگر ویرایشی چیزی را خراب کرد به آن برگردید. بازگردانی دوباره از طریق xray -test اعتبارسنجی می‌شود و پیش از آن خودکار از وضعیت فعلی snapshot می‌گیرد (پس خودش هم بازگشت‌پذیر است)، و عمداً گواهی و دامنه را دست‌نخورده می‌گذارد، پس بازگردانی هرگز دسترسی زنده را به خطر نمی‌اندازد.

اشتراک‌های خارجی (کارتی در صفحهٔ سرورها) روی دیگر همین سکه‌اند: سرورهای ارائه‌دهندهٔ دیگری که از اشتراک او خوانده می‌شوند و به کاربران شما در کنار سرورهای خودتان داده می‌شوند. منبع یک پیوند، یک پیوند happ://crypt… یا فهرستی چسبانده‌شده است؛ پیوند هر ساعت دوباره خوانده می‌شود، هر سرور جداگانه روشن و خاموش می‌شود، و اینکه چه کسی آن‌ها را بگیرد با همان گروه‌های دسترسی مسیرهای خودتان تعیین می‌شود. اشتراک را می‌توان از طریق سرورهای شما رله کرد — هر کدام، با پروتکل‌هایی که تیک می‌زنید: کاربران به مسیر VLESS TCP-TLS یا REALITY شما وصل می‌شوند (برای هر سرور و پروتکل، یک پیکربندی به هر سرور شریک، با نامی از قالبی با متغیرهای {name}، {proto}، {server} و دیگر متغیرها)، سرور ترافیک را به شریک می‌رساند، و سقف سرعت، سهمیه‌ها، محدودیت دستگاه و قطع اتصال مانند مسیرهای خودتان کار می‌کنند. اشتراک رله‌شده مسیریابی خودش را دارد: قانون‌ها بخشی از ترافیک را جای دیگری می‌فرستند (geoip:ru مستقیم از سرور شما، یک سایت از طریق WARP یا یک خط)، بقیه به شریک می‌رود، و سرور شما اگر مستقیم به شریک نرسد می‌تواند از طریق WARP یا یک خط آبشاری به او وصل شود. سرورهای WireGuard شریک (فایل .conf یا پیوند wireguard://) را فقط سرور شما وصل می‌کند — هر پیکربندی یک دستگاه است — و کاربران پیکربندی‌های VLESS شما را می‌گیرند. ارائه‌دهنده‌ای که اتصال دستگاه را الزامی می‌کند درخواست‌کننده‌ای را که دستگاهی معرفی نکند رد می‌کند، پس پنل یک دستگاه معرفی می‌کند: شناسه‌ای برگرفته از منبع — در هر خواندن یکسان، تا طرف مقابل یک جای خالی را متصل کند نه یکی تازه در هر به‌روزرسانی — به‌اضافهٔ نسخهٔ این بیلد و یک user agent ساده. هر کدام از این‌ها یک پیش‌فرض قابل‌ویرایش است، برای وقتی که طرف مقابل مقادیر خاصی انتظار دارد.

🌐 شبکهٔ سرورها (چندنودی)

یک پنل سرور اصلی و هر تعداد نود راه دور را مدیریت می‌کند. سرور از رابط کاربری اضافه می‌شود: یک فرمان را برای یک دستگاه Ubuntu تمیز کپی کنید، یا بگذارید پنل از طریق SSH وارد شود و عامل را نصب کند — با لاگ زندهٔ نصب. نود خودش به پنل وصل می‌شود (long-poll خروجی روی HTTPS)، پس پنل به دسترسی به نودها نیاز ندارد و جابه‌جا کردن پنل آن‌ها را جدا نمی‌کند. کاربران، محدودیت‌ها و طرح‌ها روی همهٔ نودها پخش می‌شوند؛ ترافیک و دستگاه‌ها در برابر محدودیت‌های مشترک شمرده می‌شوند، در حالی که آمار و کارت کاربر نشان می‌دهند چقدر ترافیک از هر سرور گذشته، و آمار به‌تفکیک هر پروتکل هم. هر نود همچنین یک ضریب ترافیک دارد — ضریبی که تعیین می‌کند ترافیک عبوری از آن با چه سرعتی سهمیهٔ کاربر را مصرف کند (2× در یک مکان گران، 0.5× در یک مکان تبلیغاتی)؛ فقط سهمیه را تغییر می‌دهد، هرگز آمار بایت به‌ازای هر نود را.

هر سرور جداگانه پیکربندی می‌شود (پروتکل‌ها، خروجی، DNS، کلیدهای REALITY، دامنه و TLS، پایگاه داده‌های geo، سایت پوششی). نود همان فایل اجرایی در حالت نود است: پنل پیکربندی آن را تولید می‌کند، یک xray -test محلی با بازگردانی از ناهمخوانی نسخه‌ها جلوگیری می‌کند، و به‌روزرسانی‌ها از رابط کاربری با بررسی SHA256 اجرا می‌شوند.

💳 طرح‌ها و پرداخت‌ها (اختیاری)

طرح‌ها: قیمت، مدت، محدودیت ترافیک و دستگاه؛ قیمت 0 طرح رایگان می‌سازد. طرح می‌تواند چرخهٔ شارژ ترافیک خودش را داشته باشد (روزانه / هفتگی / ماهانه / سالانه) برای طرح‌هایی مانند «100 GB در ماه، پرداخت برای یک سال»؛ اگر خالی بماند، سهمیهٔ طرح پولی کل مدت را پوشش می‌دهد و طرح رایگان در هر دوره شارژ می‌شود. دورهٔ آزمایشی، طرح رایگان جایگزین برای کاربران منقضی‌شده، تمدید و انتقال کاربران بین طرح‌ها وجود دارد. دریافت پرداخت — یک ارائه‌دهنده انتخاب کنید: YooKassa، PayPalych، RioPay، RollyPay، SeverPay، Platega، PayPear، AuraPay (کارت‌ها، SBP، ₽)، YooMoney (انتقال به کیف پول شخصی — بدون شرکت یا قرارداد)، CryptoBot و Heleket (رمزارز)، Telegram Stars (در ربات، قیمت ₽ با نرخ شما تبدیل می‌شود). کلاینت در ربات یا در صفحهٔ اشتراک پرداخت می‌کند و طرح خودش فعال می‌شود. یک وب‌هوک آن را تأیید می‌کند (امضا بررسی می‌شود)، و polling حالتی را پوشش می‌دهد که وب‌هوک هرگز نرسد؛ پردازش idempotent است و مبلغ با سفارش مقایسه می‌شود. پرداخت دستی روشی جداگانه در کنار آن‌هاست: در پرداخت‌ها ← دریافت پرداخت روشن می‌شود، مشخصات خود شما را همراه تصویر — کد QR یا تصویری از مشخصات — نشان می‌دهد و یک مدیر انتقال را تأیید می‌کند.

  • طرح‌های منعطف — طرح می‌تواند دستگاه اضافی بفروشد (قیمتی به‌ازای هر دستگاه در هر دوره، تا یک حد): همراه طرح انتخاب می‌شود، در تمدید حفظ و پرداخت می‌شود، و در میانهٔ مدت برای روزهای باقی‌مانده اضافه می‌شود. بسته‌های ترافیک علاوه بر سهمیه تا بازنشانی بعدی آن دوام دارند. کاربر می‌تواند وقتی طرحی فعال است طرحش را عوض کند: به طرح گران‌تر — مابه‌التفاوت روزهای باقی‌مانده را بپردازد، با همان تاریخ پایان؛ به طرح ارزان‌تر — رایگان، روزهای باقی‌مانده با قیمت آن دوباره محاسبه می‌شوند.
  • کیف پول — شارژ در ربات و در صفحهٔ اشتراک، پرداخت کامل یا بخشی از هزینهٔ طرح، تمدید خودکار از کیف پول (قابل خاموش کردن).
  • کد تخفیف — تخفیف درصدی یا ₽، روزهای اشتراک، اعتبار کیف پول؛ محدودیت استفاده، انقضا، محدود به طرح‌ها و به نخستین خرید.
  • دعوت (معرفی) — پیوند شخصی ربات؛ پرداخت‌های دعوت‌شدگان درصدی به کیف پول یا روزهایی به اشتراک می‌دهد.
  • تخفیف مدت طولانی‌تر — طرحی برای چند دوره یک‌جا، ارزان‌تر، با شارژ ترافیک در هر دوره.
  • بازگرداندن مشتری (به‌طور پیش‌فرض خاموش) — چند روز پس از پایان اشتراک پولی، کاربر یک کد تخفیف شخصی یک‌بارمصرف در ربات دریافت می‌کند که از پیش روی پرداخت بعدی اعمال شده است.
  • نظرسنجی کاربران رفته (به‌طور پیش‌فرض خاموش) — یک روز پس از پایان اشتراک پولی، ربات دلیل را می‌پرسد (گران، بد کار می‌کرد، دیگر لازم نیست، سرویس دیگر، یا با کلمات خودش)؛ صفحهٔ اشتراک هم همین را می‌پرسد. پاسخ‌ها در قیف فروش و وبهوک user.churn_answer.
  • در پنل — کیف پول و تاریخچه در کارت کاربر، چه کسی چه کسی را دعوت کرده، استفاده از کدهای تخفیف، برترین دعوت‌کنندگان، بازپرداخت به کیف پول، قیف فروش. بازپرداخت یا chargeback که سیستم پرداخت انجام دهد خودکار دریافت می‌شود: سفارش از درآمد خارج می‌شود و آنچه خریده بود از دست می‌رود.
  • برچسب‌های منبع — پیوند ربات t.me/<bot>?start=<tag> مشخص می‌کند کاربر از کجا آمده (تبلیغ، پست، شریک)؛ قیف، ثبت‌نام‌ها، پرداخت‌ها و درآمد را به‌تفکیک برچسب نشان می‌دهد. ربات‌های خودتان آن را از طریق API تنظیم می‌کنند.
  • فهرست سیاه مشترک (به‌طور پیش‌فرض خاموش) — حساب‌های Telegram که سرویس‌های VPN دیگر به‌خاطر فروش مجدد، اسکن، اشتراک‌گذاری یا کلاه‌برداری مسدود کرده‌اند (BEDOLAGA-DEV/VPN-BLACKLIST یا فهرست خودتان): نمی‌توانند در ربات ثبت‌نام کنند؛ حساب ثبت‌شده در کارتش علامت می‌خورد.
  • فعالیت مشکوک — جمع‌آوری دوره‌های آزمایشی از یک نشانی، یک دستگاه روی چند حساب، دعوت از خود، هجوم کدهای تخفیف و پرداخت‌ها، کارت‌های ناموفق، chargebackها؛ هر ردیف حساب‌ها را نام می‌برد.
  • پیام‌های خودکار — ربات خودش پیام می‌دهد وقتی کسی آن را باز کرده و هرگز ثبت‌نام نکرده، ثبت‌نام کرده و هرگز وصل نشده، دورهٔ آزمایشی را گرفته و هرگز پرداخت نکرده، استفاده از اشتراک فعال را متوقف کرده، یا مدت پولی را تمام کرده؛ یک بار برای هر رخداد، پس از تأخیری که تعیین می‌کنید، به‌طور اختیاری با کد تخفیف شخصی که از پیش روی پرداخت بعدی اعمال شده. هر قاعده نشان می‌دهد به چند نفر پیام داده و چند نفر از آن‌ها ظرف 30 روز پرداخت کرده‌اند.
  • دفتر callbackها — هر اعلانی که سیستم پرداخت فرستاده، با بدنه‌اش و کاری که پنل با آن کرده (واریز شد، تکراری، مغایرت مبلغ، سفارش وجود ندارد، بررسی امضا ناموفق)؛ 30 روز نگه داشته می‌شود.

Warning

ارائه‌دهندگان پرداخت هنوز با حساب‌های واقعی بررسی نشده‌اند. اگر یکی از آن‌ها را متصل کرده‌اید، لطفاً یک issue باز کنید و بگویید کار می‌کند یا نه (کدام ارائه‌دهنده، چه چیزی کار کرد، چه چیزی خراب شد). همین است که اجازه می‌دهد ارائه‌دهندگان بررسی‌شده علامت بخورند و بقیه اصلاح شوند.

👥 دسترسی، نقش‌ها و ممیزی

نقش‌ها مجموعه‌های مجوزی هستند که مالک می‌سازد (مدیران ← نقش‌ها): برای هر بخش — کاربران، گروه‌ها، طرح‌ها، سرورها، مسیریابی، تنظیمات، امنیت — یک گزینهٔ «خواندن» و یک گزینهٔ «نوشتن»، به‌اضافهٔ مجوزهای جداگانه برای آنچه از بقیه پرخطرتر است: حذف و خروجی گرفتن از کاربران، کلیدهای ارائه‌دهندگان پرداخت، ارسال‌های همگانی، وب‌هوک‌ها، کلیدهای API، به‌روزرسانی‌ها، لاگ‌ها و دفتر رویدادهای پنل. بدون «نوشتن» بخش فقط‌خواندنی باز می‌شود؛ بدون «خواندن» در منو نیست. مجوز وب‌هوک‌ها شامل خواندن کاربران و پرداخت‌ها می‌شود. دو نقش داخلی وجود دارد: مدیر (همه‌چیز جز دفتر رویدادهای پنل) و اپراتور (کاربران، گروه‌ها، آمار). مالک یگانه همهٔ مجوزها را دارد و تنها اوست که به آنچه از هر نقشی قوی‌تر است دسترسی دارد: مدیران و نقش‌ها، ربات‌های Telegram (گفت‌وگوی ربات مدیر هشدارهای ورود را دریافت می‌کند و می‌تواند نشست‌های هر مدیری را پایان دهد)، پشتیبان‌ها، بازیابی و بازنشانی کارخانه، و کلیدهای API با دسترسی کامل. مجوزها در هر درخواست سمت سرور بررسی می‌شوند و ویرایش یک نقش در درخواست بعدی دارندگانش اعمال می‌شود. به کلید API متدهای دقیق API داده می‌شود که به‌تفکیک بخش تیک زده می‌شوند — REST و MCP سپس دقیقاً همان‌ها را انجام می‌دهند، و هیچ‌کس نمی‌تواند بیش از آنچه خودش دارد به کلیدی بدهد. مدیر تازه یک رمز عبور موقت می‌گیرد که باید در نخستین ورود تغییر کند. احراز هویت دومرحله‌ای (TOTP): هر مدیر آن را برای خودش روشن می‌کند — کدی از اپ احراز هویت (Google Authenticator، Aegis، 1Password) علاوه بر رمز عبور، با رازی که در پایگاه داده رمزنگاری شده و پس از راه‌اندازی هرگز دوباره ارائه نمی‌شود؛ برای گوشی گم‌شده، rospanel totp reset <login> روی سرور؛ و rospanel rescue کامل‌تر رمز عبور فراموش‌شده را بازنشانی می‌کند، عامل دوم را پاک می‌کند، یا وقتی هیچ مدیری اصلاً نمی‌تواند وارد شود مالک را از نو می‌سازد. دو اقدامی که بازگشت ندارند — بازنشانی کارخانه و حذف سرور — رمز عبور و، از مدیری که آن را دارد، یک کد تازه می‌خواهند: کدی که با آن وارد شده از قبل مصرف شده، پس یک کد که از پشت سر دیده شود فقط یک اقدام را ممکن می‌کند نه همه را. هر مدیر همچنین نشست‌های فعال خودش را در پنجرهٔ حساب می‌بیند — مرورگر و سیستم‌عامل، آخرین نشانی استفاده، زمان ورود — و می‌تواند هر کدام را پایان دهد یا با یک کلیک از همهٔ جاهای دیگر خارج شود؛ نشستی که این‌گونه پایان یابد در درخواست بعدی‌اش از کار می‌افتد، و لاگ پنل ثبت می‌کند چه کسی چه چیزی را پایان داد. ورود از نشانی‌ای که این مدیر پیش‌تر از آن استفاده نکرده به Telegram گزارش می‌شود (دستهٔ «ورود از نشانی تازه» در تنظیمات ربات): چه کسی، از کجا (IP، کشور، شبکه)، با کدام مرورگر. زیر پیام دکمهٔ «من نبودم» هست — با یک لمس همهٔ نشست‌های آن مدیر را پایان می‌دهد و فقط تغییر رمز عبور باقی می‌ماند. لاگ کاربر ثبت می‌کند چه کاری با او و توسط چه کسی انجام شده (مدیر، کلید API، ربات، خود کاربر، سیستم) و پس از حذف او باقی می‌ماند. لاگ پنل (برای مالک قابل‌مشاهده) ورودها و تلاش‌های ناموفق با IP، روشن و خاموش شدن عامل دوم، تغییرات تنظیمات و پشتیبان‌ها را پوشش می‌دهد؛ فقط اقدامات موفق نوشته می‌شوند و بدنهٔ درخواست‌ها هرگز. لاگ پنل قابل‌جست‌وجو است (متن آزاد روی اقدام، هدف، مدیر و IP) و بر اساس دسته و بازهٔ تاریخ فیلتر می‌شود، و نمای فعلی با یک کلیک به CSV صادر می‌شود. هر دو لاگ یک سال نگه داشته می‌شوند.

🤖 یکپارچه‌سازی‌ها

ربات مدیر در Telegram: مدیریت کاربران، طرح‌ها، کدهای QR اشتراک، پشتیبان‌گیری زمان‌بندی‌شده، اعلان رویدادها (ثبت‌نام‌ها، انقضاها، خرابی‌های Xray، پرداخت‌ها، گواهی‌ها).

ربات کلاینت: ثبت‌نام خودکار، منوی شخصی با اشتراک و آمار، خرید طرح — به‌اضافهٔ اعلان‌های شخصی برای کاربر: پایان اشتراک، تمام شدن ترافیک، دریافت پرداخت.

ربات پشتیبانی — ربات سوم: فرد در پیام خصوصی به آن می‌نویسد و گفت‌وگو در گروه انجمنی شما قرار می‌گیرد، یک موضوع برای هر نفر؛ مستقیماً از همان‌جا پاسخ می‌دهید و پاسخ در ربات به او برمی‌گردد.

ارسال همگانی — نه بخش مخاطب (همه، با و بدون حساب، فعال، منقضی‌شده، رو به انقضا، مدت‌ها غیرفعال، هرگز وصل‌نشده) با تصویر و دکمه. ارسال بر اساس جدول گیرندگان انجام می‌شود، پس ارسال همگانی قطع‌شده از سر گرفته می‌شود نه از اول، و هیچ‌کس پیام را دو بار دریافت نمی‌کند. ارسال همگانی را می‌توان برای تاریخ و ساعتی مشخص زمان‌بندی کرد؛ گیرندگان در لحظه‌ی ارسال تعیین می‌شوند.

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

لینک جدید توسط خود کاربر — اگر مجاز باشد (تنظیمات ← اشتراک‌ها، از هر ساعت تا هر 30 روز یک بار)، صفحه‌ی اشتراک به‌جای لینکی که لو رفته لینک تازه می‌دهد؛ لینک قدیمی فوراً از کار می‌افتد. انتقال حساب به Telegram دیگر از همان صفحه را هم می‌توان به همین شکل محدود کرد (تنظیمات ← Telegram).

REST API با کلیدهای نام‌دار (Authorization: Bearer)، OpenAPI تولیدشده از کد و Swagger UI. هر دو نیمهٔ پنل را پوشش می‌دهد: کاربران، طرح‌ها، سفارش‌ها و سرورهایی که اداره می‌کنید، و پیکربندی پشت آن‌ها — تنظیمات، مسیریابی و DNS به‌ازای هر سرور، نقاط ذخیرهٔ پیکربندی با بازگردانی. مدیران، کلیدهای API و مسیر مخفی پنل عمداً در دسترس قرار نگرفته‌اند. وب‌هوک‌ها رویدادهایی امضاشده با HMAC-SHA256 را با تلاش مجدد ارسال می‌کنند. معیارهای Prometheus در /<api-path>/v1/metrics پشت همان کلید — کاربران، ترافیک، توان عملیاتی، آمار میزبان و یک سری برای هر نود؛ یک داشبورد Grafana آماده برای آن‌ها docs/grafana/rospanel.json است (Dashboards → New → Import). یک سرور MCP همان API را با فهرست ابزارهایی که از همان سند OpenAPI تولید می‌شود به دستیار هوش مصنوعی می‌دهد: …/v1/mcp/<key> را در دستیاری که URL می‌پذیرد بچسبانید و هیچ چیزی برای نصب در هیچ‌جا نیست. متدهای کلید تعیین می‌کنند دستیار چه ابزارهایی بگیرد: برای دستیاری که فقط نگاه می‌کند، «فقط خواندن» را تیک بزنید. اطلاعات بیشتر در docs/api/.

ثبت‌نام از یک سیستم خارجی — POST /v1/signup کلاینت را با شناسه‌اش در سیستم خارجی (ایمیل، شمارهٔ حساب) طبق قواعد ربات ثبت می‌کند: ثبت‌نام بسته، کد دعوت، بازبینی، محدودیت نرخ، یک حساب و یک دورهٔ آزمایشی برای هر شناسه. کلید سیستم خارجی را برای این متد تیک بزنید، نه برای ساختن کاربران. کلاینتی که از قبل حساب دارد شناسه را از طریق PATCH /v1/users/{id} می‌گیرد. ربات خودتان با telegram_id، طبق قواعد ربات داخلی، ثبت‌نام می‌کند: یک دورهٔ آزمایشی برای هر Telegram، فهرست سیاه مشترک، Telegram بی‌درنگ متصل می‌شود.

صفحهٔ اشتراک اختصاصی شما — GET /v1/users/{id}/subscription همان صفحه به‌صورت داده است: ارقام، وارد کردن در اپ‌ها، پیکربندی‌ها، دستگاه‌ها، پیشنهادها و پیوند اتصال Telegram (tg_link). مقدار تنظیمات ← اشتراک‌ها ← صفحهٔ اشتراک اختصاصی شما (https://example.com/cabinet?sub={token}) را تنظیم کنید تا مرورگری که پیوند اشتراک را باز می‌کند به آنجا برود؛ اپ‌ها مانند قبل اشتراک را دریافت می‌کنند.

اتصال یک دستیار یک URL می‌خواهد و هیچ نصب محلی‌ای لازم ندارد. در تنظیمات ← API یک کلید بسازید (با تیک زدن کارهایی که مجاز است)، نشانی پایه را از همان صفحه بردارید، و بچسبانید:

https://vpn.example.com/<api-path>/v1/mcp/<key>

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

صفحهٔ وضعیت — صفحه‌ای عمومی و اختیاری (تنظیمات ← عمومی) که نشان می‌دهد کدام سرورها بالا هستند و تاریخچهٔ 90 روزهٔ uptime. فقط نام‌ها و دسترس‌پذیری: بدون نشانی، بدون کاربر، بدون ترافیک، و تا وقتی روشنش نکنید اصلاً صفحه‌ای وجود ندارد. اختلال‌ها و تعمیرات برنامه‌ریزی‌شده هم از همین صفحه منتشر می‌شوند: عنوان، متن، سرورهای درگیر و بازه‌ی تعمیرات، و می‌توان آن‌ها را با ربات برای همه‌ی کسانی که اشتراک فعال دارند فرستاد. هر مورد روند رویدادها دارد (در حال بررسی، علت پیدا شد، در حال پایش، جمع‌بندی)؛ موارد جاری و نزدیک (تا سه روز) در صفحه‌ی اشتراک هم نمایش داده می‌شوند؛ مدیریت از طریق /v1/incidents و رویدادهای incident.*. تعمیرات می‌تواند سرورهایش را در طول بازه از اشتراک حذف کند. پس از پایان یک مورد، یک دکمه ساعت‌های آن را جبران می‌کند: به اشتراک هر کسی که هنگام شروع فعال بوده و به سرورهای نام‌برده دسترسی دارد افزوده می‌شود، همراه با پیامی در ربات.

🧩 افزونه‌ها (بتا)

کد جامعه درون پنل: اعلان‌ها، یکپارچه‌سازی‌ها، منطق خودتان روی رویدادهای پنل و طبق زمان‌بندی. افزونه می‌تواند یک روش پرداخت، فیلدها و دکمه‌هایی روی کارت کاربر، ابزارک‌های داشبورد، بلوک‌هایی در صفحهٔ اشتراک، دکمه‌ها و فرمان‌هایی در ربات اضافه کند، و در ثبت‌نام‌ها، اتصال دستگاه و قیمت‌ها نظر بدهد، یا ظاهر صفحهٔ اشتراک را تغییر دهد. افزونه یک فایل JavaScript با یک manifest است؛ پنل آن را در یک sandbox از نوع WebAssembly با پایگاه دادهٔ خودش و محدودیت حافظه و زمان اجرا می‌کند، پس افزونهٔ خراب متوقف می‌شود نه پنل. پیش از نصب، مدیر می‌بیند افزونه چه می‌خواهد — مجوزهای API پنل و میزبان‌های اینترنتی — و می‌تواند کدش را بخواند؛ فراتر از آن به چیزی دسترسی ندارد. تنظیمات ← افزونه‌ها، از یک فایل zip یا یک پیوند. افزونه را می‌توان همان‌جا هم ساخت: سازندهٔ قاعده («وقتی این رویداد آمد و این شرط برقرار بود، آن کار را بکن» — Telegram، Discord، HTTP، تمدید، برچسب) یا ویرایشگر کد، با آزمون‌ها و اجرای آزمایشی در sandbox. نویسندگان rospanel plugin new | test | dev | pack را بدون نیاز به Node در اختیار دارند؛ نگاه کنید به docs/plugins و examples/plugins.

🌍 زبان (RU / EN / 中文 / العربية / فارسی)

بخش زبان از کجا می‌آید
پنل انتخاب خود مدیر (به‌ازای هر مرورگر)، وگرنه زبان‌های مرورگر
صفحهٔ اشتراک Accept-Language
ربات کلاینت و ربات پشتیبانی زبان Telegram هر فرد
ربات مدیر یک تنظیم سراسری پنل (تنظیمات ← Telegram)
CLI انگلیسی

🎨 برندینگ و پوسته

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

🛡️ تشخیص سوءاستفاده

پنل نشانی‌های IP مقصد را از access log مربوط به Xray با فهرستی از شبکه‌های مخرب مقایسه می‌کند و فقط موارد منطبق را ثبت می‌کند — ترافیک معمولی هرگز ذخیره نمی‌شود. این قابلیت دقیقاً برای یک هدف وجود دارد: وقتی شکایت سوءاستفاده‌ای دربارهٔ نشانی سرور می‌رسد، بتوانید بگویید ترافیک متعلق به چه کسی بوده است.

فهرست FireHOL level 1 است: سرورهای فرمان‌وکنترل باتنت‌ها، مهاجمان و شبکه‌های اسپم. سطحی گزیده با حداقل مثبت کاذب، بدون CDNها یا میزبانی اشتراکی. در کنار آن فهرست خودتان (IP/CIDR) هست که اول بررسی می‌شود. موارد منطبق در آمار و در کارت کاربر نمایش داده می‌شوند و به سروری نسبت داده می‌شوند که ترافیک از آن خارج شده؛ وقتی آستانهٔ روزانه رد شود، اعلانی در Telegram ارسال می‌شود. دسته‌ها، فهرست سفارشی، آستانه و به‌روزرسانی‌ها در تنظیمات ← فهرست‌های مسدودسازی قرار دارند.

هشدار تنها واکنش نیست. همان زبانه اقدامات خودکار را پیکربندی می‌کند — نردبانی سه‌مرحله‌ای، هر مرحله با آستانهٔ تطبیق روزانهٔ خودش (0 مرحله را خاموش می‌کند): هشدار به کاربر از طریق ربات Telegram او (روزی یک بار)، محدود کردن سرعت او به مقداری معین، قطع دسترسی. محدودیت و قطع برای مدتی معین (از یک ساعت تا 30 روز) برقرار می‌مانند، پس از آن پنل خودش سرعت قبلی را برمی‌گرداند یا دسترسی را دوباره روشن می‌کند و به کاربر خبر می‌دهد؛ کاربر و مدیر از هر مرحله باخبر می‌شوند و هر مرحله در دفتر رویدادها ثبت می‌شود. فعال کردن کاربر یا تغییر سرعتش به‌صورت دستی بر اقدام خودکار غلبه می‌کند — تصمیم مدیر بعداً توسط پنل «برداشته» نمی‌شود. ترافیک نودها هم شمرده می‌شود: موارد منطبق روی سرور اصلی جمع زده می‌شوند، و سقف‌های سرعت و مجموعهٔ کاربران از طریق همگام‌سازی معمول به نودها می‌رسند.

بررسی‌ها روی نشانی‌ها انجام می‌شوند نه دامنه‌ها، و این ساده‌سازی نیست. کلاینت‌های امروزی DNS را بیرون از تونل resolve می‌کنند و SNI را رمزنگاری می‌کنند (ECH)، پس تنها چیزی که به سرور می‌رسد یک IP خالی است.

موارد منطبق 30 روز نگه داشته می‌شوند — برای رسیدگی به یک شکایت کافی است.

کلاینت‌ها از کجا می‌توانند وصل شوند (تنظیمات ← عمومی). یک قاعدهٔ کشوری — فقط این کشورها، یا همه‌جا جز این کشورها — که با آنچه پنل از قبل برای هر اتصال، روی سرور اصلی و روی هر نود، ثبت می‌کند بررسی می‌شود، پس قاعده همهٔ پروتکل‌ها را پوشش می‌دهد، از جمله آن‌هایی که Xray حمل نمی‌کند. نشانی مسدود می‌شود، نه حساب: IP متخلف وارد یک مجموعهٔ nftables روی هر سرور می‌شود (با مدتی که مدیر تعیین می‌کند و خودبه‌خود منقضی می‌شود)، در حالی که حساب از هر جایی که سیاست اجازه می‌دهد به کار ادامه می‌دهد. اعمال قاعده تا وقتی روشن نشود خاموش است — تا آن زمان تخلف فقط ثبت می‌شود، در دفتر رویدادهای کاربر و در فهرستی که مدیر می‌تواند پیش از اینکه اجازه دهد قاعده چیزی را قطع کند بخواند، و هر مسدودسازی را می‌توان دستی برداشت. نشانی‌ای که جدول geo نتواند جایش را تعیین کند هرگز رد نمی‌شود: آن جدول ناقص است، و قطع کردن کاربران واقعی از یک سرویس کارا تنها خرابی‌ای است که این قابلیت نباید داشته باشد.

نشانی‌های مورد اعتماد (تنظیمات ← عمومی ← حفاظت و پایداری) IPها و شبکه‌هایی هستند که پنل هرگز خودش مسدودشان نمی‌کند: نه برای حدس زدن رمز عبور SOCKS/HTTP، نه برای اسکن پنل، نه تحت سیاست منبع (رد شدن طبق سیاست برای آن‌ها فقط ثبت می‌شود). برای یک دفتر یا سرور خودتان پشت یک نشانی مشترک؛ مسدودسازی‌هایی که از قبل روی آن‌ها هست هنگام ذخیره برداشته می‌شوند.

مسدودسازی نشانی (کارت کاربر ← دستگاه‌ها (IP)) — IP تا رفع مسدودیت در فایروال سرور اصلی و همهٔ نودها مسدود می‌شود. هر مسدودسازی، دستی یا خودکار، همراه با رفع مسدودیت — در کاربران ← آمار.

🧰 عملیات و امنیت

عیب‌یابی با یک کلیک: پردازهٔ Xray، تونل AmneziaWG، اعمال پیکربندی، انقضای TLS، فضای دیسک، تازگی پایگاه دادهٔ geo، سلامت خروجی — هر بررسی با یک راهنما. یک خودآزمایی اتصال جداگانه مانند یک کلاینت واقعی به هر پروتکل وصل می‌شود و تأیید می‌کند ترافیک واقعاً خارج می‌شود — و انحراف در اطلاعات ورود، TLS یا ALPN را پیش از اینکه کاربری متوجه شود پیدا می‌کند. پشتیبان‌گیری / بازیابی و بازنشانی از پنل و CLI در دسترس‌اند. بازیابی از پنل رمز عبور شما و، با 2FA روشن، یک کد تازه می‌خواهد — و وقتی مالک یا مدیران پشتیبان 2FA داشتند، کدی از احرازکنندهٔ آن پشتیبان هم، از جمله در دستیار نخستین اجرا، پس پشتیبانِ پنلی که با 2FA محافظت می‌شود را کسی که فایل را دارد ولی احرازکننده را ندارد نمی‌تواند بازیابی کند.

دسترس‌پذیری از کشورهای دیگر: ‏TCP ping به پورت اصلی هر سرور از کاوشگرهای Globalping در کشورهایی که انتخاب می‌کنید (روسیه، چین، ایران و…) — از کارت سرور یا طبق زمان‌بندی. اگر کشوری دو دور پشت سر هم به سرور نرسد، مدیران در Telegram اعلان می‌گیرند، و وقتی دسترسی برگردد هم.

قوانین هشدار (سرورها ← هشدارها): آستانه‌ای برای بار پردازنده، حافظه، دیسک، سرعت شبکه یا شمار کاربران آنلاین — برای همهٔ سرورها یا یکی، با مدتی که تعیین می‌کنید. قانونی که فعال شود در Telegram اعلان و وب‌هوک alert.fired را برای مدیران می‌فرستد؛ سپس پایان هشدار با اوج و مدت می‌آید. تاریخچه ۳۰ روز نگه داشته می‌شود.

به‌روزرسانی با یک فرمان: پنل SHA256 را بررسی می‌کند، فایل اجرایی را آزمایشی اجرا می‌کند، پشتیبان می‌گیرد و تنها پس از آن خودش را جایگزین می‌کند و نسخهٔ قبلی را کنار خود نگه می‌دارد. به‌روزرسانی خودکار طبق زمان‌بندی (تنظیمات ← عمومی): پنل نسخهٔ تازه را خودش نصب می‌کند و سپس سرورها را به‌روز می‌کند (نصب با systemd؛ Docker با ایمیجش به‌روز می‌شود)؛ ربات مدیر می‌گوید چه کرده است. «تازه‌ها» در منوی پروفایل تاریخچهٔ انتشارها را که درون خود فایل اجرایی قرار دارد، با علامت نسخهٔ در حال اجرا، نشان می‌دهد. هستهٔ Xray روی یک نسخهٔ دقیق ثابت شده است و به‌روزرسانی پنل آن را همراه دارد: در راه‌اندازی بعدی پنل و هر نود Xray موجود خود را با نسخهٔ ثابت‌شده مقایسه می‌کنند و اگر متفاوت باشد جایگزینش می‌کنند — اول checksum، و دستگاهی که به GitHub دسترسی ندارد همان نسخه‌ای را که اجرا می‌کند نگه می‌دارد. ناظر، Xray را در صورت crash دوباره راه‌اندازی می‌کند. یک watchdog حالت دشوارتری را پوشش می‌دهد که handler مربوط به crash نمی‌بیند — پردازه‌ای که زنده می‌ماند ولی سرویس‌دهی را متوقف می‌کند: API مربوط به Xray را بررسی می‌کند و اگر در چند بررسی پیاپی پاسخ ندهد، آن را دوباره راه‌اندازی می‌کند (با فاصلهٔ انتظار در برابر طوفان راه‌اندازی مجدد) و به مدیر هشدار می‌دهد. روی سرور اصلی و همهٔ نودها اجرا می‌شود.

اقدامات خود صفحهٔ اشتراک (لغو طرح، پرداخت، آزاد کردن دستگاه) فقط از همان صفحه پذیرفته می‌شوند: توکن در پیوند حساب را ثابت می‌کند، نه اینکه چه کسی درخواست می‌دهد، پس سایت شخص دیگری نمی‌تواند با پیوند لورفته کاری انجام دهد.

رازهای درون پایگاه داده رمزنگاری شده‌اند (AES-GCM). توکن‌های نشست و کلیدهای API فقط به‌صورت hash ذخیره می‌شوند — حتی با دسترسی به جدول‌ها نمی‌توانید از نشست کسی دوباره استفاده کنید. هنگام تغییر کلید، پنل هر چیزی را که بسته نگه می‌دارد دوباره رمزنگاری می‌کند: رمزهای عبور و کلیدهای کاربران، کلیدهای نودها (REALITY، WARP، AmneziaWG)، رازهای وب‌هوک، کلیدهای ورودی‌های سفارشی، رمزهای عبور پراکسی سیستم، عامل دوم مدیران، پیکربندی‌های ارائه‌دهندگان پرداخت و تنظیمات افزونه‌ها. تأیید پرداخت و مدیریت مدیران وارد کردن دوبارهٔ رمز عبور را لازم دارند. درخواست‌های خروجی در برابر SSRF محافظت می‌شوند، brute force روی ورودی‌ها از طریق nftables مسدود می‌شود (مدخلی زمان‌دار در یک مجموعه که کرنل خودش منقضی می‌کند)، و تعداد اتصال‌ها به‌ازای هر IP از طریق nftables محدود می‌شود.


🛠️ CLI

rospanel                     اجرای پنل (معمولاً از طریق systemd)
rospanel install             نصب سرویس systemd و راه‌اندازی آن (root)
rospanel uninstall [-y]      حذف سرویس (داده‌ها حفظ می‌شوند)
rospanel start|stop|restart  کنترل سرویس
rospanel status              وضعیت سرویس
rospanel update [-y]         به‌روزرسانی به آخرین نسخهٔ GitHub
rospanel backup [file]       snapshot از نوع .tar.gz (پایگاه داده + کلید رمزنگاری + گواهی‌ها + پیکربندی Xray)
rospanel restore [-y] <file> بازیابی از snapshot (هنگام راه‌اندازی اعمال می‌شود)
rospanel host [-y] [domain|IP] نمایش/تغییر نشانی (TLS را دوباره صادر می‌کند)
rospanel path                نمایش URL پنل و بررسی secrets.key / پایگاه داده
rospanel totp reset <login>  حذف احراز هویت دومرحله‌ای یک مدیر (گوشی گم‌شده)؛ totp به‌تنهایی فهرست می‌دهد
rospanel rescue <sub>        بازیابی دسترسی قفل‌شده: list | password | unlock | owner
rospanel reset [-y]          بازنشانی کارخانه (پایگاه داده را پاک می‌کند)
rospanel plugin <sub>        ابزارهای نویسندگان افزونه: new, validate, pack, test, dev
rospanel version             نسخه
rospanel help                راهنمای کامل

فرمان‌های مخرب (reset، restore، host، uninstall) تأیید می‌خواهند؛ پرچم -y از آن می‌گذرد.

حالت نود

همین فایل اجرایی می‌تواند به‌عنوان نودی که پنل مدیریتش می‌کند اجرا شود. فرمان install را پنجرهٔ «افزودن نود» در پنل تولید می‌کند — معمولاً هرگز لازم نیست دستی تایپش کنید.

rospanel node install --join '<url>'   پیوستن به پنل و نصب سرویس (root)
rospanel node run                       عامل نود (نقطهٔ ورود systemd)
rospanel node set-panel <url>           هدایت نود به نشانی تازهٔ پنل
rospanel node status                    وضعیت محلی نود
rospanel node uninstall [-y]            حذف سرویس نود (داده‌ها حفظ می‌شوند)

--join از پنجرهٔ افزودن نود می‌آید؛ توکن درون آن یک‌بارمصرف است و 24 ساعت اعتبار دارد. برای راهنمای کامل نگاه کنید به 🌐 افزودن نود.


🧱 معماری

تنها منبع حقیقت SQLite است؛ پیکربندی Xray همیشه از آن تولید و توسط ناظر اعمال می‌شود. پنل وب درون فایل اجرایی جاسازی شده است.

پشته: Go 1.26 · Xray-core · SQLite (modernc، بدون CGO) · React + Vite + Tailwind.


⚠️ سلب مسئولیت

نرم‌افزار «همان‌گونه که هست» و بدون هیچ‌گونه ضمانتی ارائه می‌شود.

این پروژه برای استفادهٔ آموزشی و پژوهشی در نظر گرفته شده است: مطالعهٔ پروتکل‌های شبکه، TLS و فناوری‌های پراکسی، CTF و کار آزمایشگاهی امنیت شبکه، آزمون نفوذ مجاز، و مدیریت زیرساخت خودتان. این پروژه برای دور زدن محدودیت‌های قانونی یا هر فعالیت غیرقانونی دیگری در نظر گرفته نشده است؛ سازوکارهای استتار برای مطالعهٔ این فناوری و آزمودن پایداری سرویس در چارچوب آزمون‌های مجاز وجود دارند.

مسئولیت نصب، پیکربندی و بهره‌برداری از نرم‌افزار، و رعایت قوانین حوزهٔ قضایی شما، بر عهدهٔ اپراتور سرور است. نویسندگان و مشارکت‌کنندگان مسئول نحوهٔ استفادهٔ اشخاص ثالث از پروژه نیستند.


💻 توسعه

# فرانت‌اند (پس از تغییرات در web/)
npm --prefix web install
npm --prefix web run build      # → web/dist (درون فایل اجرایی جاسازی می‌شود)

# فایل اجرایی
go build -o rospanel ./cmd/rospanel
./rospanel

بومی‌سازی. واژه‌نامه‌های پنل web/src/i18n/{ru,en,zh,ar,fa}.ts هستند که نوع‌شان بر اساس ru.ts بررسی می‌شود: کلیدی که در یکی از آن‌ها نباشد خطای build است، نه بازگشت بی‌صدا به زبان دیگر. آنچه Go خودش رندر می‌کند — ربات‌ها و صفحهٔ اشتراک — در internal/i18n/ قرار دارد؛ backend به پنل یک کلید به‌اضافهٔ آرگومان‌ها می‌دهد و هرگز متن رندرشده. زبانی دیگر یعنی یک واژه‌نامهٔ دیگر در هر سمت.

متغیرهای محیطی سودمند (همه اختیاری): ROSPANEL_DATA (پوشهٔ داده‌ها)، ROSPANEL_ADMIN_ADDR (نشانی loopback پنل، به‌طور پیش‌فرض 127.0.0.1:8080)، XRAY_BIN، ROSPANEL_HOST، ROSPANEL_ACME_EMAIL، GOMEMLIMIT. بدون GOMEMLIMIT، پنل heap مربوط به Go را زیر یک حد نرم برابر نیمی از حافظهٔ دستگاه (یک چهارم روی نود)، یا حد cgroup اگر کمتر باشد، نگه می‌دارد؛ لاگ راه‌اندازی این عدد را نشان می‌دهد.

فایروال میزبان. با ufw، firewalld یا iptables با سیاست drop در INPUT/FORWARD روی سرور، پنل (و هر نود) پورت‌های مسیرهای فعال خود را آنجا باز می‌کند و اجازه می‌دهد تونل AmneziaWG از FORWARD عبور کند — در زنجیره‌های خودش ROSPANEL-IN/ROSPANEL-FWD، یا به‌صورت قواعد زمان اجرای firewalld — و وقتی مسیری خاموش شود آن‌ها را پس می‌گیرد. ROSPANEL_HOSTFW=off این را خاموش می‌کند.

حفاظت در برابر flood (محدودیت‌های nftables روی پورت‌های عمومی TCP، نگاه کنید به «عملیات») هم از طریق محیط پیکربندی می‌شود — مفید وقتی یک دفتر کامل یا یک اپراتور CGNAT پشت یک IP است و کلاینت‌ها به مقادیر پیش‌فرض برمی‌خورند:

متغیر چه می‌کند
ROSPANEL_CONNLIMIT=off محدودیت‌ها را کاملاً غیرفعال می‌کند (قواعد nftables حذف می‌شوند)
ROSPANEL_CONNLIMIT_MAX بیشینهٔ اتصال‌های هم‌زمان TCP از یک IP
ROSPANEL_CONNLIMIT_RATE بیشینهٔ اتصال‌های تازه در هر ثانیه از یک IP

وضعیت فعلی در داشبورد ← مدیریت ← عیب‌یابی دیده می‌شود: اگر nftables نصب نباشد یا پنل با root اجرا نشود، قواعد بی‌صدا اعمال نمی‌شوند — عیب‌یابی این را به شما می‌گوید.

PRها و issueها خوش‌آمدند. commitها از Conventional Commits پیروی می‌کنند: release-please از آن‌ها برای ساختن نسخه‌ها و انتشار فایل اجرایی و ایمیج Docker در GHCR استفاده می‌کند.


💝 حمایت از پروژه

RosPanel در اوقات فراغت توسعه داده می‌شود و رایگان توزیع می‌شود. اگر پنل برایتان سودمند بوده، ساده‌ترین راه حمایت از آن DonationAlerts یا Boosty است (کارت‌های روسی، یک‌باره یا دوره‌ای). سپاسگزاریم! 🙏

رمزارز

USDT. یک شبکه انتخاب کنید و نشانی را با دقت کپی کنید — شبکهٔ فرستنده و گیرنده باید یکسان باشد. فقط USDT بفرستید، و فقط روی شبکهٔ ذکرشده: انتقال روی شبکهٔ اشتباه قابل‌بازگشت نیست. کمترین کارمزد روی TRON (TRC20) و TON است.

شبکه توکن نشانی
TRC20 (Tron) USDT TJwyrPVEZVZ1YrcmDiZTyFjLo3Q2DmEGzs
ERC20 (Ethereum) USDT 0xf9d663146ce902da91911b214c71cc73a5269d1d
Solana USDT 2qAZRTbaUMTfYuZbD1dCYHjkYgxkw4dUYE9XY3JhC2Cs
TON USDT UQDoat731MLYuIw8ayL3Vhhw7zTBbLvRaQFmDvab--CNNI7e

Bybit. اگر شما هم از Bybit استفاده می‌کنید — به UID 136462734 انتقال دهید: فوری و رایگان.

نمی‌توانید مالی حمایت کنید؟ باز هم می‌توانید کمک کنید — سرورها را از طریق پیوندهای ارجاع در سرور را از کجا تهیه کنیم اجاره کنید. برای شما هزینه‌ای ندارد و به پروژه کمک می‌کند.


📄 مجوز

GNU Affero General Public License v3.0 (AGPL-3.0).

استفاده، تغییر و میزبانی شخصی این پروژه رایگان است. اگر دسترسی شبکه‌ای به نسخهٔ تغییریافته‌ای از پنل (از جمله به‌صورت سرویس) ارائه دهید، باید کد منبع تغییرات خود را با همان شرایط منتشر کنید.