feat(preview): static HTML mockups на /preview/* (basic auth) #268

Merged
lekss361 merged 1 commit from feat/preview-mockups-static into main 2026-05-17 08:19:25 +00:00
Owner

Summary

Размещает 4 HTML макета-альтернативы (из audit сессии) на https://gendsgn.ru/preview/ под basic auth. Не трогает существующие React-страницы Next.js.

Файлы

URL Файл (40-44 KB)
https://gendsgn.ru/preview/landing.html landing redesign
https://gendsgn.ru/preview/site-finder.html site-finder redesign
https://gendsgn.ru/preview/analytics.html analytics redesign
https://gendsgn.ru/preview/monitoring.html monitoring redesign

Изменения

  • preview/ — 4 static HTML файла (~160 KB total)
  • Caddyfilehandle_path /preview/* { root /srv/preview ; basicauth ; file_server browse } внутри gendsgn.ru block
  • docker-compose.prod.yml — bind mount ./preview:/srv/preview:ro в caddy

Auth

  • User: preview
  • Password: выдан вне репо (запросить у lekss361)
  • Bcrypt hash в Caddyfile (commit OK — bcrypt безопасен для публикации)

Безопасность / scope

  • НЕ заменяет existing routes — /, /site-finder, /analytics продолжают рендерить Next.js
  • Изолированный path /preview/* — handle_path strip prefix, root указан явно
  • Basic auth защищает от случайных посетителей / search engine indexing
  • Auto-deploy через deploy.yml после merge (Caddy auto-reload по watch)

Test plan

  • После merge + deploy:
    curl -u preview:<pwd> https://gendsgn.ru/preview/landing.html | head -5
    # → expect <!DOCTYPE html>...
    
  • Без auth: curl -i https://gendsgn.ru/preview/landing.html → 401 Unauthorized
  • Regression: curl https://gendsgn.ru/ → Next.js landing (не сломалось)
  • Regression: curl -X POST https://gendsgn.ru/api/v1/health → backend OK
## Summary Размещает 4 HTML макета-альтернативы (из audit сессии) на `https://gendsgn.ru/preview/` под basic auth. Не трогает существующие React-страницы Next.js. ## Файлы | URL | Файл (40-44 KB) | |---|---| | https://gendsgn.ru/preview/landing.html | landing redesign | | https://gendsgn.ru/preview/site-finder.html | site-finder redesign | | https://gendsgn.ru/preview/analytics.html | analytics redesign | | https://gendsgn.ru/preview/monitoring.html | monitoring redesign | ## Изменения - `preview/` — 4 static HTML файла (~160 KB total) - `Caddyfile` — `handle_path /preview/* { root /srv/preview ; basicauth ; file_server browse }` внутри `gendsgn.ru` block - `docker-compose.prod.yml` — bind mount `./preview:/srv/preview:ro` в caddy ## Auth - **User:** `preview` - **Password:** выдан вне репо (запросить у lekss361) - Bcrypt hash в Caddyfile (commit OK — bcrypt безопасен для публикации) ## Безопасность / scope - ✅ **НЕ заменяет** existing routes — `/`, `/site-finder`, `/analytics` продолжают рендерить Next.js - ✅ **Изолированный path** `/preview/*` — handle_path strip prefix, root указан явно - ✅ **Basic auth** защищает от случайных посетителей / search engine indexing - ✅ Auto-deploy через deploy.yml после merge (Caddy auto-reload по watch) ## Test plan - [ ] После merge + deploy: ```bash curl -u preview:<pwd> https://gendsgn.ru/preview/landing.html | head -5 # → expect <!DOCTYPE html>... ``` - [ ] Без auth: `curl -i https://gendsgn.ru/preview/landing.html` → 401 Unauthorized - [ ] Regression: `curl https://gendsgn.ru/` → Next.js landing (не сломалось) - [ ] Regression: `curl -X POST https://gendsgn.ru/api/v1/health` → backend OK
lekss361 added 1 commit 2026-05-17 08:16:07 +00:00
4 HTML mockups (landing/site-finder/analytics/monitoring) — alternative
designs для audit-review без замены существующих React-страниц.

- Caddy file_server на handle_path /preview/* (внутри gendsgn.ru block)
- Bind mount ./preview:/srv/preview:ro в caddy container
- basic auth: user=preview / pwd shared via private channel
- Static, isolated — не влияет на /, /site-finder, /analytics (Next.js routes)
Author
Owner

Deep review — verdict: APPROVE

Caddyfile (10 lines):

  • handle_path /preview/* корректно расположен ВНУТРИ gendsgn.ru block, ПЕРЕД catch-all handle { reverse_proxy frontend } — first-match wins, порядок правильный.
  • handle_path strip prefix: /preview/landing.htmllanding.html/srv/preview/landing.html
  • root * /srv/preview — корректный Caddy v2 синтаксис с * matcher.
  • basicauth { user hash } block — валидный v2 syntax (без deprecated basicauth /path/*).
  • Bcrypt $2a$14$... — валидный prefix, cost 14 (strong).
  • :80 block не экспонирует /preview/* — preview только через HTTPS apex domain. Good.

docker-compose.prod.yml:

  • Bind mount ./preview:/srv/preview:ro относителен к /opt/gendesign/docker-compose.prod.yml. deploy.yml делает git reset --hard origin/mainpreview/ синхронизируется. ✓
  • :ro правильно для static content.
  • Не сломан existing Caddyfile mount / cert volumes.

HTML files:

  • 0 <script> тэгов во всех 4 файлах — нет JS, нет fetch к API, нет state mutation risk.
  • External resources: только Google Fonts (fonts.googleapis.com, fonts.gstatic.com) + t.me/gendsgn в landing — приемлемо.
  • Размер ~160 KB total — OK.

Deploy flow:

  • .forgejo/workflows/deploy.yml trigger paths включает Caddyfile + docker-compose.prod.yml → этот PR редеплоит. ✓
  • caddy reload запускается автоматически после compose up -d (line 252-253). ✓
  • Минорное: trigger paths НЕ включает preview/** — будущие правки только HTML (без Caddyfile/compose) не редеплоят. Bind mount :ro подхватит файлы после следующего deploy с другим trigger, либо нужен workflow_dispatch. Можно отдельным chore добавить preview/** в paths.

Smoke checks после deploy (рекомендую):

curl -i https://gendsgn.ru/preview/landing.html             # → 401
curl -u preview:<pwd> https://gendsgn.ru/preview/landing.html | head -3  # → <!doctype html>
curl -i https://gendsgn.ru/                                 # → Next.js (200)
curl -i https://gendsgn.ru/api/v1/health                    # → backend 200

Recommendations (non-blocking, отдельный chore):

  1. Добавить preview/** в deploy.yml paths: filter (чтобы HTML-only правки редеплоили).
  2. robots.txt exclude /preview/* — bcrypt 401 защищает от индексации, но disallow safer.
  3. Опционально убрать browse из file_server (directory listing не нужен — все entry points известны).

Мержу как merge style.

## Deep review — verdict: APPROVE **Caddyfile (10 lines):** - `handle_path /preview/*` корректно расположен ВНУТРИ `gendsgn.ru` block, ПЕРЕД catch-all `handle { reverse_proxy frontend }` — first-match wins, порядок правильный. - `handle_path` strip prefix: `/preview/landing.html` → `landing.html` → `/srv/preview/landing.html` ✓ - `root * /srv/preview` — корректный Caddy v2 синтаксис с `*` matcher. - `basicauth { user hash }` block — валидный v2 syntax (без deprecated `basicauth /path/*`). - Bcrypt `$2a$14$...` — валидный prefix, cost 14 (strong). - `:80` block не экспонирует `/preview/*` — preview только через HTTPS apex domain. Good. **docker-compose.prod.yml:** - Bind mount `./preview:/srv/preview:ro` относителен к `/opt/gendesign/docker-compose.prod.yml`. `deploy.yml` делает `git reset --hard origin/main` → `preview/` синхронизируется. ✓ - `:ro` правильно для static content. - Не сломан existing Caddyfile mount / cert volumes. **HTML files:** - 0 `<script>` тэгов во всех 4 файлах — нет JS, нет fetch к API, нет state mutation risk. - External resources: только Google Fonts (`fonts.googleapis.com`, `fonts.gstatic.com`) + `t.me/gendsgn` в landing — приемлемо. - Размер ~160 KB total — OK. **Deploy flow:** - `.forgejo/workflows/deploy.yml` trigger paths включает `Caddyfile` + `docker-compose.prod.yml` → этот PR редеплоит. ✓ - `caddy reload` запускается автоматически после `compose up -d` (line 252-253). ✓ - Минорное: trigger paths НЕ включает `preview/**` — будущие правки только HTML (без Caddyfile/compose) не редеплоят. Bind mount `:ro` подхватит файлы после следующего deploy с другим trigger, либо нужен `workflow_dispatch`. Можно отдельным chore добавить `preview/**` в paths. **Smoke checks после deploy (рекомендую):** ```bash curl -i https://gendsgn.ru/preview/landing.html # → 401 curl -u preview:<pwd> https://gendsgn.ru/preview/landing.html | head -3 # → <!doctype html> curl -i https://gendsgn.ru/ # → Next.js (200) curl -i https://gendsgn.ru/api/v1/health # → backend 200 ``` **Recommendations (non-blocking, отдельный chore):** 1. Добавить `preview/**` в `deploy.yml` `paths:` filter (чтобы HTML-only правки редеплоили). 2. `robots.txt` exclude `/preview/*` — bcrypt 401 защищает от индексации, но disallow safer. 3. Опционально убрать `browse` из `file_server` (directory listing не нужен — все entry points известны). Мержу как `merge` style.
lekss361 merged commit fa76e6ac9f into main 2026-05-17 08:19:25 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#268
No description provided.