MAATRIX / Блог / Strapi на Ubuntu 24.04: пошаговая установка

Strapi на Ubuntu 24.04: пошаговая установка

MAATRIX

Если вам нужен гибкий бэкенд для сайта, мобильного приложения или витрины интернет-магазина без написания API с нуля, Strapi — один из самых практичных вариантов: open-source headless CMS на Node.js с автогенерацией REST и GraphQL API, удобной админкой и понятной моделью контента. Ниже — рабочая установка на чистый Ubuntu 24.04: Node.js, PostgreSQL, сборка админ-панели, запуск через PM2 и Nginx с SSL, чтобы получить не тестовый стенд, а продакшен-конфигурацию.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что понадобится и какой сервер выбрать

Strapi сам по себе не тяжёлый, но сборка админ-панели (npm run build) заметно нагружает CPU и память — на слабых тарифах сборка может упасть по OOM. Минимум для комфортной работы:

  • 2 vCPU, 2-4 ГБ RAM — для сборки и небольшого проекта с админкой и несколькими редакторами;
  • 20+ ГБ диска — под систему, node_modules, медиафайлы (если храните их локально, а не в S3);
  • Ubuntu 24.04 LTS — свежая, с длительной поддержкой, подходит под текущие версии Node.js и PostgreSQL.

Если сайт с самого начала рассчитан на нагрузку — интернет-магазин, медиа с загрузкой файлов, несколько окружений (dev/staging/prod) — закладывайте 4 ГБ RAM и выше, особенно если на этом же сервере будет крутиться и сама база данных.

Перед установкой обновите систему и создайте отдельного пользователя без root-прав — работать под root в проде не стоит:

sudo apt update && sudo apt upgrade -y
sudo adduser strapi
sudo usermod -aG sudo strapi
su - strapi

Устанавливаем Node.js и PostgreSQL

Strapi требует Node.js определённых LTS-веток — на момент написания статьи актуальны 18.x, 20.x и 22.x (сверьтесь с требованиями вашей версии Strapi в package.json, они периодически меняются). Ставим Node.js 20 LTS через NodeSource, а не через apt — в стандартных репозиториях Ubuntu версия обычно устаревшая:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v
npm -v

Дальше нужна база данных. Strapi из коробки может работать на SQLite, но это вариант только для разработки — под нагрузкой и параллельной записью SQLite быстро становится узким местом. Для продакшена ставим PostgreSQL:

sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql

Создаём базу и пользователя под проект — без прав суперпользователя, только на свою базу:

sudo -u postgres psql -c "CREATE DATABASE strapi_db;"
sudo -u postgres psql -c "CREATE USER strapi_user WITH ENCRYPTED PASSWORD 'замените_на_свой_пароль';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE strapi_db TO strapi_user;"
sudo -u postgres psql -d strapi_db -c "GRANT ALL ON SCHEMA public TO strapi_user;"

Последняя строка нужна отдельно: в новых версиях PostgreSQL права на схему public больше не выдаются владельцу базы автоматически, и без неё Strapi при первом запуске упадёт с ошибкой доступа к схеме. Если нужен более глубокий разбор установки и тюнинга самого PostgreSQL — есть отдельная статья про установку PostgreSQL на Ubuntu 24.04.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Создаём проект Strapi

Официальный способ — через create-strapi-app. Флаг --quickstart не подходит для продакшена (он ставит SQLite и сразу открывает мастер настройки в браузере), поэтому создаём проект с явным выбором базы:

npx create-strapi@latest my-strapi-project

Мастер спросит про шаблон (можно выбрать пустой) и тип установки — выберите ручную настройку (custom), затем укажите PostgreSQL как базу данных и введите параметры подключения: хост 127.0.0.1, порт 5432, имя базы strapi_db, пользователя strapi_user и пароль, который вы задали выше. CLI сам пропишет драйвер pg в зависимости и сгенерирует базовую структуру config/database.ts (или .js, в зависимости от версии).

После создания проверьте, что зависимости встали без ошибок:

cd my-strapi-project
npm install

Если на сервере мало памяти, сборка npm install и особенно последующий npm run build могут упасть с JavaScript heap out of memory. Временное решение — увеличить лимит памяти для Node.js:

export NODE_OPTIONS="--max-old-space-size=2048"

Но это костыль. Правильнее — либо взять сервер с достаточным объёмом RAM, либо собирать проект на более мощной машине и деплоить уже готовую сборку.

Настраиваем production-конфиг и .env

Все секреты и ключи шифрования Strapi живут в файле .env в корне проекта. При создании проекта через CLI он уже сгенерирован со случайными значениями, но для продакшена стоит их пересоздать явно и хранить отдельно от git:

APP_KEYS=ключ1,ключ2,ключ3,ключ4
API_TOKEN_SALT=случайная_строка
ADMIN_JWT_SECRET=случайная_строка
TRANSFER_TOKEN_SALT=случайная_строка
JWT_SECRET=случайная_строка

