Тема
Универсальная CMS — видение (v2)
Статус: фаза 1 в работе (обновлено 2026-07-13). Первый срез ядра-минимума собран и опубликован на студийном полигоне cms.rosveb.ru (репозиторий
laravel/cms.rosveb.ru); исполняемый ранбук с прогрессом —TZ.mdэтого репозитория (волны 0–12 ✅, продолжение — волны 13–23). Все 12 архитектурных вопросов закрыты (решения), написаны спеки контрактов фазы 0, стандарт модуля, ТЗ ядра + API и отдельное ТЗ на каждый из 121 модуля (индекс), порядок сборки — по волнам. Предыдущая версия видения (Rosveb CMS v1, закрытый внутренний инструмент студии) в архив не сохранялась; её пересмотренные решения зафиксированы в Что изменилось против v1.
Что это
Универсальная блочная CMS на Laravel + Filament, распространяемая как набор приватных composer-пакетов. Сайт клиента — тонкий skeleton: тема, кастомные блоки, .env. Всё остальное — ядро и модули, которые приезжают пакетами и обновляются штатной процедурой через центр обновлений, а не git-merge форков.
Прародитель — проект universal (каталог стройматериалов): рабочий блочный движок на 15 типов блоков, Filament-админка, SEO-движок, settings из БД, теговый page-cache, формы с очередью. Это проверено продом. CMS рождается портированием рабочих кусков в чистое ядро, а не рефакторингом universal на месте.
Принцип «универсальное ядро + модульное включение» (модель Битрикс). Ядро — большое и универсальное: богатые базовые механизмы (движок полей, события, очереди, API-слой) и редакторы-инструменты (сущности, типы данных, файлы, пользователи). Но конкретные возможности раскрываются через модули, которые включаются по потребности (платежи, доставка, каталог, интеграции, push — десятки). Как в Битрикс: ядро D7 мощное, но sale/catalog — отдельные модули. Чем меньше модулей включено — тем легче работает сайт (тяжесть определяется числом включённых модулей, а не размером ядра). Это даёт универсальность из коробки, независимые релизы, изоляцию сбоев и раздельное лицензирование. Исчерпывающая карта — в каталоге подсистем.
Зачем (проблема)
Текущая модель «форк-пер-клиент»:
- новый сайт = копия репозитория + недели выпиливания чужого наследия;
- обновление общего кода = ручной git-merge с конфликтами; на 5+ клиентах не масштабируется;
- исправление бага в общем коде не доезжает до старых клиентов никогда;
- в каждом форке копится «нельзя удалять» (у universal это
Estimate*,artel-конфиги).
Для кого (аудитория)
Студия + клиенты, которые сами ведут контент. Это ключевое решение, определяющее всю архитектуру:
- студия строит сайты, разрабатывает темы и модули, обслуживает парк;
- клиент самостоятельно наполняет и собирает страницы через удобный редактор (визуальный drag&drop блоков) — поэтому редактор должен быть дружелюбным, а не «таблица+форма для разработчика».
Это шире, чем «внутренний инструмент студии» из v1: контент-менеджер клиента — полноправный пользователь системы.
Целевые метрики
Мерить не «сколько фич», а:
| Метрика | Цель |
|---|---|
| Развёртывание нового сайта клиента | день, а не месяц |
| Обновление ядра у существующего клиента | минуты, без ручных правок |
| Доля кода в клиентском проекте | < 10 % (тема + кастом-блоки) |
| Перенос макета из Claude.ai/design | регламентная процедура, а не подвиг |
| Upgrade-тесты с прошлого мажора | зелёные в CI |
| Контент-менеджер клиента собирает страницу | без обращения в студию |
Ключевые решения (зафиксировано в этой сессии)
| Вопрос | Решение | Обоснование |
|---|---|---|
| Целевой стек | Laravel 13 · PHP 8.4 · PostgreSQL 16 · Filament v5.6.6+ | L12 вне багфиксов с авг.2026; апгрейд 12→13 zero-breaking. См. Целевая платформа и Канонический стек |
| Дистрибуция | Приватные composer-пакеты + Satis | Composer сам решает версии/конфликты; composer.lock — механизм отката. См. Центр обновлений |
| Админка | Filament v5.6.6+ (Livewire 4/Blade) | Вид из коробки, нулевая вёрстка админки, весь опыт студии |
| Публичный фронт | Blade + дизайн-токены + React-острова точечно | SEO критичен → сервер отдаёт HTML, page-cache работает. См. Фронт-архитектура |
| Клиентские кабинеты | Отдельное Inertia + React SSR приложение рядом, на том же ядре | Богатый интерактив и точный дизайн там, где SEO не важен (после логина) |
| Темы | Слой пакетов: Blade-переопределения + theme.json токены + React-острова | Переключение темы + точность дизайна из claude.ai/design без потери SEO |
| Расширяемость | Открытый BlockRegistry + события + фильтры + контракт модуля | Аналог Битрикс /local+init.php, но идиоматично для Laravel. См. Расширяемость |
| Редактор страниц | Визуальный drag&drop блоков, средняя свобода | Клиент собирает страницы сам; стили (цвет/отступ/шрифт) — в теме, не в редакторе (Q9) |
| Произвольные типы контента | В ядре, через JSONB+GIN (не EAV) | Гибкость инфоблоков Битрикс без деградации SEO/производительности (Q5) |
| Права/RBAC | Filament Shield + spatie/permission | Стандарт де-факто, уже в стеке (Q11) |
| Репозиторий | Своя инфра (Gitea/GitLab) + Satis | Полный контроль, нет внешней зависимости (Q2) |
| Экосистема | Маркетплейс закрыт сейчас, архитектура под открытие | Урок WP (91% CVE в плагинах); открытие — фаза 5 (Q3) |
Что изменилось против v1
Первая концепция (Rosveb CMS v1) описывала CMS как закрытый внутренний инструмент студии. При переосмыслении расширены три границы:
| Аспект | v1 (anti-goal) | v2 (решение) |
|---|---|---|
| Аудитория | только студия | студия + клиенты ведут контент |
| drag&drop-конструктор | запрещён (Tilda-стиль) | нужен (но со строгими схемами блоков) |
| Маркетплейс для сторонних | запрещён | открыть (перспектива, не с первого дня) |
| React-кабинеты | не предусмотрены | Inertia SSR-приложение рядом |
Остальные решения v1 (composer+Satis, Filament, версии схем блоков, центр обновлений с откатом) — подтверждены и усилены исследованием чужих ядер.
Anti-goals — чего НЕ строим
Дисциплина рамок важнее фич. Осознанно не делаем:
- Мультитенант в ядре — по умолчанию одна инсталляция на клиента; общий пульт — отдельный флит-дашборд. Мультитенантность возможна как отдельный инфра-модуль под конкретный заказ, но не встроена в ядро.
- Свободный конструктор без схем (голая Tilda). drag&drop есть, но каждый блок — строгая схема полей; стили (цвет/отступ/шрифт) остаются в теме — это защищает дизайн от разрушения контент-менеджером (Q9).
- Headless-first — JSON API блоков возможен позже как опциональный модуль; ядро рендерит сервером (условие SEO).
- Конкурента WordPress «вообще» — корпоративные сайты в модели студии, ориентир по возможностям — 1С-Битрикс.
- Свой транспорт обновлений — не переизобретаем composer (урок Winter/Botble, см. исследование ядер).
Экономика: почему это не только техника
Центр обновлений превращает разовую сборку сайта в подписочный продукт: клиент платит за «сайт живёт» — обновления ядра и модулей, бэкапы, мониторинг, отчёты. Флит-дашборд — операционный инструмент этой подписки. Без CMS с управляемыми обновлениями подписка на поддержку — ручной труд; с ней — процесс. Маркетплейс (перспектива) добавляет второй источник: продажа модулей и тем.
Порядок чтения раздела
Раздел большой — читать по роли задачи:
- Понять замысел — эта страница → решения → дорожная карта;
- Спроектировать/проверить архитектуру — каталог подсистем → спеки фазы 0 (таблица ниже) → обмен данными;
- Разрабатывать — ТЗ ядра + API → стандарт модуля → ТЗ нужного модуля (индекс) → порядок разработки → DX-петля агента;
- Портировать из доноров — реестр модулей с путями.
Страницы раздела
| Страница | Содержание | Статус |
|---|---|---|
| Глоссарий терминов | Модуль, блок, виджет, компонент, тема — что есть что, с Битрикс-аналогиями | ✅ |
| Каталог подсистем | Исчерпывающая карта всех подсистем CMS; принцип «универсальное ядро + модули» | ✅ |
| SEO — гибкость | Правила, редиректы, переменные, умный фильтр, региональность, подмена URL | ✅ |
| Модули услуг (artel) | Разбор эталонной SEO-модели услуг, разбивка на 5 модулей | ✅ |
| Интеграции и API | REST/GraphQL, вебхуки, платежи, доставка, крипта, CRM/1С, мобильные | ✅ |
| Модель e-commerce | Торговые предложения, мульти-склад, типы цен, НДС/чеки, цифровые товары/услуги, скидки и бонусы (rule-engine) | ✅ |
| Мультиязычность | Стратегии хранения переводов, резолв локали, fallback, hreflang, граница с мультигородом | ✅ |
| Клиентские кабинеты | ЛК B2C/B2B, мультивендор-маркетплейс, UGC-публикации | ✅ |
| Фронт-архитектура | Blade+острова / Filament / Inertia-кабинеты; посадка дизайна | ✅ |
| Расширяемость и ядро | BlockRegistry, события, фильтры, аналог /local, лестница расширяемости | ✅ |
| Обмен данными | Пять каналов обмена: ядро↔модули↔компоненты, владение данными, запреты | ✅ |
| Зависимости модулей | Граф зависимостей, иерархия, каскад включения, метапакеты | ✅ |
| Безопасность и права | RBAC, capability-слой модуля, фильтрация всех границ входа, ReDoS, модуль «статистика атак», маркетплейс, лицензирование | ✅ |
| DX для Claude Code | Читаемость для AI-агента, цикл «Claude Code пишет 100% кода», автоматизированная API-документация | ✅ |
| Исследование ядер CMS | Битрикс/WP/Drupal/TYPO3/Statamic/Twill/Winter/Botble — что заимствуем | ✅ |
| Выбор пути (build vs adopt) | Своё ядро / готовая CMS / гибрид / headless — сравнение и рекомендация | ✅ |
| Центр обновлений | Satis, процедура, откат, телеметрия, флит-дашборд, канареечные волны | ✅ |
| Полный каталог модулей | Все модули по категориям с зависимостями и метапакетами | ✅ |
| ТЗ модулей (индекс) | Отдельное ТЗ на каждый модуль: возможности, API, компоненты, настройки, события, донорский код | ✅ |
| ТЗ ядра + API ядра | Полная поверхность REST API ядра, контракты core-contracts, группы настроек, компоненты, события | ✅ |
| Стандарт модуля | Нормативные требования к построению модулей: инварианты, манифест, semver, канон именования, шаблон ТЗ v2, DoD | ✅ |
| Реестр модулей | Перечень модулей CMS с донор-проектами студии | ✅ |
| Решения брейншторма | Все 12 вопросов ТЗ с мотивировкой и последствиями | ✅ |
| Открытые вопросы (архив) | Исторический список вопросов (все закрыты) | ✅ |
| Дорожная карта | Фазы 0–5, риски | ✅ |
| Порядок разработки | Волны сборки фазы 1: зависимости, security-гейты, критерии готовности каждой волны | ✅ |
Фаза 0 — спеки контрактов (уровень «как именно»)
| Страница | Содержание | Статус |
|---|---|---|
| Канонический стек и фронтенд зон | Единый источник версий: Laravel 13 / PHP 8.4 / PostgreSQL 16 / Filament v5.6.6+, фронтенд трёх зон (публичный сайт / админка / кабинет), матрица совместимости | ✅ |
| Целевая платформа (Laravel 13 / PHP / Filament) | Обоснование Laravel 13 vs 12 на 2026, минимум PHP 8.4, пин Filament v5.6.6+, политика следования мажорам для парка | ✅ |
| Модель данных и жизненный цикл контента | Фундамент: таблицы ядра, граница код/схема/контент, установка/сидинг/экспорт/перенос сайта, владение данными между слоями | ✅ |
| Движок «Типы контента» (Content Types Engine) | Несущая подсистема ядра (не модуль): property-sets + связи + шаблоны + генерик-ресурс, no-code создание типа, маршрутизация, версионирование схемы; карта пресетов (blog/reviews/galleries/faq/banners — ревизия ТЗ предстоит) | ✅ |
| Движок полей (field engine) | Фундамент: один движок под схему блока (Q9) + типы контента (Q5) + конструктор форм (Q8); типы полей, валидация, версии, JSONB | ✅ |
| Контракт блока и BlockRegistry | Схема блока, версии _v + data-миграция, блоки-контейнеры, рендер, контрактные тесты | ✅ |
| Жизненный цикл и надёжность модулей | Версионирование, install/enable/disable/откат, рассогласование версий (старый блок ↔ новый модуль, модуль выключен), деградация вместо падения, вывод ошибок | ✅ |
| Контракт модуля | Структура пакета, манифест, регистрация через хуки ядра, Filament-плагин, capability-слой, запреты, контрактные тесты | ✅ |
| Три оси (события/очереди/настройки) | FilterBus + события с порядком, именованные очереди + контракт job, settings-store с каскадом и кешем | ✅ |
| Контракт темы | Каскад шаблонов, theme.json → токены, template-suggestions, React-острова, приём дизайна из claude.ai/design, демо-контент | ✅ |
| WidgetRegistry и области | Виджет как отдельная сущность (Q4), области, условия показа, отдельная инвалидация кеша областей | ✅ |
| API-слой и OpenAPI-контракт | REST/GraphQL, версионирование /api/vN, Sanctum, rate-limit, единый конверт, OpenAPI из кода, preview-API | ✅ |
| Производительность и кеширование | Бюджет запросов к БД, карта слоёв кеша, точная инвалидация тегами, stampede-защита, многоядерность (FPM/Horizon/batch), отладка кеша | ✅ |
| Открытые детали реализации | Сводка незакрытого «до кода» с рекомендованными дефолтами: id блока, ретеншн ревизий, preview, профиль установки — ничто не блокирует фазу 1 | ✅ |
Легенда: ✅ — зафиксировано (спеки фазы 0 написаны, см. дорожную карту; контракты правятся свободно до 1.0). Незакрытые уточнения — открытые детали.