Контент-менеджер заполняет материалы в админке, фронтенд забирает их по API, а между ними стоит сервер, который вы контролируете от первого байта до последнего. Это не облако, где ваши данные живут на чужих дисках, а софт, который вы ставите к себе.

72 000 звёзд на GitHub, лицензия MIT для Community Edition, автоматическая генерация REST и GraphQL для каждой модели данных. Strapi — один из главных инструментов в категории headless CMS с открытым кодом, и его стоит разобрать подробно.

Потому что за словом «headless» скрывается архитектурный сдвиг, который меняет не только техническую часть, но и то, как команда работает с контентом.

Что это и как начать использовать

Strapi — это готовый бэкенд для управления контентом, написанный на Node.js и TypeScript. Представьте конструктор таблиц: вы описываете структуру данных — статьи, товары, авторы — через визуальный интерфейс, а система сама строит для каждой таблицы API, админку и права доступа. Дополнительно ничего писать не нужно.

Аналогия из инфраструктуры: если классическая CMS вроде WordPress — это монолит, где и контент, и шаблоны, и разметка живут в одном репозитории, то Strapi работает как отдельный микросервис. Фронтенд — отдельный проект, который обращается к CMS по API, как к базе данных. CMS не знает и не хочет знать, как вы рисуете страницы.

Три шага до работающего прототипа:

  • Установить Node.js (версия Active LTS — v20, v22 или v24) и выполнить npx create-strapi-app@latest my-project
  • Создать первого администратора на http://localhost:1337/admin
  • В Content-Type Builder нажать «Create new collection type», добавить поля — и получить готовый API

Совет: Если хотите просто пощупать интерфейс — SQLite подойдёт для локальной разработки. Для продакшена понадобится PostgreSQL или MySQL.

Зачем разделять контент и фронтенд

Headless CMS — архитектурный подход, при котором хранение контента отделено от его отображения. CMS управляет данными и отдаёт их через API. Как именно эти данные будут показаны — на сайте, в мобильном приложении, в умных часах — решаете вы, а не CMS.

Классическая CMS связывает контент с шаблонами намертво. Хотите перенести статьи с WordPress-сайта в мобильное приложение — пишите парсер, пробиваетесь через PHP-хуки, экспортируете базу. Headless-подход разрывает эту связь: контент живёт в одном месте, потребители подключаются по API.

Strapi в этой категории — не единственный игрок, но один из немногих, кто работает как self-hosted софт. Вы ставите его на свой сервер, данные лежат в вашей базе, код открыт. Для одних это преимущество — полный контроль, соблюдение GDPR, нет привязки к облаку. Для других — дополнительная ответственность: нужен сервер, нужны обновления, нужен человек, который это поддерживает.

Как устроена архитектура

Strapi состоит из двух слоёв. Backend — Node.js-приложение, которое обрабатывает HTTP-запросы, управляет данными в базе и генерирует API. Admin Panel — отдельное React-приложение с графическим интерфейсом для контент-менеджеров.

Поток данных прямой: вы описываете структуру — Content Types — мышкой или кодом. Для каждого типа Strapi строит REST и GraphQL-эндпоинты автоматически. Редакторы вносят данные через админку, фронтенд тянет их по API. Ручных роутов писать не приходится — каркас генерируется сам.

Под капотом — Express (или Koa в режиме разработки), Knex как query builder, документация генерируется автоматически. База данных — PostgreSQL, MySQL или SQLite. Версия 5.x написана на TypeScript, и типы распространяются на пользовательский код.

Content-Type Builder: конструктор моделей без кода

Ключевое удобство — конструктор моделей в админке, без единой строки кода. Завести схему для блога, каталога товаров или базы знаний можно мышкой: кнопка «Create new collection type», затем добавляете поля и выбираете их тип. Модель готова сразу после сохранения.

Интерфейс Strapi для управления контентом и моделями

Типы контента

ТипЧто этоПример
Collection TypeКоллекция записей одного типаСтатьи, Продукты, Авторы
Single TypeОдна запись (синглтон)Главная страница, Настройки сайта
ComponentПереиспользуемый блок полейSEO-метаданные, Блок «Герой»
Dynamic ZoneЗона, куда можно добавлять разные компонентыКонструктор страниц из блоков

Типы полей

Strapi поддерживает все базовые типы: Text, Rich Text, Number, Date, Boolean, Media (изображения, видео), Relation (связи между моделями), Enumeration, JSON, UID (slug), Email, Password. Дополнительно — кастомные поля через плагины: Color Picker, Google Maps и другие.

Совет: Dynamic Zones превращают страницу в набор Lego-блоков. Заранее задайте компоненты — «Герой», «Текст», «Галерея», «CTA» — а редактор компонует их в любом порядке. Принцип как в блочных редакторах вроде Notion, но палитру блоков определяете вы, а не платформа.

