Strapi
Strapi - самый популярный self-hosted headless CMS: описываете типы контента в визуальном конструкторе, а он сам поднимает REST и GraphQL API, админку с ролями и медиатеку. Развернули v5.52.2 на RU-VPS с PostgreSQL, поставили за TLS и замерили ресурсы.
Вердикт
- командам, которым нужен свой контент-бэкенд под сайт, мобильное приложение или несколько витрин сразу
- разработчикам, кому важен API-first: REST и GraphQL из коробки, свой фронтенд на чем угодно
- тем, кто уходит от облачных CMS с оплатой за записи и seat и хочет данные у себя
- если нужен готовый сайт «из коробки» с темами - Strapi не имеет фронтенда, только API
- под простой блог одному человеку - избыточно, проще классическая CMS
- если нет ни одного разработчика в команде
Что это и какую задачу решает
Strapi - это headless CMS: система управления контентом без своего фронтенда. Вы описываете структуру данных (статьи, товары, страницы, авторов), а Strapi генерирует под нее админку для редакторов и API для разработчиков. Фронтенд - сайт, мобильное приложение, витрина - вы делаете отдельно на любом стеке и берете контент через API. Это ключевое отличие от классической CMS вроде WordPress, где бэкенд и фронт слиты воедино.
Главный инструмент - визуальный Content-Type Builder: добавляете поля мышкой, и Strapi сразу поднимает под них REST-эндпоинты, GraphQL-схему, ролевой доступ (RBAC) и медиатеку для файлов. Продукт с открытым кодом (73k звезд на GitHub, ядро под MIT), поэтому данные и API живут на вашем сервере - без лимитов на количество записей и без абонплаты за каждого редактора, как у облачных Contentful или Sanity.
Чем отличается от облачных аналогов
Сравнение с Contentful - зрелым облачным headless CMS - по тому, что влияет на выбор.
| Параметр | Strapi (self-hosted) | Contentful (SaaS) |
|---|---|---|
| Модель цены | бесплатно, платите только за сервер | подписка, рост по числу записей и мест |
| Где данные | на вашем сервере, свой Postgres | в облаке вендора |
| Лимиты на записи/API | нет, ограничены только железом | по тарифу |
| Vendor lock-in | нет, полный доступ к коду и БД | данные и модель у вендора |
| API | REST + GraphQL (плагин) | REST + GraphQL |
| Кастомизация | свои плагины, хуки, полный код | в рамках платформы |
Тех-стек и архитектура
Strapi v5 написан на Node.js и TypeScript, сервер - на Koa. Админка - SPA на React, отдается тем же процессом на порту 1337. База данных подключается через DATABASE_CLIENT: по умолчанию SQLite, но для продакшена берут PostgreSQL или MySQL. В нашей карте продукт посажен на PostgreSQL 16 - на первом старте Strapi сам создает схему (у нас поднялась 41 таблица).
В карте маркетплейса все разложено на три контейнера: strapi (приложение, слушает только localhost), strapi-db (PostgreSQL 16, данные в отдельном томе) и caddy (реверс-прокси с автоматическим TLS от Let's Encrypt). Наружу открыт только 443 - админка и API доступны по HTTPS, сам Strapi на публичный порт не смотрит.
Минимальная конфигурация
Реальные требования против официального минимума.
| Официальный минимум RAM | 2 GB |
| Реально в простое (Strapi) | ~270 MiB |
| Реально с Postgres | около 0.7-1 GB суммарно |
| Что ест ресурс | разовая сборка админки (node_modules ~725 МБ) |
| Рекомендуем тариф | CPU2-RAM4-DISK50 |
| Тариф Fatmetal | CPU2-RAM4-DISK50 - 500 ₽/мес |
Важно: рантайм Strapi легкий, но сборка админки тяжелая - она упирается в диск и память. Поэтому в карте маркетплейса образ уже собран заранее и на сервере клиента только загружается (docker load), ничего не компилируется. Для ручной установки на CPU2-RAM4-DISK50 сборки хватает, на 1 GB - уже впритык.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Strapi есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий Strapi с PostgreSQL на своем домене, валидный TLS и файл с доступами.
Рекомендуемая конфигурация:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe от 450 ₽/мес
Развертывание на Fatmetal
Базовый путь для ручной установки - Cloud Server + Ubuntu 24.04 + Docker.
Создать VM
Тариф CPU2-RAM4-DISK50, Ubuntu 24.04, приложение Docker. Открыть порты 80 и 443.
Создать проект Strapi
Node.js должен быть версии 22.13 и выше (на Node 20 будет предупреждение EBADENGINE).
npx create-strapi-app@latest myapp --quickstartПереключить на PostgreSQL
Задать в
.envподключение к своей базе, собрать и запустить в продакшене:DATABASE_CLIENT=postgres DATABASE_HOST=localhost DATABASE_NAME=strapi DATABASE_USERNAME=strapi DATABASE_PASSWORD=пароль npm run build npm run startПроверка:
curl localhost:1337/adminдолжен вернуть 200.Поставить за TLS
Реверс-прокси Caddy на
127.0.0.1:1337с автоматическим Let's Encrypt - админка и API открываются по HTTPS.Зарегистрировать администратора
Открыть
/admin- первый экран это форма создания первого администратора.
Что измерили после запуска
Цифры со свежей установки, без нагрузки. Только реальные замеры.
| Сборка админки (strapi build) | ~28.6 c |
| Первый старт (создание схемы в Postgres) | ~30-90 c |
| Таблиц создано в БД | 41 |
| RAM в простое (процессы Strapi) | ~270 MiB |
| Отклик /admin локально | ~16 мс |
| Отклик /admin по HTTPS (magic-DNS) | ~0.57 c |
| Образ приложения на диске | 2.18 ГБ (архив 483 МБ) |
Главное: сам Strapi в работе легкий - около 270 MiB. Вся тяжесть в разовой сборке админки и в размере node_modules (~725 МБ), поэтому образ большой. В карте маркетплейса это решено пре-сборкой: клиент получает готовый образ, а не компилирует у себя.
Проверено на версии v5.52.2, сентябрь 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли, на которые наткнулись при запуске.
Content-Type Builder в продакшене только на чтение
При NODE_ENV=production Strapi запрещает менять структуру данных через админку - конструктор типов открыт лишь на просмотр. Типы контента создают в dev-режиме (npm run develop), а на прод выкатывают вместе с кодом. Это защита от случайных правок схемы на живой базе, а не баг.
Русский интерфейс не включен по умолчанию
Свежая админка идет только с английским. Русская локаль в комплекте - включается в Settings → Administration panel, там же можно задать язык по умолчанию для всех редакторов.
Причина. Strapi v5.52 требует Node.js 22.13 и выше. На Node 20 проект соберется, но с предупреждением, и часть функций может вести себя нестабильно.
Решение. Ставить Node.js 22 LTS. В карте маркетплейса образ уже собран на Node 22, поэтому вопрос не встает.
Docker Hub из РФ. При установке с нуля образ postgres:16 с Docker Hub часто отваливается по таймауту. В нашем установщике на этот случай зашит retry-pull - тянет с повторами, пока не получится.
Безопасность и обновления
У Strapi своя аутентификация: первый экран /admin - регистрация администратора, дальше вход по email и паролю. Секреты приложения (APP_KEYS, JWT_SECRET, ENCRYPTION_KEY) генерируются при установке, а не вшиты в образ. Токены для внешних приложений выдаются в админке в Settings → API Tokens с точной областью доступа.
Обновление проекта до свежей версии:
npx @strapi/upgrade latest
Бэкап базы и загрузок:
docker exec strapi-db pg_dump -U strapi strapi > backup.sql
Связь с другими стеками
- Обратный прокси - Caddy или Traefik для TLS перед админкой и API.
- База данных - PostgreSQL для продакшена вместо файлового SQLite.
- Хранилище файлов - S3-совместимое хранилище для медиатеки через провайдер-плагин.
- Бэкапы - pg_dump по расписанию плюс выгрузка тома с загрузками.
Когда это НЕ ваш выбор
Нужен готовый сайт, а не API
Strapi не отдает готовые страницы - только контент через API. Если нужен сайт с темами и визуальным редактором из коробки, смотрите в сторону классической CMS.
Нет разработчика
Чтобы забрать контент из API и собрать фронтенд, нужен разработчик. Для проекта без технической команды headless-подход избыточен.
Частые вопросы
Чем headless CMS отличается от WordPress?
Strapi дает только контент-бэкенд и API, а фронтенд вы делаете сами на любом стеке. WordPress совмещает бэкенд и готовый сайт в одном.
Хватит ли 2 GB RAM?
Для работы - да, рантайм Strapi около 270 MiB. Узкое место - сборка админки, поэтому рекомендуем CPU2-RAM4-DISK50.
Есть ли GraphQL?
Да, добавляется плагином @strapi/plugin-graphql. REST-API работает сразу без плагинов.
Почему нельзя создать тип контента в продакшене?
Content-Type Builder в prod-режиме открыт только на чтение. Модель данных меняют в dev-режиме и деплоят вместе с кодом.
Можно ли на PostgreSQL вместо SQLite?
Да, и для продакшена так и нужно. В карте маркетплейса Strapi уже посажен на PostgreSQL 16.
Как делать бэкап?
pg_dump базы плюс выгрузка тома с загрузками (strapi-uploads).
Какие ограничения лицензии?
Ядро (Community Edition) под MIT, свободно в том числе коммерчески. Часть enterprise-функций (SSO, аудит, расширенный RBAC) - под коммерческой лицензией, но для своего контент-бэкенда они не нужны.
Итог
Strapi - зрелый и самый популярный self-hosted headless CMS: визуальный конструктор типов контента, REST и GraphQL API, ролевой доступ и медиатека. Рантайм легкий (~270 MiB), для продакшена сажаете на PostgreSQL и ставите за TLS. Подходит командам с разработчиком, которым нужен свой контент-бэкенд без облачных лимитов и вендор-лока. На CPU2-RAM4-DISK50 разворачивается за пару минут, а в маркетплейсе Fatmetal образ уже собран - компилировать ничего не нужно.
Рекомендуемая конфигурация для установки:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe
Не хотите устанавливать вручную?
Запустите Strapi на этой конфигурации автоматически - от 450 ₽/мес.
Этот стек у нас запущен на тарифе CPU2-RAM4-DISK50. Нашли баг в гайде - напишите, поправим в течение дня.