diff --git a/CHANGELOG.md b/CHANGELOG.md index 94fb29f..2bdf846 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,127 @@ All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.3.1] - Unreleased +## [1.4.0] - Unreleased + +Every country's flag, on every platform. On PasarGuard, the applications and +the announcement link the operator already configured in the panel. Live +figures on PasarGuard and Rebecca, as on 3X-UI. And on a fresh PasarGuard or +Rebecca install, the panel's own name and support link are offered instead of +being typed again. Row stays the default design, and nothing changes for an +existing install except what is listed below. + +### Added + +- **Every country's flag, on every platform.** A node's flag used to be drawn by + the reader's own emoji font, and Windows has none with flags, so Chromium-based + browsers there — most desktop readers — printed the two letters (`TR`, `DE`) + instead; only six countries were drawn another way. The page now carries the + Twemoji flags as a small colour font and uses it for the flag badge alone, so + all 258 flags draw the same on Windows, Android, iOS, macOS and Linux, in + Chromium, Safari and Firefox. It covers flag emoji and ISO codes alike + (`🇹🇷 Istanbul`, `TR | Ankara`, `GB-LON-1`). `UK` now draws the British flag + (no emoji set draws a `UK` pair), and `XK` (Kosovo) is recognised. The font is + a 64-units-per-em subset of Twemoji Country Flags — visually identical at badge + size and a third smaller — rebuilt reproducibly by `tools/subset-flag-font.sh`; + the artwork is CC-BY 4.0 (`src/fonts/TWEMOJI-LICENSE.txt`). +- **PasarGuard: the operator's own applications.** When the operator has listed + applications in PasarGuard (Settings → Subscription → Applications), the + Connect card shows those instead of the built-in list: one tab for each + platform the list covers (Android, iOS, Windows, macOS, Linux, Android TV, + Apple TV), the recommended application first, the operator's description in + the reader's language, and a download link. Import uses the link PasarGuard + built for this subscriber — completed with the page's own address when + PasarGuard has no subscription URL prefix and gives only a path — and for a + device-bound subscription PasarGuard has already left out the applications + that do not apply. With no list configured, + the page keeps its built-in catalogue. The icons the panel names are never + loaded, because the page makes no request to another site. +- **PasarGuard: the announcement's own link.** An announcement with an address + set in the panel (`announce_url`) gains an *Open link* under its text. +- **Live figures on PasarGuard and Rebecca.** Usage, expiry and online status now + refresh while the page is open on every panel. Both panels serve them at + `//info` in their own format; the page reads that format and stops, + leaving the figures it has, if a panel ever answers with anything else. +- **The panel's own name and support link, offered at install.** PasarGuard and + Rebecca already hold a subscription title and a support URL. A fresh install + on either reads them (read-only) and asks *Use them for this page?*. In a + script, `RT_PANEL_BRANDING=1` takes them and `RT_PANEL_BRANDING=0` never offers + them; `RT_SERVICE_NAME` and `RT_SUPPORT_URL` always win. On an existing + install, **Reconfigure → Use PasarGuard's (Rebecca's) name and support link** + in the manager, or `RT_PANEL_BRANDING=1 row-template config`, does the same. + The panels' defaults (`Subscription`, `https://t.me/`) are never offered, nor a + PasarGuard title that still carries a per-subscriber placeholder such as + `{USERNAME}`; every value passes the same checks a typed one does. + +### Fixed + +- **A panel's default support link no longer replaces yours.** Rebecca's + support URL defaults to the bare `https://t.me/`, and a support link from the + panel outranks the one configured in Row-Template, so on a default Rebecca + every page's *Contact support* went to Telegram's front page. The bare + default now counts as no link, on Rebecca and PasarGuard alike. +- **Rolling back after the update keeps your design.** The backup a + pre-1.4.0 updater takes of the page it replaces is written after the new + designs are installed, so it matches none of them and names no design; a + rollback to it restored Row instead of the design you had. The rollback now + takes the design that backup's own saved settings record, and restores it from + the installed designs. + +### Changed + +- **The page is larger, and paints as early as before.** 1.4.0 adds 81,052 + bytes to every design, 68,748 of them the flag font (the largest design is now + 285,757 bytes); the size ceiling is 280 KiB (was 200 KiB). The font is placed after the page's markup, not in + its head, so the first paint does not wait for it: measured on a 4× slower CPU + and a 1.6 Mbit/s link, first paint is unchanged or earlier, and the page + finishes loading about 0.4 s later on that link (about 0.1 s on 4G). Script + time is unchanged. +- **Tabs wrap.** With more than four platforms in a panel's list, the tab strip + wraps onto a second line in every design instead of shortening the labels. + +### Known limitations + +- The panel-branding offer reads SQLite databases only; with MySQL, MariaDB or + PostgreSQL the installer simply asks as before. +- PasarGuard's application icons are not shown (see above), and the page does + not state a device limit; the panel's own filtering of the application list is + what a device-bound subscription gets. +- PasarGuard's page title (`subTitle`) and Clash templates are still not + produced, and Rebecca on MySQL/MariaDB still needs its one setting entered in + the dashboard. +- Rebecca's Docker image is still the 0.0.x Python edition, which cannot render + this page, and is refused before anything is changed. Use Rebecca 1.x from its + binary installer (`rebecca-binary.sh`). + +### Development + +- **Every built script is compiled by the suite.** The runtime modules are + concatenated into one scope for the page, so two modules declaring the same + name are fine as modules and a syntax error as a page. `tests/artifact-scripts + .test.mjs` compiles every script of every design on every panel, and refuses + a top-level name declared twice. +- **The flag font is tested from its bytes.** `tests/flag-font.test.mjs` reads + the committed WOFF2 with Node's own Brotli and proves that every code the page + can emit has a colour glyph, and where the face sits in every page. +- **Browser validation in three engines.** The PasarGuard and Rebecca pages, + rendered by the panels' real engines, and the 3X-UI pages from the fixture + renderer, were checked in Chromium, WebKit and Firefox: every flag drawn as a + flag, the panel's applications and platforms, the announcement link, live + refresh repainting, Persian right-to-left, no request to another host. +- `tools/rebaseline.mjs` re-pins the seventeen artifact locks to the current + build and prints what moved, for a deliberate change to the shared runtime. + +### Upgrading + +- From **1.1.0, 1.2.0 or 1.3.x**, on any panel: run `row-template update`. Your + design, branding and panel wiring are kept; the new page is in place at once. +- To take PasarGuard's or Rebecca's own name and support link on an existing + install: `row-template` → **Reconfigure** → the last item, or + `RT_PANEL_BRANDING=1 row-template config`. +- Rolling back after the update returns the page and the recorded version, not + the manager, as before; only the two newest backups are kept. + +## [1.3.1] - 2026-09-27 A hotfix release: everything fixed after v1.3.0 was published, packaged as one small upgrade. The PasarGuard and Rebecca pages now name themselves after the diff --git a/README.ar.md b/README.ar.md index 076dbc6..475fc9f 100644 --- a/README.ar.md +++ b/README.ar.md @@ -50,7 +50,7 @@ ## التصاميم -يأتي Row-Template 1.3.1 بسبعة عشر تصميمًا، والتصميم الافتراضي هو Row. +يأتي Row-Template 1.4.0 بسبعة عشر تصميمًا، والتصميم الافتراضي هو Row. @@ -88,10 +88,10 @@ **لمشتركيك** -- **حالة حيّة.** حالة الباقة، والبيانات المستهلكة والمتبقية، وتاريخ الانتهاء، تُحدَّث من لوحتك طالما كانت الصفحة ظاهرة (في 3X-UI؛ أما في PasarGuard وRebecca فتعرض الصفحة القيم لحظة فتحها). -- **استيراد بلمسة واحدة** إلى التطبيقات الشائعة، مرتّبة حسب المنصة: v2rayNG وHapp وsing-box على Android؛ وStreisand وV2Box وShadowrocket على iOS؛ وClash Verge Rev وMihomo Party وv2rayN على Windows؛ وClash Verge Rev وStreisand وV2Box على macOS. +- **حالة حيّة.** حالة الباقة، والبيانات المستهلكة والمتبقية، وتاريخ الانتهاء، تُحدَّث من لوحتك طالما كانت الصفحة ظاهرة — في 3X-UI وPasarGuard وRebecca على حدّ سواء. +- **استيراد بلمسة واحدة** إلى التطبيقات الشائعة، مرتّبة حسب المنصة: v2rayNG وHapp وsing-box على Android؛ وStreisand وV2Box وShadowrocket على iOS؛ وClash Verge Rev وMihomo Party وv2rayN على Windows؛ وClash Verge Rev وStreisand وV2Box على macOS. وفي PasarGuard تحلّ محلّها التطبيقات التي تدرجها في اللوحة (Settings → Subscription → Applications)، مع أوصافك وروابط التنزيل. - **النسخ ورمز QR.** انسخ رابط الاشتراك أو امسحه كرمز QR يُولَّد داخل الصفحة. -- **مستكشف الإعدادات.** كل خادم في صف خاص به، مع علم الدولة أو شارة بالأحرف الأولى (monogram) ووسم البروتوكول (VLESS وVMess وTrojan وShadowsocks وHysteria/Hysteria2 وWireGuard وAmneziaWG وTelegram MTProto)، مع رمز QR ونسخ لكل إعداد، وبحث في القوائم الطويلة. +- **مستكشف الإعدادات.** كل خادم في صف خاص به، مع علم الدولة أو شارة بالأحرف الأولى (monogram) ووسم البروتوكول (VLESS وVMess وTrojan وShadowsocks وHysteria/Hysteria2 وWireGuard وAmneziaWG وTelegram MTProto)، مع رمز QR ونسخ لكل إعداد، وبحث في القوائم الطويلة. تُرسم الأعلام بخط Twemoji مضمَّن في الصفحة، فيظهر علم كل دولة على كل منصة، بما فيها Windows. - **خمس لغات** — الإنجليزية والفارسية والعربية والروسية والصينية — مع تخطيط من اليمين إلى اليسار، واختيار المظهر System / Light / Dark. **لك** @@ -117,13 +117,13 @@ تستخدم اللوحات الثلاث ثلاثة محرّكات قوالب مختلفة — `html/template` في Go وJinja2 وpongo2 — لذا يُبنى كل تصميم مرة لكل لوحة، ويُختبر كل إصدار منه بعرضه بمحرّك تلك اللوحة الحقيقي. يكتشف المثبّت اللوحة الموجودة على الخادم؛ وعلى خادم فيه أكثر من لوحة يسألك (أو يقرأ `RT_PANEL`). **مدعومة** تعني توفّر القدرات السبع كلها على تلك اللوحة — الاكتشاف والتثبيت والتفعيل والتحقق والنسخ الاحتياطي والاستعادة وإلغاء التثبيت — ويختبر كلًّا منها مجموعة الاختبارات. راجع [التوافق](https://iitzseridev.github.io/Row-Template/ar/compatibility/) لتفاصيل كل لوحة. -**حدود الإصدار 1.3.1:** +**حدود الإصدار 1.4.0:** -- **التحديث الحي في 3X-UI فقط.** في PasarGuard وRebecca تعرض الصفحة الاستهلاك وتاريخ الانتهاء كما كانا عند فتحها. -- **صورة Docker الخاصة بـ Rebecca مرفوضة.** ما زالت 0.0.x، أي إصدار Python؛ والأمر `rebecca migrate-binary` الخاص بـ Rebecca ينقل تثبيت Docker إلى 1.x. +- **صورة Docker الخاصة بـ Rebecca مرفوضة.** ما زالت 0.0.x، أي إصدار Python؛ ثبّت Rebecca 1.x بمثبّتها الثنائي (`rebecca-binary.sh`). - **إعداد واحد يدويًا** حين يتعذّر التفعيل التلقائي: 3X-UI دون `sqlite3`، وRebecca مع MySQL/MariaDB أو دون `sqlite3`. - **إعدادات اللوحة تبقى لها الأولوية** في PasarGuard وRebecca: قالب الاشتراك الخاص بمشرف ما، وإعداد **disable subscription template** في PasarGuard. ويُبلغ `row-template verify` عن كليهما. - **قوالب Clash** لا تُنتَج؛ تُنتَج صفحة الاشتراك فقط. +- **لا تُعرض أيقونات تطبيقات PasarGuard.** لا تحمّل الصفحة شيئًا من موقع آخر، لذا لا يُستخدم عنوان الأيقونة المضبوط في اللوحة. - **الأعلام تأتي من رمز أو من إيموجي، لا من اسم.** رمز ISO 3166-1 alpha-2 في اسم العقدة (`TR | Istanbul`، `RU-01`، `GB-LON-1`، `DE`) يرسم علم تلك الدولة، وكذلك إيموجي العلم. أما أسماء الدول وأسماء المدن (`Turkey - Istanbul`، `Finland Helsinki`) فلا تُستنتَج وتبقى بشارة الأحرف الأولى (monogram). - **لوحة واحدة لكل خادم.** يخدم التثبيت اللوحة التي ثُبّت لها؛ ولخدمة لوحة أخرى، شغّل `row-template uninstall` أولًا. @@ -144,7 +144,7 @@ flowchart TB end build -- "GitHub Releases" --> host host -- "serves the page" --> BROWSER["Subscriber's browser"] - BROWSER -. "live status (3X-UI): ?format=info" .-> host + BROWSER -. "live status: ?format=info (3X-UI), /info (PasarGuard, Rebecca)" .-> host ``` - **ملف واحد لكل تصميم.** يضمّن `tools/build.mjs` الشيفرة المشتركة والترجمات والخطوط ومولّد QR داخل تخطيط كل تصميم، ويرفض أي تخطيط ينقصه أيٌّ من نقاط الربط (hooks) التي تحتاجها الشيفرة. ثم يرفض `tools/verify.mjs` أي ملف يحمّل شيئًا من مصدر بعيد أو يحتوي على بنية محظورة. @@ -195,6 +195,12 @@ RT_PANEL=pasarguard bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Templa يجب أن يسمّي `RT_PANEL` لوحة مثبّتة على ذلك الخادم. وتحتفظ إعادة التشغيل أو التحديث باللوحة التي ثُبّت Row-Template لها. +في PasarGuard وRebecca يعرض التثبيت الجديد أيضًا اسم الخدمة ورابط الدعم المضبوطين مسبقًا في إعدادات الاشتراك في اللوحة نفسها. ولأخذهما في سكربت اضبط `RT_PANEL_BRANDING=1` (أما `RT_PANEL_BRANDING=0` فلا يعرضهما أبدًا، ولـ`RT_SERVICE_NAME` و`RT_SUPPORT_URL` الأولوية دائمًا): + +```bash +RT_PANEL_BRANDING=1 bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Template/releases/latest/download/install.sh) +``` + إن كنت تفضّل عدم تمرير السكربت مباشرة من الشبكة، فنزّل ملفات الإصدار الأربعة (`install.sh`، `manifest.txt`، `SHA256SUMS`، `row-template-.tar.gz`) من [صفحة الإصدارات](https://github.com/iitzSeriZdev/Row-Template/releases/latest) إلى مجلد واحد، وتحقق من المجموع الاختباري بنفسك كما يشرح [PROVENANCE.md](PROVENANCE.md)، ثم وجّه المثبّت إلى ذلك المجلد: ```bash @@ -234,7 +240,7 @@ SUBSCRIPTION_PAGE_TEMPLATE = "row-template/index.html" - **تلقائيًا** مع قاعدة بيانات SQLite الافتراضية وتثبيت `sqlite3`. - **يدويًا** مع MySQL/MariaDB (أو دون `sqlite3`): تبقى الصفحة موضوعة في مكانها؛ في لوحة تحكم Rebecca افتح **Settings → Subscription → Templates** واضبط **Subscription page template** على `row-template/index.html` و**Custom templates directory** على `/var/lib/rebecca/templates`. -يدعم Row-Template الإصدار **1.x** من Rebecca، أي إصدار Go الذي تنشره Rebecca لتثبيتها الثنائي (`rebecca-binary.sh`). أما صورة `rebeccapanel/rebecca` على Docker Hub فما زالت إصدار 0.0.x المكتوب بـ Python، الذي لا يستطيع عرض هذه الصفحة؛ لذا يرفضها المثبّت ولا يغيّر شيئًا، والأمر `rebecca migrate-binary` الخاص بـ Rebecca ينقل تثبيت Docker إلى 1.x. +يدعم Row-Template الإصدار **1.x** من Rebecca، أي إصدار Go الذي تنشره Rebecca لتثبيتها الثنائي (`rebecca-binary.sh`). أما صورة `rebeccapanel/rebecca` على Docker Hub فما زالت إصدار 0.0.x المكتوب بـ Python، الذي لا يستطيع عرض هذه الصفحة؛ لذا يرفضها المثبّت ولا يغيّر شيئًا. ثبّت Rebecca 1.x بمثبّت Rebecca الثنائي (`rebecca-binary.sh`) لاستخدام Row-Template. ## الاستخدام @@ -258,10 +264,10 @@ row-template يجب تشغيل الأوامر التي تغيّر النظام (`config` و`update` و`rollback` و`uninstall`) بصلاحية root. -- **العلامة التجارية** تُخزَّن كبيانات، ولا تُنفَّذ أبدًا، وتُحقن في الصفحة كنص. اترك أي حقل فارغًا للحصول على صفحة بلا علامة تجارية. لا يقبل رابط الدعم إلا البروتوكولات التي ينبغي للمتصفح فتحها، مثل `https://…` أو `tg://…` أو `mailto:…`. +- **العلامة التجارية** تُخزَّن كبيانات، ولا تُنفَّذ أبدًا، وتُحقن في الصفحة كنص. اترك أي حقل فارغًا للحصول على صفحة بلا علامة تجارية. لا يقبل رابط الدعم إلا البروتوكولات التي ينبغي للمتصفح فتحها، مثل `https://…` أو `tg://…` أو `mailto:…`. وفي PasarGuard وRebecca يعرض التثبيت الجديد الاسم ورابط الدعم المضبوطين مسبقًا في اللوحة. - **التحديثات** تأتي من قناة الإصدارات المستقرة العامة. يطبّق `row-template update` دائمًا أحدث إصدار مستقر، حتى لو كان هو الإصدار المثبّت لديك؛ أما خيار **Update** في المدير فيقارن الإصدارات أولًا ويسأل قبل أي تغيير. إذا تعذّر الوصول إلى مصدر الإصدارات، لا يتغيّر شيء ولا يُعامَل تثبيتك أبدًا على أنه تالف. -- **التحديث من 1.1.0 أو 1.2.0** يكفيه تشغيل `row-template update` مرة واحدة. ينسخ مُحدِّث 1.1.0 نفسه جزءًا فقط من الإصدار الجديد، لذا فإن التشغيل التالي لـ`row-template` أو `row-template config` أو `row-template verify` بصلاحيات root ينزّل أولًا بقية الإصدار نفسه — كل التصاميم، مع التحقق من checksum. ويُحفَظ تصميمك وعلامتك التجارية وربط اللوحة. لم تكن الإصدارات السابقة تُثبَّت على PasarGuard أو Rebecca؛ فهناك شغّل المثبّت. -- **التراجع** يستعيد إصدارًا سابقًا من نسخة احتياطية جرى التحقق منها. تُلتقط لقطة (snapshot) للإصدار الحالي أولًا، بحيث يمكن التعافي من تراجع فاشل، وتُحفَظ علامتك التجارية. تسجّل النسخ الاحتياطية اللوحة التي أُنشئت عليها ولا تُستعاد أبدًا على لوحة أخرى؛ والنسخة الاحتياطية من إصدار أقدم لا تسجّل اسم تصميمها تُستعاد على أنها Row. يستعيد التراجع الصفحة والإصدار الذي تسجّله النسخة الاحتياطية، لا مدير `row-template` نفسه: بعد التراجع إلى نسخة احتياطية من 1.1.0 يُبلغ `row-template version` عن 1.1.0 بينما يبقى مدير 1.3.0 في مكانه، ويعيدك `row-template update` التالي إلى 1.3.0. لا يُحتفظ إلا بأحدث نسختين احتياطيتين — فكل تحديث وتبديل تصميم وتراجع ينشئ واحدة. +- **التحديث من 1.1.0 أو 1.2.0 أو 1.3.x** يكفيه تشغيل `row-template update` مرة واحدة. ينسخ مُحدِّث 1.1.0 نفسه جزءًا فقط من الإصدار الجديد، لذا فإن التشغيل التالي لـ`row-template` أو `row-template config` أو `row-template verify` بصلاحيات root ينزّل أولًا بقية الإصدار نفسه — كل التصاميم، مع التحقق من checksum. ويُحفَظ تصميمك وعلامتك التجارية وربط اللوحة. لم تكن الإصدارات السابقة تُثبَّت على PasarGuard أو Rebecca؛ فهناك شغّل المثبّت. +- **التراجع** يستعيد إصدارًا سابقًا من نسخة احتياطية جرى التحقق منها. تُلتقط لقطة (snapshot) للإصدار الحالي أولًا، بحيث يمكن التعافي من تراجع فاشل، وتُحفَظ علامتك التجارية. تسجّل النسخ الاحتياطية اللوحة التي أُنشئت عليها ولا تُستعاد أبدًا على لوحة أخرى؛ والنسخة الاحتياطية من إصدار أقدم لا تسجّل اسم تصميمها تُستعاد على أنها Row. يستعيد التراجع الصفحة والإصدار الذي تسجّله النسخة الاحتياطية، لا مدير `row-template` نفسه: بعد التراجع إلى نسخة احتياطية من 1.1.0 يُبلغ `row-template version` عن 1.1.0 بينما يبقى مدير 1.4.0 في مكانه، ويعيدك `row-template update` التالي إلى 1.4.0. لا يُحتفظ إلا بأحدث نسختين احتياطيتين — فكل تحديث وتبديل تصميم وتراجع ينشئ واحدة. - **إلغاء التثبيت** يزيل ملفات Row-Template ويعيد اللوحة إلى الصفحة التي كانت لديها من قبل: في 3X-UI لا يمسح `subThemeDir` إلا إذا كان يشير إلى Row-Template؛ وفي PasarGuard يزيل كتلته من `.env` وصفحته؛ وفي Rebecca يستعيد إعدادَي الاشتراك اللذين غيّرهما (ويتركهما إن كنت قد اخترت صفحة أخرى منذ ذلك الحين). ولا يمسّ المستخدمين أو الواردات (inbounds) أو العملاء أو العُقد أو الشهادات. يغطي [التوثيق](https://iitzseridev.github.io/Row-Template/ar/) الإعداد والعلامة التجارية واستكشاف الأخطاء بمزيد من التفصيل. @@ -292,7 +298,6 @@ npm run preview # preview the fixture pages at http://127.0.0.1:8787 توجّه، لا وعود: -- **الحالة الحيّة في PasarGuard وRebecca** — تقدّمها كلتاهما على لاحقة مسار لا على `?format=info`؛ ويحتاج ربطها إلى تغيير صغير في الشيفرة، وقد أُرجئ هذا القرار. راجع [التوافق](https://iitzseridev.github.io/Row-Template/ar/compatibility/). - **القوالب المخصّصة** — مقترح لإضافة تصميمك الخاص: [`docs/design/CUSTOM-TEMPLATES-PROPOSAL.md`](docs/design/CUSTOM-TEMPLATES-PROPOSAL.md). ## المساهمة @@ -329,7 +334,7 @@ Row-Template مجاني ومفتوح المصدر. إن وفّر عليك وقت ## الترخيص -مُرخَّص بموجب [رخصة MIT](LICENSE). ومولّد رمز QR المرفق (`src/vendor/uqr`) مُضمَّن بموجب رخصة MIT الخاصة به، والجزء المضمَّن من خط Vazirmatn بموجب رخصة SIL Open Font License (`src/fonts/OFL.txt`). +مُرخَّص بموجب [رخصة MIT](LICENSE). ومولّد رمز QR المرفق (`src/vendor/uqr`) مُضمَّن بموجب رخصة MIT الخاصة به، والجزء المضمَّن من خط Vazirmatn بموجب رخصة SIL Open Font License (`src/fonts/OFL.txt`). وخط الأعلام المضمَّن من رسوم Twemoji بموجب رخصة CC-BY 4.0 (`src/fonts/TWEMOJI-LICENSE.txt`). ## المطوّر diff --git a/README.fa.md b/README.fa.md index 67d115f..660e8ef 100644 --- a/README.fa.md +++ b/README.fa.md @@ -51,7 +51,7 @@ ## طرح ها -Row-Template 1.3.1 با هفده طرح عرضه می شود. طرح پیش فرض Row است. +Row-Template 1.4.0 با هفده طرح عرضه می شود. طرح پیش فرض Row است.
@@ -89,15 +89,15 @@ Row-Template 1.3.1 با هفده طرح عرضه می شود. طرح پیش فر **برای مشترکان شما** -- **وضعیت زنده.** وضعیت پلن، ترافیک مصرف شده و باقی مانده و تاریخ انقضا، که تا وقتی صفحه دیده می شود از پنل شما به روز می شود (در 3X-UI؛ در PasarGuard و Rebecca صفحه مقادیر لحظهٔ باز شدن را نشان می دهد). -- **ورود با یک لمس** به برنامه های پرکاربرد، بر اساس پلتفرم: v2rayNG، Happ و sing-box در Android؛ Streisand، V2Box و Shadowrocket در iOS؛ Clash Verge Rev، Mihomo Party و v2rayN در Windows؛ Clash Verge Rev، Streisand و V2Box در macOS. +- **وضعیت زنده.** وضعیت پلن، ترافیک مصرف شده و باقی مانده و تاریخ انقضا، که تا وقتی صفحه دیده می شود از پنل شما به روز می شود — در 3X-UI، PasarGuard و Rebecca. +- **ورود با یک لمس** به برنامه های پرکاربرد، بر اساس پلتفرم: v2rayNG، Happ و sing-box در Android؛ Streisand، V2Box و Shadowrocket در iOS؛ Clash Verge Rev، Mihomo Party و v2rayN در Windows؛ Clash Verge Rev، Streisand و V2Box در macOS. در PasarGuard، برنامه هایی که در پنل فهرست کرده اید (Settings → Subscription → Applications)، با توضیحات و لینک های دانلود شما، جای این فهرست را می گیرند. - **کپی و QR.** پیوند اشتراک را کپی کنید یا آن را به صورت کد QR که روی خود صفحه ساخته می شود اسکن کنید. -- **کاوشگر پیکربندی ها.** هر سرور در یک ردیف جداگانه، با پرچم کشور یا نشان حروف (monogram) و برچسب پروتکل (VLESS، VMess، Trojan، Shadowsocks، Hysteria/Hysteria2، WireGuard، AmneziaWG، Telegram MTProto)، به همراه QR و کپی برای هر پیکربندی و جستجو برای فهرست های طولانی. +- **کاوشگر پیکربندی ها.** هر سرور در یک ردیف جداگانه، با پرچم کشور یا نشان حروف (monogram) و برچسب پروتکل (VLESS، VMess، Trojan، Shadowsocks، Hysteria/Hysteria2، WireGuard، AmneziaWG، Telegram MTProto)، به همراه QR و کپی برای هر پیکربندی و جستجو برای فهرست های طولانی. پرچم ها با یک فونت Twemoji که درون صفحه گنجانده شده کشیده می شوند، پس پرچم هر کشور در هر پلتفرمی — از جمله Windows — نمایش داده می شود. - **پنج زبان** — انگلیسی، فارسی، عربی، روسی و چینی — با چیدمان راست به چپ، و انتخاب پوستهٔ System / Light / Dark. **برای شما** -- **برندسازی وایت لیبل.** نام سرویس، پیوند پشتیبانی و لوگو، همگی اختیاری، که به عنوان داده ذخیره و به صورت متن تزریق می شوند. +- **برندسازی وایت لیبل.** نام سرویس، پیوند پشتیبانی و لوگو، همگی اختیاری، که به عنوان داده ذخیره و به صورت متن تزریق می شوند. در PasarGuard و Rebecca، نصب تازه نام و لینک پشتیبانی ای را که از قبل در پنل تنظیم شده پیشنهاد می دهد. - **یک مدیر برای همه چیز.** منوی تعاملی و دستورهای مستقیم برای برندسازی، به روزرسانی، بررسی سلامت، بازگردانی و حذف نصب. - **به روزرسانی از کانال پایدار.** `row-template update` هر بار که اجرا شود آخرین نسخهٔ پایدار را پس از بررسی نصب می کند — و به همین دلیل راهی سریع برای تعمیر نصب هم هست. @@ -118,13 +118,13 @@ Row-Template 1.3.1 با هفده طرح عرضه می شود. طرح پیش فر این سه پنل از سه موتور قالب متفاوت استفاده می کنند — `html/template` زبان Go، Jinja2 و pongo2 — پس هر طرح برای هر پنل یک بار ساخته می شود و هر نسخه با رندر شدن توسط موتور واقعی همان پنل آزموده می شود. نصب کننده تشخیص می دهد کدام پنل روی سرور است؛ روی سروری با بیش از یک پنل، از شما می پرسد (یا `RT_PANEL` را می خواند). **پشتیبانی‌شده** یعنی هر هفت توانایی روی آن پنل موجود است — تشخیص، نصب، فعال‌سازی، بررسی، پشتیبان‌گیری، بازگردانی و حذف نصب — و هر کدام توسط مجموعهٔ آزمون آزموده می شود. برای جزئیات هر پنل، [سازگاری](https://iitzseridev.github.io/Row-Template/fa/compatibility/) را ببینید. -**محدودیت های 1.3.1:** +**محدودیت های 1.4.0:** -- **به روزرسانی زنده فقط در 3X-UI.** در PasarGuard و Rebecca، صفحه مصرف و انقضا را همان طور نشان می دهد که هنگام باز شدن صفحه بود. -- **ایمیج Docker مربوط به Rebecca رد می شود.** این ایمیج هنوز 0.0.x، یعنی نسخهٔ پایتونی است؛ دستور `rebecca migrate-binary` خود Rebecca یک نصب Docker را به 1.x منتقل می کند. +- **ایمیج Docker مربوط به Rebecca رد می شود.** این ایمیج هنوز 0.0.x، یعنی نسخهٔ پایتونی است؛ Rebecca نسخهٔ 1.x را با نصب کنندهٔ باینری آن (`rebecca-binary.sh`) نصب کنید. - **یک تنظیم دستی** وقتی فعال سازی خودکار ممکن نیست: 3X-UI بدون `sqlite3`، و Rebecca با MySQL/MariaDB یا بدون `sqlite3`. - **تنظیمات پنل همچنان اولویت دارند** در PasarGuard و Rebecca: قالب اشتراک اختصاصی یک ادمین، و تنظیم **disable subscription template** در PasarGuard. `row-template verify` هر دو را گزارش می دهد. - **قالب های Clash** ساخته نمی شوند؛ فقط صفحهٔ اشتراک ساخته می شود. +- **آیکون برنامه های PasarGuard نمایش داده نمی شود.** صفحه چیزی را از سایت دیگری بارگذاری نمی کند، پس آدرس آیکونی که در پنل تنظیم شده استفاده نمی شود. - **پرچم ها از یک کد یا ایموجی می آیند، نه از یک نام.** کد ISO 3166-1 alpha-2 در نام گره (`TR | Istanbul`، `RU-01`، `GB-LON-1`، `DE`) پرچم آن کشور را می کشد، و ایموجی پرچم نیز همین طور. نام کشورها و نام شهرها (`Turkey - Istanbul`، `Finland Helsinki`) استنباط نمی شوند و نشان حروف (monogram) باقی می مانند. - **یک پنل برای هر سرور.** هر نصب به پنلی سرویس می دهد که برای آن نصب شده است؛ برای سرویس دادن به پنل دیگر، ابتدا `row-template uninstall` را اجرا کنید. @@ -145,7 +145,7 @@ flowchart TB end build -- "GitHub Releases" --> host host -- "serves the page" --> BROWSER["Subscriber's browser"] - BROWSER -. "live status (3X-UI): ?format=info" .-> host + BROWSER -. "live status: ?format=info (3X-UI), /info (PasarGuard, Rebecca)" .-> host ``` - **یک فایل برای هر طرح.** `tools/build.mjs` کد اجرایی مشترک، ترجمه ها، فونت ها و مولد QR را درون چیدمان هر طرح می گنجاند و چیدمانی را که هر یک از قلاب های (hook) مورد نیاز کد اجرایی را نداشته باشد رد می کند. سپس `tools/verify.mjs` هر فایلی را که چیزی را از راه دور بارگذاری کند یا ساختاری ممنوع داشته باشد رد می کند. @@ -196,6 +196,12 @@ RT_PANEL=pasarguard bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Templa `RT_PANEL` باید پنلی را نام ببرد که روی همان سرور نصب است. اجرای دوباره یا به روزرسانی، پنلی را که Row-Template برای آن نصب شده حفظ می کند. +در PasarGuard و Rebecca، نصب تازه نام سرویس و لینک پشتیبانی ای را هم که از قبل در تنظیمات اشتراک خود پنل تنظیم شده پیشنهاد می دهد. برای برداشتن آن ها در یک اسکریپت، `RT_PANEL_BRANDING=1` را تنظیم کنید (`RT_PANEL_BRANDING=0` هرگز آن ها را پیشنهاد نمی دهد، و `RT_SERVICE_NAME` و `RT_SUPPORT_URL` همیشه اولویت دارند): + +```bash +RT_PANEL_BRANDING=1 bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Template/releases/latest/download/install.sh) +``` + اگر ترجیح می دهید از طریق شبکه به صورت pipe عمل نکنید، چهار فایل نسخه (`install.sh`، `manifest.txt`، `SHA256SUMS` و `row-template-.tar.gz`) را از [صفحهٔ Releases](https://github.com/iitzSeriZdev/Row-Template/releases/latest) در یک پوشه دانلود کنید، مجموع کنترلی را خودتان همان گونه که در [PROVENANCE.md](PROVENANCE.md) توضیح داده شده بررسی کنید و نصب کننده را به آن پوشه ارجاع دهید: ```bash @@ -235,7 +241,7 @@ PasarGuard فایل `.env` را هنگام راه اندازی می خواند، - **خودکار** با پایگاه دادهٔ پیش فرض SQLite و نصب بودن `sqlite3`. - **دستی** با MySQL/MariaDB (یا بدون `sqlite3`): صفحه همچنان جایگذاری می شود؛ در داشبورد Rebecca، **Settings → Subscription → Templates** را باز کنید و **Subscription page template** را `row-template/index.html` و **Custom templates directory** را `/var/lib/rebecca/templates` قرار دهید. -Row-Template از Rebecca نسخهٔ **1.x** پشتیبانی می کند، یعنی نسخهٔ Go که Rebecca برای نصب باینری خود (`rebecca-binary.sh`) منتشر می کند. ایمیج `rebeccapanel/rebecca` در Docker Hub هنوز نسخهٔ 0.0.x پایتونی است که نمی تواند این صفحه را رندر کند؛ نصب کننده آن را رد می کند و چیزی را تغییر نمی دهد، و دستور `rebecca migrate-binary` خود Rebecca یک نصب Docker را به 1.x منتقل می کند. +Row-Template از Rebecca نسخهٔ **1.x** پشتیبانی می کند، یعنی نسخهٔ Go که Rebecca برای نصب باینری خود (`rebecca-binary.sh`) منتشر می کند. ایمیج `rebeccapanel/rebecca` در Docker Hub هنوز نسخهٔ 0.0.x پایتونی است که نمی تواند این صفحه را رندر کند؛ نصب کننده آن را رد می کند و چیزی را تغییر نمی دهد. برای استفاده از Row-Template، Rebecca نسخهٔ 1.x را با نصب کنندهٔ باینری خود Rebecca (`rebecca-binary.sh`) نصب کنید. ## استفاده @@ -261,8 +267,8 @@ row-template - **برندسازی** به عنوان داده ذخیره می شود، هرگز اجرا نمی شود و به صورت متن در صفحه تزریق می گردد. برای یک صفحهٔ بدون برند، فیلدی را خالی بگذارید. پیوند پشتیبانی تنها پروتکل هایی را می پذیرد که مرورگر باید باز کند، مانند `https://…`، `tg://…` یا `mailto:…`. - **به روزرسانی ها** از کانال عمومی نسخه های پایدار می آیند. `row-template update` همیشه آخرین نسخهٔ پایدار را اعمال می کند، حتی اگر همان نسخه را داشته باشید؛ گزینهٔ **Update** در منوی مدیریت ابتدا نسخه ها را مقایسه می کند و پیش از هر تغییری می پرسد. اگر منبع انتشار در دسترس نباشد، چیزی تغییر نمی کند و نصب شما هرگز آسیب دیده تلقی نمی شود. -- **به روزرسانی از 1.1.0 یا 1.2.0** با یک بار اجرای `row-template update` انجام می شود. به روزرسان خود 1.1.0 فقط بخشی از نسخهٔ جدید را کپی می کند، برای همین اجرای بعدی `row-template`، `row-template config` یا `row-template verify` با دسترسی root، ابتدا بقیهٔ همان نسخه را دریافت می کند — همهٔ طرح ها، با بررسی checksum. طرح، برندسازی و اتصال پنل شما حفظ می شوند. نسخه های پیشین روی PasarGuard یا Rebecca نصب نمی شدند؛ در آنجا نصب کننده را اجرا کنید. -- **بازگردانی** یک نسخهٔ پیشین را از یک پشتیبان اعتبارسنجی شده بازیابی می کند. ابتدا از نسخهٔ فعلی یک عکس فوری (snapshot) گرفته می شود تا یک بازگردانی ناموفق قابل جبران باشد، و برندسازی شما حفظ می شود. پشتیبان ها پنلی را که روی آن ساخته شده اند ثبت می کنند و هرگز روی پنل دیگری بازگردانده نمی شوند؛ پشتیبانی از یک نسخهٔ قدیمی تر که نام طرحش را ثبت نکرده، به صورت Row بازگردانده می شود. بازگردانی، صفحه و نسخه ای را که پشتیبان ثبت کرده بازیابی می کند، نه خود مدیر `row-template` را: پس از بازگردانی به یک پشتیبان 1.1.0، `row-template version` نسخهٔ 1.1.0 را گزارش می دهد در حالی که مدیر 1.3.0 سر جایش می ماند، و `row-template update` بعدی به 1.3.0 برمی گردد. فقط دو پشتیبان جدیدتر نگه داشته می شوند — هر به روزرسانی، تغییر طرح و بازگردانی یکی می سازد. +- **به روزرسانی از 1.1.0، 1.2.0 یا 1.3.x** با یک بار اجرای `row-template update` انجام می شود. به روزرسان خود 1.1.0 فقط بخشی از نسخهٔ جدید را کپی می کند، برای همین اجرای بعدی `row-template`، `row-template config` یا `row-template verify` با دسترسی root، ابتدا بقیهٔ همان نسخه را دریافت می کند — همهٔ طرح ها، با بررسی checksum. طرح، برندسازی و اتصال پنل شما حفظ می شوند. نسخه های پیشین روی PasarGuard یا Rebecca نصب نمی شدند؛ در آنجا نصب کننده را اجرا کنید. +- **بازگردانی** یک نسخهٔ پیشین را از یک پشتیبان اعتبارسنجی شده بازیابی می کند. ابتدا از نسخهٔ فعلی یک عکس فوری (snapshot) گرفته می شود تا یک بازگردانی ناموفق قابل جبران باشد، و برندسازی شما حفظ می شود. پشتیبان ها پنلی را که روی آن ساخته شده اند ثبت می کنند و هرگز روی پنل دیگری بازگردانده نمی شوند؛ پشتیبانی از یک نسخهٔ قدیمی تر که نام طرحش را ثبت نکرده، به صورت Row بازگردانده می شود. بازگردانی، صفحه و نسخه ای را که پشتیبان ثبت کرده بازیابی می کند، نه خود مدیر `row-template` را: پس از بازگردانی به یک پشتیبان 1.1.0، `row-template version` نسخهٔ 1.1.0 را گزارش می دهد در حالی که مدیر 1.4.0 سر جایش می ماند، و `row-template update` بعدی به 1.4.0 برمی گردد. فقط دو پشتیبان جدیدتر نگه داشته می شوند — هر به روزرسانی، تغییر طرح و بازگردانی یکی می سازد. - **حذف نصب** فایل های Row-Template را حذف می کند و پنل را به صفحه ای که پیش تر داشت بازمی گرداند: در 3X-UI، `subThemeDir` را تنها در صورتی پاک می کند که به Row-Template اشاره کند؛ در PasarGuard بلوک `.env` و صفحهٔ خودش را برمی دارد؛ در Rebecca دو تنظیم اشتراکی را که تغییر داده بازمی گرداند (و اگر از آن پس صفحهٔ دیگری انتخاب کرده باشید، به آن ها دست نمی زند). به کاربران، inboundها، کلاینت ها، نودها و گواهی های شما دست زده نمی شود. [مستندات](https://iitzseridev.github.io/Row-Template/fa/) پیکربندی، برندسازی و رفع اشکال را با جزئیات بیشتری پوشش می دهد. @@ -293,7 +299,6 @@ npm run preview # preview the fixture pages at http://127.0.0.1:8787 جهت گیری، نه وعده: -- **وضعیت زنده در PasarGuard و Rebecca** — هر دو آن را روی یک پسوند مسیر ارائه می دهند نه `?format=info`؛ اتصال آن به یک تغییر کوچک در کد اجرایی نیاز دارد و این تصمیم به تعویق افتاده است. [سازگاری](https://iitzseridev.github.io/Row-Template/fa/compatibility/) را ببینید. - **قالب های سفارشی** — پیشنهادی برای افزودن طرح خودتان: [`docs/design/CUSTOM-TEMPLATES-PROPOSAL.md`](docs/design/CUSTOM-TEMPLATES-PROPOSAL.md). ## مشارکت @@ -330,7 +335,7 @@ Row-Template رایگان و متن باز است. اگر در وقت شما ص ## مجوز -تحت [مجوز MIT](LICENSE) منتشر شده است. مولد کد QR همراه بسته (`src/vendor/uqr`) تحت مجوز MIT خودش، و زیرمجموعهٔ فونت Vazirmatn که درون صفحه گنجانده شده تحت مجوز SIL Open Font License (`src/fonts/OFL.txt`) عرضه می شوند. +تحت [مجوز MIT](LICENSE) منتشر شده است. مولد کد QR همراه بسته (`src/vendor/uqr`) تحت مجوز MIT خودش، و زیرمجموعهٔ فونت Vazirmatn که درون صفحه گنجانده شده تحت مجوز SIL Open Font License (`src/fonts/OFL.txt`) عرضه می شوند. فونت پرچم های درون صفحه، اثر Twemoji تحت مجوز CC-BY 4.0 است (`src/fonts/TWEMOJI-LICENSE.txt`). ## توسعه دهنده diff --git a/README.md b/README.md index 006c984..9cbc973 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ It ships as one self-contained HTML file per design, with every style, script, f ## Designs -Row-Template 1.3.1 ships seventeen designs. Row is the default. +Row-Template 1.4.0 ships seventeen designs. Row is the default.
@@ -89,15 +89,15 @@ Choose a design during a fresh interactive install, set `RT_TEMPLATE` for a scri **For your subscribers** -- **Live status.** Plan state, traffic used and remaining, and expiry, refreshed from your panel while the page is visible (3X-UI; on PasarGuard and Rebecca the page shows the values as of when it was opened). -- **One-tap import** into popular apps, grouped by platform: v2rayNG, Happ and sing-box on Android; Streisand, V2Box and Shadowrocket on iOS; Clash Verge Rev, Mihomo Party and v2rayN on Windows; Clash Verge Rev, Streisand and V2Box on macOS. +- **Live status.** Plan state, traffic used and remaining, and expiry, refreshed from your panel while the page is visible — on 3X-UI, PasarGuard and Rebecca alike. +- **One-tap import** into popular apps, grouped by platform: v2rayNG, Happ and sing-box on Android; Streisand, V2Box and Shadowrocket on iOS; Clash Verge Rev, Mihomo Party and v2rayN on Windows; Clash Verge Rev, Streisand and V2Box on macOS. On PasarGuard, the applications you list in the panel (Settings → Subscription → Applications) take their place, with your descriptions and download links. - **Copy and QR.** Copy the subscription link or scan it as a QR code generated on the page. -- **Configuration Explorer.** Every server on its own row, with a country flag or monogram and a protocol label (VLESS, VMess, Trojan, Shadowsocks, Hysteria/Hysteria2, WireGuard, AmneziaWG, Telegram MTProto), plus per-configuration QR and copy, and search for long lists. +- **Configuration Explorer.** Every server on its own row, with a country flag or monogram and a protocol label (VLESS, VMess, Trojan, Shadowsocks, Hysteria/Hysteria2, WireGuard, AmneziaWG, Telegram MTProto), plus per-configuration QR and copy, and search for long lists. Flags are drawn by an embedded Twemoji font, so every country's flag shows on every platform — Windows included. - **Five languages** — English, Persian, Arabic, Russian, and Chinese — with right-to-left layout, and a System / Light / Dark theme choice. **For you** -- **White-label branding.** Service name, support link, and logo, all optional, stored as data and injected as text. +- **White-label branding.** Service name, support link, and logo, all optional, stored as data and injected as text. On PasarGuard and Rebecca, a fresh install offers the name and support link already set in the panel. - **A manager for everything.** An interactive menu and direct commands for branding, updates, verification, rollback, and uninstall. - **Stable-channel updates.** `row-template update` installs the latest stable release, verified, whenever you run it — which also makes it a quick repair. @@ -118,13 +118,13 @@ Choose a design during a fresh interactive install, set `RT_TEMPLATE` for a scri The three panels use three different template engines — Go `html/template`, Jinja2 and pongo2 — so every design is built once per panel, and each version is tested by rendering it with that panel's real engine. The installer detects which panel is on the server; on a server with more than one, it asks (or reads `RT_PANEL`). **Supported** means all seven capabilities are present on that panel — detect, install, activate, verify, backup, restore and uninstall — and each one is exercised by the test suite. See [Compatibility](https://iitzseridev.github.io/Row-Template/compatibility/) for the details of each panel. -**Limitations in 1.3.1:** +**Limitations in 1.4.0:** -- **Live refresh is 3X-UI only.** On PasarGuard and Rebecca the page shows usage and expiry as of when it was opened. -- **Rebecca's Docker image is refused.** It is still 0.0.x, the Python edition; Rebecca's own `rebecca migrate-binary` moves a Docker install to 1.x. +- **Rebecca's Docker image is refused.** It is still 0.0.x, the Python edition; install Rebecca 1.x with its binary installer (`rebecca-binary.sh`). - **One setting by hand** when automatic activation is not possible: 3X-UI without `sqlite3`, and Rebecca on MySQL/MariaDB or without `sqlite3`. - **Panel settings still take precedence** on PasarGuard and Rebecca: an admin's own subscription template, and PasarGuard's **disable subscription template** setting. `row-template verify` reports both. - **Clash templates** are not produced; only the subscription page is. +- **PasarGuard application icons are not shown.** The page loads nothing from another site, so an icon address set in the panel is not used. - **Flags come from a code or an emoji, never from a name.** An ISO 3166-1 alpha-2 code in the node name (`TR | Istanbul`, `RU-01`, `GB-LON-1`, `DE`) draws that country's flag, as does a flag emoji. Country *names* and *city names* (`Turkey - Istanbul`, `Finland Helsinki`) are **not** inferred and keep the monogram. - **One panel per server.** An installation serves the panel it was installed for; to serve a different one, run `row-template uninstall` first. @@ -145,7 +145,7 @@ flowchart TB end build -- "GitHub Releases" --> host host -- "serves the page" --> BROWSER["Subscriber's browser"] - BROWSER -. "live status (3X-UI): ?format=info" .-> host + BROWSER -. "live status: ?format=info (3X-UI), /info (PasarGuard, Rebecca)" .-> host ``` - **One file per design.** `tools/build.mjs` inlines the shared runtime, the translations, the fonts, and the QR generator into a design's layout, and refuses a layout that is missing any hook the runtime needs. `tools/verify.mjs` then rejects an artifact that loads anything remote or carries a forbidden construct. @@ -196,6 +196,12 @@ RT_PANEL=pasarguard bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Templa `RT_PANEL` must name a panel that is installed on that server. A re-run or an update keeps the panel Row-Template was installed for. +On PasarGuard and Rebecca, a fresh install also offers the service name and support link already set in the panel's own subscription settings. To take them in a script, set `RT_PANEL_BRANDING=1` (`RT_PANEL_BRANDING=0` never offers them, and `RT_SERVICE_NAME` and `RT_SUPPORT_URL` always win): + +```bash +RT_PANEL_BRANDING=1 bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Template/releases/latest/download/install.sh) +``` + If you prefer not to pipe from the network, download the four release assets (`install.sh`, `manifest.txt`, `SHA256SUMS`, and `row-template-.tar.gz`) from the [Releases page](https://github.com/iitzSeriZdev/Row-Template/releases/latest) into one folder, verify the checksum yourself as described in [PROVENANCE.md](PROVENANCE.md), and point the installer at that folder: ```bash @@ -235,7 +241,7 @@ PasarGuard reads `.env` at start-up, so a running panel is restarted once. None - **Automatic** with the default SQLite database and `sqlite3` installed. - **Manual** with MySQL/MariaDB (or without `sqlite3`): the page is still placed; in the Rebecca dashboard open **Settings → Subscription → Templates** and set **Subscription page template** to `row-template/index.html` and **Custom templates directory** to `/var/lib/rebecca/templates`. -Row-Template supports Rebecca **1.x**, the Go edition, which Rebecca publishes for its binary install (`rebecca-binary.sh`). Docker Hub's `rebeccapanel/rebecca` image is still the 0.0.x Python edition, which cannot render this page; the installer refuses it and changes nothing, and Rebecca's own `rebecca migrate-binary` moves a Docker install to 1.x. +Row-Template supports Rebecca **1.x**, the Go edition, which Rebecca publishes for its binary install (`rebecca-binary.sh`). Docker Hub's `rebeccapanel/rebecca` image is still the 0.0.x Python edition, which cannot render this page; the installer refuses it and changes nothing. Install Rebecca 1.x with Rebecca's own binary installer (`rebecca-binary.sh`) to use Row-Template. ## Usage @@ -261,8 +267,8 @@ Commands that change the system (`config`, `update`, `rollback`, `uninstall`) mu - **Branding** is stored as data, never executed, and injected into the page as text. Leave a field blank for an unbranded page. The support link accepts only schemes a browser should open, such as `https://…`, `tg://…`, or `mailto:…`. - **Updates** come from the public stable channel. `row-template update` always applies the latest stable release, even the version you already run; the manager's **Update** compares versions first and asks before changing anything. If the release source is unreachable, nothing is changed and your installation is never treated as damaged. -- **Updating from 1.1.0 or 1.2.0** takes one `row-template update`. 1.1.0's own updater copies only part of the new release, so the next `row-template`, `row-template config`, or `row-template verify` run as root first downloads the rest of that same release — every design, checksum-verified. Your design, branding, and panel wiring are kept. Earlier releases did not install on PasarGuard or Rebecca; there, run the installer. -- **Rollback** restores a previous version from a validated backup. The current version is snapshotted first, so a failed rollback can be recovered, and your branding is preserved. Backups record the panel they were made on and are never restored onto another; a backup from an older release that does not name its design restores as Row. A rollback restores the page and the version it records, not the `row-template` manager itself: after rolling back to a 1.1.0 backup, `row-template version` reports 1.1.0 while the 1.3.0 manager stays in place, and the next `row-template update` returns to 1.3.0. Only the two newest backups are kept — each update, design switch, and rollback makes one. +- **Updating from 1.1.0, 1.2.0 or 1.3.x** takes one `row-template update`. 1.1.0's own updater copies only part of the new release, so the next `row-template`, `row-template config`, or `row-template verify` run as root first downloads the rest of that same release — every design, checksum-verified. Your design, branding, and panel wiring are kept. Earlier releases did not install on PasarGuard or Rebecca; there, run the installer. +- **Rollback** restores a previous version from a validated backup. The current version is snapshotted first, so a failed rollback can be recovered, and your branding is preserved. Backups record the panel they were made on and are never restored onto another; a backup from an older release that does not name its design restores as Row. A rollback restores the page and the version it records, not the `row-template` manager itself: after rolling back to a 1.1.0 backup, `row-template version` reports 1.1.0 while the 1.4.0 manager stays in place, and the next `row-template update` returns to 1.4.0. Only the two newest backups are kept — each update, design switch, and rollback makes one. - **Uninstall** removes Row-Template's files and returns the panel to the page it had before: on 3X-UI it clears `subThemeDir` only if it points at Row-Template; on PasarGuard it removes its `.env` block and its page; on Rebecca it restores the two subscription settings it changed (leaving them alone if you have since chosen another page). Your users, inbounds, clients, nodes, and certificates are not touched. The [documentation](https://iitzseridev.github.io/Row-Template/) covers configuration, branding, and troubleshooting in more depth. @@ -293,7 +299,6 @@ The build is deterministic — the same sources always produce a byte-identical Direction, not promises: -- **Live status on PasarGuard and Rebecca** — both serve it on a path suffix rather than `?format=info`; wiring it up needs a small runtime change, and that decision is deferred. See [Compatibility](https://iitzseridev.github.io/Row-Template/compatibility/). - **Custom templates** — a proposal for adding your own design: [`docs/design/CUSTOM-TEMPLATES-PROPOSAL.md`](docs/design/CUSTOM-TEMPLATES-PROPOSAL.md). ## Contributing @@ -330,7 +335,7 @@ Thank you. ## License -Released under the [MIT License](LICENSE). The bundled QR code generator (`src/vendor/uqr`) is included under its own MIT license, and the embedded Vazirmatn font subset under the SIL Open Font License (`src/fonts/OFL.txt`). +Released under the [MIT License](LICENSE). The bundled QR code generator (`src/vendor/uqr`) is included under its own MIT license, and the embedded Vazirmatn font subset under the SIL Open Font License (`src/fonts/OFL.txt`). The embedded flag font is Twemoji artwork under CC-BY 4.0 (`src/fonts/TWEMOJI-LICENSE.txt`). ## Developer diff --git a/README.ru.md b/README.ru.md index 763f5b3..d3a5097 100644 --- a/README.ru.md +++ b/README.ru.md @@ -51,7 +51,7 @@ ## Дизайны -Row-Template 1.3.1 поставляется с семнадцатью дизайнами. Дизайн по умолчанию — Row. +Row-Template 1.4.0 поставляется с семнадцатью дизайнами. Дизайн по умолчанию — Row.
@@ -89,15 +89,15 @@ Row-Template 1.3.1 поставляется с семнадцатью дизай **Для ваших подписчиков** -- **Статус в реальном времени.** Состояние тарифа, израсходованный и оставшийся трафик и срок действия, которые обновляются из вашей панели, пока страница открыта на экране (в 3X-UI; в PasarGuard и Rebecca страница показывает значения на момент открытия). -- **Импорт в одно касание** в популярные приложения, сгруппированные по платформам: v2rayNG, Happ и sing-box на Android; Streisand, V2Box и Shadowrocket на iOS; Clash Verge Rev, Mihomo Party и v2rayN на Windows; Clash Verge Rev, Streisand и V2Box на macOS. +- **Статус в реальном времени.** Состояние тарифа, израсходованный и оставшийся трафик и срок действия, которые обновляются из вашей панели, пока страница открыта на экране, — в 3X-UI, PasarGuard и Rebecca. +- **Импорт в одно касание** в популярные приложения, сгруппированные по платформам: v2rayNG, Happ и sing-box на Android; Streisand, V2Box и Shadowrocket на iOS; Clash Verge Rev, Mihomo Party и v2rayN на Windows; Clash Verge Rev, Streisand и V2Box на macOS. В PasarGuard их место занимают приложения, которые вы перечислили в панели (Settings → Subscription → Applications), с вашими описаниями и ссылками на загрузку. - **Копирование и QR.** Скопируйте ссылку на подписку или отсканируйте её как QR-код, созданный на самой странице. -- **Обозреватель конфигураций.** Каждый сервер в отдельной строке — с флагом страны или монограммой и меткой протокола (VLESS, VMess, Trojan, Shadowsocks, Hysteria/Hysteria2, WireGuard, AmneziaWG, Telegram MTProto), с QR-кодом и копированием для каждой конфигурации и поиском по длинным спискам. +- **Обозреватель конфигураций.** Каждый сервер в отдельной строке — с флагом страны или монограммой и меткой протокола (VLESS, VMess, Trojan, Shadowsocks, Hysteria/Hysteria2, WireGuard, AmneziaWG, Telegram MTProto), с QR-кодом и копированием для каждой конфигурации и поиском по длинным спискам. Флаги рисует встроенный шрифт Twemoji, поэтому флаг любой страны виден на любой платформе, включая Windows. - **Пять языков** — английский, персидский, арабский, русский и китайский — с раскладкой справа налево и выбором темы System / Light / Dark. **Для вас** -- **White-label оформление.** Название сервиса, ссылка на поддержку и логотип — всё необязательно, хранится как данные и вставляется как текст. +- **White-label оформление.** Название сервиса, ссылка на поддержку и логотип — всё необязательно, хранится как данные и вставляется как текст. В PasarGuard и Rebecca новая установка предлагает имя и ссылку поддержки, уже заданные в панели. - **Менеджер для всего.** Интерактивное меню и прямые команды для оформления, обновлений, проверки, отката и удаления. - **Обновления из стабильного канала.** `row-template update` при каждом запуске устанавливает последний стабильный релиз с проверкой — поэтому это ещё и быстрый способ восстановить установку. @@ -118,13 +118,13 @@ Row-Template 1.3.1 поставляется с семнадцатью дизай Три панели используют три разных шаблонизатора — Go `html/template`, Jinja2 и pongo2, — поэтому каждый дизайн собирается отдельно для каждой панели, и каждая версия проверяется отрисовкой настоящим движком этой панели. Установщик определяет, какая панель стоит на сервере; если их несколько, он спрашивает (или читает `RT_PANEL`). **Поддерживается** означает, что для этой панели есть все семь возможностей — обнаружение, установка, активация, проверка, резервная копия, восстановление и удаление, — и каждая из них покрыта тестами. Подробности по каждой панели — в разделе [Совместимость](https://iitzseridev.github.io/Row-Template/compatibility/). -**Ограничения 1.3.1:** +**Ограничения 1.4.0:** -- **Живое обновление — только в 3X-UI.** В PasarGuard и Rebecca страница показывает расход и срок действия на момент открытия. -- **Образ Docker для Rebecca отклоняется.** Это всё ещё 0.0.x, версия на Python; собственная команда Rebecca `rebecca migrate-binary` переводит установку Docker на 1.x. +- **Образ Docker для Rebecca отклоняется.** Это всё ещё 0.0.x, версия на Python; установите Rebecca 1.x её бинарным установщиком (`rebecca-binary.sh`). - **Одна настройка вручную**, когда автоматическая активация невозможна: 3X-UI без `sqlite3`, а также Rebecca с MySQL/MariaDB или без `sqlite3`. - **Настройки панели по-прежнему имеют приоритет** в PasarGuard и Rebecca: собственный шаблон подписки администратора и настройка PasarGuard **disable subscription template**. `row-template verify` сообщает о них. - **Шаблоны Clash** не создаются — только страница подписки. +- **Значки приложений PasarGuard не показываются.** Страница ничего не загружает с других сайтов, поэтому адрес значка из панели не используется. - **Флаг берётся из кода или эмодзи, но не из названия.** Код ISO 3166-1 alpha-2 в имени узла (`TR | Istanbul`, `RU-01`, `GB-LON-1`, `DE`) рисует флаг этой страны, как и эмодзи флага. Названия стран и городов (`Turkey - Istanbul`, `Finland Helsinki`) **не** распознаются и остаются монограммой. - **Одна панель на сервер.** Установка обслуживает панель, для которой она выполнена; чтобы обслуживать другую, сначала выполните `row-template uninstall`. @@ -145,7 +145,7 @@ flowchart TB end build -- "GitHub Releases" --> host host -- "serves the page" --> BROWSER["Subscriber's browser"] - BROWSER -. "live status (3X-UI): ?format=info" .-> host + BROWSER -. "live status: ?format=info (3X-UI), /info (PasarGuard, Rebecca)" .-> host ``` - **Один файл на дизайн.** `tools/build.mjs` встраивает общий код, переводы, шрифты и генератор QR в макет дизайна и отклоняет макет, в котором нет хотя бы одной нужной коду точки привязки (hook). Затем `tools/verify.mjs` отклоняет файл, который загружает что-либо извне или содержит запрещённую конструкцию. @@ -196,6 +196,12 @@ RT_PANEL=pasarguard bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Templa `RT_PANEL` должен называть панель, установленную на этом сервере. Повторный запуск и обновление сохраняют панель, для которой установлен Row-Template. +В PasarGuard и Rebecca новая установка также предлагает имя сервиса и ссылку поддержки, уже заданные в настройках подписки самой панели. Чтобы взять их в скрипте, задайте `RT_PANEL_BRANDING=1` (`RT_PANEL_BRANDING=0` никогда их не предлагает, а `RT_SERVICE_NAME` и `RT_SUPPORT_URL` всегда в приоритете): + +```bash +RT_PANEL_BRANDING=1 bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Template/releases/latest/download/install.sh) +``` + Если вы не хотите запускать скрипт прямо из сети, скачайте четыре файла релиза (`install.sh`, `manifest.txt`, `SHA256SUMS` и `row-template-.tar.gz`) со [страницы релизов](https://github.com/iitzSeriZdev/Row-Template/releases/latest) в одну папку, проверьте контрольную сумму самостоятельно, как описано в [PROVENANCE.md](PROVENANCE.md), и укажите установщику эту папку: ```bash @@ -235,7 +241,7 @@ PasarGuard читает `.env` при запуске, поэтому работ - **Автоматически** — с базой SQLite по умолчанию и установленным `sqlite3`. - **Вручную** — с MySQL/MariaDB (или без `sqlite3`): страница всё равно размещается; в панели управления Rebecca откройте **Settings → Subscription → Templates** и задайте **Subscription page template** = `row-template/index.html` и **Custom templates directory** = `/var/lib/rebecca/templates`. -Row-Template поддерживает Rebecca **1.x** — версию на Go, которую Rebecca публикует для бинарной установки (`rebecca-binary.sh`). Образ `rebeccapanel/rebecca` на Docker Hub всё ещё версии 0.0.x на Python, которая не может отрисовать эту страницу; установщик отклоняет её и ничего не меняет, а собственная команда Rebecca `rebecca migrate-binary` переводит установку Docker на 1.x. +Row-Template поддерживает Rebecca **1.x** — версию на Go, которую Rebecca публикует для бинарной установки (`rebecca-binary.sh`). Образ `rebeccapanel/rebecca` на Docker Hub всё ещё версии 0.0.x на Python, которая не может отрисовать эту страницу; установщик отклоняет её и ничего не меняет. Чтобы использовать Row-Template, установите Rebecca 1.x собственным бинарным установщиком Rebecca (`rebecca-binary.sh`). ## Использование @@ -261,8 +267,8 @@ row-template - **Оформление** хранится как данные, никогда не выполняется и вставляется в страницу как текст. Оставьте поле пустым, чтобы получить страницу без брендинга. Ссылка на поддержку принимает только схемы, которые браузер должен открывать, например `https://…`, `tg://…` или `mailto:…`. - **Обновления** берутся из публичного стабильного канала. `row-template update` всегда применяет последний стабильный релиз, даже если он уже установлен; пункт **Update** в менеджере сначала сравнивает версии и спрашивает перед любым изменением. Если источник релизов недоступен, ничего не меняется, и установка никогда не считается повреждённой. -- **Обновление с 1.1.0 или 1.2.0** выполняется одним запуском `row-template update`. Механизм обновления самой версии 1.1.0 копирует лишь часть нового релиза, поэтому следующий запуск `row-template`, `row-template config` или `row-template verify` от root сначала загружает остальную часть того же релиза — все дизайны, с проверкой контрольных сумм. Ваш дизайн, оформление и подключение к панели сохраняются. Прежние релизы не устанавливались на PasarGuard и Rebecca; там запустите установщик. -- **Откат** восстанавливает предыдущую версию из проверенной резервной копии. Сначала делается снимок (snapshot) текущей версии, поэтому неудачный откат можно исправить, а ваше оформление сохраняется. Резервные копии запоминают панель, на которой созданы, и никогда не восстанавливаются на другую; копия из старого релиза, в которой не записан дизайн, восстанавливается как Row. Откат восстанавливает страницу и записанную в копии версию, но не сам менеджер `row-template`: после отката к копии 1.1.0 `row-template version` показывает 1.1.0, менеджер 1.3.0 остаётся на месте, а следующий `row-template update` возвращает 1.3.0. Хранятся только две самые новые резервные копии — каждое обновление, смена дизайна и откат создают по одной. +- **Обновление с 1.1.0, 1.2.0 или 1.3.x** выполняется одним запуском `row-template update`. Механизм обновления самой версии 1.1.0 копирует лишь часть нового релиза, поэтому следующий запуск `row-template`, `row-template config` или `row-template verify` от root сначала загружает остальную часть того же релиза — все дизайны, с проверкой контрольных сумм. Ваш дизайн, оформление и подключение к панели сохраняются. Прежние релизы не устанавливались на PasarGuard и Rebecca; там запустите установщик. +- **Откат** восстанавливает предыдущую версию из проверенной резервной копии. Сначала делается снимок (snapshot) текущей версии, поэтому неудачный откат можно исправить, а ваше оформление сохраняется. Резервные копии запоминают панель, на которой созданы, и никогда не восстанавливаются на другую; копия из старого релиза, в которой не записан дизайн, восстанавливается как Row. Откат восстанавливает страницу и записанную в копии версию, но не сам менеджер `row-template`: после отката к копии 1.1.0 `row-template version` показывает 1.1.0, менеджер 1.4.0 остаётся на месте, а следующий `row-template update` возвращает 1.4.0. Хранятся только две самые новые резервные копии — каждое обновление, смена дизайна и откат создают по одной. - **Удаление** стирает файлы Row-Template и возвращает панели страницу, которая была до него: в 3X-UI очищает `subThemeDir`, только если та указывает на Row-Template; в PasarGuard убирает свой блок из `.env` и свою страницу; в Rebecca восстанавливает две изменённые настройки подписки (и не трогает их, если вы с тех пор выбрали другую страницу). Ваши пользователи, inbound'ы, клиенты, ноды и сертификаты не затрагиваются. [Документация](https://iitzseridev.github.io/Row-Template/) подробнее описывает настройку, оформление и устранение неполадок. @@ -293,7 +299,6 @@ npm run preview # preview the fixture pages at http://127.0.0.1:8787 Направление, а не обещания: -- **Статус в реальном времени в PasarGuard и Rebecca** — обе отдают его по суффиксу пути, а не через `?format=info`; для подключения нужно небольшое изменение в коде, и это решение отложено. См. [Совместимость](https://iitzseridev.github.io/Row-Template/compatibility/). - **Собственные шаблоны** — предложение о добавлении своего дизайна: [`docs/design/CUSTOM-TEMPLATES-PROPOSAL.md`](docs/design/CUSTOM-TEMPLATES-PROPOSAL.md). ## Участие в проекте @@ -330,7 +335,7 @@ Row-Template — бесплатный проект с открытым исхо ## Лицензия -Распространяется под [лицензией MIT](LICENSE). Входящий в комплект генератор QR-кодов (`src/vendor/uqr`) включён под собственной лицензией MIT, а встроенное подмножество шрифта Vazirmatn — под лицензией SIL Open Font License (`src/fonts/OFL.txt`). +Распространяется под [лицензией MIT](LICENSE). Входящий в комплект генератор QR-кодов (`src/vendor/uqr`) включён под собственной лицензией MIT, а встроенное подмножество шрифта Vazirmatn — под лицензией SIL Open Font License (`src/fonts/OFL.txt`). Встроенный шрифт флагов — рисунки Twemoji под лицензией CC-BY 4.0 (`src/fonts/TWEMOJI-LICENSE.txt`). ## Разработчик diff --git a/README.zh-CN.md b/README.zh-CN.md index e3f5a65..532dd56 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -50,7 +50,7 @@ ## 设计 -Row-Template 1.3.1 提供十七种设计,默认设计为 Row。 +Row-Template 1.4.0 提供十七种设计,默认设计为 Row。
@@ -88,15 +88,15 @@ Row-Template 1.3.1 提供十七种设计,默认设计为 Row。 **面向你的订阅者** -- **实时状态。** 套餐状态、已用和剩余流量以及到期时间,在页面可见期间从你的面板刷新(3X-UI;在 PasarGuard 和 Rebecca 上,页面显示打开时的数值)。 -- **一键导入**常用应用,按平台分组:Android 上的 v2rayNG、Happ 和 sing-box;iOS 上的 Streisand、V2Box 和 Shadowrocket;Windows 上的 Clash Verge Rev、Mihomo Party 和 v2rayN;macOS 上的 Clash Verge Rev、Streisand 和 V2Box。 +- **实时状态。** 套餐状态、已用和剩余流量以及到期时间,在页面可见期间从你的面板刷新——3X-UI、PasarGuard 和 Rebecca 均是如此。 +- **一键导入**常用应用,按平台分组:Android 上的 v2rayNG、Happ 和 sing-box;iOS 上的 Streisand、V2Box 和 Shadowrocket;Windows 上的 Clash Verge Rev、Mihomo Party 和 v2rayN;macOS 上的 Clash Verge Rev、Streisand 和 V2Box。在 PasarGuard 上,由你在面板中列出的应用(Settings → Subscription → Applications)取而代之,并附带你的说明和下载链接。 - **复制与二维码。** 复制订阅链接,或扫描在页面内生成的二维码。 -- **配置浏览器。** 每个服务器单独一行,带有国家旗帜或首字母徽章(monogram)以及协议标签(VLESS、VMess、Trojan、Shadowsocks、Hysteria/Hysteria2、WireGuard、AmneziaWG、Telegram MTProto),每个配置都可查看二维码和复制,长列表支持搜索。 +- **配置浏览器。** 每个服务器单独一行,带有国家旗帜或首字母徽章(monogram)以及协议标签(VLESS、VMess、Trojan、Shadowsocks、Hysteria/Hysteria2、WireGuard、AmneziaWG、Telegram MTProto),每个配置都可查看二维码和复制,长列表支持搜索。旗帜由页面内嵌的 Twemoji 字体绘制,因此每个国家的旗帜在所有平台上都能显示,包括 Windows。 - **五种语言** —— 英语、波斯语、阿拉伯语、俄语和中文 —— 支持从右到左的布局,并可选择 System / Light / Dark 主题。 **面向你** -- **白标品牌。** 服务名称、支持链接和徽标,均为可选,以数据形式存储并以文本形式注入。 +- **白标品牌。** 服务名称、支持链接和徽标,均为可选,以数据形式存储并以文本形式注入。在 PasarGuard 和 Rebecca 上,全新安装会提供面板中已设置的名称和支持链接。 - **一个管理器搞定一切。** 交互式菜单和直接命令,用于品牌设置、更新、验证、回滚和卸载。 - **稳定通道更新。** 每次运行 `row-template update` 都会安装经过校验的最新稳定版本——因此它也是快速修复安装的方法。 @@ -117,13 +117,13 @@ Row-Template 1.3.1 提供十七种设计,默认设计为 Row。 三个面板使用三种不同的模板引擎 —— Go `html/template`、Jinja2 和 pongo2 —— 因此每种设计都会为每个面板分别构建,并用该面板真实的引擎渲染来测试每个版本。安装程序会检测服务器上是哪一个面板;如果有多个,它会询问你(或读取 `RT_PANEL`)。**支持**意味着该面板具备全部七项能力 —— 检测、安装、激活、校验、备份、还原和卸载 —— 并且每一项都由测试套件覆盖。各面板的详细信息见[兼容性](https://iitzseridev.github.io/Row-Template/compatibility/)。 -**1.3.1 的限制:** +**1.4.0 的限制:** -- **实时刷新仅限 3X-UI。** 在 PasarGuard 和 Rebecca 上,页面显示的是打开时的用量和到期时间。 -- **Rebecca 的 Docker 镜像会被拒绝。** 它仍是 0.0.x,即 Python 版本;Rebecca 自带的 `rebecca migrate-binary` 可以把 Docker 安装迁移到 1.x。 +- **Rebecca 的 Docker 镜像会被拒绝。** 它仍是 0.0.x,即 Python 版本;请用其二进制安装程序(`rebecca-binary.sh`)安装 Rebecca 1.x。 - **无法自动激活时需手动设置一项:** 没有 `sqlite3` 的 3X-UI,以及使用 MySQL/MariaDB 或没有 `sqlite3` 的 Rebecca。 - **面板设置仍然优先**(PasarGuard 和 Rebecca):管理员自己的订阅模板,以及 PasarGuard 的 **disable subscription template** 设置。`row-template verify` 会报告这两种情况。 - **Clash 模板**不会生成;只生成订阅页面。 +- **不显示 PasarGuard 应用图标。** 页面不会从其他站点加载任何内容,因此不使用面板中设置的图标地址。 - **旗帜来自国家代码或旗帜表情,而不是名称。** 节点名中的 ISO 3166-1 alpha-2 代码(`TR | Istanbul`、`RU-01`、`GB-LON-1`、`DE`)会绘制该国旗帜,旗帜表情同样如此。国家**名称**和城市**名称**(`Turkey - Istanbul`、`Finland Helsinki`)**不会**被推断,仍显示首字母徽章。 - **每台服务器一个面板。** 一次安装只为安装时所选的面板提供页面;若要改为另一个面板,请先运行 `row-template uninstall`。 @@ -144,7 +144,7 @@ flowchart TB end build -- "GitHub Releases" --> host host -- "serves the page" --> BROWSER["Subscriber's browser"] - BROWSER -. "live status (3X-UI): ?format=info" .-> host + BROWSER -. "live status: ?format=info (3X-UI), /info (PasarGuard, Rebecca)" .-> host ``` - **每种设计一个文件。** `tools/build.mjs` 将共享的运行时代码、翻译、字体和二维码生成器内联到设计的布局中,并拒绝缺少任何运行时所需钩子(hook)的布局。随后 `tools/verify.mjs` 会拒绝任何加载远程资源或包含禁用结构的文件。 @@ -195,6 +195,12 @@ RT_PANEL=pasarguard bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Templa `RT_PANEL` 必须指向该服务器上已安装的面板。重新运行或更新会保留 Row-Template 安装时所服务的面板。 +在 PasarGuard 和 Rebecca 上,全新安装还会提供面板自身订阅设置中已设置的服务名称和支持链接。要在脚本中采用它们,请设置 `RT_PANEL_BRANDING=1`(`RT_PANEL_BRANDING=0` 从不提供它们,`RT_SERVICE_NAME` 和 `RT_SUPPORT_URL` 始终优先): + +```bash +RT_PANEL_BRANDING=1 bash <(curl -fsSL https://github.com/iitzSeriZdev/Row-Template/releases/latest/download/install.sh) +``` + 如果你不希望直接从网络通过管道执行,可以从 [Releases 页面](https://github.com/iitzSeriZdev/Row-Template/releases/latest)将四个发布文件(`install.sh`、`manifest.txt`、`SHA256SUMS` 和 `row-template-.tar.gz`)下载到同一个文件夹,按照 [PROVENANCE.md](PROVENANCE.md) 中的说明自行校验校验和,然后让安装程序使用该文件夹: ```bash @@ -234,7 +240,7 @@ PasarGuard 在启动时读取 `.env`,因此正在运行的面板会重启一 - **自动:** 使用默认的 SQLite 数据库并已安装 `sqlite3` 时。 - **手动:** 使用 MySQL/MariaDB(或没有 `sqlite3`)时:页面仍会放好;在 Rebecca 控制台中打开 **Settings → Subscription → Templates**,把 **Subscription page template** 设为 `row-template/index.html`,把 **Custom templates directory** 设为 `/var/lib/rebecca/templates`。 -Row-Template 支持 Rebecca **1.x**,即 Rebecca 为其二进制安装(`rebecca-binary.sh`)发布的 Go 版本。Docker Hub 上的 `rebeccapanel/rebecca` 镜像仍是 0.0.x 的 Python 版本,无法渲染此页面;安装程序会拒绝它且不做任何更改,而 Rebecca 自带的 `rebecca migrate-binary` 可以把 Docker 安装迁移到 1.x。 +Row-Template 支持 Rebecca **1.x**,即 Rebecca 为其二进制安装(`rebecca-binary.sh`)发布的 Go 版本。Docker Hub 上的 `rebeccapanel/rebecca` 镜像仍是 0.0.x 的 Python 版本,无法渲染此页面;安装程序会拒绝它且不做任何更改。要使用 Row-Template,请用 Rebecca 自带的二进制安装程序(`rebecca-binary.sh`)安装 Rebecca 1.x。 ## 使用 @@ -260,8 +266,8 @@ row-template - **品牌信息**以数据形式存储,从不执行,并以文本形式注入页面。将某个字段留空即可得到无品牌的页面。支持链接只接受浏览器应当打开的协议,例如 `https://…`、`tg://…` 或 `mailto:…`。 - **更新**来自公共稳定通道。`row-template update` 总是应用最新的稳定版本,即使你已安装的就是该版本;管理器中的 **Update** 会先比较版本,并在做出任何更改前询问。如果无法访问发布源,则不会做任何更改,你的安装也绝不会因此被视为已损坏。 -- **从 1.1.0 或 1.2.0 更新**只需运行一次 `row-template update`。1.1.0 自带的更新程序只会复制新版本的一部分,因此下一次以 root 运行 `row-template`、`row-template config` 或 `row-template verify` 时,会先下载同一版本的其余部分——所有设计,并校验 checksum。你的设计、品牌配置和面板连接都会保留。早期版本不能安装在 PasarGuard 或 Rebecca 上;在这些面板上请运行安装程序。 -- **回滚**会从经过验证的备份中恢复之前的版本。系统会先为当前版本创建快照(snapshot),因此失败的回滚也可以恢复,且你的品牌配置会被保留。备份会记录其所在的面板,绝不会恢复到另一个面板上;来自旧版本、未记录设计名称的备份会按 Row 恢复。回滚恢复的是页面和备份记录的版本,而不是 `row-template` 管理器本身:回滚到 1.1.0 的备份后,`row-template version` 显示 1.1.0,而 1.3.0 的管理器仍然保留,下一次 `row-template update` 会回到 1.3.0。只保留最新的两个备份——每次更新、切换设计和回滚都会创建一个。 +- **从 1.1.0、1.2.0 或 1.3.x 更新**只需运行一次 `row-template update`。1.1.0 自带的更新程序只会复制新版本的一部分,因此下一次以 root 运行 `row-template`、`row-template config` 或 `row-template verify` 时,会先下载同一版本的其余部分——所有设计,并校验 checksum。你的设计、品牌配置和面板连接都会保留。早期版本不能安装在 PasarGuard 或 Rebecca 上;在这些面板上请运行安装程序。 +- **回滚**会从经过验证的备份中恢复之前的版本。系统会先为当前版本创建快照(snapshot),因此失败的回滚也可以恢复,且你的品牌配置会被保留。备份会记录其所在的面板,绝不会恢复到另一个面板上;来自旧版本、未记录设计名称的备份会按 Row 恢复。回滚恢复的是页面和备份记录的版本,而不是 `row-template` 管理器本身:回滚到 1.1.0 的备份后,`row-template version` 显示 1.1.0,而 1.4.0 的管理器仍然保留,下一次 `row-template update` 会回到 1.4.0。只保留最新的两个备份——每次更新、切换设计和回滚都会创建一个。 - **卸载**会移除 Row-Template 的文件,并让面板恢复之前使用的页面:在 3X-UI 上,只有当 `subThemeDir` 指向 Row-Template 时才会将其清除;在 PasarGuard 上,删除它在 `.env` 中的块和它的页面;在 Rebecca 上,恢复它修改过的两项订阅设置(如果你此后已选择了其他页面,则不做改动)。你的用户、入站(inbound)、客户端、节点和证书都不会受到影响。 [文档](https://iitzseridev.github.io/Row-Template/)更详细地介绍了配置、品牌设置和故障排查。 @@ -292,7 +298,6 @@ npm run preview # preview the fixture pages at http://127.0.0.1:8787 这是方向,而非承诺: -- **PasarGuard 和 Rebecca 上的实时状态** —— 两者都通过路径后缀而不是 `?format=info` 提供它;接入需要对运行时代码做一处小改动,这一决定已推迟。参见[兼容性](https://iitzseridev.github.io/Row-Template/compatibility/)。 - **自定义模板** —— 关于添加你自己设计的提案:[`docs/design/CUSTOM-TEMPLATES-PROPOSAL.md`](docs/design/CUSTOM-TEMPLATES-PROPOSAL.md)。 ## 参与贡献 @@ -329,7 +334,7 @@ Row-Template 是免费且开源的。如果它为你节省了时间,欢迎支 ## 许可证 -基于 [MIT License](LICENSE) 发布。随附的二维码生成器(`src/vendor/uqr`)依据其自身的 MIT 许可证包含在内,内嵌的 Vazirmatn 字体子集则依据 SIL Open Font License(`src/fonts/OFL.txt`)提供。 +基于 [MIT License](LICENSE) 发布。随附的二维码生成器(`src/vendor/uqr`)依据其自身的 MIT 许可证包含在内,内嵌的 Vazirmatn 字体子集则依据 SIL Open Font License(`src/fonts/OFL.txt`)提供。内嵌的旗帜字体为 Twemoji 图稿,依据 CC-BY 4.0 提供(`src/fonts/TWEMOJI-LICENSE.txt`)。 ## 开发者 diff --git a/VERSION b/VERSION index 3a3cd8c..88c5fb8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.1 +1.4.0 diff --git a/docs/design/FLAG-RENDERER-AUDIT.md b/docs/design/FLAG-RENDERER-AUDIT.md index 7fab32a..cb36d5e 100644 --- a/docs/design/FLAG-RENDERER-AUDIT.md +++ b/docs/design/FLAG-RENDERER-AUDIT.md @@ -1096,3 +1096,28 @@ and the country-name boundary. The previous 13 tests pass verbatim. --- ALPHA-2 INPUT PATH ADDED — RETURN SHAPE, `CODES` AND FALLBACKS UNCHANGED — 15 LOCKS RE-BASELINED + +--- + +## 18. 1.4.0 — the embedded flag face (supersedes §3's "no font" and §5) + +The owner approved raising the artifact ceiling from 200 KiB to 280 KiB for +1.4.0, which removes the one constraint that ruled Option **I** out (§3, §4.2: +"+104,430 → impossible"). The page now embeds the Twemoji Country Flags face +and the six CSS gradients of §5 are gone. + +- **Size.** Not the 104,430 B of §4.2: the face is subset to the regional + indicators and scaled from 512 to 64 units per em (`tools/subset-flag-font.sh`), + 51,560 B of WOFF2, 68,748 B of base64. Compared side by side in Chromium, + WebKit and Firefox at badge size and at 48 px, before and after; 32 units per + em visibly moved stripe proportions and was not used. +- **Coverage.** Every code in `CODES` has a colour glyph — proven from the + committed bytes by `tests/flag-font.test.mjs`, which reads the WOFF2 with + Node's own Brotli. `UK`, which no emoji set draws, resolves to `GB`; `XK` + joins the registry (259 codes, 258 flags). +- **Placement.** Not the head stylesheet: the face is its own ` + +