Skip to content

Latest commit

 

History

History
375 lines (252 loc) · 72.8 KB

README.fa.md

File metadata and controls

375 lines (252 loc) · 72.8 KB

English | Русский | فارسی | 中文

still-ui

مجوز: GPL-3.0 بر پایهٔ 3x-ui v3.11.0 آخرین نسخه CI بیلدهای انتشار با GitHub Actions گواهی شده‌اند

still-ui یک فورک از پنل 3x-ui ساختهٔ MHSanaei است؛ همان پنل وب برای Xray-core. پایهٔ آن نسخهٔ v3.11.0 از 3x-ui است و هر کاری که آن پنل انجام می‌دهد، still-ui هم انجام می‌دهد: همان پروتکل‌ها، همان رابط کاربری و همان پایگاه داده.

تفاوت در تمرکز است. still-ui مشکلاتی را برطرف می‌کند که وقتی پنل ماه‌ها روی یک سرور کوچک کار می‌کند و کاربران واقعی پشت اینترنت موبایل هستند، دردسر می‌شوند: تنظیمات کلاینت‌هایی که بی‌صدا از دست می‌روند، دست‌دادن (handshake) که روی شبکهٔ ضعیف قطع می‌شود، و پنلی که آرام‌آرام حافظهٔ سرور را می‌بلعد.

اسم پروژه هم همین را می‌گوید: سروری که یک بار راه‌اندازی می‌کنید و بعد به حال خودش می‌گذارید.

Important

still-ui یک فورک مستقل است و هیچ ارتباطی با سازندگان 3x-ui ندارد. لطفاً مشکلات still-ui را همین‌جا گزارش کنید، نه در مخزن 3x-ui.

چرا still-ui

