Strapi
Система управления контентом для своего сервера: редакторы ведут материалы в админке, сайты и приложения получают их через API. Проверили установку Strapi 5.59.0 на Fatmetal Cloud Server; замеры ресурсов и скриншоты сохранены от версии 5.52.2.
Вердикт
- командам, которым нужен свой контент-бэкенд под сайт, мобильное приложение или несколько витрин сразу
- разработчикам, кому важен API-first: REST сразу и GraphQL через плагин, свой фронтенд
- тем, кто уходит от облачных CMS с оплатой за записи и seat и хочет данные у себя
- если нужен готовый сайт «из коробки» с темами - Strapi не имеет фронтенда, только API
- под простой блог одному человеку - избыточно, проще классическая CMS
- если нет ни одного разработчика в команде
Что изменилось с прошлого разбора
В сентябре проверяли 5.52.2. В 5.59.0 от 21 октября исправлены зависающие соединения с PostgreSQL и MySQL, работа со связями и публикация записей.
Промежуточная 5.54 включила новую медиатеку с деревом папок и фоновыми загрузками. Снимки ниже относятся к 5.52.2: их версия указана в подписях.
Для 5.59 нужен Node.js от 22.19, несмотря на старое значение в engines. У Knex 3.3 изменилось поведение delete/truncate с limit и having: проверьте собственные плагины перед обновлением.
Обновления Axios и Handlebars закрывают уязвимости старых зависимостей. Для Undici и DOMPurify требуются дополнительные исправления: они внесены в команды установки. Подробности - в разделе «Уязвимости прошлых версий».
Что это и какую задачу решает
Strapi - это headless CMS: система управления контентом без своего фронтенда. Вы описываете структуру данных (статьи, товары, страницы, авторов), а Strapi генерирует под нее админку для редакторов и API для разработчиков. Фронтенд - сайт, мобильное приложение, витрина - вы делаете отдельно на любом стеке и берете контент через API. Это ключевое отличие от классической CMS вроде WordPress, где бэкенд и фронт слиты воедино.
Главный инструмент - визуальный Content-Type Builder: добавляете поля мышкой, и Strapi сразу поднимает под них REST-эндпоинты, после установки GraphQL-плагина - его схему, ролевой доступ (RBAC) и медиатеку для файлов. Ядро продукта открыто под MIT, поэтому данные и API живут на вашем сервере - без лимитов на количество записей и без абонплаты за каждого редактора, как у облачных Contentful или Sanity.
Чем отличается от облачных аналогов
Сравнение с Contentful - зрелым облачным headless CMS - по тому, что влияет на выбор.
| Параметр | Strapi (self-hosted) | Contentful (SaaS) |
|---|---|---|
| Модель цены | CE бесплатна, сервер оплачивается отдельно | подписка, рост по числу записей и мест |
| Где данные | на вашем сервере, свой Postgres | в облаке вендора |
| Лимиты на записи/API | нет, ограничены только железом | по тарифу |
| Vendor lock-in | доступ к коду и БД; перенос схемы требует разработки | данные и модель у вендора |
| API | REST + GraphQL (плагин) | REST + GraphQL |
| Кастомизация | свои плагины, хуки, полный код | в рамках платформы |
По прайсу Contentful на 24 октября 2026 Free включает 10 пользователей и 100 тысяч API-запросов в месяц; Lite стоит 300 долларов в месяц. Для небольшого проекта бесплатное облако может быть достаточным.
Тех-стек и архитектура
Сервер Strapi написан на Node.js и TypeScript, запросы обрабатывает Koa. Админка на React собирается в статические файлы и отдается тем же приложением.
В ручной инструкции приложение работает службой systemd, PostgreSQL 16 - контейнером. Оба слушают localhost; Caddy принимает внешний HTTPS и передает запросы на порт 1337.
Генератор проекта создает секреты и настройки подключения к БД в .env. При первом запуске Strapi создает таблицы; модель контента хранится также в исходниках проекта.
Минимальная конфигурация
По требованиям вендора и для повторения инструкции возьмите CPU2-RAM4-DISK50. Четыре гигабайта нужны в том числе для установки зависимостей и сборки админки на сервере.
| Минимум вендора | 1 CPU, 2 ГБ RAM, 8 ГБ диска |
| Рекомендация вендора | 2+ CPU, 4+ ГБ RAM, 32+ ГБ диска |
| Strapi 5.52.2 в простое | около 270 МиБ, без PostgreSQL |
| Рекомендуемая конфигурация | CPU2-RAM4-DISK50 |
270 МиБ - потребление процесса из сентябрьского замера, а не размер сервера для всей установки. База, система, сборка и загрузки требуют отдельного запаса.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий домен, валидный TLS и файл с доступами.
Рекомендуемая конфигурация:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe от 450 ₽/мес
Развертывание на Fatmetal Cloud Server
Ручной путь: Node.js 22, PostgreSQL 16 в Docker и Caddy. В отличие от готовой карточки, здесь вы собираете приложение на своем сервере.
Установите Node.js и Docker
Войдите по SSH, выполните sudo -i и копируйте команды в этой оболочке. Нужна чистая Ubuntu 24.04 с 4 ГБ RAM; порты 80 и 443 должны быть доступны.
apt-get update && apt-get install -y curl ca-certificates gnupg build-essential curl -fsSL https://deb.nodesource.com/setup_22.x -o /tmp/node-setup.sh bash /tmp/node-setup.sh && apt-get install -y nodejs curl -fsSL https://get.docker.com -o /tmp/docker-setup.sh sh /tmp/docker-setup.sh node --versionСоздайте базу и задайте адрес
Замените ваш-домен адресом, направленным на IP сервера. Введите пароль сервера из панели: он станет паролем администратора. У PostgreSQL будет отдельный случайный пароль.
DOMAIN=ваш-домен read -rsp 'Пароль сервера из панели: ' ADMIN_PASSWORD; echo DB_PASSWORD=$(openssl rand -hex 24) docker pull postgres:16 docker run -d --name strapi-db --restart unless-stopped -p 127.0.0.1:5432:5432 -e POSTGRES_DB=strapi -e POSTGRES_USER=strapi -e POSTGRES_PASSWORD="$DB_PASSWORD" -v strapi-db-data:/var/lib/postgresql/data postgres:16 until docker exec strapi-db pg_isready -U strapi >/dev/null 2>&1; do sleep 2; doneСоздайте проект нужной версии
Генератор добавит пример типов контента для первых записей. Приложение пока не запускается, поэтому окно регистрации недоступно из интернета.
mkdir -p /opt/strapi && cd /opt/strapi npx --yes create-strapi-app@5.59.0 app --non-interactive --no-install --no-run --skip-cloud --no-git-init --js --example --use-npm --dbclient postgres --dbhost 127.0.0.1 --dbport 5432 --dbname strapi --dbusername strapi --dbpassword "$DB_PASSWORD" --dbssl false cd app node -e 'const fs=require("fs"),p=require("./package.json"); p.overrides={"undici@^6":"6.29.1","undici@^7":"7.30.1","undici@^8":"8.12.2","vite@^6":"6.4.4","vite@^8":"8.1.6","dompurify":"3.4.17","markdown-it@^14":"14.3.3","zod@^4":"4.6.6","@strapi/provider-email-sendmail":{"nodemailer":"10.1.4"}}; fs.writeFileSync("package.json",JSON.stringify(p,null,2))' npm installСоберите админку и создайте администратора
Исправленные версии зависимостей заданы отдельно от версии Strapi; после установки сохраните package-lock.json вместе с проектом. Само приложение слушает localhost; вход администратора создается до включения HTTPS-прокси.
printf ' HOST=127.0.0.1 URL=https://%s ' "$DOMAIN" >> .env cat > config/server.js <<'EOF' module.exports = ({ env }) => ({ host: env('HOST'), port: env.int('PORT', 1337), url: env('URL'), proxy: { koa: true }, app: { keys: env.array('APP_KEYS') } }); EOF npm run build NODE_ENV=production npm run strapi -- admin:create-user --firstname Admin --email "admin@$DOMAIN" --password "$ADMIN_PASSWORD" unset ADMIN_PASSWORD useradd --system --home-dir /opt/strapi --shell /usr/sbin/nologin strapi chown -R strapi:strapi /opt/strapi && chmod 600 .env cat > /etc/systemd/system/strapi.service <<'EOF' [Unit] After=network-online.target docker.service [Service] User=strapi WorkingDirectory=/opt/strapi/app Environment=NODE_ENV=production ExecStart=/usr/bin/npm run start Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl daemon-reload && systemctl enable --now strapiВключите HTTPS и войдите
Caddy получает сертификат автоматически. Дождитесь ответа приложения локально, затем откройте /admin и войдите как admin@ваш-домен с паролем сервера из панели.
until curl -fsS http://127.0.0.1:1337/admin/init >/dev/null; do sleep 3; done apt-get install -y debian-keyring debian-archive-keyring apt-transport-https curl -fsSL https://dl.cloudsmith.io/public/caddy/stable/gpg.key | gpg --batch --yes --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -fsSL https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt > /etc/apt/sources.list.d/caddy-stable.list apt-get update && apt-get install -y caddy printf '%s { reverse_proxy 127.0.0.1:1337 } ' "$DOMAIN" > /etc/caddy/Caddyfile systemctl restart caddy curl -fsS --retry 12 --retry-all-errors --retry-delay 5 --max-time 10 "https://$DOMAIN/admin/init"
После входа закройте экскурсию кнопкой Skip, если она появилась. Откройте Content Manager → Article → Create new entry. Заполните title и slug, нажмите Save, затем Publish. Пример типов контента добавлен генератором: структуру можно изучить в каталоге src/api проекта.
Что измерили после запуска
Замеры Strapi 5.52.2 из сентября 2026. Они сохранены для сравнения и не переназначены новой версии.
| Сборка админки (strapi build) | около 29 с |
| Таблиц создано в БД | 41 |
| RAM в простое (процессы Strapi) | около 270 МиБ |
| Отклик /admin локально | 16 мс |
| Отклик /admin по HTTPS (magic-DNS) | около 0,6 с |
| Образ приложения на диске | 2,18 ГБ (архив 483 МБ) |
Вывод для выбора сервера: размер работающего процесса не учитывает затраты сборки. Для ручного пути оставляйте 4 ГБ RAM и место под зависимости; архив приложения и база также занимают диск.
Проверено на версии v5.52.2, сентябрь 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли, на которые наткнулись при запуске.
Content-Type Builder в продакшене только на чтение
При NODE_ENV=production Strapi запрещает менять структуру данных через админку - конструктор типов открыт лишь на просмотр. Типы контента создают на отдельной рабочей копии в dev-режиме (npm run develop), а на сервер переносят вместе с кодом. Режим разработки не открывайте в интернет. Это защита от случайных правок схемы на живой базе, а не баг.
Причина. Старый Node не соответствует новым зависимостям. Для 5.59 нужен Node от 22.19.
Решение. Проверьте node --version; повторите установку Node 22 из первого шага, затем npm ci и npm run build.
Docker Hub из РФ. При установке с нуля образ postgres:16 с Docker Hub часто отваливается по таймауту. Повторите docker pull postgres:16, затем команду запуска базы. Не запускайте второй контейнер с тем же именем, если первый уже появился: проверьте docker ps -a.
Безопасность и обновления
В инструкции администратор создается командой до запуска публичного прокси. Вход - admin@ваш-домен и пароль сервера из панели. Для интеграции выпустите отдельный токен в Settings → API Tokens.
Перед обновлением остановите запись и сохраните базу вместе с проектом, секретами и загруженными файлами. Выполните в root-оболочке:
umask 077
systemctl stop strapi
docker exec strapi-db pg_dump --clean --if-exists -U strapi strapi > /root/strapi.sql
tar --exclude=app/node_modules -czf /root/strapi-app.tgz -C /opt/strapi app
systemctl start strapiДля восстановления этих копий на том же сервере остановите приложение, верните файлы и импортируйте базу. Существующие данные будут заменены состоянием копии:
systemctl stop strapi
tar -xzf /root/strapi-app.tgz -C /opt/strapi
docker exec -i strapi-db psql -v ON_ERROR_STOP=1 -U strapi strapi < /root/strapi.sql
cd /opt/strapi/app && npm ci
chown -R strapi:strapi /opt/strapi
systemctl start strapiДля обновления проекта используйте штатную утилиту. Сначала сохраните копии выше, затем выполните:
cd /opt/strapi/app
systemctl stop strapi
npx --yes @strapi/upgrade@5.59.0 to 5.59.0
npm run build && chown -R strapi:strapi /opt/strapi
systemctl start strapi
npm ls @strapi/strapi undiciСохраните overrides исправленных зависимостей из шага установки. После запуска откройте админку, войдите, загрузите файл и опубликуйте запись. При ошибке смотрите journalctl -u strapi -n 80; для возврата используйте обе копии, а не только старый код.
Уязвимости прошлых версий
Инструкция устанавливает 5.59.0 и отдельно закрепляет исправленные зависимости. Обновление одного номера Strapi недостаточно: сравните состав своего проекта с таблицей.
| Идентификатор | Уровень | Затронуто | Исправлено | Последствия |
|---|---|---|---|---|
| CVE-2026-106446 | critical | Handlebars 4.0.0-4.7.9 | 4.7.10; обновлен в Strapi 5.58 | Недоверенный объект шаблона мог привести к выполнению кода. |
| CVE-2026-106445 | critical | Handlebars 3.0.0-4.7.9 | 4.7.10; обновлен в Strapi 5.58 | Опасные настройки шаблонизатора допускали выполнение кода. |
| GHSA-cg2g-xh64-v4q7 | critical | DOMPurify 3.4.4-3.4.16 | 3.4.17 | Определенные режимы очистки DOM оставляли опасные шаблонные выражения. |
| CVE-2026-109869 | high | Undici 6.23-6.29.0, 7.18-7.30.0, 8.0-8.12.1 | 6.29.1 / 7.30.1 / 8.12.2 | Ответ вредоносного внешнего сервера мог завершить процесс Node.js. |
| CVE-2026-101903 | high | Axios 1.19.0 из прежнего набора зависимостей | 1.20.0; обновлен в Strapi 5.58 | Специальная data-ссылка могла надолго занять обработчик запросов. |
| CVE-2026-82417 | medium | qs >=2.2.5, <6.16.0 | 6.16.0 | Определенные входные данные могли вызвать отказ обработки. |
Это условия уязвимостей библиотек, а не утверждение о захвате любого Strapi. Для атаки нужен указанный в бюллетене путь обработки. Смена пароля не заменяет обновление пакетов.
Связь с другими стеками
- Обратный прокси - Caddy или Traefik для TLS перед админкой и API.
- База данных - PostgreSQL для продакшена вместо файлового SQLite.
- Хранилище файлов - S3-совместимое хранилище для медиатеки через провайдер-плагин.
- Бэкапы - pg_dump по расписанию плюс выгрузка тома с загрузками.
Когда это НЕ ваш выбор
Нужен готовый сайт, а не API
Strapi не отдает готовые страницы - только контент через API. Если нужен сайт с темами и визуальным редактором из коробки, смотрите в сторону классической CMS.
Нужны бесплатные SSO и журнал аудита
Эти функции требуют коммерческой лицензии Strapi. Бесплатное ядро на своем сервере их не разблокирует.
Нет разработчика
Чтобы забрать контент из API и собрать фронтенд, нужен разработчик. Для проекта без технической команды headless-подход избыточен.
Частые вопросы
Чем headless CMS отличается от WordPress?
Strapi дает только контент-бэкенд и API, а фронтенд вы делаете сами на любом стеке. WordPress совмещает бэкенд и готовый сайт в одном.
Хватит ли 2 GB RAM?
Вендор указывает 2 ГБ как минимум. Для повторения ручной установки со сборкой берите CPU2-RAM4-DISK50; сентябрьские 270 МиБ относятся только к процессу Strapi 5.52.2.
Есть ли GraphQL?
Да, добавляется плагином @strapi/plugin-graphql. REST-API работает сразу без плагинов.
Почему нельзя создать тип контента в продакшене?
Content-Type Builder в prod-режиме открыт только на чтение. Модель данных меняют в dev-режиме и деплоят вместе с кодом.
Можно ли на PostgreSQL вместо SQLite?
Да, и для продакшена так и нужно. В карте маркетплейса Strapi уже посажен на PostgreSQL 16.
Как делать бэкап?
В ручной установке - /root/strapi.sql и /root/strapi-app.tgz по командам выше: база, проект, .env и public/uploads. Храните копии вне сервера.
Какие ограничения лицензии?
Ядро (Community Edition) под MIT, свободно в том числе коммерчески. Корпоративные функции лицензируются отдельно; размещение на своем сервере не меняет условия их лицензии.
Итог
Strapi подходит проекту, где один набор материалов нужен сайту и приложению, а фронтенд делает разработчик. Инструкция для 5.59.0 дает PostgreSQL, HTTPS и заранее созданного администратора; изменения схемы готовьте в разработке и переносите вместе с кодом.
Рекомендуемая конфигурация для установки:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe
Не хотите устанавливать вручную?
Запустите Strapi на этой конфигурации автоматически - от 450 ₽/мес.
Этот стек у нас запущен на тарифе CPU2-RAM4-DISK50. Нашли баг в гайде - напишите, поправим в течение дня.