131 lines
5.0 KiB
Markdown
131 lines
5.0 KiB
Markdown
|
|
# tubev — Sync Workflow
|
|||
|
|
|
|||
|
|
`sync.sh` копіює фронтенд з prod (`/home/nosfortube/frontend_<port>/`) → backup (`~/backup_<port>/`).
|
|||
|
|
|
|||
|
|
## Дві парадигми
|
|||
|
|
|
|||
|
|
### Group A — rsync mirror (7 сайтів)
|
|||
|
|
|
|||
|
|
**Сайти:** 8084, 8085, 8100, 8102, 8107, 8126, 8131
|
|||
|
|
|
|||
|
|
**Шаблон (12 рядків, ідентичний після port-mask):**
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
SRC="/home/nosfortube/frontend_<port>"
|
|||
|
|
DST="/home/w4/backup_<port>"
|
|||
|
|
|
|||
|
|
# Mirror views/
|
|||
|
|
rsync -a --delete --exclude='.git' "$SRC/views/" "$DST/views/"
|
|||
|
|
|
|||
|
|
# Mirror lib/<port>/
|
|||
|
|
mkdir -p "$DST/lib/<port>"
|
|||
|
|
rsync -a --delete "$SRC/lib/<port>/" "$DST/lib/<port>/"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Властивості:**
|
|||
|
|
- `--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_<NEW_PORT>/`:**
|
|||
|
|
```bash
|
|||
|
|
mkdir -p ~/backup_<NEW_PORT>
|
|||
|
|
cd ~/backup_<NEW_PORT>
|
|||
|
|
git init
|
|||
|
|
git remote add origin <repo-url-from-developer>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **Скопіювати rsync-template (Group A) — recommended:**
|
|||
|
|
```bash
|
|||
|
|
cat > sync.sh <<'SHELL'
|
|||
|
|
#!/bin/bash
|
|||
|
|
SRC="/home/nosfortube/frontend_<NEW_PORT>"
|
|||
|
|
DST="/home/w4/backup_<NEW_PORT>"
|
|||
|
|
rsync -a --delete --exclude='.git' "$SRC/views/" "$DST/views/"
|
|||
|
|
mkdir -p "$DST/lib/<NEW_PORT>"
|
|||
|
|
rsync -a --delete "$SRC/lib/<NEW_PORT>/" "$DST/lib/<NEW_PORT>/"
|
|||
|
|
SHELL
|
|||
|
|
chmod +x sync.sh
|
|||
|
|
./sync.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **Закомітити перший snapshot:**
|
|||
|
|
```bash
|
|||
|
|
git add .
|
|||
|
|
git commit -m "Initial backup of frontend_<NEW_PORT>"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **Оновити `docs/SITES.md`** — додати рядок з портом, доменом, кластером.
|
|||
|
|
|
|||
|
|
## Як зробити локальну зміну
|
|||
|
|
|
|||
|
|
1. **Sync прод стан:**
|
|||
|
|
```bash
|
|||
|
|
cd ~/backup_<port>
|
|||
|
|
./sync.sh
|
|||
|
|
git status # перевір чи прод змінився під час твоєї роботи
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **Edit:** редагуй `views/`, `static/`, etc. **НЕ йди у `/home/nosfortube/`**.
|
|||
|
|
|
|||
|
|
3. **Commit локально:**
|
|||
|
|
```bash
|
|||
|
|
git add <files>
|
|||
|
|
git commit -m "<scope>: <change>"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **Push до prod:** **goboss НЕ пушить**. Це робить розробник через свій процес. Боти лишають коміти у власному worktree (`~/gocc{N}/<repo>/`), 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.*
|