در 3x-ui 3.11.0 در still-ui
از Xray 26.9 به بعد سرور اثر انگشت ios و همهٔ کلاینت‌های sing-box (Hiddify، Karing) را رد می‌کند (3x-ui#6596، 3x-ui#6727، Xray-core#7259) نسخهٔ وصله‌شدهٔ Xray دوباره آن‌ها را می‌پذیرد (جزئیات)
راه‌اندازی دوباره یا به‌روزرسانی پنل اتصال همهٔ کلاینت‌ها را قطع می‌کند Xray سرویس جداگانه است، پس راه‌اندازی دوبارهٔ پنل کلاینت‌های Xray را قطع نمی‌کند (کلاینت‌های AmneziaWG، MTProto و TUIC دوباره وصل می‌شوند؛ در Docker، Xray داخل پنل می‌ماند)
حافظهٔ پنل با ترافیک AmneziaWG بالا می‌رود و پنل بی‌مهار می‌تواند سرور کوچک را به swap بکشاند بافرها دوباره استفاده می‌شوند (403 → 176 MiB زیر بار) و پنل سقف حافظه دارد
ربات تلگرام پایگاه داده را بدون رمزنگاری می‌فرستد پشتیبان‌ها با کلید شما رمزنگاری می‌شوند (کلید خصوصی هرگز روی سرور نمی‌آید)، طبق زمان‌بندی نگه داشته می‌شوند و still-ui restore هر کدام را برمی‌گرداند
ربات تلگرام از کرش Xray، بار بالای CPU و حافظهٔ زیاد خبر می‌دهد همچنین وقتی Xray مدام راه‌اندازی دوباره می‌شود، دیسک پر است، گواهی به‌زودی منقضی می‌شود یا پشتیبان‌گیری شکست خورده هشدار می‌دهد

روی یک 3x-ui در حال کار امتحان کنید: یک فرمان آن را منتقل می‌کند و بررسی می‌کند که پنل، اینباندها، کلاینت‌ها و اشتراک‌ها همان باشند (چه کار می‌کند):

bash <(curl -Ls https://github.com/Dv2Corn/still-ui/releases/latest/download/install.sh) migrate

و یک فرمان 3x-ui را برمی‌گرداند:

still-ui migrate-rollback

چه فرقی دارد

انجام شده

  • ویرایش بخشی از کلاینت دیگر آن را خراب نمی‌کند. در 3x-ui v3.11.0 اگر کلاینتی را از طریق API (/panel/api/clients/update/:email) ویرایش می‌کردید و فقط بخشی از فیلدها را می‌فرستادید، کلاینت غیرفعال می‌شد (enable=false) و limitIp، totalGB، tgId، comment، group، flow، تنظیمات تمدید (reset، resetMax) و limitHwid صفر می‌شدند. در still-ui هر فیلدی که در درخواست نباشد از کلاینت ذخیره‌شده برداشته می‌شود. فرستادن صریح صفر یا مقدار خالی همچنان فیلد را پاک می‌کند. کلیدهای WireGuard/AmneziaWG و نشانی‌های همتا در v3.11.0 هم حفظ می‌شدند؛ یک آزمون این را تضمین می‌کند.
  • هستهٔ Xray دوباره اثر انگشت ios و کلاینت‌های sing-box را می‌پذیرد. از Xray 26.9.9 به بعد، سرور رسمی REALITY فقط ClientHello دارای کلید X25519MLKEM768 را می‌پذیرد؛ بنابراین کلاینت‌های Xray با اثر انگشت ios، edge و qq، همهٔ کلاینت‌های sing-box (Hiddify، Karing) با هر اثر انگشتی، و mihomo بدون support-x25519mlkem768 وصل نمی‌شوند. ios کوتاه است (حدود ۵۱۷ بایت، یک قطعهٔ TCP) و در شبکه‌های موبایلی که ClientHello بلندتر را دور می‌اندازند، همین اثر انگشت کار می‌کند. still-ui 1.4.0 همراه با Xray v26.10.31 ساخته‌شده از سورس و یک وصلهٔ کوچک در REALITY عرضه می‌شود: ClientHello بدون آن کلید دوباره پذیرفته می‌شود، کلیدهای تکراری همچنان رد می‌شوند و چیز دیگری تغییر نمی‌کند. ساخت قابل تکرار است: دستور ساخت، وصله و sha256 در scripts/xray-build. اینباندهای جدید REALITY مانند 3x-ui با chrome شروع می‌شوند. اگر Xray را از پنل به نسخهٔ رسمی تغییر دهید (دکمهٔ نسخه کنار Xray در صفحهٔ نمای کلی)، رفتار قدیمی برمی‌گردد؛ still-ui update نسخهٔ still-ui را برمی‌گرداند.
  • نصب‌کننده برای پنل سقف حافظه می‌گذارد. سرویس پنل محدودیت‌های systemd می‌گیرد: MemoryMax برابر ۳۵٪ از RAM (دست‌کم ۲۵۶ مبی‌بایت و حداکثر ۱ گیبی‌بایت)، MemoryHigh برابر ۸۵٪ همین مقدار، و پنل اجازهٔ استفاده از swap را ندارد. اگر پنل بیش از حد بزرگ شود، systemd آن را دوباره راه‌اندازی می‌کند، به‌جای اینکه کل سرور به swap بیفتد و از کار بایستد. اگر سرور swap نداشته باشد و RAM آن ۲ گیبی‌بایت یا کمتر باشد، نصب‌کننده پیشنهاد می‌کند یک /swapfile دو گیبی‌بایتی برای بقیهٔ سیستم بسازد.
  • Xray با راه‌اندازی دوبارهٔ پنل از کار نمی‌افتد. Xray به‌صورت سرویس جداگانهٔ still-xray اجرا می‌شود: کاربر بدون دسترسی ویژه، فقط CAP_NET_BIND_SERVICE و CAP_NET_ADMIN (علامت‌گذاری سوکت، TPROXY)، ProtectSystem=strict، Restart=always و سقف حافظهٔ خودش. راه‌اندازی دوباره، به‌روزرسانی یا از کار افتادن پنل کاربران را قطع نمی‌کند. پنل همچنان کلاینت‌ها را بدون راه‌اندازی دوباره از طریق API خود Xray اضافه و حذف می‌کند و هسته را فقط هنگام تغییر ساختار اینباندها دوباره راه می‌اندازد — آن هم پس از بررسی پیکربندی با xray run -test؛ پیکربندی‌ای که بررسی را با موفقیت پشت سر بگذارد ولی اجرا نشود، با آخرین پیکربندی سالم جایگزین می‌شود. این حالت پیش‌فرض روی هر سرور دارای systemd است؛ نصبی که از قبل وجود دارد در still-ui update بعدی به آن منتقل می‌شود، مگر اینکه پیکربندی‌اش چیزی بخواهد که سرویس از عهده‌اش برنمی‌آید (پایین‌تر را ببینید). ایمیج‌های Docker مانند 3x-ui، Xray را درون پنل نگه می‌دارند. AmneziaWG، MTProto و TUIC داخلی همچنان درون پنل اجرا می‌شوند و با راه‌اندازی دوبارهٔ آن دوباره وصل می‌شوند.
  • پشتیبان‌گیری زمان‌بندی‌شده و رمزنگاری‌شده، و دستور بازگردانی. پنل می‌تواند طبق زمان‌بندی از پایگاه داده‌اش در /etc/still-ui/backups نسخهٔ پشتیبان بگیرد، N نسخهٔ آخر را نگه دارد، آن‌ها را برای کلید عمومی age یا SSH شما رمزنگاری کند (کلید خصوصی هرگز به سرور نمی‌رسد) و نسخهٔ رمزنگاری‌شده را به Telegram بفرستد. still-ui restore <file> نسخهٔ پشتیبان را بررسی می‌کند، پنل را متوقف می‌کند، پایگاه داده را جایگزین می‌کند (پایگاه دادهٔ قبلی را نگه می‌دارد) و پنل را دوباره راه می‌اندازد.
  • هشدارهای سلامت در Telegram. Xray اجرا نمی‌شود، Xray بیش از حد دوباره راه‌اندازی می‌شود، حافظهٔ پنل یا Xray نزدیک سقفش است، دیسک پر است، گواهی رو به انقضاست، پشتیبان‌گیری ناموفق بوده است. یک پیام هنگام شروع مشکل، یادآوری تا وقتی ادامه دارد، و یک پیام وقتی برطرف شد.
  • استفادهٔ خودکار از گواهی تمدیدشده. Xray خودش هر یک ساعت (یا هر ocspStapling ثانیه) فایل‌های گواهی اینباندهای TLS و Hysteria را دوباره می‌خواند. پنل هر دقیقه با دست‌دهی (TLS، و برای Hysteria با QUIC) بررسی می‌کند که هر اینباند واقعاً کدام گواهی را ارائه می‌دهد؛ اگر هسته پس از تمدید در این مدت فایل جدید را نخوانده باشد (یا اینباند از oneTimeLoading استفاده کند)، یا گواهی ارائه‌شده ظرف یک ساعت منقضی شود، فقط Xray دوباره راه‌اندازی می‌شود: با سرویس still-xray خودکار، و با Xray درون پنل (Docker، یا STILL_XRAY_UNIT=off) فقط با STILL_CERT_RESTART=on در /etc/default/still-ui، چون این راه‌اندازی دوباره همهٔ کاربران را قطع می‌کند؛ بدون آن، برچسب فقط نشان می‌دهد که گواهی تمدید شده است. برچسب «گواهی‌ها» در صفحهٔ نمای کلی نشان می‌دهد هر اینباند چه گواهی‌ای و تا چه تاریخی ارائه می‌دهد و از قبل هشدار می‌دهد (یک هفته زودتر، و برای گواهی‌های کوتاه‌مدت روی IP، یک‌چهارم مدت اعتبار زودتر).
  • بافرهای بازپخش AmneziaWG دوباره استفاده می‌شوند. هر اتصال TCP از طریق AmneziaWG داخلی دو بافر کپی تازهٔ ۳۲ کیبی‌بایتی می‌گرفت؛ اکنون از یک pool گرفته می‌شوند. خود بازپخش: حدود ۶۹ کیلوبایت ← ۲٫۹ کیلوبایت تخصیص برای هر اتصال. کل پنل روی سرور آزمایشی 2 vCPU / 2 GiB، ۱۰۰ اتصال کوتاه در ثانیه از طریق AmneziaWG به مدت ۵ دقیقه، ۳ اجرا برای هر کدام، 3x-ui v3.11.0 در برابر still-ui: حافظهٔ پنل زیر بار به طور میانگین ۴۰۳ ← ۱۷۶ مبی‌بایت، اوج ۵۲۵ ← ۲۱۱ مبی‌بایت، در حالت بیکار یکسان. روش، محدودیت‌ها و داده‌های خام: bench/awg-relay-churn.
  • گروه Auto در اشتراک‌های Clash/Mihomo. وقتی اشتراک دو سرور یا بیشتر دارد، پروفایل Clash/Mihomo یک گروه Auto می‌گیرد: برنامه هر سرور را از درون تونل می‌آزماید و خودش به سروری که کار می‌کند می‌رود (سریع‌ترین با تلرانس ۵۰ میلی‌ثانیه و آزمون هر ۳۰۰ ثانیه، یا نخستین سروری که پاسخ دهد). Auto انتخاب پیش‌فرض در PROXY است و انتخاب دستی سرور همچنان ممکن است. در نصب‌های تازه روشن است؛ در پنلی که از پیش بوده، Auto group را در تنظیمات اشتراک روشن کنید.
  • اشتراک نتیجهٔ کاوشگرها را در نظر می‌گیرد. پیوندی که کاوشگرها نقطهٔ ورودش را از کار افتاده گزارش کنند (دو شکست پیاپی) می‌تواند به انتهای اشتراک برود یا پنهان شود، در همهٔ قالب‌ها: پیوندها، JSON و Clash. کاربر همیشه دست‌کم یک پیوند دارد و بدون نتیجهٔ تازهٔ کاوشگرها چیزی تغییر نمی‌کند. به‌طور پیش‌فرض خاموش است.
  • سایت‌های داخلی با یک تنظیم مستقیم باز می‌شوند. در تنظیمات ← اشتراک ← اتصال مستقیم سایت‌های داخلی یک کشور انتخاب کنید تا برنامه‌های کاربران سایت‌های همان کشور را مستقیم باز کنند (دامنه‌های ملی، فهرست آمادهٔ geosite و geoip) و بقیه را از VPN بفرستند؛ بانک‌ها، درگاه‌های دولتی و فروشگاه‌هایی که نشانی خارجی را نمی‌پذیرند با VPN روشن هم کار می‌کنند. فهرست کوتاه «همیشه از طریق VPN» پیش از آن بررسی می‌شود — Telegram (بازه‌های نشانی آن در پایگاه‌های geoip روسی ثبت شده‌اند)، YouTube، Instagram، WhatsApp، Discord، ChatGPT و Claude — و می‌توانید موارد خودتان را به آن اضافه کنید. در اشتراک‌های JSON، Clash/Mihomo و Happ/INCY کار می‌کند و یک فایل قوانین Shadowrocket هم در صفحهٔ اشتراک هست؛ فهرست سادهٔ لینک‌ها و پیکربندی‌های AmneziaWG نمی‌توانند چنین قوانینی را حمل کنند. به‌طور پیش‌فرض خاموش است. جزئیات
  • پالایهٔ ترافیک خروجی کلاینت‌ها. می‌توان جلوی ارسال ایمیل کلاینت‌ها از درگاه ۲۵ (در نصب‌های تازه از ابتدا روشن)، دسترسی به شبکه‌های خصوصی پشت سرور، درگاه‌های پنل و SSH خود سرور و نشانی‌ها و درگاه‌هایی را که فهرست می‌کنید گرفت. برای همهٔ اینباندهای کلاینت از راه Xray و، با nft، برای کلاینت‌های AmneziaWG در حالت کرنل کار می‌کند؛ پنل اصلی می‌تواند آن را به نودها بدهد.
  • سقف ماهانهٔ ترافیک برای هر نود. پنل اصلی ترافیک اینباندهای خود نود را در هر ماه (از روز بازنشانی‌ای که انتخاب می‌کنید) می‌شمارد، در ۸۰٪ (قابل تنظیم) و در رسیدن به سقف در Telegram هشدار می‌دهد و می‌تواند اینباندهای نود را تا دورهٔ بعد خاموش کند. ضریب حسابداری از ۰٫۱ تا ۱۰۰ ترافیک آن نود را در شمارندهٔ کلاینت‌ها مقیاس می‌کند از لحظهٔ تغییر به بعد (ترافیک قبلی با ضریب قبلی می‌ماند). نود سهمیهٔ هر کلاینت را با شمارش پنل اصلیِ همان کلاینت بررسی می‌کند، پس پنل‌هایی با ضریب‌های مختلف می‌توانند یک نود را با هم به کار ببرند. به‌طور پیش‌فرض سقفی نیست.
  • افزودن نود با یک فرمان. نودها ← افزودن با یک فرمان یک دعوت‌نامهٔ یک‌بارمصرف می‌سازد (به‌طور پیش‌فرض ۳۰ دقیقه اعتبار دارد و می‌توان آن را باطل کرد)؛ فرمانی که پنل نشان می‌دهد، اگر با root روی سرور تازه اجرا شود، still-ui را از نسخهٔ منتشرشده نصب می‌کند، آن را نود می‌کند و به پنل اصلی می‌افزاید. دیگر لازم نیست توکن API و اثر انگشت گواهی را دستی کپی کنید؛ نود پیش از هر تغییری کلید پنل اصلی را بررسی می‌کند. راهنما (انگلیسی).
  • محدودیت دستگاه به کاربر می‌گوید چه شده، پیش‌فرض پنل دارد و دستگاه‌های قدیمی را فراموش می‌کند. در 3x-ui v3.11.0 می‌توان تعداد دستگاه‌های یک اشتراک را محدود کرد (محدودیت HWID کلاینت؛ برخلاف محدودیت IP به Fail2ban نیاز ندارد و با جابه‌جایی گوشی میان Wi-Fi و اینترنت همراه فعال نمی‌شود)، اما دستگاهِ بیش از حد فقط خطای 404 می‌گیرد، برنامه‌ای که شناسهٔ دستگاه نمی‌فرستد همیشه رد می‌شود، پیش‌فرضی برای کل پنل وجود ندارد و دستگاه تا وقتی مدیر حذفش نکند جا را نگه می‌دارد. در still-ui دستگاه تازهٔ بیش از حد، پاسخی معتبر برای برنامهٔ خود می‌گیرد که تنها سرور آن یک پیام است — «Device limit 3 reached. Remove a device in your account or ask the seller.» (متن را خودتان تعیین می‌کنید؛ Happ آن را به‌صورت اعلان هم نشان می‌دهد) — و هرگز خطا نمی‌گیرد؛ دستگاه‌های ثبت‌شدهٔ قبلی همچنان سرورها را می‌گیرند. در تنظیمات ← اشتراک ← محدودیت دستگاه یک محدودیت پیش‌فرض برای همهٔ کلاینت‌های بدون محدودیت جداگانه (تا وقتی تنظیمش نکنید خاموش است؛ اشتراکی که از قبل دستگاه‌های بیشتری دارد تازه‌ترین‌ها را نگه می‌دارد)، انتخاب رفتار با برنامه‌های بدون شناسهٔ دستگاه (همهٔ آن‌ها یک جای مشترک از اشتراک می‌گیرند، که پیش‌فرض پنل تازه است؛ یا با پیام رد می‌شوند؛ یا بدون شمارش تحویل می‌گیرند — پنل به‌روزشدهٔ بدون محدودیت همین را نگه می‌دارد و در این حالت برنامه‌ای که شناسه نمی‌فرستد محدودیت را دور می‌زند و پنل دربارهٔ آن هشدار می‌دهد) و انقضا هست: دستگاهی که ۳۰ روز (قابل تنظیم؛ در پنل به‌روزشده تا وقتی تنظیمش نکنید خاموش است) اشتراک را دریافت نکرده جای خود را آزاد می‌کند. صفحهٔ اشتراک به کاربر «2 / 3» دستگاه را نشان می‌دهد و هیچ چیز دربارهٔ خود دستگاه‌ها؛ مدیر دستگاه‌ها را در کارت کلاینت می‌بیند و حذف می‌کند و API هم آن‌ها را فهرست و حذف می‌کند (/panel/api/clients/hwids/:email). پنل فقط هشِ شناسهٔ دستگاه را نگه می‌دارد و هرگز خود شناسه را. محدودیت روی دریافت اشتراک است: سرورهایی که قبلاً وارد برنامه شده‌اند همچنان کار می‌کنند و لینک‌هایی که دستی کپی شده‌اند شمرده نمی‌شوند.
  • هشدار وقتی اشتراکی به نظر لو رفته است. اشتراکی که دوباره فروخته شده، دست‌به‌دست شده یا سانسورچی آن را خریده است از شبکه‌های زیادی دریافت می‌شود و همهٔ نشانی‌های داخل آن ممکن است مسدود شوند. پنل شبکه‌هایی را که هر اشتراک از آن‌ها دریافت می‌شود می‌شمارد (IPv4 /24 یا IPv6 /48؛ صفحهٔ اشتراک و دستگاهی که محدودیت ردش کرده هم شمرده می‌شوند) و وقتی یک اشتراک در ۲۴ ساعت از ۶ شبکه دریافت شود (هر دو عدد قابل تنظیم‌اند) یک پیام Telegram می‌فرستد: کدام مشتری، چند شبکه، نخستین و آخرین دریافت و چند نمونه از شبکه‌ها. پیام بعدی برای همان اشتراک پس از ۷ روز می‌آید، یا زودتر اگر شمار شبکه‌ها دو برابر شود. چیزی مسدود نمی‌شود. پشت reverse proxy نشانی مشتری از X-Forwarded-For/X-Real-IP فقط وقتی خوانده می‌شود که پراکسی در CIDRهای پراکسی مورد اعتماد باشد، مثل ورود به پنل. شمارش در حافظه است و با راه‌اندازی دوبارهٔ پنل از نو شروع می‌شود. تنظیمات → Telegram → اعلان‌های رویداد تلگرام → امنیت → نشت اشتراک: در نصب تازه روشن (خود ربات تا وقتی تنظیمش نکنید خاموش است)، در پنل به‌روزشده خاموش.
  • مهاجرت از Marzban یا x-ui قدیمی با یک فرمان. فرمان still-ui import marzban /var/lib/marzban ورودی‌ها، کاربران و هاست‌ها را با همان UUIDها و گذرواژه‌ها، همان کلید REALITY و short ID، پورت‌ها، ترافیک مصرف‌شده، سقف‌ها، تاریخ انقضا و وضعیت‌ها منتقل می‌کند؛ پس لینک‌هایی که کاربران دارند همچنان وصل می‌شوند و لینک‌های اشتراکی که Marzban داده بود همچنان کار می‌کنند. گزینهٔ -dry-run نشان می‌دهد چه چیزی منتقل می‌شود و چه چیزی نمی‌شود؛ درون‌ریزی واقعی ابتدا پشتیبان می‌گیرد و یا همه را می‌نویسد یا هیچ. همین کار در تنظیمات ← درون‌ریزی هم هست. بخش مهاجرت از Marzban یا x-ui را ببینید.
  • حافظهٔ پنل در چند روز: بررسی شد. ۷۲ ساعت زیر بار ترکیبی (۲۰۰ کاربر؛ تغییر یک کلاینت هر ۵ ثانیه؛ درخواست‌های رابط و API؛ اشتراک‌ها؛ ترافیک VLESS، VMess و AmneziaWG)، still-ui v1.6.0 کنار 3x-ui v3.11.0 با داده و بار یکسان: در هیچ‌کدام رشدی نبود (+۰٫۱ مگابایت در ساعت در ۲۴ ساعت آخر، گوروتین‌ها و توصیف‌گرهای فایل ثابت، بدون راه‌اندازی مجدد). کلاینت‌های کند زیاد AmneziaWG هنوز می‌توانند بافرهای سوکت هسته را نگه دارند (حدود ۱۲ مگابایت برای هر جریان کند) که به حساب پنل نوشته می‌شود؛ سقف حافظه‌ای که نصب‌کننده برای سرویس تنظیم می‌کند این را مهار می‌کند (در Docker، mem_limit را تنظیم کنید).
  • گزارش اتصال‌ها در پنل. صفحهٔ اتصال‌ها نشان می‌دهد چه کسی، چه زمانی، از کدام اینباند و به کجا وصل شده است؛ با فیلتر بر اساس کلاینت، اینباند، زمان، مقصد و نشانی مبدأ و با خروجی CSV. نشانهٔ کنار هر کلاینت، اتصال‌های همان کلاینت را باز می‌کند. به شکایت سوءاستفاده («چه کسی در آن زمان به این نشانی وصل شد») بدون دسترسی به سرور پاسخ داده می‌شود. به‌طور پیش‌فرض خاموش است. مدت نگهداری (پیش‌فرض ۳۰ روز)، سقف حجم و آنچه ذخیره می‌شود را خودتان انتخاب می‌کنید: مقصد کامل، فقط دامنهٔ ثبت‌شده یا هیچ؛ نشانی کامل کلاینت، فقط شبکه یا هیچ. روزهای قدیمی خودشان پاک می‌شوند. چگونه کار می‌کند.
  • انتخاب هدف REALITY با نمایش تک‌تک بررسی‌ها. یافتن هدف‌ها در ورودی REALITY هر نامزد را از سرور شما می‌آزماید و نشان می‌دهد چه چیزی قبول شد: دسترس‌پذیری، TLS 1.3، X25519 (و اینکه X25519MLKEM768 هم پذیرفته می‌شود یا نه)، HTTP/2، گواهی معتبر برای همان نام، بیش از ۱۴ روز تا پایان گواهی، و تأخیر. نامزدها: فهرستی کوتاه که می‌توانید ویرایش کنید، هر چه خودتان وارد کنید و، اگر تیک بزنید، نشانی‌های دیگرِ شبکهٔ /24 سرور شما. استفاده هدف و SNI را پر می‌کند. هیچ فهرستی در پنل توصیه نیست: انتخاب سایت با شماست.
  • پرش پورت Hysteria2 که خود پنل راه می‌اندازد. در 3x-ui بازهٔ پورت فقط به کاربران اعلام می‌شود و هدایت روی سرور را باید خودتان بنویسید. UDP Hop ← هدایت در همین سرور یک قانون nftables بار می‌کند که بازه را به پورت ورودی می‌فرستد، پس از راه‌اندازی دوبارهٔ سرور آن را برمی‌گرداند و همراه ورودی حذفش می‌کند. جایی که این کار شدنی نیست (بدون nft، کانتینر بدون NET_ADMIN) پنل گزینه را نمی‌پذیرد تا کاربران پورت‌های بی‌سرانجام نگیرند. به‌طور پیش‌فرض خاموش است.
  • AmneziaWG: بستهٔ نخستِ شبیه QUIC یا DNS، و MTU 1280 با یک کلیک. دو دکمه بستهٔ امضای I1 را به شکل QUIC Initial یا پرس‌وجوی DNS می‌سازند؛ بخش‌های تصادفی در هر دست‌دهی فرق می‌کنند. با هر پیش‌تنظیم، کلاینت و سرور واقعی amneziawg-go در آزمون‌ها دست‌دهی را کامل می‌کنند. دکمه‌ها فقط I1 تا I5 را عوض می‌کنند، پس کاربران فعلی همچنان وصل می‌شوند. تنظیم روی 1280 کنار MTU: در شبکه‌های موبایل روسیه AmneziaWG با 1280 چهار تا پنج برابر سریع‌تر از مقدار پیش‌فرض اندازه‌گیری شد.

در حال انجام

  • فعلاً موردی نیست.

برنامهٔ کامل (به زبان روسی) در docs/ROADMAP.md آمده است.

نصب

با کاربر root اجرا کنید:

bash <(curl -Ls https://github.com/Dv2Corn/still-ui/releases/latest/download/install.sh)

برای نصب یک نسخهٔ مشخص، برچسب آن را اضافه کنید (برچسب‌ها به شکل vX.Y.Z-still.N هستند):

bash <(curl -Ls https://github.com/Dv2Corn/still-ui/releases/latest/download/install.sh) v1.4.0

نصب از آرشیو نسخه‌ای که قبلاً دانلود کرده‌اید:

STILL_UI_ARCHIVE=/path/still-ui-linux-amd64.tar.gz bash install.sh

نصب‌کننده نام کاربری، رمز عبور و مسیر پنل را به‌صورت تصادفی می‌سازد و در پایان نشان می‌دهد؛ آن‌ها را جایی نگه دارید. پس از آن، دستور still-ui منوی مدیریت را باز می‌کند: روشن و خاموش کردن سرویس، دیدن یا بازنشانی اطلاعات ورود، تغییر پورت، مدیریت گواهی‌ها و غیره. زیردستورها همان‌هایی هستند که اسکریپت x-ui در 3x-ui دارد: still-ui start، stop، restart، status، log، update، legacy، uninstall و موارد دیگر.

بسته‌های آمادهٔ هر نسخه فقط برای Linux amd64 و arm64 ساخته می‌شوند. نسخهٔ فعلی: still-ui 1.8.0 بر پایهٔ 3x-ui 3.11.0 و اصلاحاتی که پس از آن پذیرفته شده‌اند، همراه با Xray v26.10.31 در ساخت خود still-ui (چه فرقی دارد).

چه چیزی کجاست

چه چیزی کجا
سرویس still-ui (systemctl status still-ui)
برنامه /usr/local/still-ui
پایگاه داده /etc/still-ui/x-ui.db (نام فایل مثل 3x-ui مانده است)
گزارش‌ها /var/log/still-ui
تنظیمات /etc/default/still-ui
Xray سرویس still-xray، پیکربندی /etc/still-xray، گزارش‌ها /var/log/still-xray
پشتیبان‌ها /etc/still-ui/backups (با XUI_BACKUP_FOLDER در فایل تنظیمات می‌توان جای آن‌ها را تغییر داد)
گزارش اتصال‌ها /etc/still-ui/connlog (هر روز یک فایل؛ در پشتیبان‌ها نیست)

سقف حافظه

دیدن مقدار فعلی:

systemctl show still-ui -p MemoryMax

برای تعیین مقدار دلخواه، یک خط به /etc/default/still-ui اضافه کنید؛ مثلاً STILL_UI_MEMORY_MAX=800M، یا STILL_UI_MEMORY_MAX=off برای برداشتن سقف.

Xray هنگام راه‌اندازی دوبارهٔ پنل کار می‌کند

Xray جدا از پنل، به‌صورت سرویس systemd به نام still-xray اجرا می‌شود. systemctl restart still-ui، به‌روزرسانی پنل (از خط فرمان یا با دکمهٔ به‌روزرسانی) و از کار افتادن پنل کاری به آن ندارند، پس کاربران وصل می‌مانند. این در یک کانتینر یک‌بارمصرف Debian 12 آزموده شد: دانلود ۲۰ مگابایت از طریق یک اینباند SOCKS با سرعت ۴۰۰ کیلوبایت بر ثانیه، و در میانهٔ آن systemctl restart still-ui، kill -9 روی پنل و یک still-ui update کامل — هر بار فایل کامل رسید و فرایند Xray همان ماند.

Xray کی دوباره راه‌اندازی می‌شود؟ وقتی ساختار اینباندها تغییر کند (پنل این را می‌گوید)، وقتی راه‌اندازی مجدد Xray را بزنید، پس از still-ui restore، و یک بار هنگامی که نصب به سرویس منتقل می‌شود. Xray جدیدی که با یک به‌روزرسانی می‌آید فقط پس از راه‌اندازی دوبارهٔ Xray اجرا می‌شود؛ صفحهٔ نمای کلی این را می‌گوید.

بررسی: systemctl status still-xray. تا وقتی سرویس در حال استفاده است، فایل تنظیمات /etc/default/still-ui شامل XUI_XRAY_UNIT=still-xray است.

هنگام به‌روزرسانی، x-ui xray-unit-check ابتدا پیکربندی فعلی را بررسی می‌کند. Xray درون پنل می‌ماند، و به‌روزرسانی دلیلش را چاپ می‌کند، اگر یک اینباند

  • روی سوکت unix بیرون از /run/still-xray/ و /dev/shm/ گوش بدهد (سرویس /tmp جداگانهٔ خودش را دارد و بقیهٔ مسیرها را فقط‌خواندنی می‌بیند؛ مثلاً از /dev/shm/xray.sock,0666 استفاده کنید)،
  • اینباند TUN باشد: به /dev/net/tun نیاز دارد که sandbox سرویس آن را پنهان می‌کند؛ یک drop-in از خودتان در /etc/systemd/system/still-xray.service.d/ با PrivateDevices=no آن را مجاز می‌کند، سپس به‌روزرسانی را دوباره اجرا کنید.

TPROXY و علامت‌گذاری سوکت (مسیریابی بر اساس سیاست، WARP) در سرویس کار می‌کنند: سرویس CAP_NET_ADMIN دارد. پنل تغییری را که سرویسِ در حال اجرا نمی‌تواند انجام دهد رد می‌کند و دلیلش را می‌گوید، مثلاً علامت‌گذاری سوکت پس از آنکه یک drop-in محلی این قابلیت را گرفته باشد؛ هسته‌ای که هنوز از پیش از به‌روزرسانیِ دهندهٔ این قابلیت اجرا می‌شود، برای تغییری که به آن نیاز دارد یک بار دوباره راه‌اندازی می‌شود.

تنظیمات در /etc/default/still-ui: STILL_XRAY_UNIT=off Xray را درون پنل نگه می‌دارد (مانند 3x-ui)، STILL_XRAY_UNIT=on سرویس را اجباری می‌کند، و اگر تعیین نشده باشد یعنی خودکار. STILL_XRAY_MEMORY_MAX سقف حافظهٔ هسته است (به‌طور پیش‌فرض نصف RAM، از 256M تا 4G). پس از هر تغییر، still-ui update را اجرا کنید. ایمیج‌های Docker systemd ندارند و همیشه Xray را درون پنل نگه می‌دارند.

پشتیبان‌گیری و بازگردانی

در پنل، تنظیمات پنل ← پشتیبان‌ها:

  • پشتیبان زمان‌بندی‌شده را روشن کنید و زمان‌بندی را تعیین کنید (به‌طور پیش‌فرض روزانه). پنل یک snapshot سازگار می‌گیرد (SQLite backup API؛ با PostgreSQL، pg_dump)، بررسی می‌کند که دوباره خوانده شود، و still-ui-<host>-<date>-<time>.db (.pgdump) را در /etc/still-ui/backups می‌نویسد (0600، پوشه 0700). پس از تغییر زمان‌بندی، پنل را دوباره راه‌اندازی کنید.
  • تعداد نسخه‌های نگه‌داشته — پس از هر پشتیبان جدید، نسخه‌های قدیمی‌تر پاک می‌شوند؛ به فایل‌های دیگر پوشه هرگز دست زده نمی‌شود.
  • کلیدهای رمزنگاری — کلیدهای عمومی age (age1…، ساخته‌شده با age-keygen روی رایانهٔ خودتان) یا کلیدهای عمومی SSH (ssh-ed25519 …)، هر کدام در یک خط. وقتی کلیدی تعیین شده باشد، پشتیبان‌ها به شکل ….db.age نوشته می‌شوند و هیچ چیز رمزنگاری‌نشده‌ای ذخیره نمی‌شود. کلید خصوصی نزد شما می‌ماند. پشتیبان روزانه‌ای که به Telegram می‌رود (ربات تلگرام ← اعلان‌ها ← پشتیبان‌گیری از دیتابیس) هم برای همین کلیدها رمزنگاری می‌شود، و پیکربندی Xray هم.
  • ارسال به Telegram — هر پشتیبان رمزنگاری‌شده برای مدیران Telegram هم فرستاده می‌شود (تا ۵۰ مگابایت). پشتیبان‌های رمزنگاری‌نشده هرگز این‌گونه فرستاده نمی‌شوند.
  • اکنون پشتیبان بگیر و فهرست پشتیبان‌های روی سرور. از خط فرمان: still-ui backup.

بازگردانی:

still-ui restore /etc/still-ui/backups/still-ui-<host>-<date>-<time>.db.age

برای پشتیبان رمزنگاری‌شده، اسکریپت از شما می‌خواهد کلید خصوصی (AGE-SECRET-KEY-1…) را بچسبانید؛ کلید از طریق یک pipe به فایل اجرایی پنل می‌رسد و ذخیره نمی‌شود. می‌توانید یک فایل کلید را هم به‌عنوان آرگومان دوم بدهید (فایل identity در age یا کلید خصوصی OpenSSH بدون رمز) — آن را فقط برای بازگردانی به سرور کپی کنید. نسخهٔ پشتیبان ابتدا رمزگشایی و بررسی می‌شود (PRAGMA integrity_check، pg_restore --list)؛ کلید اشتباه یا فایل آسیب‌دیده چیزی را تغییر نمی‌دهد. سپس پنل متوقف می‌شود، پایگاه داده جایگزین می‌شود، پایگاه دادهٔ قبلی با نام /etc/still-ui/x-ui.db.before-restore-<time> نگه داشته می‌شود، Xray یک بار دوباره راه‌اندازی می‌شود تا اینباندهای بازگردانده را بارگذاری کند، و پنل دوباره راه می‌افتد. در PostgreSQL، پایگاه دادهٔ قبلی به‌صورت dump کنار آن نگه داشته می‌شود.

رمزگشایی در جای دیگر هم ممکن است: age -d -i key.txt backup.db.age > x-ui.db.

هشدارها

تنظیمات پنل ← ربات تلگرام ← اعلان‌ها ← سلامت سرور (ربات باید روشن باشد):

هشدار چه زمانی فرستاده می‌شود پیش‌فرض
Xray اجرا نمی‌شود Xray در دو بررسی پیاپی (یک دقیقه) پایین است و شما آن را متوقف نکرده‌اید روشن
راه‌اندازی مجدد Xray Xray در M دقیقه N بار از کار افتاده یا systemd آن را دوباره راه‌اندازی کرده است ۳ بار در ۱۰ دقیقه
حافظهٔ پنل یا Xray پنل یا Xray، X٪ از MemoryMax خود در systemd را (بدون کش فایل) مصرف می‌کند، یا X٪ از RAM را اگر سقفی نباشد؛ در سه بررسی پیاپی؛ پس از سه بررسی ۱۵ واحد پایین‌تر برطرف می‌شود ۹۰٪
دیسک پر است دیسکی که /، پایگاه داده یا پشتیبان‌ها روی آن است X٪ پر شده است؛ پس از سه بررسی ۵ واحد پایین‌تر برطرف می‌شود ۹۰٪
انقضای گواهی فایل گواهی پنل یا اشتراک، یا گواهی‌ای که یک اینباند TLS/Hysteria واقعاً ارائه می‌دهد، ظرف N روز منقضی می‌شود — حداکثر یک‌چهارم مدت اعتبارش، پس گواهی IP شش‌روزه فقط در یک روز و نیم آخرش گزارش می‌شود ۷ روز
پشتیبان‌گیری ناموفق بود یک پشتیبان زمان‌بندی‌شده (یا ارسال آن به Telegram) ناموفق بوده است روشن

بررسی‌ها هر دقیقه اجرا می‌شوند. هشدار یک بار هنگام شروع مشکل فرستاده می‌شود، تا وقتی مشکل ادامه دارد هر چند ساعت یک بار طبق یادآوری هر (ساعت) دوباره فرستاده می‌شود (به‌طور پیش‌فرض ۶؛ ۰ یعنی هرگز)، و یک بار دیگر وقتی برطرف شود. وضعیت در حافظه نگه داشته می‌شود: پس از راه‌اندازی دوبارهٔ پنل، مشکلی که هنوز وجود دارد یک بار دیگر گزارش می‌شود.

گزارش اتصال‌ها

در پنل تنظیمات ← گزارش اتصال‌ها و سپس صفحهٔ اتصال‌ها:

  • ثبت اتصال‌ها — به‌طور پیش‌فرض خاموش است. تا وقتی روشن است، پنل هر پنج ثانیه گزارش دسترسی Xray را می‌خواند. اگر آن گزارش روی none باشد، پنل تا زمانی که این کلید روشن است آن را روشن می‌کند (access-connlog.log در پوشهٔ گزارش‌های Xray) و Xray یک بار راه‌اندازی مجدد می‌شود؛ گزارش دسترسی‌ای که خودتان تنظیم کرده‌اید همان‌طور که هست و بدون راه‌اندازی مجدد استفاده می‌شود. خاموش کردن کلید، پیکربندی Xray را برمی‌گرداند و آن فایل را خالی می‌کند.
  • مدت نگهداری (روز) (۳۰) و سقف حجم (مگابایت) (۲۰۴۸). هر روز یک فایل در /etc/still-ui/connlog است، بیرون از پایگاه‌دادهٔ پنل و پشتیبان‌هایش. روزهای قدیمی‌تر از مدت نگهداری پاک می‌شوند؛ وقتی پوشه از سقف بزرگ‌تر شود ابتدا قدیمی‌ترین روز پاک می‌شود و اگر یک روز به‌تنهایی از سقف بزرگ‌تر باشد، قدیمی‌ترین اتصال‌های همان روز پاک می‌شوند. یک میلیون اتصال حدود ۷۵ مگابایت جا می‌گیرد و ذخیره‌اش حدود نیم دقیقه از یک هستهٔ پردازنده زمان می‌برد.
  • مقصد: نام کامل میزبان یا نشانی IP، فقط دامنهٔ ثبت‌شده (maps.example.co.uk می‌شود example.co.uk؛ نشانی IP همان می‌ماند) یا هیچ. نشانی کلاینت: نشانی کامل و پورت، فقط شبکه (‎/24 برای IPv4 و ‎/48 برای IPv6، بدون پورت) یا هیچ. تغییر فقط روی اتصال‌های جدید اثر دارد؛ آنچه ذخیره شده تا پایان مهلتش همان‌طور می‌ماند.
  • اتصال‌ها — فیلتر بر اساس کلاینت (نام دقیق)، اینباند، بازهٔ زمانی، بخشی از مقصد و بخشی از نشانی مبدأ. جدیدترین‌ها اول، هر صفحه ۵۰ ردیف. خروجی CSV حداکثر ۱۰۰٬۰۰۰ ردیف از فیلتر فعلی را ذخیره می‌کند و زمان‌ها به وقت UTC است.
  • فقط مدیر می‌تواند آن را بخواند: صفحه و API آن (/panel/api/connlog/list و /export) به ورود به پنل یا توکن API مدیر نیاز دارد؛ توکن‌های پایش و نود پذیرفته نمی‌شوند. هر جست‌وجو و هر خروجی همراه با کلاینت، نشانی او و فیلتر در گزارش پنل ثبت می‌شود.

محدودیت‌ها. این گزارش فقط آنچه از Xray می‌گذرد را دارد: اتصال‌های AmneziaWG و TUIC با کلاینت و مقصدشان ثبت می‌شوند، اما با نشانی مبدأ محلی، چون پنل آن‌ها را روی همان ماشین به Xray می‌دهد؛ اتصال‌های MTProto به کلاینت نسبت داده نمی‌شوند. اگر در تنظیمات گزارش Xray مقدار maskAddress تنظیم شده باشد، Xray بخشی از نشانی کلاینت را پیش از رسیدن به پنل پنهان می‌کند. هر نود گزارش خودش را نگه می‌دارد و در پنل همان نود خوانده می‌شود؛ پنل اصلی آن را جمع نمی‌کند. پنل پیش از خالی کردن گزارش دسترسیِ بزرگ، خط‌هایی را که هنوز نخوانده ذخیره می‌کند. تنظیم ذخیره‌سازی فقط به آنچه پنل نگه می‌دارد مربوط است، نه به خودِ گزارش دسترسی Xray: آن فایل سطرها را کامل نگه می‌دارد تا وقتی پنل آن را خالی کند؛ روزی یک بار یا وقتی از ۶۴ مبی‌بایت بزرگ‌تر شود. این گزارش فقط به اندازهٔ گزارش دسترسی Xray قابل اعتماد است: Xray متن درخواست ردشده را همان‌طور که رسیده، همراه با شکست خط، در آن می‌نویسد؛ پس هر کس بتواند به یک اینباند درخواست بفرستد می‌تواند سطری به دلخواه خود اضافه کند، با هر نام کلاینت، نشانی و مقصدی. پنل سطری را که تاریخش جلوتر از ساعت سرور باشد ذخیره نمی‌کند و این را در گزارش پنل می‌نویسد؛ اما سطری با زمانِ همان لحظه را نمی‌تواند از سطر خودِ Xray تشخیص دهد. هر ردیف را سرنخ بدانید، نه مدرک.

به‌روزرسانی، بازگشت به نسخهٔ قبل، حذف

به‌روزرسانی به آخرین نسخه — با دستور زیر یا با دکمهٔ به‌روزرسانی در خود پنل:

still-ui update

بازگشت به نسخهٔ قبلی — still-ui legacy شمارهٔ نسخه را می‌پرسد؛ یا نصب‌کننده را با برچسب همان نسخه اجرا کنید. پایگاه داده حفظ می‌شود.

still-ui legacy
bash <(curl -Ls https://github.com/Dv2Corn/still-ui/releases/latest/download/install.sh) v<tag>

بازگشت به نسخه‌ای بدون سرویس still-xray (مثلاً v3.11.0-still.1): still-ui legacy پیش از نصب، سرویس را متوقف می‌کند؛ اگر نصب‌کنندهٔ قدیمی را دستی اجرا می‌کنید، ابتدا systemctl disable --now still-xray را اجرا کنید.

پیش از به‌روزرسانی یا بازگشت به نسخهٔ قبل، از /etc/still-ui نسخهٔ پشتیبان بگیرید: ممکن است نسخهٔ قدیمی‌تر پایگاه داده‌ای را که نسخهٔ جدیدتر نوشته است نشناسد.

حذف پنل:

still-ui uninstall

این دستور برنامه، هر دو سرویس، کاربر still-xray و منو را حذف می‌کند، اما داده‌ها می‌مانند: پایگاه داده، نسخه‌های پشتیبان و install-result.env در /etc/still-ui و فایل تنظیمات (/etc/default/still-ui). اگر still-ui را دوباره نصب کنید، همین داده‌ها را برمی‌دارد و ورود، اینباندها و کلاینت‌ها همان می‌مانند. منو می‌پرسد «Also delete all data?» (پیش‌فرض: خیر)؛ بدون ترمینال داده‌ها هرگز پاک نمی‌شوند. برای اسکریپت‌ها: still-ui uninstall --keep-data داده‌ها را نگه می‌دارد و still-ui uninstall --purge آن‌ها را هم پاک می‌کند (و پیشنهاد پاک کردن PostgreSQL محلی را می‌دهد). برخلاف 3x-ui، تا خودتان نخواهید چیزی پاک نمی‌شود.

شبکه‌های موبایل

در افزودن ورودی ← پیش‌تنظیم دو پیش‌تنظیم برای شبکه‌های موبایل هست: VLESS REALITY روی TCP 443 با اثر انگشت ios، و Hysteria2 روی UDP 443. گزینهٔ پیکربندی Xray ← مسیریابی ← مسیریابی پایه ← مسدود کردن تورنت کاربران (به‌طور پیش‌فرض خاموش) ترافیک BitTorrent کاربران را در Xray و، روی Linux با nftables، روی خود سرور مسدود می‌کند. یافتن هدف‌ها در ورودی REALITY نامزدها را از خود سرور بررسی می‌کند و نتیجهٔ هر بررسی را نشان می‌دهد. در ورودی Hysteria گزینهٔ UDP Hop ← هدایت در همین سرور (به‌طور پیش‌فرض خاموش) بازهٔ پورت‌های پرش را با nftables به پورت ورودی هدایت می‌کند. در ورودی AmneziaWG دکمه‌های I1 شبیه QUIC و I1 شبیه DNS و میان‌بر MTU 1280 هست. جزئیات کامل (به انگلیسی): Mobile networks in Russia.

بررسی اصالت یک نسخه

آرشیوهای هر نسخه را GitHub Actions از روی commit برچسب‌خورده می‌سازد (گردش‌کار release)، نه رایانهٔ یک توسعه‌دهنده، و هر آرشیو یک گواهی منشأ ساخت (build provenance attestation) امضاشده همراه دارد. نسخه‌ها تا 1.4.0 (خود 1.4.0 هم) با scripts/still-release.sh به‌صورت دستی ساخته شده‌اند و فقط فایل‌های .sha256 را دارند.

فایل چیست
still-ui-linux-<arch>.tar.gz آرشیوی که install.sh و still-ui update دانلود می‌کنند
still-ui-linux-<arch>.tar.gz.sha256 checksum آن؛ نصب‌کننده آن را بررسی می‌کند
still-ui-linux-<arch>.tar.gz.spdx.json SBOM (SPDX): همهٔ فایل‌های آرشیو با sha256 هر کدام، و ماژول‌های Go درون x-ui، xray و mtg
still-probe-linux-<arch>.tar.gz (+ .sha256) عامل بررسی دسترس‌پذیری که scripts/still-probe-install.sh دانلودش می‌کند؛ مانند آرشیوهای پنل attestation دارد
SHA256SUMS checksum آرشیوها، SBOMها و آرشیوهای عامل بررسی

دانلود و بررسی checksumها (به‌جای v1.8.0 نسخه‌ای را بگذارید که نصب می‌کنید):

gh release download v1.8.0 -R Dv2Corn/still-ui -p 'still-ui-linux-amd64.tar.gz*' -p SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing

بررسی اینکه آرشیو را گردش‌کار release همین مخزن از روی همان برچسب ساخته است (به GitHub CLI نیاز دارد):

gh attestation verify still-ui-linux-amd64.tar.gz -R Dv2Corn/still-ui \
  --signer-workflow Dv2Corn/still-ui/.github/workflows/release.yml --source-ref refs/tags/v1.8.0

برای SBOM هم گواهی صادر شده است:

gh attestation verify still-ui-linux-amd64.tar.gz -R Dv2Corn/still-ui --predicate-type https://spdx.dev/Document/v2.3

هستهٔ Xray درون آرشیو را می‌توان بیت‌به‌بیت دوباره ساخت. روی یک میزبان Linux با git و docker:

tar -xzf still-ui-linux-amd64.tar.gz still-ui/bin/xray-linux-amd64
sha256sum still-ui/bin/xray-linux-amd64
git clone https://github.com/Dv2Corn/still-ui && cd still-ui && git checkout v1.8.0
scripts/xray-build/build.sh /tmp/xray-out amd64 arm64

build.sh sum فایل‌های اجرایی‌ای را که ساخته چاپ می‌کند و اگر با مقادیر پین‌شده در خودش فرق داشته باشند، با خطا متوقف می‌شود؛ sum فایل xray-linux-amd64 از آرشیو باید همان باشد. گردش‌کار ساخت تکرارپذیر Xray این کار را با هر تغییر در دستور ساخت و هفته‌ای یک بار، روی یک runner با x86_64 و یک runner با arm64 انجام می‌دهد. آنچه وصله تغییر می‌دهد: scripts/xray-build.

آرشیو در کل بیت‌به‌بیت تکرارپذیر نیست: فایل اجرایی پنل با toolchain زبان C که هنگام ساخت جاری است لینک می‌شود، و فایل‌های geo و mtg آخرین نسخه‌های پروژه‌های خودشان در همان لحظه‌اند. آنچه آرشیو را به commit و به اجرای گردش‌کار گره می‌زند، گواهی منشأ است.

مهاجرت از 3x-ui

یک دستور، 3x-ui در حال اجرا را به still-ui منتقل می‌کند و هر چیزی را که کاربران و شما به آن متکی هستید نگه می‌دارد:

bash <(curl -Ls https://github.com/Dv2Corn/still-ui/releases/latest/download/install.sh) migrate

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

  1. 3x-ui را پیدا می‌کند (/usr/local/x-ui، x-ui.service، پایگاه دادهٔ SQLite یا پایگاه دادهٔ PostgreSQL که در /etc/default/x-ui نام برده شده) و آنچه را نمی‌تواند با اطمینان منتقل کند نمی‌پذیرد: فورک‌های دیگر x-ui، 3x-ui قدیمی‌تر از 2.0.0 (اول آن را با x-ui update به‌روز کنید)، 3x-ui جدیدتر از نسخه‌ای که still-ui بر پایهٔ آن است، میزبان‌های بدون systemd، نصب‌های Docker، و میزبان‌هایی که از قبل still-ui دارند.
  2. تا وقتی 3x-ui هنوز اجرا می‌شود، آنچه را باید سالم بماند ثبت می‌کند: اینباندها، کلاینت‌ها، اطلاعات ورود پنل، نشانی‌های پنل و اشتراک، و اشتراک‌های حداکثر پنج کلاینت همان‌طور که 3x-ui ارائه می‌دهد.
  3. پیش از هر تغییری از همه‌چیز در /root/still-ui-migrate-<UTC time>/ پشتیبان می‌گیرد (فقط برای root خواندنی): یک کپی سازگار از پایگاه داده (یا یک pg_dump)، /usr/local/x-ui، فایل unit و drop-inهای آن، /usr/bin/x-ui، فایل env، و یک manifest با checksumها.
  4. بسته‌هایی را که still-ui لازم دارد نصب می‌کند، تا وقتی 3x-ui هنوز به کلاینت‌ها سرویس می‌دهد؛ سپس 3x-ui را متوقف می‌کند و still-ui را با یک کپی از پایگاه داده‌اش نصب می‌کند (نصب‌کننده‌ای که پس از ۱۰ دقیقه تمام نشود، STILL_UI_MIGRATE_INSTALL_TIMEOUT، شکست‌خورده حساب می‌شود). still-ui در پوشه‌های خودش قرار می‌گیرد (/usr/local/still-ui، /etc/still-ui، still-ui.service)؛ پورت‌ها، گواهی‌ها، مسیر پایهٔ پنل، نشانی‌های اشتراک، لینک‌های کلاینت و اطلاعات ورود پنل (با 2FA) از پایگاه داده می‌آیند و همان می‌مانند.
  5. still-ui را بررسی می‌کند: پنل در همان نشانی پاسخ می‌دهد، Xray اجرا می‌شود، اینباندها، کلاینت‌ها، اطلاعات ورود و تنظیمات listener یکسان‌اند، و اشتراک‌های نمونه بایت‌به‌بایت یکسان‌اند. 3x-ui 2.x پارامترهای کمتری از still-ui در لینک‌ها می‌نویسد؛ در این حالت هر پارامتری که لینک داشت باید با همان مقدار باقی مانده باشد.
  6. اگر هر مرحله‌ای پس از توقف 3x-ui شکست بخورد، 3x-ui را خودش بازمی‌گرداند و دلیل را می‌گوید.

پس از پایان، x-ui.service حذف می‌شود (در پشتیبان هست) تا 3x-ui نتواند کنار still-ui اجرا شود، دستور x-ui منوی still-ui را باز می‌کند، و تمدیدهای acme.sh که x-ui را دوباره راه می‌انداختند اکنون still-ui را دوباره راه می‌اندازند (بازگردانی آن‌ها را به حالت قبل برمی‌گرداند). فایل‌ها و پایگاه دادهٔ خود 3x-ui تغییر نمی‌کنند.

هر زمان بخواهید می‌توانید آن را برگردانید — این دستور فایل‌ها، unit و پایگاه دادهٔ 3x-ui را از تازه‌ترین پشتیبان بازمی‌گرداند، 3x-ui را اجرا می‌کند، still-ui را حذف می‌کند و پایگاه دادهٔ still-ui را در پوشهٔ پشتیبان نگه می‌دارد:

still-ui migrate-rollback

تغییراتی که پس از مهاجرت در still-ui ایجاد شده‌اند (کلاینت‌های جدید، شمارنده‌های ترافیک) به 3x-ui برنمی‌گردند. بدون ترمینال، STILL_UI_MIGRATE_YES=1 را تنظیم کنید. راه‌اندازی با PostgreSQL به pg_dump و pg_restore روی سرور نیاز دارد. آزموده‌شده روی Debian 12 و Ubuntu 24.04 با 3x-ui 3.11.0 (SQLite و PostgreSQL)، 3.7.0، 2.9.4، 2.6.7، 2.4.11، 2.3.15، 2.2.8 و 2.0.2 (scripts/test-migrate.sh).

نصب معمولی هم پیشنهاد می‌کند /etc/x-ui/x-ui.db را بردارد (بدون تعامل: STILL_UI_IMPORT_3XUI=yes)، اما بدون بررسی‌ها و پشتیبانی که در بالا آمد. این کار 3x-ui را متوقف می‌کند، یونیت آن را به /root/still-ui-3x-ui-retired/ منتقل می‌کند و تمدیدهای acme.sh را هم به still-ui می‌سپارد؛ bash /root/still-ui-3x-ui-retired/migrate.sh restore-import /root/still-ui-3x-ui-retired هر دو را برمی‌گرداند (still-ui uninstall --purge آن را اجرا می‌کند؛ حذفی که داده‌ها را برای نصب دوباره نگه می‌دارد، 3x-ui را کنار گذاشته باقی می‌گذارد).

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

مهاجرت از Marzban یا x-ui

‏still-ui را نصب کنید (روی همان سرور Marzban، یا روی سروری تازه که پوشهٔ دادهٔ Marzban روی آن کپی شده)، سپس:

still-ui import marzban /var/lib/marzban -dry-run   # فقط گزارش؛ چیزی نوشته نمی‌شود
still-ui import marzban /var/lib/marzban            # پشتیبان، درون‌ریزی، راه‌اندازی دوباره

آرگومان، پوشهٔ دادهٔ Marzban یا فایل db.sqlite3 آن است؛ ورودی‌ها از xray_config.json کنار آن خوانده می‌شوند (فایل دیگر با -config FILE). هر دو فایل فقط خوانده می‌شوند. تنظیمات ← درون‌ریزی در پنل همین کار را می‌کند: دو فایل را بارگذاری کنید، گزارش را بخوانید و تأیید کنید.

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

  • ورودی‌ها — VLESS، VMess، Trojan و Shadowsocks روی هر ترنسپورت، با TLS یا REALITY، همان‌طور که در Xray بودند: پورت، کلید خصوصی REALITY و short ID، مسیرها. فایل‌های گواهی باید در همان مسیرها روی این سرور خوانا باشند؛ ورودی‌ای که گواهی‌اش پیدا نشود در گزارش می‌آید و منتقل نمی‌شود.
  • کاربران — UUIDها و گذرواژه‌ها، flow، ترافیک مصرف‌شده و سقف، انقضا، یادداشت و وضعیت: کاربر غیرفعال غیرفعال می‌ماند، کاربری که سقف یا مهلتش تمام شده تا تمدید مسدود می‌ماند، و کاربر on hold از نخستین اتصال شروع به شمارش می‌کند. بازنشانی روزانه، هفتگی و ماهانهٔ ترافیک به تقویم still-ui منتقل می‌شود — روزانه در نیمه‌شب، هفتگی در یکشنبه، ماهانه در همان روزِ ماه که بازنشانی بعدی کاربر در Marzban سررسید داشت (Marzban از آخرین بازنشانی هر کاربر ۱، ۷ و ۳۰ روز می‌شمرد)؛ سالانه نه.
  • هاست‌ها — نشانی، پورت، SNI، سرآیند Host، مسیر، ALPN و اثرانگشت، به‌عنوان هاست‌های همان ورودی. هاستی که نشانی‌اش {SERVER_IP} است از نشانی‌ای استفاده می‌کند که اشتراک از آن دریافت شده.
  • لینک‌های اشتراک — لینک‌های /sub/<token> مرزبان همان‌طور که هستند پذیرفته می‌شوند، با رعایت تاریخ ابطال هر کاربر. این لینک‌ها در مسیر /sub/ پاسخ داده می‌شوند، مسیر اشتراک خودِ still-ui هرچه باشد، و فقط همین‌ها: شناسهٔ اشتراک معمولی همچنان به مسیر خودِ پنل نیاز دارد. نشانی‌ای را که کاربران دارند (هاست و پورت) به سرور اشتراک still-ui برسانید؛ اگر Marzban مقدار دیگری برای XRAY_SUBSCRIPTION_PATH داشت، همان را در تنظیمات ← اشتراک به‌عنوان مسیر اشتراک بگذارید. برای بررسی این لینک‌ها still-ui کلید امضای Marzban را در پایگاه‌دادهٔ خودش نگه می‌دارد. هر کس این کلید را داشته باشد — یک پشتیبان قدیمی Marzban یا مدیر پیشین — می‌تواند با چنین لینک‌هایی اشتراک کاربران منتقل‌شده را باز کند؛ پس وقتی کاربران به لینک‌های still-ui رفتند، فرمان still-ui import forget-links را اجرا کنید: پذیرش لینک‌های قدیمی متوقف و کلید حذف می‌شود. شناسهٔ اشتراک هر کاربر منتقل‌شده در still-ui تصادفی است و از روی آن کلید به دست نمی‌آید.

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

  • مدیران (گزارش آن‌ها را فهرست می‌کند)، نودها، قالب‌های کاربر و مسیرهای /info، /usage و نوع کلاینت زیر لینک اشتراک.
  • هر کلاینت در اینجا یک UUID و یک گذرواژه دارد، ولی Marzban برای هر پروتکل جداگانه می‌دهد. کاربری که هم ورودی VLESS و هم VMess دارد، یا هم Trojan و هم Shadowsocks، به دو کلاینت در یک اشتراک تبدیل می‌شود (name و name.vmess یا name.ss) که هرکدام سقف کامل و شمارندهٔ ترافیک خودش را دارد.
  • نام لینک‌ها: still-ui لینک‌ها را با قالب نام‌گذاری خودش نام می‌دهد، نه با نام هاست. همهٔ تنظیمات اتصال یکسان است.
  • ‏Marzban روی MySQL یا MariaDB: فقط فایل SQLite خوانده می‌شود.

فرمان still-ui import x-ui /etc/x-ui/x-ui.db همین کار را برای x-ui (‏vaxilu/x-ui و فورک‌هایش) و 3x-ui پیش از v3 انجام می‌دهد: ورودی‌ها با کلاینت‌ها و ترافیکشان؛ کلاینتِ بدون email یک نام می‌گیرد. برای 3x-ui 2.0 و بالاتر مهاجرتِ بالا بهتر است، چون تنظیمات و ورود به پنل را هم نگه می‌دارد.

پنلی که از قبل ورودی دارد به -merge نیاز دارد: ورودی‌هایی که پورت یا تگشان گرفته شده و کلاینت‌هایی که emailشان وجود دارد یا شناسهٔ اشتراکشان اینجا متعلق به کلاینت دیگری است رد و فهرست می‌شوند. برای برگرداندن درون‌ریزی، پشتیبانی را که خودش اعلام کرده بازگردانید: still-ui restore <file>.

به‌صورت سرتاسری در Docker آزموده شده (scripts/test-import-marzban.sh): ‏Marzban v0.8.4 از ایمیج رسمی با ورودی‌های VLESS REALITY، VMess WebSocket و Shadowsocks، سپس still-ui به جای آن؛ کلاینت Xray با همان لینک‌ها و لینک اشتراکی که Marzban داده بود، بدون تغییر، وصل می‌شود.

بررسی دسترس‌پذیری از درون یک شبکهٔ سانسورشده

پنل از درون نمی‌تواند بفهمد که اینباندهایش برای کاربرانی که در یک شبکهٔ سانسورشده هستند (برای مثال در ایران یا چین) کار می‌کنند یا نه: سرور یک دست‌دادن می‌بیند، در حالی که سانسورچی ممکن است اتصال را چند کیلوبایت بعد متوقف کند. یک کاوشگر (probe) به این پرسش پاسخ می‌دهد: «آیا VPN من همین حالا از آنجا کار می‌کند؟». کاوشگر یک عامل کوچک است (still-probe، یک فایل اجرایی ایستا همراه با Xray در still-ui) که آن را روی هر دستگاه Linux درون آن شبکه اجرا می‌کنید، در هر کشوری: یک سرور خانگی، یک Raspberry Pi یا یک VPS ارزان محلی.

  1. در پنل کاوشگرها ← افزودن کاوشگر را باز کنید، نامی به آن بدهید و اینباندهایی را که باید آزموده شوند انتخاب کنید (VLESS، VMess، Trojan، Shadowsocks، Hysteria). پنل برای آن روی همان اینباندها یک کلاینت سرویس still-probe-… بدون محدودیت ترافیک یا زمان می‌سازد؛ این کلاینت را ویرایش یا حذف نکنید.
  2. دستور نصبی را که یک بار همراه با توکن نشان داده می‌شود کپی کنید و آن را با root روی دستگاه کاوشگر اجرا کنید (amd64 یا arm64، با systemd):
STILL_PROBE_TOKEN='<token>' bash <(curl -fsSL https://raw.githubusercontent.com/Dv2Corn/still-ui/main/scripts/still-probe-install.sh) \
    --panel 'https://<server>:<port>/<base path>/'

نصب‌کننده still-probe-linux-<arch>.tar.gz را از آخرین نسخهٔ still-ui دانلود می‌کند و sha256 آن را بررسی می‌کند، عامل را در /usr/local/still-probe، پیکربندی‌اش را در /etc/still-probe/config.json (root:still-probe 0640) و یک timer در systemd نصب می‌کند، و اولین بررسی را اجرا می‌کند. برای پنلی با گواهی self-signed، --pin <sha256> را اضافه کنید، و برای حذف همه‌چیز --uninstall را. نشانی پنل با http:// پذیرفته نمی‌شود: توکن، مسیر مخفی پنل و کلیدهای همهٔ اینباندهای آزمایش‌شده به‌صورت متن آشکار از شبکهٔ سانسورشده عبور می‌کنند. --insecure-http با این حال آن را می‌پذیرد و هشدار می‌دهد.

در هر بازهٔ زمانی (به‌طور پیش‌فرض ۱۰ دقیقه) عامل کارش را از پنل می‌گیرد، Xray را با یک پورت SOCKS برای هر نقطهٔ پایانی اینباند اجرا می‌کند (همان نشانی، SNI و کلیدهایی که اشتراک ارائه می‌دهد)، نشانی آزمایشی را از طریق هر کدام دانلود می‌کند (به‌طور پیش‌فرض ۲۵۶ کیبی‌بایت از Cloudflare: سانسورچی‌ای که اتصال‌ها را پس از چند کیلوبایت اول قطع می‌کند، به شکل شکست دیده می‌شود) و، در صورت تمایل، یک نشانی مستقیم بدون VPN، مثل سایت یا صفحهٔ اشتراک شما. موفقیت، زمان تا اولین بایت، زمان کل و تعداد بایت‌ها را گزارش می‌دهد. اگر خود پنل از آنجا مسدود باشد، گزارش از طریق اینباندی فرستاده می‌شود که همین الان کار کرده است.

صفحهٔ کاوشگرها آخرین نتیجهٔ هر نقطهٔ پایانی، دسترس‌پذیری آن در ۷ روز و نوار تاریخچهٔ ساعتی را نشان می‌دهد؛ کاوشگری که سه بازه گزارش نداده باشد با «بدون گزارش» علامت می‌خورد. ربات Telegram وقتی یک نقطهٔ پایانی دو بار پشت سر هم شکست بخورد، وقتی دوباره کار کند، و وقتی کاوشگری ساکت بماند هشدار می‌فرستد: رویدادهای «کاوشگرهای دسترس‌پذیری» را در تنظیمات پنل ← ربات تلگرام روشن کنید.

توکن کاوشگر فقط دو مسیر عامل را باز می‌کند (<base path>probe/v1/job و probe/v1/report)، نه هیچ چیزی زیر /panel/api؛ پنل فقط SHA-256 آن را ذخیره می‌کند، و هر کار فقط اعتبارنامه‌های خود کلاینت کاوشگر را در بر دارد. توکن جدید توکن قبلی را باطل می‌کند و به کلاینت کاوشگر هم کلیدهای تازه می‌دهد، پس پیکربندی یا لینک نشت‌کردهٔ عامل از کار می‌افتد؛ کاوشگر غیرفعال یا حذف‌شده اصلاً کلاینتی ندارد. اینباندهای WireGuard، AmneziaWG، TUIC و MTProto هنوز بررسی نمی‌شوند.

بررسی پنل

xui-doctor یک ابزار بررسی کوچک و فقط‌خواندنی برای still-ui و 3x-ui است. نسخهٔ هستهٔ Xray، تنظیمات REALITY و TLS، پورت‌های باز، کلاینت‌ها و امنیت پنل را بررسی می‌کند و آنچه را باید اصلاح شود چاپ می‌کند. هیچ چیزی را روی سرور تغییر نمی‌دهد.

go install github.com/Dv2Corn/xui-doctor/cmd/xui-doctor@latest
XUI_API_TOKEN=<token> xui-doctor check --url https://<server>:<port>/<base path>/

کد خروج 0 یعنی مشکلی نیست، 1 یعنی هشدار، و 2 یعنی مشکلی جدی. برای اسکریپت‌ها --json را اضافه کنید.

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

اگر still-ui به کارتان آمده، می‌توانید از ادامهٔ توسعهٔ آن حمایت کنید:

  • USDT (TRC20): TE18ocTtSRa855uCzKFnPFgnSAtJ5Jny2x
  • BTC: bc1qneuy3u36lrln042uezc7a7ycxd30n5fk29f43e

پرداخت با کارت از طریق DonationAlerts: https://www.donationalerts.com/r/dv2corn

دادن ستاره در GitHub هم کمک می‌کند.

سپاسگزاری

  • 3x-ui — از MHSanaei و همهٔ مشارکت‌کنندگان؛ still-ui بر پایهٔ کار آن‌ها ساخته شده است. حمایت از نویسندهٔ 3x-ui: GitHub Sponsors, donate.sanaei.dev.
  • x-ui — از vaxilu که همه‌چیز از آنجا شروع شد، و از alireza0.
  • Xray-core — از Project X، موتوری که زیر این پنل کار می‌کند.

مجوز

still-ui تحت مجوز GNU General Public License v3.0 منتشر می‌شود؛ همان مجوز 3x-ui. هر کس نسخهٔ تغییریافته‌ای از آن را منتشر کند، باید تغییراتش را تحت همین مجوز در دسترس بگذارد.