Skip to content

Универсальная 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-пакеты + SatisComposer сам решает версии/конфликты; 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)
Права/RBACFilament 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 с управляемыми обновлениями подписка на поддержку — ручной труд; с ней — процесс. Маркетплейс (перспектива) добавляет второй источник: продажа модулей и тем.

Порядок чтения раздела

Раздел большой — читать по роли задачи:

  1. Понять замысел — эта страница → решениядорожная карта;
  2. Спроектировать/проверить архитектурукаталог подсистем → спеки фазы 0 (таблица ниже) → обмен данными;
  3. РазрабатыватьТЗ ядра + APIстандарт модуля → ТЗ нужного модуля (индекс) → порядок разработкиDX-петля агента;
  4. Портировать из доноровреестр модулей с путями.

Страницы раздела

СтраницаСодержаниеСтатус
Глоссарий терминовМодуль, блок, виджет, компонент, тема — что есть что, с Битрикс-аналогиями
Каталог подсистемИсчерпывающая карта всех подсистем CMS; принцип «универсальное ядро + модули»
SEO — гибкостьПравила, редиректы, переменные, умный фильтр, региональность, подмена URL
Модули услуг (artel)Разбор эталонной SEO-модели услуг, разбивка на 5 модулей
Интеграции и APIREST/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). Незакрытые уточнения — открытые детали.

Внутренняя база знаний студии