# tubev — Sync Workflow `sync.sh` копіює фронтенд з prod (`/home/nosfortube/frontend_/`) → backup (`~/backup_/`). ## Дві парадигми ### Group A — rsync mirror (7 сайтів) **Сайти:** 8084, 8085, 8100, 8102, 8107, 8126, 8131 **Шаблон (12 рядків, ідентичний після port-mask):** ```bash #!/bin/bash SRC="/home/nosfortube/frontend_" DST="/home/w4/backup_" # Mirror views/ rsync -a --delete --exclude='.git' "$SRC/views/" "$DST/views/" # Mirror lib// mkdir -p "$DST/lib/" rsync -a --delete "$SRC/lib//" "$DST/lib//" ``` **Властивості:** - `--delete` → backup завжди = SRC. Drift=0. - Підтягує ВСЕ під `views/`, включно зі сміттям (`*copy*`, `*bak*`, `_test`, `DEL_*`). - Безпечно для drift. ### Group B — selective cp (7 сайтів) **Сайти:** 8081, 8086, 8112, 8120, 8129, 8133, 8148 **Pattern:** explicit allowlist файлів через `cp` per-file. | Site | Lines | Особливість | |------|-------|-------------| | 8081 | 46 | Templates + JS allowlist; profile_* + videojs-v10 | | 8086 | 36 | header/footer + ~14 modules + minimal css/js | | 8112 | 50 | Templates з ad/no-ad варіантами + banners + player + var.lua | | 8120 | 46 | Templates + 14 modules + 5 css + forms + dropzone JS | | 8129 | 36 | Templates + 7 modules + 5 css + timeline JS | | 8133 | 37 | Templates + 11 modules + 9 banners + static html | | 8148 | **79** | + auto-rebuild ad-bundle (md5) + pjs/timeline-pjs/tests | **Властивості:** - Drift-prone: якщо у prod з'являється файл якого нема у allowlist — backup його не знає. - Швидко (sync лише потрібного). - Жорсткий контроль що бекапиться. ### 8148 — особливий `sync.sh` 8148 не лише копіює, а й **виконує MUTATION на prod source:** ```bash # Builds ad-bundle, computes md5, replaces ?v=HASH у layout.etlua build-ad-bundle.sh HASH=$(md5sum ad-bundle.js | cut -d' ' -f1) sed -i "s/ad-bundle.js?v=[a-f0-9]*/ad-bundle.js?v=$HASH/" layout.etlua ``` Це дельта sync ↔ build. Інші sync.sh — read-only operations. **Рекомендація** — винести build у окремий скрипт (див. RECOMMENDATIONS.md). ## Як додати новий сайт 1. **Створити `~/backup_/`:** ```bash mkdir -p ~/backup_ cd ~/backup_ git init git remote add origin ``` 2. **Скопіювати rsync-template (Group A) — recommended:** ```bash cat > sync.sh <<'SHELL' #!/bin/bash SRC="/home/nosfortube/frontend_" DST="/home/w4/backup_" rsync -a --delete --exclude='.git' "$SRC/views/" "$DST/views/" mkdir -p "$DST/lib/" rsync -a --delete "$SRC/lib//" "$DST/lib//" SHELL chmod +x sync.sh ./sync.sh ``` 3. **Закомітити перший snapshot:** ```bash git add . git commit -m "Initial backup of frontend_" ``` 4. **Оновити `docs/SITES.md`** — додати рядок з портом, доменом, кластером. ## Як зробити локальну зміну 1. **Sync прод стан:** ```bash cd ~/backup_ ./sync.sh git status # перевір чи прод змінився під час твоєї роботи ``` 2. **Edit:** редагуй `views/`, `static/`, etc. **НЕ йди у `/home/nosfortube/`**. 3. **Commit локально:** ```bash git add git commit -m ": " ``` 4. **Push до prod:** **goboss НЕ пушить**. Це робить розробник через свій процес. Боти лишають коміти у власному worktree (`~/gocc{N}//`), goboss збирає через cherry-pick. 5. **Verify:** preview/test domain механізм наразі не ідентифіковано (питання до розробника). ## Git remote Тільки **8112** має `origin = git@git.tubev.sex:nosfotube/frontend.git`. Інші 13 — local-only repos. Це означає що pull/push між backup'ами не централізовано. **Рекомендація:** з'ясувати у розробника правильний git workflow (чи всі сайти ідуть через `git.tubev.sex`, чи інакше). ## Рекомендація: уніфікація на rsync (S, ~1h) 7 selective sync.sh роблять те саме що 7 rsync, але через ad-hoc allowlists. Це drift-magnet (gocc1 знайшов 8086: 30+ файлів на disk не у sync.sh; 8112: untracked `rotator/`, `lib/`, `nginx.conf`). Краще — один template на 14 сайтів. Деталі: **[docs/RECOMMENDATIONS.md](RECOMMENDATIONS.md)** #1. --- *Source: gocc1 + gocc2 + gocc4 audits 2026-04-30.*