API из коробки: REST и GraphQL

Strapi автоматически генерирует API для каждого Content Type. Создали модель «Статья» — получили готовый набор endpoints. Писать контроллеры не нужно.

REST

Базовые запросы к API выглядят так:

# Получить все статьи
GET /api/articles

# Получить одну статью
GET /api/articles/1

# Фильтрация
GET /api/articles?filters[title][$contains]=AI

# Сортировка + пагинация
GET /api/articles?sort=publishedAt:desc&pagination[page]=1&pagination[pageSize]=10

# Подгрузка связей (по умолчанию Strapi не грузит связанные данные)
GET /api/articles?populate=author,category

GraphQL

GraphQL доступен через плагин @strapi/plugin-graphql. После установки вы получаете типизированный запрос, который вытягивает только нужные поля и связи за один вызов:

query {
  articles(sort: "publishedAt:desc", pagination: { limit: 10 }) {
    title
    slug
    content
    author {
      name
      avatar { url }
    }
  }
}

Важно: REST покрывает 90% сценариев — он понятнее и дружелюбнее к CDN-кэшированию. GraphQL имеет смысл, когда фронтенду нужны данные из цепочки связанных сущностей в одном запросе без избыточности. Это выбор под задачу, не под идеологию.

Экосистема плагинов

У Strapi развитая плагинная система. Плагины ставятся через npm, каталог доступен на market.strapi.io. Можно создавать собственные через Plugin SDK.

Встроенные плагины

  • Content Manager — основной интерфейс управления контентом
  • Content-Type Builder — визуальный конструктор моделей
  • Media Library — управление файлами, изображениями, видео
  • i18n — мультиязычность контента
  • Users & Permissions — управление доступом к API
  • Email — отправка email через Nodemailer

Популярные сторонние

ПлагинЗачемУстановка
SEOMeta-теги, Open Graphnpm i @strapi/plugin-seo
GraphQLGraphQL API поверх RESTnpm i @strapi/plugin-graphql
SlugifyАвтогенерация slugnpm i strapi-plugin-slugify
SitemapАвтогенерация sitemap.xmlnpm i strapi-plugin-sitemap
MeilisearchПолнотекстовый поискnpm i strapi-plugin-meilisearch

Мультиязычность (i18n)

Мультиязычность встроена в ядро. Маршрут настройки: Settings → Internationalization → добавляете локали (ru, en, de и т. д.). Затем в Content-Type Builder активируете i18n на нужном типе. Локализацию можно включить выборочно — не для всех полей. В Content Manager переключение между языками — вкладкой.

Запрос контента на конкретном языке:

# Получить контент на конкретном языке
GET /api/articles?locale=ru

Медиа-библиотека

Файлы живут в отдельной библиотеке: загрузка, разбиение по папкам, миниатюры, поиск. С релиза 5.34 добавилась AI-генерация alt-текстов — полезно для массовой обработки изображений.

Интерфейс Strapi Media Library для управления файлами

Где хранить файлы — три варианта:

  • Local — на сервере, по умолчанию. При рестарте контейнера файлы могут пропасть
  • AWS S3 — через @strapi/provider-upload-aws-s3. Рекомендуется для продакшена
  • Cloudinary — через @strapi/provider-upload-cloudinary

Внимание: Локальное хранилище не подходит для продакшена. При рестарте Docker-контейнера файлы теряются. Используйте S3 или Cloudinary — это первое, что нужно настроить после установки.

Роли и права доступа

Две независимые системы управления доступом:

  • Админ-панель: Super Admin, Editor, Author + кастомные роли с гранулярным доступом на уровне Content Type и действий (create, read, update, delete, publish)
  • API: Authenticated и Public плюс кастомные роли. Вы указываете, какие эндпоинты открыты для авторизованных вызовов, а какие доступны без авторизации

Кастомизация бэкенда

Под капотом — обычное Node.js-приложение, и его можно расширять программно. Четыре уровня вмешательства:

  • Controllers — переопределить логику обработки запросов
  • Services — добавить бизнес-логику
  • Middlewares — логирование, кэширование, rate limiting
  • Lifecycle Hooks — хуки на создание, обновление, удаление записей: автогенерация slug, уведомления, инвалидация кэша

Пример Lifecycle Hook — автогенерация slug при создании статьи:

// Пример: автогенерация slug при создании статьи
export default {
  async beforeCreate(event) {
    const { data } = event.params;
    if (data.title && !data.slug) {
      data.slug = slugify(data.title);
    }
  },
};

Быстрый старт

Создание проекта и запуск в разработке — две команды:

# Создать проект
npx create-strapi-app@latest my-project

# Запустить
cd my-project && npm run develop

После запуска откройте http://localhost:1337/admin, создайте первого администратора — и можно работать. SQLite подхватится автоматически, отдельная настройка базы не нужна.

