Обновлено 24 октября 2026 г.
Headless CMS

Strapi

Система управления контентом для своего сервера: редакторы ведут материалы в админке, сайты и приложения получают их через API. Проверили установку Strapi 5.59.0 на Fatmetal Cloud Server; замеры ресурсов и скриншоты сохранены от версии 5.52.2.

Проверено на версии v5.59.0, 24 октября 2026 ~10 минут чтения Fatmetal Team
Headless CMS Лицензия: MIT (ядро) Инструкция: v5.59.0

Вердикт

Подходит
  • командам, которым нужен свой контент-бэкенд под сайт, мобильное приложение или несколько витрин сразу
  • разработчикам, кому важен API-first: REST сразу и GraphQL через плагин, свой фронтенд
  • тем, кто уходит от облачных CMS с оплатой за записи и seat и хочет данные у себя
Не подходит
  • если нужен готовый сайт «из коробки» с темами - Strapi не имеет фронтенда, только API
  • под простой блог одному человеку - избыточно, проще классическая CMS
  • если нет ни одного разработчика в команде
Мин. тариф: CPU2-RAM4-DISK50 Рекомендуем: CPU2-RAM4-DISK50 Сложность: medium RAM на 5.52.2: около 270 МиБ, без PostgreSQL Главный риск: Content-Type Builder в prod только на чтение Вход: заранее созданный администратор
Новая версия

Что изменилось с прошлого разбора

В сентябре проверяли 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.

Node.js 22TypeScriptKoaPostgreSQLReact (админка)Docker
Сравнение

Чем отличается от облачных аналогов

Сравнение с Contentful - зрелым облачным headless CMS - по тому, что влияет на выбор.

ПараметрStrapi (self-hosted)Contentful (SaaS)
Модель ценыCE бесплатна, сервер оплачивается отдельноподписка, рост по числу записей и мест
Где данныена вашем сервере, свой Postgresв облаке вендора
Лимиты на записи/APIнет, ограничены только железомпо тарифу
Vendor lock-inдоступ к коду и БД; перенос схемы требует разработкиданные и модель у вендора
APIREST + 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. В отличие от готовой карточки, здесь вы собираете приложение на своем сервере.

  1. Установите 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
  2. Создайте базу и задайте адрес

    Замените ваш-домен адресом, направленным на 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
  3. Создайте проект нужной версии

    Генератор добавит пример типов контента для первых записей. Приложение пока не запускается, поэтому окно регистрации недоступно из интернета.

    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
  4. Соберите админку и создайте администратора

    Исправленные версии зависимостей заданы отдельно от версии 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
  5. Включите 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: регистрация первого администратора. В инструкции 5.59 учетная запись создается заранее командой.
Админ-панель Strapi после входа
Админ-панель после входа - виджеты, профиль, последние записи (v5.52.2, CPU2-RAM4-DISK50).
Content-Type Builder в Strapi
Content-Type Builder в 5.52.2: конструктор типов контента, в production открыт на чтение.
Замеры

Что измерили после запуска

Замеры Strapi 5.52.2 из сентября 2026. Они сохранены для сравнения и не переназначены новой версии.

Сборка админки (strapi build)около 29 с
Таблиц создано в БД41
RAM в простое (процессы Strapi)около 270 МиБ
Отклик /admin локально16 мс
Отклик /admin по HTTPS (magic-DNS)около 0,6 с
Образ приложения на диске2,18 ГБ (архив 483 МБ)
i

Вывод для выбора сервера: размер работающего процесса не учитывает затраты сборки. Для ручного пути оставляйте 4 ГБ RAM и место под зависимости; архив приложения и база также занимают диск.

Проверено на версии v5.52.2, сентябрь 2026. На новых версиях результаты могут отличаться.

Подводные камни

Где может сломаться

Реальные грабли, на которые наткнулись при запуске.

Content-Type Builder в продакшене только на чтение

При NODE_ENV=production Strapi запрещает менять структуру данных через админку - конструктор типов открыт лишь на просмотр. Типы контента создают на отдельной рабочей копии в dev-режиме (npm run develop), а на сервер переносят вместе с кодом. Режим разработки не открывайте в интернет. Это защита от случайных правок схемы на живой базе, а не баг.

npm warn EBADENGINE Unsupported engine

Причина. Старый 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-106446criticalHandlebars 4.0.0-4.7.94.7.10; обновлен в Strapi 5.58Недоверенный объект шаблона мог привести к выполнению кода.
CVE-2026-106445criticalHandlebars 3.0.0-4.7.94.7.10; обновлен в Strapi 5.58Опасные настройки шаблонизатора допускали выполнение кода.
GHSA-cg2g-xh64-v4q7criticalDOMPurify 3.4.4-3.4.163.4.17Определенные режимы очистки DOM оставляли опасные шаблонные выражения.
CVE-2026-109869highUndici 6.23-6.29.0, 7.18-7.30.0, 8.0-8.12.16.29.1 / 7.30.1 / 8.12.2Ответ вредоносного внешнего сервера мог завершить процесс Node.js.
CVE-2026-101903highAxios 1.19.0 из прежнего набора зависимостей1.20.0; обновлен в Strapi 5.58Специальная data-ссылка могла надолго занять обработчик запросов.
CVE-2026-82417mediumqs >=2.2.5, <6.16.06.16.0Определенные входные данные могли вызвать отказ обработки.

Это условия уязвимостей библиотек, а не утверждение о захвате любого Strapi. Для атаки нужен указанный в бюллетене путь обработки. Смена пароля не заменяет обновление пакетов.

Рядом

Связь с другими стеками

  • Обратный прокси - Caddy или Traefik для TLS перед админкой и API.
  • База данных - PostgreSQL для продакшена вместо файлового SQLite.
  • Хранилище файлов - S3-совместимое хранилище для медиатеки через провайдер-плагин.
  • Бэкапы - pg_dump по расписанию плюс выгрузка тома с загрузками.
Оценка

Когда это НЕ ваш выбор

Нужен готовый сайт, а не API

Strapi не отдает готовые страницы - только контент через API. Если нужен сайт с темами и визуальным редактором из коробки, смотрите в сторону классической CMS.

Нужны бесплатные SSO и журнал аудита

Эти функции требуют коммерческой лицензии Strapi. Бесплатное ядро на своем сервере их не разблокирует.

Нет разработчика

Чтобы забрать контент из API и собрать фронтенд, нужен разработчик. Для проекта без технической команды headless-подход избыточен.

FAQ

Частые вопросы

Чем 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 ₽/мес.

Запустить Strapi →
Анонсы новых разборов в Telegram-канале Новые гайды и карточки в маркетплейсе первыми @fatmetal_channel →

Этот стек у нас запущен на тарифе CPU2-RAM4-DISK50. Нашли баг в гайде - напишите, поправим в течение дня.