homepage/README.md
loop-uh d4a1939315 «Кто сейчас на связи»: переключатель программы — Zapret 2 GUI и Zapret KVN
У Zapret KVN теперь своя служба очереди обновлений и свой итог; раздел
показывает числа выбранной программы теми же графиками. Пока у программы
чисел нет, вместо графиков стоит строка об этом.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:02:37 +03:00

105 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<h1 align="center">Главная страница git.zapret.moe</h1>
<p align="center">Шаблоны, стили и скрипты стартовой страницы нашего Forgejo — вместе с заставкой про цифрового РКН, РКН-тян и Запрет-тян. Правки принимаются через pull request и уезжают на сайт автоматически.</p>
<p align="center">
<a href="https://git2.zapret.moe/"><img alt="Открыть сайт" src="https://img.shields.io/badge/сайт-git.zapret.moe-4fd1ff?style=for-the-badge&logo=forgejo&logoColor=white"></a>
<a href="https://git2.zapret.moe/zapretdiscordyoutube/homepage/issues"><img alt="Задачи" src="https://img.shields.io/badge/идеи_и_баги-Issues-9b7bff?style=for-the-badge&logo=forgejo&logoColor=white"></a>
<a href="https://telegram.me/bypassblock"><img alt="Telegram" src="https://img.shields.io/badge/обсудить-Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
</p>
## Главное правило
**Этот репозиторий — единственный источник правды.** Каталоги `templates/` и `public/` выкладываются в `custom/` Forgejo целиком: всё, чего нет в git, при следующей выкладке удаляется. Править файлы прямо на сервере бесполезно — правка проживёт максимум до следующего коммита.
## Что где лежит
| Файл | Зачем |
| --- | --- |
| `templates/home.tmpl` | разметка главной: заставка-презентация, шапка, пульс, «кто на связи», арсенал, инструменты, сборки, поддержка |
| `templates/custom/header.tmpl` | вставляется в `<head>` **каждой** страницы: фавиконки и `site.css` |
| `templates/custom/footer.tmpl` | полоса ссылок на вики внизу **каждой** страницы |
| `templates/user/auth/signup_inner.tmpl` | регистрация без почты |
| `templates/user/dashboard/dashboard.tmpl` | лента вошедшего пользователя; при `/?date=home` вместо неё рисует главную (вошедшим Forgejo всегда отдаёт на `/` ленту). При обновлении Forgejo сверить с оригиналом |
| `templates/custom/extra_links.tmpl` | пункт «Главная» в верхнем меню для вошедших |
| `public/assets/zapret-moe/home.css` | стили главной; подключается только из `home.tmpl`, на другие страницы не влияет |
| `public/assets/zapret-moe/intro.css`, `intro.js` | заставка-история: 25 слайдов в трёх актах, главы, пауза, короткий режим и саундтрек (Web Audio). Слайды нарисованы в координатах 1600×900 |
| `public/assets/zapret-moe/chars/art-*.webp` | сюжетные арты для заставки: штамп, сращивание кабеля, поражение и победа |
| `public/assets/zapret-moe/home.js` | заставка, синтезированная музыка к ней (Web Audio, без файлов) и «Пульс разработки» |
| `public/assets/zapret-moe/rig.js`, `rig/*.json` | прототип WebGL-рига персонажей: части (основа без рук и отдельные руки) натянуты на сетки, кости гнут кисти, когти и пряди без дыр и двоения. Пока включается только адресом с `?gl` (выключается `?gl=0`); без WebGL и при «меньше движения» работают обычные CSS-слои |
| `tools/rig-weights.py` | строит веса костей рига из вырезанных слоёв рук и прядей: `tools/rig-weights.py rkn` |
| `public/assets/zapret-moe/site.css` | то немногое, что нужно на всех страницах |
| `public/assets/zapret-moe/fonts/` | Unbounded и Onest (OFL), кириллица и латиница |
| `public/assets/zapret-moe/chars/` | РКН-тян и Запрет-тян, нарезанные на слои для анимации. У РКН-тян (`rkn2-*`) основа нарисована без рук, а руки — отдельные слои с опорой в плече, поэтому они поворачиваются свободно. Координаты слоёв — в системе 1600×900, точки вращения прописаны в разметке ригов в `home.tmpl` |
| `public/assets/zapret-moe/shot-gui.webp` | скриншот Zapret 2 GUI — единственная картинка, которой нет в репозитории проекта |
| `public/assets/img/` | логотип и фавиконки всего сайта |
| `public/robots.txt` | правила для поисковиков |
| `deploy/zapret-homepage-sync.sh` | скрипт выкладки, который крутится на сервере |
| `deploy/zapret-homepage-stats.py` + `.service`/`.timer` | раз в полчаса считает коммиты, релизы и скачивания для «Пульса» и пишет `public/assets/zapret-moe-stats/stats.json` |
| `tools/preview.sh` | локальный предпросмотр в настоящем Forgejo |
## «Пульс разработки»
Статистику считает `deploy/zapret-homepage-stats.py` на сервере, а не браузер каждого посетителя:
- коммиты — прямо из git-репозиториев организаций `zapretdiscordyoutube`, `zapretkvn`, `zastogram` (зеркала пропускаются). В форках с чужой историей (Telegram, MTProxy) засчитываются только коммиты наших авторов — тех, кто коммитил в наши собственные репозитории; боты не считаются;
- релизы и скачивания — из базы Forgejo, только публичные репозитории;
- закрытые репозитории входят в общие группы, их названия наружу не попадают.
Файл `stats.json` не лежит в git: скрипт выкладки специально сохраняет каталог `zapret-moe-stats` при зеркалировании. Если файла нет, главная строит график по публичному heatmap API.
## «Кто сейчас на связи»
Раздел под «Пульсом» показывает, сколько программ запущено прямо сейчас и на каких они версиях. Каждая программа с автообновлением (Zapret 2 GUI начиная с версии 21.1.7.121) держит одно соединение со службой очереди обновлений и называет ей свою версию — эти соединения и считаются.
- Числа считает сервер, а не браузер: служба `zapret-update-wait` на хосте раз в минуту складывает итог в файл, который nginx отдаёт по адресу `/api/zapret/stats.json`. Исходники службы — в закрытом репозитории сборки (`another/update_wait_service.py`, `another/update_wait_stats.py`).
- В файле только числа: программ на связи по версиям, разных пользователей за сутки, ряд «на связи» за сутки, скорость расхождения версий. Адреса не хранятся — разные пользователи считаются приближённым счётчиком.
- Раздел живой: период графика переключается (сутки, неделя, месяц), каналы Stable и Dev включаются и выключаются, всё остальное откликается на наведение, без щелчка: график показывает числа в точке под курсором, отрезок полосы версий (или строка под ней) — всплывающую подсказку о версии, строка выпуска в блоке «как расходились версии» — его кривую. С клавиатуры то же самое делает фокус, на телефоне — касание. Всё, что есть в подсказках, написано и без них: в строках под полосой версий и в таблице под графиком по дням.
- Живая сценка: сервер в середине, вокруг программы, тонкая нить — открытое соединение. По нитям бегут вопросы «есть новее?» и ответы — столько, сколько сервер насчитал за последнюю минуту (`requests_min`); рядом — счётчики потока и строки того, что программа посылает. Число точек, доля прежних версий и занятых — настоящие; какая именно точка спросила — условность. Сценка стоит, пока раздел не на экране, и не движется при «меньше движения».
- «Чем заняты программы»: полоса и список — окно открыто, в трее, игра или видео на весь экран, проверка сети, подбор стратегии — и у скольких включён обход. Это слова самих программ (`online.activity`, `online.running`), считаются общим числом; в сценке программы в трее — приглушённые точки.
- Раздача по ступеням: лестница «5% → 25% → все» показывает, какая ступень открыта, сколько программ версию получили, сколько обновились и вышли на связь и сколько сообщили о неудаче; остановленная раздача подписана причиной.
- Обновления: график «сервер разрешил / обновились / не удалось», время от разрешения до запуска новой версии, отметки ступеней на кривой выпуска и отрезок кривой (10 минут, час, всё время). Таблицы сортируются щелчком по заголовку.
- Графики появляются плавно один раз — когда раздел попал на экран — и когда человек сам что-то переключил; при ежеминутном обновлении чисел они не дёргаются.
- У двух каналов две краски — синий акцент страницы и янтарь (`--zw-stable`, `--zw-dev` в `home.css`). Пара проверена на различимость при нарушениях цветового зрения; не меняйте её на глаз. То же относится к паре «обновились / не удалось» (`--zw-done`, `--zw-fail`).
- Программ две, итогов два: переключатель «Zapret 2 GUI / Zapret KVN» берёт числа из `/api/zapret/stats.json` или `/api/zapret/kvn/stats.json` (у KVN своя служба очереди `zapret-kvn-update-wait`). Подписи, которые у программ разные («обход включён» / «подключение включено»), лежат в `PRODUCTS` в `home.js`.
- Если файла нет или в нём пусто, раздел на странице не показывается. Если пусто у программы, которую человек выбрал сам, вместо графиков стоит строка о том, что чисел ещё нет.
- Разметка — `#zpm-live` в `home.tmpl`, стили `.zw-*` в `home.css`, код — блок «На связи» в `home.js`.
## Картинки проектов не копируются
Обложки берутся прямо из репозиториев проектов — ровно те файлы, что показаны в их README:
- ZaStoGram — `zastogram/ZaStoGram_desktop/media/branch/dev/docs/assets/zastogram-overview.webp`
- Magisk Zapret 2 — `zapretdiscordyoutube/magisk-zapret2/media/branch/main/docs/assets/zapret2-control-ui.webp`
- Zapret KVN — `zapretkvn/ZapretKVN-android/media/branch/main/docs/assets/zapret-kvn-android-overview.webp`
- эмблема сообщества — аватар организации, `/zapretdiscordyoutube.png`
Поменяли обложку в проекте — главная показывает новую сама. Если переименовываете файл или ветку в проекте, поправьте ссылку в `home.tmpl`.
## Как предложить правку
1. Нажмите **Fork** и клонируйте свою копию.
2. Правьте файлы. Разметка — HTML внутри Go-шаблона: конструкции в двойных фигурных скобках (`{{AppSubUrl}}`, `{{if .IsSigned}}`) подставляют адрес сервера и состояние входа, их не трогайте. `@ASSETS_VER@` в ссылках на CSS и JS сервер заменяет хешем файлов — тоже оставьте как есть.
3. Проверьте результат: `tools/preview.sh` скачает Forgejo той же версии, что на сервере, и поднимет главную на http://127.0.0.1:3999/. Шаблоны рендерятся по-настоящему, так что синтаксическая ошибка видна сразу.
4. Откройте pull request в `main`.
## Как правка попадает на сайт
В контейнере Forgejo раз в две минуты запускается `deploy/zapret-homepage-sync.sh`. Если в `main` новый коммит, он:
1. собирает `templates/` и `public/` из этого коммита во временный каталог и подставляет в `@ASSETS_VER@` хеш `home.css`, `home.js` и `site.css`. Поэтому правка CSS/JS меняет шаблоны и перезапускает Forgejo на пару секунд, а замена картинки — нет;
2. атомарно подменяет каталоги в `custom/`, прошлую версию откладывает для отката;
3. если изменились шаблоны — перезапускает Forgejo и проверяет, что главная и регистрация отвечают. Пока Forgejo остановлен ночным бэкапом, выкладка откладывается. Не отвечает — возвращает прошлую версию и больше не выкладывает этот коммит, пока в `main` не появится новый.
После правки файлов из `deploy/` их нужно вручную поставить в контейнер (`/usr/local/sbin/` для скриптов, `/etc/systemd/system/` для юнитов): скрипт выкладки себя не обновляет.
## Правила оформления
- **Палитра** — тушь, бумага и одна краска: почти чёрный фон, тёплый белый текст, синий акцент `--acc`. Переменные — в начале `home.css`. Цвет на странице несут арты, а не интерфейс.
- **Без рамок и без неона.** Блоки стоят прямо на странице: никаких карточек со скруглённой обводкой, пилюль-бейджей, свечений (`box-shadow: 0 0 …`), градиентного текста и цветных пятен на фоне. Группируем отступами, выравниванием и размером шрифта; тонкая линейка допустима только внутри списка.
- **Метафоры — из сетей и IT**, а не из быта: пакеты, провода, соединения, терминал. Сборки — досмотр на ТСПУ: слева поддельный SNI и шум байтов (что видит цензор), рамка со сканером, справа настоящий релиз, по проводам едут пакеты, «Как присоединиться» — TCP-рукопожатие, доверие к сборке — вывод терминала. Картонные коробки, бумажные чеки и прочие «предметы» сюда не подходят.
- **Одна залитая кнопка на блок** (`.zb-main`), остальные действия — ссылки со стрелкой (`.zb`).
- **Никаких внешних ресурсов.** Шрифты, скрипты и картинки со сторонних сайтов не подключаем: страница должна открываться у людей, которым заблокирована половина интернета.
- **Анимации — на CSS и SVG.** JavaScript только как улучшение: без него страница полностью работает, заставка просто не показывается.
- **Уважайте `prefers-reduced-motion`**: для таких пользователей заставки нет, движение выключено.
- **Проверяйте на узком экране** (390 px): горизонтальной прокрутки быть не должно.