Деплой

Пять вариантов — от облака до собственного VPS:

ПлатформаСложностьЦенаОсобенности
Strapi CloudНизкаяот $35/месДеплой из Git, managed-инфраструктура
RailwayНизкаяПо потреблениюOne-click deploy, PostgreSQL в комплекте
RenderНизкаяот $7/месAuto-deploy из Git
Docker (VPS)Средняяот $5/месПолный контроль, нужны DevOps-навыки
AWS / GCPВысокаяВарьируетсяМаксимальная гибкость

Требования к серверу (VPS)

Если разворачиваете Strapi на своём сервере — вот на что ориентироваться:

ПараметрМинимумРекомендуется
CPU1 ядро2+ ядра
RAM2 ГБ4 ГБ+
Диск8 ГБ32 ГБ+ (SSD/NVMe)

Софт

  • Node.js — только Active LTS или Maintenance LTS (v20, v22, v24). Нечётные версии (v23, v25) не поддерживаются
  • Продакшен-база — PostgreSQL или MySQL. SQLite — исключительно девелопмент
  • build-essentials — системный пакет сборочных инструментов (Debian/Ubuntu)
  • ОС — Ubuntu 18.04+ LTS, Debian 9.x+, CentOS/RHEL 8+ или Docker

Совет: 2 ГБ RAM хватает, чтобы сервер работал, но админка — самая тяжёлая часть — начинает тормозить. Если контент правится локально, а на проде Strapi отдаёт только API, двух гигабайт достаточно. Для одновременной работы редакторов в админке — ориентируйтесь на 4 ГБ.

Производительность: что стоит настроить

Шесть вещей, которые напрямую влияют на скорость ответа API:

  • Reverse Proxy (Nginx) — кэширование, SSL, gzip. Обязательно в продакшене
  • CDN (Cloudflare) — если аудитория глобальная
  • Pagination — всегда, не загружайте всё разом
  • Selective populate — загружайте только нужные связи. По умолчанию Strapi не грузит связанные данные, и это правильно: лишние join-ы убивают производительность
  • Redis — кэширование API-ответов при высокой нагрузке
  • Database indexes — для больших таблиц и сложных фильтров

Тарифы

ВариантЦенаЧто включено
Community (self-hosted)Бесплатно навсегдаПолный функционал, REST + GraphQL, плагины, i18n
Strapi Cloud — Starterот $35/мес100K API запросов, 50 ГБ хранилище, CDN, кастомные домены
Strapi Cloud — Proот $90/мес1M запросов, 250 ГБ хранилище, мульти-среды, бэкапы, CRON
Strapi Cloud — Businessот $450/мес10M запросов, 1 ТБ хранилище, SLA 99.9%, приоритетная поддержка
EnterpriseПо запросуSSO, Audit Logs, Review Workflows, SLA

Важно: Strapi Cloud тарифицируется по проектам, Enterprise — по пользователям. При планировании бюджета считайте TCO на 12-24 месяца, включая инфраструктуру и DevOps-часы. Self-hosted не стоит денег по лицензии, но инфраструктура, патчи и поддержка съедают время. Цены Cloud-планов указаны на момент публикации — сверяйтесь с актуальным прайсом на сайте вендора.

Интеграция с фронтенд-фреймворками

Strapi не привязан к конкретному фронтенду. Любой HTTP-клиент работает, но для популярных фреймворков есть готовые связки:

ФреймворкИнтеграцияПримечание
Next.jsREST/GraphQL + @strapi/clientSSG, SSR, ISR — все режимы
AstroREST/GraphQLОтлично для статических сайтов
Nuxt 3REST/GraphQL + @strapi/clientNuxt Content Module совместим
MobileREST APIЛюбой HTTP-клиент

Strapi AI

В пятой версии добавили AI-инструменты в ядро:

  • Генерация текстов для полей прямо в редакторе админки
  • AI-метаданные для медиа — автоматическая генерация alt-текстов (с версии 5.34)
  • Content Modeling с AI — помощь в проектировании структуры контента

Когда Strapi — правильный выбор

  • Требуется полное владение данными и серверной инфраструктурой
  • В штате есть Node.js-разработчик, готовый обслуживать self-hosted инстанс
  • Бюджет не позволяет платить за облачную CMS — Community Edition бесплатна
  • Бэкенд-логика нестандартная: нужны кастомные controllers, services, lifecycle hooks
  • Регуляторные требования или GDPR обязывают хранить данные на собственном сервере

Когда лучше посмотреть на альтернативы

