Интеграция Directus с React ломается на кэше и правах доступа
Интеграция Directus с React почти никогда не ломается на этапе «получили данные и отрисовали». Первый отказ приходит позже: контент-редактор правит материал в админке, а фронтенд ещё сутки отдаёт старую версию из кэша. Причина — данные тянут напрямую из браузера и кэшируют на уровне CDN или сборщика, не привязывая инвалидацию к событию изменения записи. В итоге рассинхрон между админкой и сайтом живёт до следующего релиза, а не до следующей правки.
Вторая типовая поломка — права доступа. Когда запросы к Directus уходят из клиентского кода, в сборку попадает статический токен с широкими правами: он виден в исходниках страницы и открывает доступ к коллекциям, которые пользователю видеть не положено. Публичная роль в Directus должна отдавать только разрешённые поля и записи, а всё, что требует авторизации, идёт через серверный слой приложения, где токен не покидает инфраструктуру.
Третья проблема — дубли запросов. Компоненты React при гидратации и повторном монтировании дёргают один и тот же эндпоинт по несколько раз, а прямые вызовы из браузера не проходят через общий слой кэширования. При активном трафике это превращается в лишнюю нагрузку на Directus и в разное состояние у компонентов, которые ждут одни и те же данные.
Все три отказа лежат в одной плоскости: граница между клиентом и сервером проведена не там, где нужно. Разбираем, как это закрывается на уровне архитектуры, а не точечными заплатками.
Что даёт связка Directus и Next.js на практике
Скорость сборки и время до первого контента
Directus отдаёт контент через API, а Next.js забирает его на этапе сборки: страницы каталога, статей и лендингов собираются в статику и раздаются с границы сети. На практике это даёт время до первого контента в пределах десятых долей секунды вместо секунд при запросе к базе на каждый показ. Инкрементальная регенерация меняет картину: при правке материала пересобирается только затронутая страница, а не весь сайт, поэтому публикация занимает секунды, а не минуты.
Класс отказов, который уходит
Когда фронтенд ходит в базу напрямую, падение хранилища или тяжёлый запрос роняют весь сайт. С разделением слоёв отказ ограничен: готовая статика продолжает отдаваться из кеша, а сбой касается только обновления контента. Это переводит аварию из «сайт лежит» в «правки подождут» — принципиально другой класс инцидентов и другой объём работ для дежурной смены.
Производительность под нагрузкой
Статические страницы не нагружают приложение при пиковых заходах: рост трафика упирается в раздачу файлов, а не в запросы к базе. Модель данных и права доступа описываются в Directus один раз, а фронтенд получает уже готовые структуры — меньше кода на разбор ответов и меньше расхождений между админкой и сайтом. Обновление контента не требует выката новой версии приложения, поэтому маркетинг и редакция работают независимо от релизного цикла разработки.
Режимы работы: статика, инкрементальная пересборка, живой поток
Directus отдаёт контент через API, но способ доставки этого контента на фронт определяет, как быстро правка в редакции становится видна посетителю и сколько нагрузки ложится на сервер. На практике выбирают между тремя режимами — и часто комбинируют их на одной странице: каталог собирается статически, карточка товара обновляется инкрементально, а блок наличия подтягивается живым потоком.
| Режим | Когда подходит | Ограничения |
|---|---|---|
| Статика | Лендинги, документация, страницы с редкими правками | Полная пересборка при каждом изменении; контент устаревает между сборками |
| Инкрементальная пересборка | Каталоги, блоги, страницы с частым, но не мгновенным обновлением | Нужны вебхуки из Directus; задержка между правкой и публикацией; сложнее отлаживать кэш |
| Живой поток | Счётчики, статусы, чаты, остатки на складе | Требует постоянного соединения; не индексируется поисковиками; дороже по нагрузке |
Статика даёт минимальное время отклика и предсказуемую нагрузку, но каждая правка означает пересборку всего сайта. Инкрементальная пересборка снимает это ограничение: вебхук из Directus по событию публикации пересобирает только затронутые страницы, а остальные остаются в кэше. Живой поток закрывает сценарии, где данные меняются между пересборками, — но его нельзя делать основой для страниц, которые должны попадать в поиск.
Выбор режима — это компромисс между свежестью контента, нагрузкой и сложностью поддержки. Ошибка на этом этапе проявляется позже: либо редактор ждёт публикации часами, либо сервер не выдерживает пересборок при каждом сохранении. Разбираем, как подобрать режим под конкретный раздел сайта.
Как мы внедряем интеграцию: от аудита до передачи
Внедрение начинается с аудита, а не с кода. На этом этапе мы разбираем текущий стек, смотрим, где живут данные и как они попадают на фронтенд, какие разделы обновляются чаще остальных и кто из команды заказчика будет работать с контентом. Аудит даёт карту узких мест: дублирование данных между сервисами, ручная выгрузка, страницы, которые пересобираются целиком из-за одной правки. Без этой карты любая интеграция превращается в переписывание наугад.
Дальше проектируем схему данных — коллекции, связи, права доступа по ролям, поля с валидацией. Схема фиксируется до настройки, потому что менять её после подключения фронтенда дороже в разы.
- Аудит. Инвентаризация источников данных, точек интеграции и сценариев редактора. На выходе — перечень узких мест с приоритетами.
- Схема данных. Модель коллекций, типы связей, роли и политики доступа, правила валидации на стороне API.
- Настройка. Подключение слоя данных к приложению, режимы отдачи контента, кеширование и инвалидация по событиям изменения.
- Проверка. Тесты на выборку, права, поведение при недоступности источника; прогон сценариев редактора от черновика до публикации.
- Передача. Доступы, окружения, инструкции для контент-команды и разработчиков, разбор типовых операций.
- Сопровождение. Мониторинг ошибок интеграции, обновления схемы под новые разделы, реакция на изменения нагрузки.
Каждый шаг заканчивается артефактом, который можно проверить: карта интеграций, описание схемы, конфигурация окружений, отчёт по тестам. Это снимает главный риск — когда после запуска никто не понимает, почему страница показывает устаревшие данные. Передача включает не только документацию, но и совместный разбор: ваша команда должна уметь добавить поле или раздел без нас.
Опишите задачу — вернёмся с оценкой и планом по этим этапам.
Артефакты на выходе: конфигурации, схемы, регламенты
Интеграция Directus с фронтендом — это не «настроили и забыли»: конфигурация коллекций, роли, права на поля и вебхуки живут в репозитории и меняются вместе с продуктом. Поэтому на выходе вы получаете не набор разрозненных настроек в админке, а воспроизводимый комплект, по которому интеграцию можно развернуть заново, передать другой команде или расширить без археологии.
- Конфигурация схемы Directus — коллекции, поля, связи и типы в виде декларативных файлов в репозитории: схема поднимается на чистом окружении одной командой, а не собирается руками.
- Схемы данных и связей — диаграмма коллекций, направлений связей и каскадов удаления: видно, что произойдёт с записью при удалении родителя, до того как это случится в проде.
- Политики доступа — роли, права на коллекции и отдельные поля, правила фильтрации на уровне строк: редактор видит только свои материалы, публичный API отдаёт только опубликованное.
- Конфигурация сборки и кеша — правила инкрементальной регенерации страниц и то, какие изменения контента её запускают: правка в Directus обновляет нужные страницы, а не весь сайт.
- Настройки вебхуков и real-time — какие события публикации дёргают фронтенд, с какой задержкой контент доходит до посетителя и как обрабатывается недоставленное событие.
- Регламент работы с контентом — какие поля обязательны, что проверяется перед публикацией, как заводится новая сущность: редактор не ломает вёрстку, потому что правила зашиты в схему.
- Документация интеграции — карта эндпоинтов, переменные окружения, порядок развёртывания и откат на предыдущую версию схемы.
- Инструкция по эксплуатации — что делать при рассинхроне кеша, как добавить поле без простоя и куда смотреть при ошибке доступа.
Каждый артефакт версионируется вместе с кодом: изменение прав или схемы проходит ревью и откатывается так же, как обычный релиз. Опишите вашу задачу — вернёмся с оценкой и планом, какие из этих документов и конфигураций нужны именно вам.
Кейс: как мы убрали рассинхрон контента и ускорили сборку
Что было до изменений
Проект — медийный портал с каталогом и редакционным разделом: контент-менеджеры правили материалы в админке, фронтенд собирался по расписанию. Правки не попадали на прод до следующего цикла — в среднем 40 минут ожидания, а при срочных публикациях редакция дублировала материал вручную. Рассинхрон между тем, что видел редактор в интерфейсе, и тем, что отдавал сайт, доходил до 15% правок за неделю: часть изменений терялась при перезаписи, часть уезжала в прод в неполном виде.
Сборка занимала 11 минут и пересобирала весь сайт целиком из-за одной правки в карточке товара. Откаты случались 2-3 раза в неделю: контент-команда не могла предсказать, что именно попадёт в релиз, и просила вернуть предыдущее состояние.
Что изменили
Мы перевели фронтенд на инкрементальную пересборку: правка в коллекции помечается тегом, и пересобираются только страницы, которые её используют. Полная сборка осталась для изменений в шаблонах и навигации. Параллельно настроили поток обновлений от админки к фронтенду — редактор видит результат сразу после сохранения, без ожидания цикла.
Добавили правило отката: каждый релиз привязан к снимку контента, вернуться к предыдущему состоянию можно одной операцией. Логи сборки и публикаций сведены в одну панель — видно, какая правка вызвала пересборку и сколько она заняла.
Что стало
| Метрика | До | После |
|---|---|---|
| Время сборки после правки | 11 мин | 40-60 сек |
| Доля рассинхрона правок | до 15% | менее 1% |
| Откаты в неделю | 2-3 | единичные, по плановым релизам |
| Задержка публикации | до 40 мин | секунды |
Сборка ускорилась за счёт отказа от полного пересбора: теперь пересобирается только затронутый участок. Рассинхрон ушёл, потому что источник правды один — админка, а фронтенд получает изменения потоком, а не пакетом по расписанию. Отказы перестали быть аварийными: снимок контента позволяет вернуться к рабочему состоянию без ручной сверки.
Стек здесь вторичен — важна схема: единый источник контента, точечная пересборка и предсказуемый откат. Такой подход переносится на каталоги, лендинги и личные кабинеты, где контент меняется чаще, чем код.
Чем отличается инкрементальная пересборка от живого потока?
Инкрементальная пересборка и живой поток решают одну задачу — доставить свежий контент в готовую страницу — но по-разному устроены и по-разному ломаются. Инкрементальная пересборка работает на стороне сервера: при изменении материала помечается только та страница, которая от него зависит, и она перестраивается в фоне, пока посетители получают предыдущую версию из кеша. Живой поток держит соединение между браузером и источником данных открытым и подменяет блок прямо в интерфейсе, без перезагрузки и без участия серверного кеша.
Отсюда главное отличие — в моменте обновления. Инкрементальная пересборка даёт задержку от нескольких секунд до минуты: контент меняется редко, зато страница отдаётся статикой и держит нагрузку. Живой поток обновляет данные мгновенно, но каждое открытое соединение — это ресурс, который надо сопровождать, а при обрыве связи интерфейс должен корректно показать устаревшие данные, а не пустоту.
Выбор режима определяется природой контента, а не удобством разработчика. Каталог, блог, лендинг, документация — это инкрементальная пересборка: материал меняется по расписанию, важна скорость отдачи и устойчивость к пикам. Панели мониторинга, чаты, статусы заказов, совместное редактирование — живой поток: здесь устаревшее значение на экране дороже, чем стоимость соединения.
На практике режимы почти всегда сосуществуют на одном сайте. Статическая часть собирается инкрементально, а отдельные блоки подписываются на живой поток через клиентский компонент — так страница остаётся быстрой, а критичные данные не отстают. Мы разводим эти зоны на этапе проектирования схемы данных, чтобы не перестраивать всю страницу ради одного счётчика и не тянуть живое соединение туда, где хватит пересборки.
Частые технические сомнения при интеграции Directus
Перед стартом проекта почти всегда всплывают одни и те же вопросы: не станет ли внешняя система точкой отказа, выдержит ли она пиковую нагрузку, реально ли уйти с неё без переписывания фронтенда. Ниже — разбор по каждому, с инженерной стороны.
Безопасность: не получит ли внешний сервис доступ к нашим данным?
Доступ разграничивается на уровне ролей и коллекций: публичной роли выдаются только те поля, которые реально нужны фронтенду, остальное закрыто. Токены для серверных запросов живут в переменных окружения и не попадают в клиентский бандл — браузер их не видит. Пишем на данные правила доступа, а не «доверяем всему, что пришло с фронта».
Нагрузка: выдержит ли система пики и рост контента?
Статику и редко меняющиеся страницы отдаём из кэша, к источнику идём только за свежими данными — при росте трафика это снимает основную часть запросов. Тяжёлые выборки закрываем индексами и ограничением полей в ответе. Если контента станет в разы больше, узкое место видно заранее по метрикам, а не по жалобам пользователей.
Миграция: что будет с текущим сайтом и данными?
Переносим данные пакетно, с проверкой целостности на каждом шаге, и держим старую систему рабочей до подтверждённого переключения. Схему описываем декларативно — её можно поднять в новой среде одной командой. Откат возможен на любом этапе, пока не отключили прежний контур.
Поддержка: не останемся ли мы одни с чужой системой?
Отдаём конфигурации, схему данных, описание ролей и доступов, инструкции по типовым операциям. Наши инженеры остаются на связи по сопровождению: обновления, разбор инцидентов, доработка моделей контента. Система остаётся управляемой, даже если задачи ведёт другая команда.
Опишите вашу задачу — вернёмся с оценкой и планом по интеграции.
Обсудим вашу задачу и вернёмся с оценкой
Чтобы оценка была предметной, а не «средней по рынку», нам нужен контекст по задаче: как устроена текущая система, какие данные она хранит и какие сценарии критичны. Ниже — что уточняем на первом разговоре и какие материалы помогают посчитать объём работ точно.
- Цель и границы. Что должно измениться: новый раздел, интеграция Directus с фронтендом, ускорение выдачи или переезд на другую схему данных. Фиксируем, что входит в первый этап, а что осознанно откладываем.
- Текущий стек и состояние. Какие фреймворки и версии в проде, где хостятся сервисы, как устроена сборка и выкладка. Если проект уже живёт — нужен доступ к репозиторию или краткое описание архитектуры.
- Модель данных и контент. Какие сущности и связи есть сейчас, кто и как их редактирует, какие поля обязательны. Это определяет схему коллекций в Directus и объём миграции.
- Сценарии и нагрузка. Какие страницы кэшируются, где нужен real-time, сколько пользователей и запросов ожидается в пике. От этого зависит выбор между статической генерацией и обновлением по запросу.
- Ограничения и доступы. Требования к ролям и правам, работа с внешними сервисами, правила хранения персональных данных, окружения для тестов и приёмки.
- Сроки и приоритеты. Что нужно к конкретной дате и что можно выпускать частями. Так мы предложим план, который не блокирует остальные направления.
В ответ вы получите оценку по этапам с трудозатратами, черновик плана работ с порядком выпуска и список рисков, которые стоит закрыть до старта. Если данных пока мало — опишите задачу словами, остальное уточним в переписке или на созвоне.







