نصب
فعالسازی
Row-Template چطور در 3X-UI، PasarGuard و Rebecca به صفحهای تبدیل میشود که مشترکان میبینند — آنچه روی هر پنل تغییر میکند، انجام خودکار یا دستی آن، و اطمینان از درستی کار.
نصب Row-Template صفحه را روی دیسک قرار میدهد. فعالسازی به پنل میگوید آن را ارائه کند. معنای آن به پنل بستگی دارد و Row-Template روی هر کدام کمترین تغییر ممکن را میدهد:
| پنل | آنچه فعالسازی تغییر میدهد | خودکار است وقتی | ریاستارت |
|---|---|---|---|
| 3X-UI | یک تنظیم، یعنی subThemeDir |
sqlite3 نصب باشد و پایگاهدادهٔ پنل پیدا شود |
بله، کوتاه |
| PasarGuard | صفحه در پوشهٔ تمپلیتهای PasarGuard، و یک بلوک نشاندار در /opt/pasarguard/.env |
همیشه | یک بار، فقط اگر پنل در حال اجرا باشد |
| Rebecca | صفحه در پوشهٔ تمپلیتهای Rebecca، و دو فیلد از تنظیمات اشتراکش | Rebecca از پایگاهدادهٔ پیشفرض SQLite استفاده کند و sqlite3 نصب باشد |
هرگز |
از آن پس پنل صفحه را به مرورگرهایی که لینک اشتراک را باز میکنند ارائه میکند و اطلاعات هر مشترک را در آن قرار میدهد. اپهای VPN که همان لینک را دریافت میکنند همچنان محتوای معمولی اشتراک را میگیرند.
در PasarGuard و Rebecca، فعالسازی یک تراکنش است: از تنظیمات پنل عکس فوری گرفته میشود (زیر backups.v2/ در پوشهٔ نصب)، تغییر اعمال و بررسی میشود و — اگر هر مرحله شکست بخورد — دقیقاً از روی عکس فوری بازگردانده میشود، و بازگردانی با خواندن دوبارهٔ تنظیمات تأیید میشود.
3X-UI
آن یک تنظیم، پوشهٔ پوستهٔ اشتراک است که با نام subThemeDir ذخیره میشود و روی این مقدار قرار میگیرد:
/etc/3x-ui/sub_templates/row-template
از آن پس 3X-UI فایل sub.html را از همین پوشه ارائه میکند.
فعالسازی خودکار
وقتی sqlite3 نصب باشد و پایگاهدادهٔ پنل پیدا شود (پیشنیازها را ببینید)، نصبکننده میتواند خودش subThemeDir را تنظیم کند. این کارها را انجام میدهد:
- اگر سرویس
x-uiدر حال اجرا باشد، آن را متوقف میکند تا پنل نتواند مقدار قدیمی را روی تغییر بنویسد؛ subThemeDirرا در پایگاهدادهٔ پنل مینویسد — و هیچ چیز دیگری را؛- اگر سرویس در حال اجرا بوده، دوباره راهش میاندازد؛
- مقدار را دوباره میخواند و فقط در صورت تطابق، موفقیت را اعلام میکند.
در نصب تعاملی، مقدار فعلی را نشان میدهد و اول میپرسد: Make Row-Template the active 3X-UI subscription theme now? [Y/n]. نصب بدون پرسش این کار را بدون سؤال انجام میدهد. پنل در چند ثانیهٔ بین توقف و راهاندازی در دسترس نیست.
اگر هر مرحلهای شکست بخورد، نصبکننده مطمئن میشود سرویس دوباره در حال اجراست و بهجای آن مرحلهٔ دستی را چاپ میکند.
فعالسازی دستی
بدون sqlite3 — یا اگر ترجیح میدهید خودتان انجامش دهید:
تنظیمات اشتراک را باز کنید
در پنل وب 3X-UI، بخش Panel Settings → Subscription را باز کنید.
Sub Theme Directory را تنظیم کنید
دقیقاً این مسیر مطلق را در Sub Theme Directory وارد کنید — بدون اسلش انتهایی و بدون فاصله:
/etc/3x-ui/sub_templates/row-templateذخیره کنید
تنظیمات را ذخیره کنید و پنل را ریاستارت کنید تا پوشهٔ جدید را اعمال کند — از خود پنل یا با systemctl restart x-ui.
PasarGuard
همیشه خودکار. صفحه در این مسیر قرار میگیرد:
/var/lib/pasarguard/templates/row-template/index.html
— یا اگر CUSTOM_TEMPLATES_DIRECTORY خودتان را تنظیم کردهاید، داخل همان. در نصب Docker آن پوشه باید داخل /var/lib/pasarguard باشد، پوشهای که کانتینر با میزبان به اشتراک میگذارد؛ هر پوشهٔ دیگری پیش از هر تغییری رد میشود. سپس این بلوک به /opt/pasarguard/.env اضافه میشود:
# >>> row-template (managed by Row-Template; do not edit) nl=0 >>>
CUSTOM_TEMPLATES_DIRECTORY = "/var/lib/pasarguard/templates"
SUBSCRIPTION_PAGE_TEMPLATE = "row-template/index.html"
# <<< row-template <<<
در .env آخرین مقداردهی هر کلید اعمال میشود، پس هیچکدام از خطوط خودتان ویرایش نمیشود. PasarGuard فایل .env را فقط هنگام شروع میخواند، پس پنلِ در حال اجرا یک بار ریاستارت میشود (پنل متوقف راهاندازی نمیشود). .env رمز ادمین، کلید JWT و نشانی پایگاهداده را هم نگه میدارد: فقط برای دو کلید صفحه خوانده میشود، هرگز چاپ نمیشود و هرگز در پشتیبان کپی نمیشود.
آنچه همچنان اولویت دارد: ادمینی که تمپلیت اشتراک خودش را دارد، و تنظیم disable subscription template پنل. هر دو در اختیار خودتاناند؛ row-template verify آنها را گزارش میدهد.
Rebecca
Row-Template از Rebecca نسخهٔ 1.x، یعنی نسخهٔ Go با نصب باینری Rebecca پشتیبانی میکند. ایمیج Docker نسخهٔ 0.0.x پیش از هر تغییری رد میشود — پیشنیازها را ببینید.
صفحه در این مسیر قرار میگیرد:
/var/lib/rebecca/templates/row-template/index.html
— یا اگر Rebecca از قبل پوشهٔ تمپلیت سفارشی دارد، داخل همان. سپس تنظیمات اشتراک Rebecca طوری تنظیم میشوند که آن را انتخاب کنند. Rebecca این تنظیمات را در هر درخواست میخواند، پس چیزی ریاستارت نمیشود.
- خودکار با پایگاهدادهٔ پیشفرض SQLite و نصب بودن
sqlite3: فیلدهای صفحه و پوشهٔ جدیدترین ردیف تنظیمات اشتراک تنظیم میشوند. پوشه فقط وقتی تنظیم میشود که از قبل نداشته باشید، و هر مقدار — خالی،NULLیا تنظیمشده — هنگام حذف دقیقاً بازگردانده میشود. - دستی با MySQL/MariaDB یا بدون
sqlite3: صفحه همچنان گذاشته میشود و نصبکننده تنها مرحلهٔ باقیمانده را چاپ میکند. در داشبورد Rebecca Settings → Subscription → Templates را باز کنید و این مقادیر را بگذارید:
Subscription page template: row-template/index.html
Custom templates directory: /var/lib/rebecca/templates
اگر پوشهٔ تمپلیت سفارشی از قبل تنظیم شده، آن را نگه دارید و بهجایش /var/lib/rebecca/templates/row-template/ را داخل آن کپی کنید. هیچ رمز پایگاهدادهای هرگز پرسیده، خوانده یا چاپ نمیشود.
آنچه همچنان اولویت دارد: تنظیمات تمپلیت اشتراک اختصاصی یک ادمین. row-template verify گزارش میدهد چند ادمین چنین تنظیمی دارند.
فعالسازی در زمان دیگر
منوی مدیریت تعاملی هر زمان میتواند فعالسازی را بررسی و اعمال کند: row-template را اجرا کنید و 5 — Activate / Re-apply theme را انتخاب کنید. وضعیت فعلی را نشان میدهد، پیش از هر تغییری میپرسد و پس از آن بررسیهای زنده را اجرا میکند. در PasarGuard و Rebecca اول صفحه را دوباره میسازد تا آنچه فعال میشود دقیقاً همان باشد که verify بررسی میکند.
اطمینان از درستی کار
لینک اشتراک یکی از کلاینتها را در مرورگر باز کنید. باید صفحهٔ Row-Template را ببینید، نه صفحهٔ داخلی پنل را. سپس اجرا کنید:
row-template verify
| خط | معنی |
|---|---|
ok Panel subThemeDir points at Row-Template. |
فعالسازی برقرار است. |
warn panel subThemeDir is empty; set it to … |
هنوز فعال نشده — یکی از روشهای بالا را به کار ببرید. |
warn panel subThemeDir does not point at Row-Template. |
پنل پوشهٔ پوستهٔ دیگری را ارائه میکند. |
ok Live render check: a browser receives Row-Template. |
یک درخواست واقعی صفحه را برگرداند. |
warn live render check: the panel served its built-in page. |
تنظیم هنوز اعمال نشده — پنل را ریاستارت کنید یا مسیر را بررسی کنید. |
ok VPN-client check: normal subscription content is served. |
اپهای VPN تحت تأثیر قرار نگرفتهاند. |
بررسیهای subThemeDir و زنده برای پیدا کردن اشتراکی جهت آزمایش به sqlite3 نیاز دارند؛ بدون آن رد میشوند، نه اینکه شکست بخورند.
| خط | معنی |
|---|---|
ok PasarGuard selects the Row-Template page, and the placed page is current. |
.env صفحه را انتخاب میکند و نسخهٔ گذاشتهشده همان است که همین حالا ساخته شده. |
ok Live check: the running PasarGuard uses the Row-Template page. |
کانتینرِ در حال اجرا تنظیم را میخواند و صفحه را میبیند (نصب Docker). |
warn the running PasarGuard does not use the Row-Template page yet; restart the panel. |
PasarGuard را ریاستارت کنید (pasarguard restart). |
warn PasarGuard does not select the Row-Template page; activate it from the manager. |
هنوز فعال نشده. |
warn panel pasarguard: … admin(s) set their own subscription page … |
کاربران آن ادمینها صفحهٔ خودشان را میبینند. |
| خط | معنی |
|---|---|
ok Rebecca selects the Row-Template page, and the placed page is current. |
تنظیمات Rebecca صفحه را انتخاب میکنند و نسخهٔ گذاشتهشده همان است که همین حالا ساخته شده. |
warn Rebecca does not select the Row-Template page; activate it from the manager. |
هنوز فعال نشده، یا صفحهٔ دیگری در داشبورد انتخاب شده است. |
Panel selection not checked (activation is manual here: …) |
MySQL/MariaDB یا نبود sqlite3: خودتان Settings → Subscription → Templates را بررسی کنید. |
warn panel rebecca: … admin(s) override the subscription page … |
کاربران آن ادمینها صفحهٔ خودشان را میبینند. |
غیرفعال کردن
- 3X-UI: در پنل Sub Theme Directory را خالی کنید و ذخیره کنید: 3X-UI به صفحهٔ داخلی خودش برمیگردد و Row-Template نصب باقی میماند.
- PasarGuard: بلوک
row-templateرا از/opt/pasarguard/.envحذف کنید و پنل را ریاستارت کنید. - Rebecca: در Settings → Subscription → Templates مقدار Subscription page template را به
subscription/index.html، یعنی صفحهٔ خود Rebecca، برگردانید.
row-template uninstall همهٔ این کارها را برایتان انجام میدهد و روی هر پنل فقط چیزی را تغییر میدهد که خود Row-Template تنظیم کرده بود. حذف را ببینید.