Три сценария, где Strapi может быть не лучшим выбором:

  • Не хотите заниматься серверами — посмотрите на Sanity, облачную CMS с щедрым бесплатным планом. Никакого DevOps, обновлений и бэкапов — всё на стороне вендора
  • Уже есть база данных и нужен API поверх неё — Directus оборачивает любую SQL-базу в REST/GraphQL API без переписывания схемы
  • Нужен enterprise с мультиязычностью и governance из коробки — Contentful заточен под крупные команды и сложные workflow утверждения контента

Strapi — это не про экономию на CMS, а про контроль над контуром данных. Если вам нужен API-бэкенд для контента, который вы полностью контролируете, и в команде есть кто-то, кто готов поддерживать Node.js-приложение — это рабочий инструмент без скрытых платежей и vendor lock-in.

Ограничения

Ограничения

Self-hosted требует DevOps — Community Edition бесплатна по лицензии, но вы сами отвечаете за сервер, обновления безопасности, бэкапы и мониторинг.

Без выделенного человека или навыков DevOps инфраструктура быстро превращается в технический долг. Минимальный набор — Nginx, SSL-сертификаты, регулярные бэкапы базы и мониторинг доступности.

Локальное хранилище медиа не для продакшена — Файлы, загруженные в локальное хранилище, теряются при рестарте Docker-контейнера.

Для продакшена обязательно подключать S3 или Cloudinary через соответствующие провайдеры — @strapi/provider-upload-aws-s3 или @strapi/provider-upload-cloudinary. Это первое, что настраивается после установки.

Админ-панель требовательна к RAM — На сервере с 2 ГБ RAM Strapi-сервер работает, но админ-панель — React-приложение — подтормаживает при одновременной работе нескольких контент-менеджеров.

Комфортный порог — 4 ГБ RAM. Если Strapi используется только как API и контент редактируется локально, 2 ГБ достаточно.

Node.js только LTS-версии — Strapi официально поддерживает только Active LTS и Maintenance LTS версии Node.js — v20, v22, v24.

Нечётные версии (v23, v25), известные как current, не поддерживаются. Использование current-версии может привести к нестабильной работе и ошибкам, которые команда Strapi не будет фиксить.

Антипаттерны

Антипаттерны

Грузить все связанные данные по умолчанию — Strapi не грузит связанные сущности автоматически — и это сделано намеренно.

Если включить populate=* на всех запросах, каждый API-вызов превращается в мульти-join, который вытягивает дерево связанных записей. На больших объёмах это убивает производительность базы и сети. Решение — selective populate: указывайте конкретные связи, которые нужны фронтенду, например populate=author,category.

Использовать SQLite в продакшене — SQLite подходит для локальной разработки и прототипирования.

В продакшене с параллельными записями и транзакциями SQLite блокирует таблицу на запись — при нескольких контент-менеджерах и автоматических запросах это приводит к deadlock-ам. Переходите на PostgreSQL или MySQL до запуска.

Игнорировать пагинацию — Запрос GET /api/articles без параметров пагинации вернёт все записи коллекции.

На таблице с 50 000 статей это один запрос на десятки мегабайт JSON. Всегда указывайте pagination[pageSize] и pagination[page], даже если уверены, что записей мало — они появятся.

Не настраивать права на API-эндпоинты — По умолчанию новые Content Types не имеют публичных прав.

Но если включить Public-роль для всех действий на всех эндпоинтах — любой может читать, создавать и удалять контент. Настройте granular-доступ: Public — только чтение нужных эндпоинтов, Authenticated — запись и обновление.

Чеклист

Чеклист

Проверьте версию Node.js — Перед установкой убедитесь, что установлена Active LTS или Maintenance LTS версия — v20, v22 или v24.

Нечётные current-версии не поддерживаются и могут вызвать ошибки сборки.

Выберите базу данных до запуска — Решите, какая база будет в продакшене — PostgreSQL или MySQL.

SQLite оставьте для локальной разработки. Миграция с SQLite на PostgreSQL возможна, но проще сразу настроить правильно.

Настройте S3 или Cloudinary для медиа — До первой загрузки файлов подключите внешний провайдер хранилища — @strapi/provider-upload-aws-s3 или @strapi/provider-upload-cloudinary.

Локальное хранилище не переживёт рестарт контейнера.

Настройте Nginx как reverse proxy — Nginx перед Strapi-сервером — SSL-терминация, gzip-сжатие, кэширование статики.

Без reverse proxy Strapi работает, но в продакшене это обязательный слой для безопасности и скорости.

Ограничьте права на API-эндпоинты — Проверьте, какие эндпоинты доступны публично, какие — авторизованным пользователям.

Минимальный принцип: Public-роль — только чтение, запись — только для Authenticated с нужными ролями.

Включите пагинацию на всех коллекциях — Убедитесь, что фронтенд передаёт параметры pagination[page] и pagination[pageSize] на каждом запросе коллекции.

Дефолтный лимит — 25 записей, но лучше указывать явно.

Ссылки

Ссылки