Начните с визитки. Вырастите во что угодно.
Архитектурный фундамент для self-hosted сайтов, которые растут. Стек, структура проекта и правила развития уже определены — не вы выбираете между Next/Astro/Remix или Strapi/Sanity/Payload, не вы изобретаете границы между фронтом и CMS. Решения зафиксированы — фокусируйтесь на продукте.
Сайты редко умирают из-за технологий. Они умирают из-за того, что были построены как временное решение. WHG даёт фундамент, чтобы начать маленьким и расти без переписывания через год.
Что это и зачем — docs/whg/00-overview.md · README in English · README на русском
gh repo create my-site --template Vovanda/WebHolyGrail --private --clone
cd my-site && corepack enable && pnpm install
./dev-setup.sh
./dev.shОткрывается http://localhost:3000 (сайт), http://localhost:3001/admin (CMS).
Кроме Node и pnpm ничего не нужно: настройки лежат в .env.local, а залитые файлы
CMS хранит у себя и сама раздаёт. Докер и хранилище секретов подключаются, когда
настройки становятся общими на команду:
./dev-setup.sh --shared # Infisical + локальное хранилище файлов в докереВнешнее хранилище на стенде включается строками S3_* в .env.local - пояснение
лежит там же.
| Слой | Выбор |
|---|---|
| Frontend | Next.js 15 (App Router) + React 19 |
| UI | shadcn/ui + Tailwind + CSS-токены |
| CMS | Payload 3.x (TypeScript-first, админка на русском) |
| Database | SQLite / Postgres (адаптер одной строкой) |
| Contracts | contracts/ workspace (one-way seam) |
| Containers | Docker compose + blue-green в проде |
| Storage | своё на стенде, S3-совместимое на боевом сайте |
| Secrets | .env.local на стенде, Infisical на боевом сайте |
| Tests | Vitest + Playwright (scaffolded; coverage WIP) |
| Video | Своя раздача: нарезка ffmpeg, шифрование, плеер |
Обоснование выбора каждого слоя — docs/whg/15-vision.md.
Записи лежат в вашем хранилище и играют без сторонних площадок. Загруженный файл режется на короткие куски сразу в нескольких качествах, куски шифруются, обложка берётся кадром из середины. Закрыть или открыть запись можно в любую секунду: меняется только то, кому сервер выдаёт ключ, а перенарезки не требуется.
Плеер умеет то, к чему зритель привык: субтитры несколькими языками, оглавление главами, кадры-подсказки при перемотке, ссылку с таймкодом, продолжение с места остановки и уголок при прокрутке страницы. Доступ к закрытому даётся кодом, который владелец выдаёт сам.
Подробно — docs/whg/39-video.md.
.
├── src/
│ ├── client/ # Next.js 15 app
│ └── cms/ # Payload 3.x app
├── contracts/ # shared types (client/cms → contracts)
├── deploy/{local,prod,proxy-stack}/
├── scripts/ # setup-infisical, sync-template
└── docs/whg/ # документация
Детали — docs/whg/32-structure.md.
| File | What |
|---|---|
00-overview.md |
Категория, боль которую закрывает, что в коробке |
15-vision.md |
Stack rationale: почему именно эти выборы |
30-philosophy.md |
R-rules R1-R9 |
32-structure.md |
Структура монорепо, growth models, project types |
37-scaffolding.md |
Создание нового сайта (gh template → Infisical → dev) |
45-data-location.md |
Где живут значения — Payload / Infisical / код |
stack/ |
Per-component reference |