Strapi - самый популярный self-hosted headless CMS (73k звёзд на GitHub): контент-бэкенд для сайтов, мобильных приложений и витрин на любом фронтенде. Вы описываете типы контента в визуальном Content-Type Builder, а Strapi сам поднимает под них REST и GraphQL API, админку с ролевым доступом (RBAC) и медиатеку. В отличие от облачных CMS данные и API живут на вашем сервере - без лимитов на записи, без абонплаты за seat и без вендор-лока. Ядро (Community Edition) под лицензией MIT.

После создания сервера Strapi ставится автоматически: docker поднимает приложение (пре-собранный образ, у вас на машине ничего не компилируется) и Postgres, а Caddy выпускает Let's Encrypt и открывает доступ по HTTPS на magic-DNS домене. При первом заходе на /admin вы создаёте первого администратора прямо в браузере.

Что внутри

  • Strapi v5 (Node.js 22) - приложение: админка и API на порту 1337, слушает только localhost.
  • PostgreSQL 16 - база данных в отдельном контейнере (том strapi-db-data), production-grade вместо файлового SQLite.
  • Caddy - reverse-proxy и авто-TLS (Let's Encrypt).
  • Пре-собранный образ приложения тянется из нашего ассета и грузится через docker load - сборки админки на клиенте нет (она тяжёлая: node_modules ~725 МБ).

Как войти

  1. Адрес формируется из IP сервера: замените точки на дефисы и добавьте .fatmetal.net. Пример: IP 45.15.159.10 -> https://45-15-159-10.fatmetal.net/admin.
  2. Первый экран - регистрация первого администратора: имя, email и пароль вы задаёте сами прямо в браузере. Пароль сервера из личного кабинета приложением не используется - у Strapi своя аутентификация.
  3. REST API доступно на /api, токены для внешних приложений создаются в админке в Settings -> API Tokens. GraphQL включается доустановкой плагина @strapi/plugin-graphql.

Важно

Секреты приложения (APP_KEYS, JWT_SECRET, ENCRYPTION_KEY и др.) и пароль базы генерируются на сервере при установке и лежат в /opt/strapi/strapi.env (chmod 600) - в образ они не вшиты. Данные в двух томах docker: strapi-db-data (Postgres) и strapi-uploads (загрузки) - бэкапьте оба (docker exec strapi-db pg_dump -U strapi strapi). Русская локаль интерфейса включается в Settings -> Administration panel (в комплекте, не по умолчанию).

Лицензия

Strapi - open-core: ядро (Community Edition) под лицензией MIT, свободное в том числе для коммерческого использования. Часть enterprise-функций (SSO, аудит-лог, расширенный RBAC) - под коммерческой лицензией, но для своего контент-бэкенда они не нужны.

Свой домен

Наведите CNAME на этот сервер, впишите домен в /etc/caddy/Caddyfile и в URL (/opt/strapi/strapi.env), затем docker compose -f /opt/strapi/compose.yml up -d и systemctl restart caddy - Caddy выпустит Let's Encrypt. Поле URL должно совпадать с публичным адресом, иначе ссылки в письмах и превью админки ведут на старый домен.

Требования

Ubuntu 24.04, открытые порты 80/443. Рекомендуемая конфигурация CPU2-RAM4-DISK50. Образ пре-собран и ставится из нашего ассета (~483 МБ архив), у клиента ничего не компилируется. Рантайм: Strapi ~270 МиБ + Postgres, диск под образ и данные.

Подробный разбор с замерами и скриншотами