Контент-менеджер заполняет материалы в админке, фронтенд забирает их по 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», затем добавляете поля и выбираете их тип. Модель готова сразу после сохранения.
Типы контента
| Тип | Что это | Пример |
|---|---|---|
| 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
Популярные сторонние
| Плагин | Зачем | Установка |
|---|---|---|
| SEO | Meta-теги, Open Graph | npm i @strapi/plugin-seo |
| GraphQL | GraphQL API поверх REST | npm i @strapi/plugin-graphql |
| Slugify | Автогенерация slug | npm i strapi-plugin-slugify |
| Sitemap | Автогенерация sitemap.xml | npm 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-текстов — полезно для массовой обработки изображений.
Где хранить файлы — три варианта:
- 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 limitingLifecycle 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 на своём сервере — вот на что ориентироваться:
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| CPU | 1 ядро | 2+ ядра |
| RAM | 2 ГБ | 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.js | REST/GraphQL + @strapi/client | SSG, SSR, ISR — все режимы |
| Astro | REST/GraphQL | Отлично для статических сайтов |
| Nuxt 3 | REST/GraphQL + @strapi/client | Nuxt Content Module совместим |
| Mobile | REST 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 записей, но лучше указывать явно.
Ссылки
Ссылки
- Сайт: strapi.io
- Документация: docs.strapi.io
- Репозиторий: github.com/strapi/strapi
- Документация: market.strapi.io — маркетплейс плагинов
- Сайт: cloud.strapi.io