DATABASE_CLIENT=postgres
DATABASE_HOST=127.0.0.1
DATABASE_PORT=5432
DATABASE_NAME=strapi_db
DATABASE_USERNAME=strapi_user
DATABASE_PASSWORD=замените_на_свой_пароль
DATABASE_SSL=false

Сгенерировать случайные строки для секретов удобно так:

node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

Выполните команду несколько раз — по одному значению на каждый секрет. Обязательно добавьте .env в .gitignore, если проект попадёт в репозиторий: утечка ADMIN_JWT_SECRET даёт возможность подделывать сессии администратора.

Отдельный момент — NODE_ENV. По умолчанию в разработке Strapi запускается в режиме development, где включена автоматическая пересборка схемы контент-тайпов при каждом изменении файлов. В продакшене это лишняя нагрузка и риск случайно изменить структуру данных на живом сайте, поэтому явно выставляем:

export NODE_ENV=production

Собираем админ-панель и запускаем через PM2

Перед первым запуском в продакшен-режиме нужно собрать статику админки:

NODE_ENV=production npm run build

Сборка компилирует React-приложение админ-панели в build/ — именно её раздаёт Strapi по адресу /admin. Если менялись переменные окружения, связанные с публичным URL или плагинами, сборку нужно повторить.

Запускать npm run start напрямую в SSH-сессии бессмысленно — процесс умрёт при отключении терминала. Используем PM2 как менеджер процессов с автоперезапуском:

sudo npm install -g pm2
pm2 start npm --name "strapi" -- run start
pm2 save
pm2 startup systemd

Последняя команда выведет строку с sudo env PATH=... pm2 startup systemd -u strapi --hp /home/strapi — её нужно выполнить отдельно, она регистрирует PM2 в systemd, чтобы процессы поднимались после перезагрузки сервера. Проверить статус и посмотреть логи:

pm2 status
pm2 logs strapi

По умолчанию Strapi слушает 127.0.0.1:1337 — наружу этот порт открывать не нужно, доступ к нему будет только через reverse proxy на следующем шаге.

Nginx как reverse proxy и SSL

Наружу сайт должен смотреть через Nginx, а не напрямую через Node.js-процесс — так проще управлять SSL, кэшированием статики и лимитами на загрузку файлов. Устанавливаем Nginx и открываем порты в файрволе:

sudo apt install -y nginx
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable

Если файрвол на сервере ещё не настраивался, у нас есть отдельный разбор настройки UFW на Ubuntu 24.04 со всеми нюансами.

Конфиг для проксирования на Strapi:

server {
    listen 80;
    server_name example.com;

    client_max_body_size 100M;

    location / {
        proxy_pass http://127.0.0.1:1337;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Директива client_max_body_size важна отдельно: Strapi активно используют для загрузки медиафайлов через встроенный Media Library, и лимит Nginx по умолчанию (1 МБ) обрежет загрузку изображений уже на первом файле побольше.

Сохраните конфиг в /etc/nginx/sites-available/strapi, включите и проверьте синтаксис:

sudo ln -s /etc/nginx/sites-available/strapi /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Общий разбор настройки Nginx как обратного прокси есть в отдельной статье, если нужны детали по таймаутам и буферизации. SSL-сертификат подключается через Certbot:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com

Certbot сам пропишет редирект с 80 на 443 порт и настроит автопродление. Проверить, что таймер продления активен:

sudo systemctl status certbot.timer

Если сертификат в будущем перестанет обновляться автоматически, разбор типичных причин есть в статье про ошибки Let's Encrypt SSL.

После этого зайдите на https://example.com/admin и создайте первого администратора — эта форма показывается только один раз, при первом обращении к панели.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

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

Можно ли обойтись без PostgreSQL и оставить SQLite?

Технически да, Strapi запустится. Но SQLite не рассчитан на параллельную запись и плохо переживает нагрузку — для продакшена с реальными пользователями лучше сразу PostgreSQL или MySQL.

Почему сборка админки падает с ошибкой памяти?

Чаще всего это нехватка RAM на слабом тарифе. Решение — временно увеличить NODE_OPTIONS=--max-old-space-size, добавить своп-файл или собрать проект на более мощной машине и перенести готовую папку build/.

Как обновить Strapi до новой версии?

Через официальный upgrade-инструмент: npx @strapi/upgrade latest. Перед обновлением обязательно сделайте бэкап базы данных и файлов — мажорные апгрейды иногда меняют структуру конфигов.

Где хранить загружаемые файлы — на диске сервера или в облаке?

Для небольших проектов подходит локальное хранилище (папка public/uploads), но её нужно регулярно бэкапить. Для проектов с ростом трафика лучше подключить провайдер загрузки через S3-совместимое хранилище — это снимает нагрузку с диска и упрощает горизонтальное масштабирование.

Нужен ли отдельный сервер под Strapi и PostgreSQL?

Для небольших и средних проектов оба сервиса спокойно уживаются на одном VPS. Разносить их по разным серверам имеет смысл, когда база начинает съедать значительную часть ресурсов или когда нужна отдельная политика бэкапов для данных.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →