Skip to content
 
 

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

دیپلوی چندمسیره‌ی 3X-UI روی Orbit / Flux

این پروژه پنل رسمی 3X-UI (پنل مدیریت Xray-core) رو داخل یک کانتینر روی Orbit، پلتفرم دیپلوی Flux، اجرا می‌کنه.

Flux/Orbit به‌صورت پیش‌فرض فقط یک پورت عمومی با TLS رو از یک کانتینر به بیرون باز می‌کنه (همون "App Port"). چون پنل مدیریت، اینباند(های) پروکسی Xray، و سرور Subscription پنل هر سه باید از بیرون در دسترس باشن، این پروژه یه ری‌ورس‌پروکسی کوچیک به زبان Go جلوی همه‌شون اجرا می‌کنه که همه‌چی رو روی همون یک پورت عمومی، با روتینگ بر اساس مسیر (Path) درخواست HTTP، مالتی‌پلکس (تفکیک) می‌کنه.

نحوه‌ی کار

  1. موقع اولین اجرا، main.go باینری رسمی و از‌پیش‌بیلدشده‌ی 3X-UI (x-ui-linux-amd64.tar.gz) رو دانلود می‌کنه، به‌جای این‌که خودِ 3X-UI رو از سورس کامپایل کنه (چون این محیط نمی‌تونه فرانت‌اند Vue پروژه رو بیلد کنه که یه مرحله‌ی npm run build قبل از go build لازم داره).

  2. باینری واقعی x-ui رو روی یک پورت فقط-داخلی (از طریق env var XUI_PORT) بالا میاره — پورتی که مستقیماً از اینترنت در دسترس نیست.

  3. سرور HTTP سبک خودش رو روی پورت عمومی بالا میاره. این سرور مسیر (Path) درخواست ورودی رو چک می‌کنه و اونو (reverse proxy) به سرویس داخلی درست هدایت می‌کنه:

    پیشوند مسیر (Path) به کجا فوروارد می‌شه (پورت داخلی) کاربرد
    /xvpnws/ اینباند VLESS+WebSocket ایکس‌ری ترافیک پروکسی
    /sub/ سرور Subscription پنل لینک‌های Subscription
    (هر چیز دیگه) پنل مدیریت 3X-UI پنل وب ادمین

چون net/http/httputil.ReverseProxy توی Go به‌صورت بومی از هدر Upgrade: websocket پشتیبانی می‌کنه (بعد از تکمیل هندشیک ۱۰۱، خودِ کانکشن رو Hijack و بایت‌ها رو دوطرفه رد و بدل می‌کنه)، این روش به‌صورت شفاف از ترابرهای مبتنی بر WebSocket ایکس‌ری هم پشتیبانی می‌کنه، بدون نیاز به کد اضافه.

پیش‌نیازها سمت Orbit/Flux

  • مقدار App Port باید دقیقاً با publicPort توی main.go یکی باشه (الان: 2053).
  • کانتینر باید به github.com دسترسی خروجی داشته باشه تا موقع اولین اجرا بتونه ریلیز 3X-UI رو دانلود کنه.

پیش‌نیازها داخل پنل 3X-UI

برای هر اینباندی که می‌سازی، فیلد Port باید دقیقاً با یکی از پورت‌های داخلی تعریف‌شده توی main.go یکی باشه، و Path (زیر تنظیمات Stream) باید دقیقاً همون پیشوند رو داشته باشه (با اسلش اول و آخر). Security روی هر اینباند باید none باشه، چون TLS از قبل توسط edge خودِ Flux باز شده و به این کانتینر نمی‌رسه.

برای سرویس Subscription، فیلد Settings → Subscription → Reverse Proxy URI رو روی https://<دامنه‌ی-تو>.app.runonflux.io/sub/ بذار تا لینک‌های Subscription که پنل می‌سازه، به مسیر عمومی اشاره کنن، نه به پورت فقط-داخلی.

اضافه کردن یک مسیر جدید

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

  1. یه پورت داخلی خالی و یه پیشوند مسیر یکتا انتخاب کن.
  2. هر دو رو به slice به اسم routes توی main.go اضافه کن.
  3. Commit و Push کن، بعد توی Orbit دکمه‌ی Pull & Build رو بزن (نه فقط Redeploy — چون باینری Go باید دوباره کامپایل بشه).
  4. توی پنل، یک اینباند جدید با دقیقاً همون پورت و همون مسیر بساز.

محدودیت‌ها

  • فقط ترابرهای مبتنی بر HTTP (WebSocket، و تئوریاً XHTTP) رو می‌شه با این روش مالتی‌پلکس کرد، چون روتینگ بر اساس بررسی مسیر (Path) درخواست HTTP انجام می‌شه.
  • اینباندهای TCP خام و REALITY با این معماری روی پورت عمومی اصلی سازگار نیستن، چون TLS از قبل توسط edge خودِ Flux قبل از رسیدن درخواست ساده‌ی HTTP به این پروکسی باز شده — REALITY به ClientHello اصلی و دست‌نخورده‌ی TLS نیاز داره، و TCP خام هم اصلاً مسیر HTTP‌ای برای روتینگ نداره. اگه دیپلویت یک پورت خام دوم هم باز کرده باشه (توی تب Specifications داخل FluxCloud، بخش Container Ports رو چک کن)، می‌شه یک اینباند TCP خام یا REALITY رو مستقیماً به همون پورت وصل کرد و کاملاً از این پروکسی رد نشد.

نکته‌ی امنیتی

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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages