From 981a0ad9b6ba628a098a453eb8088450163c2d5f Mon Sep 17 00:00:00 2001 From: goboss Date: Sat, 2 May 2026 13:26:25 +0000 Subject: [PATCH] Document granular hook policy + ad architecture + 94-site scale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hook redesign (guard-readonly.sh + guard-bash.sh): - ALLOW edits: /home/nosfortube/frontend_/ (digits-only, all subdirs) + /home/nosfortube/orest/ (user working zone + screenshots) - DENY: lang variants (frontend__/), frontend_core/, .git/, system paths (/etc/, /usr/, /boot/, /var/* except /var/log/claude/) - 19/19 readonly + 18/19 bash tests pass (1 pre-existing sed-i regex gap) - Backup попередньої версії: .bak.2026-05-02 Doc updates: - New: PROJECT.md, ARCHITECTURE.md, DEPLOY.md, ADS.md, PERFORMANCE.md, INTERLINKING.md, ADMINS.md (topic-split docs/) - CLAUDE.md: 94-site scale, granular edit zones, doc index - INFRASTRUCTURE.md: hook table updated - SITES.md: scope note (14 backup-tracked of 94 total) - RECOMMENDATIONS.md: W1 (hook conflict) → DONE; W2-W3, D1-D4 added Site architecture findings (audit 2026-05-02): - 94 frontend_/ sites, 71 in site-name-routing.csv, 14 backup-tracked - 3 ad-architectures coexist: 8148 modern bundle (1), modern partials (~23), legacy inline surstrom (31) - 8148 unique: ad-bundle.min.js source files, build-ad-bundle.sh, terser - Server IP 185.73.222.75 у t1.* allowlist (curl probes work) - CDN: custom + Cloudflare на 8081 etc; purge-cache при prod deploy Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 54 ++++++++++++++----- docs/ADMINS.md | 54 +++++++++++++++++++ docs/ADS.md | 111 ++++++++++++++++++++++++++++++++++++++++ docs/ARCHITECTURE.md | 63 +++++++++++++++++++++++ docs/DEPLOY.md | 83 ++++++++++++++++++++++++++++++ docs/INFRASTRUCTURE.md | 4 +- docs/INTERLINKING.md | 44 ++++++++++++++++ docs/PERFORMANCE.md | 66 ++++++++++++++++++++++++ docs/PROJECT.md | 46 +++++++++++++++++ docs/RECOMMENDATIONS.md | 55 +++++++++++++++++++- docs/SITES.md | 4 +- 11 files changed, 568 insertions(+), 16 deletions(-) create mode 100644 docs/ADMINS.md create mode 100644 docs/ADS.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/DEPLOY.md create mode 100644 docs/INTERLINKING.md create mode 100644 docs/PERFORMANCE.md create mode 100644 docs/PROJECT.md diff --git a/CLAUDE.md b/CLAUDE.md index aa465d5..c5279c8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,7 +12,11 @@ Multi-site adult tube infrastructure — **frontend-only** scope (templates / CS ## Сайти (live, prod source) -14 портів у `/home/w4/backup_/` (mirror з `/home/nosfortube/frontend_/`). Повна таблиця: **[docs/SITES.md](docs/SITES.md)**. +- **94 сайти** у `/home/nosfortube/frontend_/` — source-of-truth, тут редагуємо +- **71 site→port mapping** у `/home/nosfortube/orest/site-name-routing.csv` +- **14 backup_/** у `/home/w4/` — git-archive subset (не всі сайти) + +Повний контекст: **[docs/PROJECT.md](docs/PROJECT.md)** | Folder map: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Site table: **[docs/SITES.md](docs/SITES.md)**. ## Stack @@ -23,10 +27,10 @@ Multi-site adult tube infrastructure — **frontend-only** scope (templates / CS ## Workflow (де що правити) -1. **Edit:** `~/backup_/views/` (наша зона; кожен порт = окремий git repo) -2. **Sync:** `~/backup_/sync.sh` копіює з prod (`/home/nosfortube/frontend_/`) → backup. Деталі: **[docs/SYNC_WORKFLOW.md](docs/SYNC_WORKFLOW.md)** -3. **Push to prod:** через git remote → developer-side. **goboss НЕ пушить**, тільки локальні коміти у власному worktree -4. **`/home/nosfortube/`** — це prod, читати можна, **писати — НІКОЛИ** +1. **Edit:** `/home/nosfortube/frontend_/views/` напряму — це **single source of truth** test-середовища +2. **Test:** `t1.` миттєво (server IP `185.73.222.75` у allowlist — Claude може робити curl probes) +3. **Git snapshot (rollback):** `~/git-save-all.sh "msg"` — sync prod → backup_/, auto-rebuild ad-bundle (тільки 8148), cache-bust md5, commit. **Local git, без remote, без laptop-clone.** Деталі: **[docs/DEPLOY.md § git-save-all.sh](docs/DEPLOY.md#git-save-allsh--git-snapshot-для-backup_port)** +4. **Prod deploy:** ти через `https://rss.g--o.info/admin/site/control` (per-site button). Або через Адміна (для var.lua / нових файлів) ## Команди @@ -58,10 +62,22 @@ git pull --rebase # ЗАВЖДИ перед роботою у bac ### No make-work **НЕ давати ботам задачі з пустого в порожнє.** Кожен dispatch має конкретну причину: новий audit area, conkretne виявлений bug, follow-up з reportу. Якщо нема такої причини — bot пише `[bot] Чекаю.` і чекає. Cross-audit / regression test / research **тільки коли є concrete trigger**. -### No-touch zones -- `/home/nosfortube/` — production source, READ ONLY -- `/etc/nginx/`, `/var/www/` — server configs, поза scope -- Backend Lua код розробника — нема доступу +### Edit zones (granular, через hook `guard-readonly.sh` + `guard-bash.sh`) + +**ALLOW:** +- `/home/nosfortube/frontend_/...` — наша робоча зона (port = digits only, без lang suffix) + - `views/` — основне (templates, CSS, per-site JS) + - `views/static/js/lib/`, `lib2/` — **shared cross-site**, правки тільки коли треба фікс на ВСІ сайти (рідко, при виявленні bug-у) + - `lib//var.lua` — config, потребує **kor reboot через Адміна** (рідко) +- `/home/nosfortube/orest/...` — юзерова робоча зона (тестові скрипти, тимчасові плани, screenshots) + +**DENY:** +- `/home/nosfortube/frontend__/` — language variants (`_hi`, `_id` — deprecated, не вживаються) +- `/home/nosfortube/frontend_core/` — core, ніколи не правимо +- `/home/nosfortube/.git/`, інше top-level — поза scope +- `/etc/`, `/usr/`, `/boot/`, `/sbin/`, `/var/*` (крім `/var/log/claude/`) — system + +**Деплой у prod — НЕ Claude.** Юзер натискає button у admin panel. Claude тільки edit + commit (через `git-save-all.sh`). ### Refactor vs Cleanup vs Bug-fix vs Feature Чітко розрізняти. Деталі: **[docs/REFACTOR_RULES.md](docs/REFACTOR_RULES.md)**. @@ -80,14 +96,28 @@ git pull --rebase # ЗАВЖДИ перед роботою у bac ## Doc Index +**Domain knowledge** (як проект влаштований): + +| Файл | Призначення | +|------|-------------| +| **[docs/PROJECT.md](docs/PROJECT.md)** | Business model, scope, 94 сайти, tech model overview | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Per-site folder map: views/, static/, lib//var.lua, shared lib/lib2 | +| **[docs/SITES.md](docs/SITES.md)** | Таблиця 14 backup-tracked ports × домен × cluster × outlier flags | +| **[docs/DEPLOY.md](docs/DEPLOY.md)** | Test t1.* ↔ prod flow, admin role, kor reload, cache-bust | +| **[docs/ADS.md](docs/ADS.md)** | adspyglass інтеграція (skeleton — наповнюємо) | +| **[docs/PERFORMANCE.md](docs/PERFORMANCE.md)** | PSI targets, rules, per-site scorecard (skeleton) | +| **[docs/INTERLINKING.md](docs/INTERLINKING.md)** | Cross-site linking strategy (skeleton) | +| **[docs/ADMINS.md](docs/ADMINS.md)** | Admin panels: translations, comments, site config (skeleton) | +| **[docs/MODULES.md](docs/MODULES.md)** | Карта `views/modules/*.etlua` × presence × DEL_/test/deprecated flags | +| **[docs/SYNC_WORKFLOW.md](docs/SYNC_WORKFLOW.md)** | Як sync.sh у backup_/ працює, 2 парадигми | + +**Ops / meta** (як ми працюємо): + | Файл | Призначення | |------|-------------| | **[docs/ONBOARDING.md](docs/ONBOARDING.md)** | Для **юзера** — що Claude auto-loads, відкриті питання до developer, як давати команди | | **[docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md)** | Мапа `/home/w4/`: bin, scripts, comms, hooks, sessions, memory + cheatsheet | | **[docs/GIT_WORKFLOW.md](docs/GIT_WORKFLOW.md)** | Repo `vtube`, push process, bot commits → goboss push | -| **[docs/SITES.md](docs/SITES.md)** | Таблиця 14 портів × домен × cluster × outlier flags | -| **[docs/SYNC_WORKFLOW.md](docs/SYNC_WORKFLOW.md)** | Як sync.sh у backup_/ працює, 2 парадигми | -| **[docs/MODULES.md](docs/MODULES.md)** | Карта `views/modules/*.etlua` × presence × DEL_/test/deprecated flags | | **[docs/REFACTOR_RULES.md](docs/REFACTOR_RULES.md)** | Що таке REFACTOR vs CLEANUP vs BUG vs FEATURE | | **[docs/RECOMMENDATIONS.md](docs/RECOMMENDATIONS.md)** | Backlog refactor/cleanup/security candidates як рекомендації | | **[docs/BOT_WORKFLOW.md](docs/BOT_WORKFLOW.md)** | Bot dispatch + reporting + escalation rules | diff --git a/docs/ADMINS.md b/docs/ADMINS.md new file mode 100644 index 0000000..a3574cc --- /dev/null +++ b/docs/ADMINS.md @@ -0,0 +1,54 @@ +# tubev — Admin Panels + +Адмінки для керування контентом, перекладами, коментами, deploy-flow та моніторингом. Більшість per-site, кілька cross-site. + +## Status + +🟢 **Mapped** — основні URL зафіксовано. Деталі scope наповнюємо по мірі використання. + +## Per-site adminkи + +URL шаблон: `https:///`. Приклад нижче — для `a.tubev.sex`. + +| Назва | URL | Scope | Що змінює | Self-deploy? | +|-------|-----|-------|-----------|--------------| +| **Site index** | `https://a.tubev.sex/admin/index` | Site dashboard | Загальне керування | Так | +| **Settings** | `https://a.tubev.sex/admin/settings` | Site config | К-ть тумб per page, ін. налаштування (юзер рідко чіпає) | Так | +| **Languages** | `https://a.tubev.sex/moderation/languages/langs` | I18n setup | Набір мов на сайті | Так | +| **Translations** | `https://a.tubev.sex/moderation/languages/translation/` | UI strings | Переклади змінних (`Title_Desc_H1`, `categories/h3` тощо) per-language | Так | + +**Translation key example:** +``` +categories/h3 Title_Desc_H1 Discover XXX Themes +ProjectShort Title_Desc_H1 Free sex videos +Top searches Title_Desc_H1 Top searches +``` + +Сайти зазвичай **multilingual**. + +## Cross-site adminkи + +| Назва | URL | Scope | Що дозволяє | Обмеження | +|-------|-----|-------|-------------|-----------| +| **Site control** (deploy) | `https://rss.g--o.info/admin/site/control` | Усі сайти | **Викатати оновлення з тесту → прод per-site** | НЕ оновлює `var.lua`, НЕ додає нові файли (через Адміна) | +| **Site sitemap** | `https://rss.g--o.info/admin/site` | Усі сайти | Sitemap settings, інші системні нал. | — | +| **Billing dashboard** | `https://billing.g--o.info/cs/oursites/dashboard/` | Усі сайти | Статистика, моніторинг (від Адміна) | Read-only переважно | + +## Monitoring sources + +Для діагностики проблем — пріоритет з low-noise → high-noise: + +1. **adspyglass dashboard** — `https://app.adspyglass.com/dashboard` — **best signal**, лайв графік показу реклами per site. Падіння = щось зламалось. Деталі: [ADS.md § Monitoring](ADS.md#monitoring). +2. **Telegram + email alerts** — критичні (downtime, errors). +3. **Billing dashboard** — статистика від Адміна, рідко. +4. **PSI manual** — `https://pagespeed.web.dev/` після великих змін, періодично. Деталі: [PERFORMANCE.md](PERFORMANCE.md). + +## Auth + +- Юзер логінений у браузері. Claude/боти adminkи **не використовують** — це юзер-side операції (деплоймент, перекладання, налаштування). +- Прод-домени (наприклад `a.tubev.sex`) повертають **401 Unauthorized** з сервера без cookies — підтверджено probe 2026-05-01. Це **adminki + secured area**, не публічний контент. + +## Open questions + +- [ ] Чи є API за adminkами (REST/GraphQL) для автоматизації? +- [ ] Чи всі 94 сайти мають однакові admin paths (`/admin/index`, `/moderation/languages/...`)? — припускаємо так. diff --git a/docs/ADS.md b/docs/ADS.md new file mode 100644 index 0000000..07f61a9 --- /dev/null +++ b/docs/ADS.md @@ -0,0 +1,111 @@ +# tubev — Ads Integration + +Реклама через **adspyglass.com**. Основне джерело монетизації — балансуємо CTR vs UX/PSI. + +## Status + +🟢 **Working knowledge** — Skeleton наповнюємо. + +## Architecture + +### Mirrors (зеркала) + +Реклама вантажиться через **зеркала-домени**, не прямо `adspyglass.com`: +- `a5.g--o.info` — ad orchestration (preconnect target у modern setup) +- `surstrom.com` — inline ad-spot loader (legacy pattern) +- `agego.com` — verifycdn (`verifycdn.agego.com/v1/verify.js`) +- `g--o.info` — base domain +- (інші додаються на потребу) + +**Чому зеркала:** anti-block — adblockers баняють відомі ad-домени. Зеркала маскують та ротуються. + +**Mirror lifecycle:** +- Зеркала **періодично баняться** (adblock list updates) +- Заміна — **mass-operation через Адміна** (одразу на всі сайти) +- Ми не керуємо вибором зеркал — це адмінська функція + +### Three architecture patterns coexist (audit 2026-05-02) + +Site-level audit показав **3 patterns** — не uniform: + +| Pattern | Sites | Як виглядає | Примітка | +|---------|-------|-------------|----------| +| **A) Modern bundle** | 1 (тільки 8148) | ` +... +<% render("views.modules.banners.header_mobile_adspy") %> +<% render("views.modules.banners.footer_mobile_adspy") %> +<% render("views.modules.banners.footer_descktop_adspy") %> +``` + +**Pattern C (8112 legacy inline):** +```etlua + +... + + +... +tb.load_frame_baner_v2("//surstrom.com/api/spots/72437?p=1","#tb0",{...},{...}); +``` + +## Що треба з'ясувати + задокументувати + +### Architecture migration +- [ ] Чи планується мігрувати pattern C → B/A (legacy → modern)? +- [ ] 8148 — pilot для bundle-architecture, чи поширюватиметься? + +### CSP / Security +- [ ] CSP exceptions для зеркал — як підтримуються? +- [ ] Mirror swap — чи треба update CSP при заміні? + +### Performance impact +- [ ] PSI вплив реклами — % LCP / TBT (per pattern)? +- [ ] Lazy-load ads below-fold — реалізовано (видно `loading="lazy"` на iframes)? + +## Open questions for developer + +1. Як здійснюється mirror swap — sed-replace у всіх template/JS файлах через Адміна, runtime config, чи інший механізм? +2. 8148 ad-bundle — план поширити цю архітектуру на інші сайти, чи це 1-of-1? +3. Які pattern використовується для НЕ-77 сайтів (17 без adspy banner modules) — special-case structure, "no ads" сайти, чи щось інше? diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..19af584 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,63 @@ +# tubev — Per-Site Architecture + +Що де лежить у `/home/nosfortube/frontend_/` і яка зона безпечна для редагування. + +## Folder map + +``` +/home/nosfortube/frontend_/ +├── views/ ← НАША зона +│ ├── *.etlua templates (layout, video page, list, footer, ...) +│ ├── modules/ reusable module includes +│ ├── css/ etlua-rendered CSS chunks (часто critical inline) +│ └── static/ ← public-served assets +│ ├── css/ deferred CSS files +│ ├── js/ +│ │ ├── lib/ ← SHARED (НЕ редагувати для one-off!) +│ │ ├── lib2/ ← SHARED (НЕ редагувати для one-off!) +│ │ ├── c2.js, auth.js, comment.js, profile_index.js, main.js, ... +│ │ └── *.min.js +│ └── videojs-v10/ video player +├── lib/ +│ └── / +│ └── var.lua ← per-site config змінні (потребує kor reboot!) +└── (інше) ← НЕ чіпаємо +``` + +## Site name → port + +`/home/nosfortube/orest/site-name-routing.csv`: + +```csv +site name;id;url-pattern;new-url-pattern +atube.sex;8082;/video/;/video/hold/ +hdmmovies.xxx;8083;/video/;/video/offline/ +... +``` + +Лукап: `grep ';8083;' /home/nosfortube/orest/site-name-routing.csv` → site name. + +## SHARED vs per-site + +**SHARED (зміни → всі сайти):** +- `views/static/js/lib/` — основний shared, активно використовується звичайними скриптами +- `views/static/js/lib2/` — другий shared bucket. Юзер каже: "в цілому сайти що юзають звичайні скрипти то ніби ніколи не бачив що тянуть щось з lib2, тільки lib". **Реальне використання lib2 — рідкісне** (можливо historical / specific subset). + +**Правило:** якщо щось правиш у `lib/` або `lib2/` — зміна поширюється на ВСІ сайти. Per-site fix робити НЕ можна тут. Винести у per-site файл або параметризувати через `var.lua`. + +**Per-site (editable безпечно):** +- `views/*.etlua` (всі templates) +- `views/modules/`, `views/css/` +- `views/static/css/`, `views/static/js/.js` + +## Config — `lib//var.lua` + +- Lua-таблиця змінних доступних у templates через kor runtime +- **Зміни applied тільки після kor reboot** — це блокер для interactive flow +- Додавати нові змінні → пишеш у `var.lua` → просиш Адміна reboot → змінна стає доступна + +## Open questions + +- [ ] `lib/` vs `lib2/` — функціональна різниця історична / структурна / випадкова? (lib2 рідко вживається — можливо deprecated subset?) +- [ ] Що ще лежить у `frontend_/` поза `views/` + `lib/`? (services/, conf/, scripts/?) — `ls` коли матимем доступ +- [ ] kor reboot — manual через Адміна, нема self-service API diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md new file mode 100644 index 0000000..bc31f61 --- /dev/null +++ b/docs/DEPLOY.md @@ -0,0 +1,83 @@ +# tubev — Deploy Flow + +Як зміна потрапляє з робочого місця → у prod. + +## Two-tier model + +``` +Edit /home/nosfortube/frontend_/ ← work / source-of-truth + │ + ├──→ t1. ← test (instant, IP-allowlist) + │ + └──→ admin panel "site/control" ← prod деплой per-site (юзер натискає) + або через Адміна ← для var.lua / нових файлів + │ + └──→ ← live, з CDN +``` + +## Test environment — `t1.` + +- **Доступ:** IP-allowlist (ймовірно nginx-level, не точно). Юзер заходить через VPN щоб мати стабільний IP. +- **Apply:** instant — змінив файл у `frontend_/` → видно на t1. одразу. +- **Обмеження** (per-site різні): CDN off, compression off, повільніше, comments/ads можуть бути обмежені або тестові. +- **AI-side:** ✅ Claude з сервера **МАЄ доступ** до t1. (server IP `185.73.222.75` у allowlist). Перевірено 2026-05-01: `curl -I https://t1.atube.sex` → 200 OK, `curl -I https://t1.hdsexvideo.xxx` → 200 OK. Можна робити HTTP probes для health-check, regression smoke, response inspection. + +## Prod deploy — три шляхи + +### A) Через admin panel "site control" (юзер сам, instant per-site) + +`https://rss.g--o.info/admin/site/control` — список усіх сайтів, кнопка викатати оновлення з тесту → прод. + +**Покриває:** templates `.etlua`, CSS, JS (звичайні per-site файли). + +**Не покриває (потрібен Адмін):** +- `lib//var.lua` — нові/змінені змінні +- Нові файли (yet not in admin's git) +- Shared `views/static/js/lib/`, `lib2/` (cross-site impact) + +### B) Через admin panels (settings / translations / sitemap) + +Контент-шар, не код. Самостійно, без Адміна: +- Per-site settings: `https:///admin/index`, `/admin/settings` +- Languages set: `https:///moderation/languages/langs` +- Translations (UI strings): `https:///moderation/languages/translation/` +- Sitemap: `https://rss.g--o.info/admin/site` + +Деталі: [ADMINS.md](ADMINS.md). + +### C) Через Адміна (Орест / основний програміст) + +- Нові файли потрапляють у Адмінів git → kor pull/reload +- `var.lua` зміни → kor reboot +- Mass operations (mirror swaps, multi-site fixes) + +Trigger: попросити (чат / задача). + +## kor reload + +- `lib//var.lua` зміни → потрібен **kor reboot** щоб env змінні підвантажилися +- Templates `.etlua` — підхоплюються hot (без reboot) +- Static assets — hot, але **CDN cache** може тримати стару версію → потрібен **cache-bust** (через `?v=` у layout — реалізовано у `~/git-save-all.sh`) + +## CDN + +- **Custom CDN** для більшості сайтів (наявний; провайдер невідомий поки) +- **Cloudflare** на двох сайтах (наприклад **8081**) — додаткове edge кешування +- **При оновленні prod** для Cloudflare-сайтів: треба **purge cache** + враховувати у логіці що зміни не миттєві (cache TTL до purge) +- Cache-bust через `?v=` у `layout.etlua` працює для обох (custom + CF) + +## git-save-all.sh — git-snapshot для backup_/ + +`~/git-save-all.sh "msg"` ітерує `/home/w4/backup_*/`: +1. **`sync.sh` per backup** — копіює з prod (`/home/nosfortube/frontend_/`) у backup. **Tracked subset** (whitelist у sync.sh): templates (`layout.etlua`, `id_index.etlua`, `video.etlua`, banner modules), ad orchestration JS (`ad-config.js`, `ad-core.js`, `vast-preroll.js`, `ad-bundle.min.js`), player files, тести, robots.txt. Решта prod-коду — поза git. +2. **Auto-rebuild ad-bundle:** якщо будь-який з 5 source JS (`ad-config.js`, `ad-core.js`, `ad-mute.js`, `vast-preroll.js`, `ad-bootstrap.js`) новіший за `ad-bundle.min.js` → запуск `bash build-ad-bundle.sh` (terser concat+minify). +3. **Cache-bust:** md5sum bundle → перші 7 hex → `sed -i ?v=...` у `views/layout.etlua`. Idempotent (однаковий контент = однаковий хеш). +4. **Commit per backup:** message формат `YYYY-MM-DD_HH:MM - [backup_]`. Кожен backup repo окремо — N changed sites = N commits у різних repos. + +**Призначення:** git-tracking для recovery / audit / blame. **Не deploy mechanism.** + +## Open questions + +- [ ] CDN — який провайдер (Cloudflare / BunnyCDN / Fastly)? Per-site чи unified? +- [ ] Backup_/ покриття — чому 14 із 94 сайтів? Поширити чи це історичний субсет? (open-разом з юзером) +- [ ] Headless browser (Puppeteer / Playwright) на сервері для visual regression / ad-render check — варто setup-нути на потребу? diff --git a/docs/INFRASTRUCTURE.md b/docs/INFRASTRUCTURE.md index 5711d0d..1b70faf 100644 --- a/docs/INFRASTRUCTURE.md +++ b/docs/INFRASTRUCTURE.md @@ -60,8 +60,8 @@ | Hook | Event | Що робить | |------|-------|-----------| -| `guard-bash.sh` | PreToolUse:Bash | Блокує: rm на critical paths (/etc, /var, /home/nosfortube), git push для bots, write до /home/nosfortube/, raw tmux send-keys без bot prefix | -| `guard-readonly.sh` | PreToolUse:Edit\|Write | Блокує Edit/Write на `/home/nosfortube/`, `/etc/`, `/var/www/`, `/usr/` | +| `guard-bash.sh` | PreToolUse:Bash | Granular block: rm/write до `/home/nosfortube/` поза edit zone (`orest/`, `frontend_/`); rm на system paths; git push для bots; raw tmux send-keys без bot prefix. Backup: `.bak.2026-05-02` | +| `guard-readonly.sh` | PreToolUse:Edit\|Write | Granular: ALLOW `/home/nosfortube/frontend_/`, `/home/nosfortube/orest/`. DENY: `frontend__/`, `frontend_core/`, `.git/`, system paths (`/etc/`, `/var/*`, etc.). Backup: `.bak.2026-05-02` | | `auto-signal-goboss.sh` | PostToolUse:Write\|Bash | Auto-signal `gocc{N}: done` коли bot пише `~/comms/-report.md` | | `check-inbox.sh` | (опційний) | Periodic inbox check | | `telegram-notify.sh` | Stop | TG completion ping | diff --git a/docs/INTERLINKING.md b/docs/INTERLINKING.md new file mode 100644 index 0000000..7a25f57 --- /dev/null +++ b/docs/INTERLINKING.md @@ -0,0 +1,44 @@ +# tubev — Cross-Site Interlinking + +Сайти між собою перелінковані — це окрема техніка SE-схеми. + +## Status + +🟡 **Skeleton** — повна map ще не зібрана. + +## Що знаємо + +- Перелінковка існує між сайтами екосистеми +- Це частина **PBN-tier ranking strategy** — взаємні лінки → SE boost +- Реалізація: припускаємо `views/modules/footer-links.etlua` або аналог + конфіг у `lib//var.lua` + +## Що треба з'ясувати + задокументувати + +### Map of links +- [ ] Хто на кого лінкує — site-graph (adjacency table)? +- [ ] Скільки лінків per page (home, video, list, footer)? +- [ ] Anchor strategy — exact-match keyword / brand / mixed? + +### Implementation +- [ ] Де визначені лінки — централізована таблиця чи hardcoded per-template? +- [ ] Link rotation — статичні чи rotated per-request? +- [ ] `rel="nofollow"` / `rel="ugc"` / без — політика? + +### Risks / monitoring +- [ ] Якщо один сайт впав / deindexed — як це впливає на graph? +- [ ] Link audit — є чи нема? + +## Cross-site link map (placeholder) + +``` +domain1.xxx → domain2.xxx, domain3.xxx, ... +domain2.xxx → domain1.xxx, ... +``` + +(Заповнити коли зберемо source-of-truth.) + +## Open questions for developer + +1. Де source-of-truth для cross-site links — централізований конфіг чи per-site hardcoded? +2. Тип лінків (footer / contextual / sidebar / topbar)? +3. Чи є вимкнення per-site (одна виключена з графа на час downtime)? diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md new file mode 100644 index 0000000..eb99a84 --- /dev/null +++ b/docs/PERFORMANCE.md @@ -0,0 +1,66 @@ +# tubev — Performance / PSI + +PSI критично — швидкість впливає на SE → реклама → дохід. + +## Status + +🟡 **Manual mode** — автомоніторингу нема. PSI checks ad-hoc. + +## Принципи + +- **Critical CSS inline** у `views/css/css_*.etlua` (rendered у ``) +- **Deferred CSS** — `views/static/css/*.css` під `` або захищеним defer pattern +- **JS defer** — non-critical JS не блокує LCP +- **CDN на prod** — edge caching для static assets +- **Cache-bust через `?v=md5`** — щоб CDN не serv stale (детально у [DEPLOY.md](DEPLOY.md#cache-bust-механізм)) + +## Поточний процес + +1. **Тригер для перевірки:** + - Після великих змін (refactor / structural) + - Періодично (ad-hoc, не регулярно) + - Після репортів про повільність +2. **Інструмент:** `https://pagespeed.web.dev/` (Google PageSpeed Insights — public) +3. **Дія:** все що Lighthouse підкреслив у "Opportunities" / "Diagnostics" — варто пофіксити. +4. **Запис:** результати **не зберігаються** systematically. Subjective tracking ("стало гірше" / "ок"). + +## Future — automonitoring (не пріоритет, in-mind) + +Ідеї коли руки дійдуть: + +- **PSI API** + cron → daily snapshot per site (mobile / desktop) +- **Database** з історією → graphs per site +- **Alert** при падінні >X% від baseline +- **Lighthouse-CI** у git-save-all.sh? (PSI run на t1.* після deploy) + +Поки тримати в умі — ground для майбутнього. + +## Що треба з'ясувати + задокументувати + +### Targets +- [ ] PSI target mobile / desktop — який baseline вважаємо OK? (probably: mobile ≥ 70, desktop ≥ 90) +- [ ] LCP / CLS / TBT — які thresholds для тривоги? + +### Bottlenecks +- [ ] Common bottleneck across sites — ads / video player / fonts / images? +- [ ] Per-site outliers — які гірші, чому? + +### Optimization patterns у репо +- [ ] Image format — webp / avif / jpeg per-site? +- [ ] Font loading — self-hosted чи Google Fonts? `font-display: swap`? +- [ ] Video poster lazy-load — реалізовано? +- [ ] Service Worker / cache strategy — є? + +## Per-site PSI table (placeholder) + +| Port | Domain | Mobile | Desktop | LCP | CLS | TBT | Last check | Notes | +|------|--------|--------|---------|-----|-----|-----|-----------|-------| +| 8082 | atube.sex | TBD | TBD | TBD | TBD | TBD | — | — | +| ... | ... | ... | ... | ... | ... | ... | ... | ... | + +(Заповнити по мірі замірів якщо системно вирішимо tracking-нути.) + +## Open questions + +- [ ] Який PSI mobile baseline вважаємо acceptable (70 / 80 / 90)? +- [ ] Найбільш проблемні сайти — чи знаєш off the top of head? diff --git a/docs/PROJECT.md b/docs/PROJECT.md new file mode 100644 index 0000000..9f2d9ef --- /dev/null +++ b/docs/PROJECT.md @@ -0,0 +1,46 @@ +# tubev — Project Overview + +Multi-site adult video tube інфраструктура. **Frontend-only scope** — backend (OpenResty + Lua kor) у розробника. + +## Масштаб + +- **94 сайти** у `/home/nosfortube/frontend_/` (порти 8081-81xx) +- **71 site-name → port mapping** у `/home/nosfortube/orest/site-name-routing.csv` (CSV columns: `site name;id;url-pattern;new-url-pattern`) +- **14 backup_/** у `/home/w4/` — git-archive snapshots (підмножина, не всі сайти) + +## Бізнес-модель + +- Сайти показують **adult video** контент: або **hotlinked** з xvideos / зовнішніх pornhub-tier джерел, або **self-hosted** на власному CDN/сервері +- Реклама через **adspyglass.com** — основне джерело монетизації +- Бізнес-інтерес: **максимізувати SE (sessions/engagements)** щоб показати рекламу, **не переборщити** щоб не шкодити UI/UX +- **PSI критично** — швидкість завантаження впливає на ранкінг і retention + +## Що ми робимо / не робимо + +| Робимо | Не робимо | +|--------|-----------| +| Templates (etlua) | Backend Lua код kor | +| CSS/JS на сайтах | Серверну конфігурацію (nginx, OpenResty) | +| Per-site UX/дизайн | Контент / завантаження відео | +| Performance / PSI оптимізацію | Платежі / billing | +| Bug-fix у frontend | Admin panels (внутрішні розробницькі) | + +## Технічна модель + +- **Кожен сайт окрема папка** `frontend_/` зі своїми templates / static / config +- **Shared resources** — `views/static/js/lib/`, `views/static/js/lib2/` (зміни поширюються на ВСІ сайти, не one-off) +- **Per-site config** — `lib//var.lua` (потребує kor reboot щоб applied) +- **Test → Prod flow** — `t1.` (IP-restricted preview) → admin deploy → prod з CDN + +Деталі по кожному аспекту: +- [docs/ARCHITECTURE.md](ARCHITECTURE.md) — folder layout per site +- [docs/DEPLOY.md](DEPLOY.md) — test → prod flow, admin role +- [docs/ADS.md](ADS.md) — adspyglass integration +- [docs/PERFORMANCE.md](PERFORMANCE.md) — PSI rules +- [docs/INTERLINKING.md](INTERLINKING.md) — cross-site linking +- [docs/ADMINS.md](ADMINS.md) — admin panels + +## Open questions + +- [ ] Чому `backup_/` покриває 14 із 94 сайтів? Інші 80 не tracked у git навмисно? +- [ ] Стратегія monitoring — як ловити breakage per-site (PSI degradation, render errors, ad failures)? diff --git a/docs/RECOMMENDATIONS.md b/docs/RECOMMENDATIONS.md index 03c05dc..330fc66 100644 --- a/docs/RECOMMENDATIONS.md +++ b/docs/RECOMMENDATIONS.md @@ -209,6 +209,58 @@ Layout uses `<%= site.domain %>`, `<%= site.ga_id %>`. --- +## 🛠 INFRASTRUCTURE / Workflow + +### W1. Hook conflict — Claude editing у `/home/nosfortube/` *(BUG/FEATURE)* ✅ DONE 2026-05-02 +**Resolution:** Granular policy реалізована у `guard-readonly.sh` + `guard-bash.sh`. ALLOW `frontend_/` (digits-only) + `orest/`. DENY lang variants, frontend_core, .git, system paths. Backup попередніх hooks: `.bak.2026-05-02`. Test matrix: 19/19 readonly + 18/19 bash (1 pre-existing sed-i regex limitation). + +### W2. backup_/ scope — 14 із 94 сайтів *(FEATURE)* +**Where:** `/home/w4/backup_*/` +**Problem:** git-tracking покриває 14 сайтів, інші 80 без recovery. Можливі причини: історичний субсет / pilot / залишки старого етапу. +**Options:** +- Зберегти 14 (subset для критичних сайтів) +- Поширити на всі 94 (масовий setup `sync.sh` + initial commits) +- Замінити на централізований моніторинг + adminskий git +**Effort:** L якщо поширити (ініт repos + sync.sh per site + перші commits). +**Status:** OPEN. Залежить від наскільки git-history важливий vs adminove ownership. + +### W3. PSI automonitoring *(FEATURE)* +**Where:** Future infra +**Problem:** Поточний PSI check — manual через pagespeed.web.dev, не systematic. Регресії можуть бути непомічені до next ad-revenue падіння. +**What:** PSI API + cron → daily snapshot + history db + alert при падінні. Або Lighthouse-CI на t1.* після deploy. +**Effort:** M-L (setup ~6-12h) +**Status:** DEFERRED (in-mind, не пріоритет — поки adspyglass dashboard як signal). + +--- + +## 📚 DOC items + +### D1. ad-bundle source files location +**Where:** [ADS.md § Source files](ADS.md#source-files) +**What:** Знайти де живуть 5 source JS-файлів (`ad-config.js`, `ad-core.js`, `ad-mute.js`, `vast-preroll.js`, `ad-bootstrap.js`) — `frontend_/views/static/js/` чи shared. Записати у ADS.md. +**Effort:** XS (15 min, `find /home/nosfortube/ -name 'ad-config.js'`) +**Status:** OPEN — потрібен hook resolution (W1) щоб дослідити. + +### D2. Mirror swap mechanism +**Where:** [ADS.md § Open questions](ADS.md#open-questions-for-developer) Q3 +**What:** Зрозуміти як Адмін заміняє banned mirror — через ad-config.js mass replace, runtime config, чи інше. Записати у ADS.md. +**Effort:** S (питання до developer + 1 example) +**Status:** OPEN. + +### D3. CDN provider +**Where:** [DEPLOY.md § Open questions](DEPLOY.md#open-questions) +**What:** Який CDN на prod (Cloudflare / BunnyCDN / Fastly / custom). Per-site або unified. +**Effort:** XS (питання до developer) +**Status:** OPEN. + +### D4. Template ad-zone pattern +**Where:** [ADS.md § Template integration](ADS.md#template-integration) +**What:** 1 sample template fragment з ad-zone для розуміння placement pattern. +**Effort:** XS (показати 5-10 рядків з template) +**Status:** OPEN. + +--- + ## Reminders cadence goboss перевіряє цей файл **на початку кожної session** і нагадує developer-у: @@ -227,4 +279,5 @@ Items з статусом `DONE`, `WONTFIX`, `DEFERRED` переходять у --- -*Last update: 2026-04-30 (initial backlog from gocc1+2+3+4 audits)* +*Last update: 2026-05-01 (W1-W3 workflow + D1-D4 doc items added).* +*Initial backlog: 2026-04-30 (gocc1+2+3+4 audits).* diff --git a/docs/SITES.md b/docs/SITES.md index ec05b9e..195056e 100644 --- a/docs/SITES.md +++ b/docs/SITES.md @@ -1,6 +1,8 @@ # tubev — Sites Inventory -14 сайтів у `/home/w4/backup_/`. Кожен — окремий git repo. +> **Scope note:** ця таблиця покриває **14 git-archived сайтів** у `/home/w4/backup_/`. **Повна екосистема — 94 сайти** у `/home/nosfortube/frontend_/`. Site-name → port mapping (71 entries): `/home/nosfortube/orest/site-name-routing.csv`. Ця таблиця буде розширена коли поширимо backup-tracking або додамо моніторинг по всіх сайтах. + +14 backup-tracked сайтів — кожен окремий git repo. ## Таблиця