Гид по технологиям

Установка Strapi CMS на Rocky Linux 9 с Nginx и SSL

8 min read DevOps Обновлено 13 Oct 2025
Strapi на Rocky Linux 9: установка, PM2 и SSL
Strapi на Rocky Linux 9: установка, PM2 и SSL

Главная иллюстрация Strapi

Strapi — это open-source headless CMS на JavaScript. Как и другие headless CMS, Strapi не содержит фронтенд по умолчанию. Он предоставляет API, с которым вы строите сайт на React, Next.js или другом фреймворке. Strapi основан на системе плагинов: панель администратора и API расширяемы, а каждая часть настраивается под конкретные задачи. В системе также есть управление пользователями и правами доступа.

В этом руководстве вы научитесь устанавливать Strapi Community Edition на Rocky Linux 9 и настраивать Nginx в качестве обратного прокси с SSL.

Что вы получите (intent и варианты)

  • Primary intent: установка Strapi на Rocky Linux 9
  • Варианты запросов пользователя: установка Strapi, Strapi с PostgreSQL, Strapi + Nginx, запуск Strapi в фоне (PM2), настройка SSL для Strapi

Быстрый план

  1. Подготовка сервера и пакетов
  2. Настройка firewall
  3. Установка PostgreSQL и создание БД
  4. Установка Node.js и Strapi
  5. Управление процессом через PM2
  6. Установка Nginx и получение SSL через Certbot
  7. Конфигурация Nginx и финальная проверка
  8. Обновление Strapi и рекомендации по безопасности

Требования

  • Сервер с Rocky Linux 9, минимум 2 ГБ ОЗУ и 1 CPU.
  • Неразрешённый root-пользователь с sudo.
  • Полное доменное имя (FQDN), например strapi.example.com.
  • Обновлённая система и базовый набор утилит.

Перед началом обновите систему:

$ sudo dnf update

Установите базовые пакеты (если их нет):

$ sudo dnf install wget curl nano unzip yum-utils -y

Некоторые пакеты могут уже быть установлены.

Важное

  • Используйте сильные пароли и храните их в менеджере секретов.
  • На production-сервере запускайте Strapi в режиме production и под отдельным системным пользователем.

Шаг 1 — Настройка брандмауэра (Firewalld)

Rocky Linux использует firewalld. Проверьте состояние:

$ sudo firewall-cmd --state
running

Список активных служб:

$ sudo firewall-cmd --permanent --list-services

Откройте HTTP и HTTPS:

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload

Чтобы временно открыть порт Strapi при локальном тесте (потом удалите правило):

$ sudo firewall-cmd --permanent --add-port=1337/tcp
$ sudo firewall-cmd --reload

После запуска в production удалите правило порта 1337:

$ sudo firewall-cmd --permanent --remove-port=1337/tcp
$ sudo firewall-cmd --reload

Совет: используйте зоны firewalld для изоляции сервисов (public, internal и т.д.).

Шаг 2 — Установка и настройка PostgreSQL

Strapi поддерживает PostgreSQL 11+. В Rocky Linux 9 по умолчанию есть PostgreSQL 13, но мы установим PostgreSQL 15.

Добавьте GPG-ключ и репозиторий PostgreSQL:

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ sudo dnf -qy module disable postgresql
$ sudo dnf install -y postgresql15-server

Инициализируйте БД и запустите сервис:

$ sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
$ sudo systemctl enable postgresql-15
$ sudo systemctl start postgresql-15
$ sudo systemctl status postgresql-15

Создайте базу и пользователя для Strapi:

$ sudo -i -u postgres psql
postgres=# CREATE DATABASE strapidb;
postgres=# CREATE USER strapiuser WITH PASSWORD 'Your_Password';
postgres=# ALTER DATABASE strapidb OWNER TO strapiuser;
postgres=# \q

Проверьте подключение:

$ psql --username strapiuser --password --host localhost strapidb
Password:
psql (15.1)
Type "help" for help.
strapidb=>
\q

Советы и примечания:

  • Выберите безопасный пароль и не публикуйте его в репозиториях.
  • При желании используйте pg_hba.conf для ограничения доступа по IP и методам аутентификации.
  • Для production рассмотрите включение автоматических бэкапов (pg_dump/pg_basebackup) и репликацию.

Шаг 3 — Установка Node.js

Rocky Linux 9 может поставляться с Node v16. Установим текущую LTS (v18 на момент руководства):

$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install nodejs -y
$ node -v
v18.13.0

Если нужно использовать nvm для нескольких версий Node.js, установите nvm как альтернативу.

Шаг 4 — Установка Strapi

Создайте проект Strapi с помощью npx:

$ npx create-strapi-app@latest howtoforge-project
Need to install the following packages:
  [email protected]
Ok to proceed? (y) y

Выберите Custom и укажите параметры базы данных:

? Choose your installation type Custom (manual settings)
? Choose your preferred language JavaScript
? Choose your default database client postgres
? Database name: strapidb
? Host: 127.0.0.1
? Port: 5432
? Username: strapiuser
? Password: Your_Password
? Enable SSL connection: No

Переключитесь в каталог проекта и соберите панель администратора в production-режиме:

$ cd howtoforge-project
$ NODE_ENV=production npm run build

Запустите сервер вручную для проверки:

$ node ~/howtoforge-project/node_modules/.bin/strapi start

Приложение будет доступно по адресу http://:1337.

После проверки остановите сервер (Ctrl+C) и удалите временное правило firewall (порт 1337), если вы его открывали.

Страница запуска Strapi на локальном порту 1337

Шаг 5 — Менеджер процессов PM2

Для стабильной работы в production используйте PM2, чтобы демонизировать процесс и создать unit systemd.

Установите PM2 глобально и создайте файл конфигурации:

$ cd ~
$ sudo npm install pm2@latest -g
$ sudo nano ecosystem.config.js

Пример файла ecosystem.config.js (вставьте ваши пути и креденшелы):

module.exports = {
  apps: [
    {
      name: 'strapi',
      cwd: '/home/navjot/howtoforge-project',
      script: 'npm',
      args: 'start',
      env: {
        NODE_ENV: 'production',
        DATABASE_HOST: 'localhost',
        DATABASE_PORT: '5432',
        DATABASE_NAME: 'strapidb',
        DATABASE_USERNAME: 'strapiuser',
        DATABASE_PASSWORD: 'Your_Password',
      },
    },
  ],
};

Запустите приложение под PM2 и настройте автозапуск:

$ pm2 start ecosystem.config.js
$ pm2 startup
# Скопируйте команду, которую предложит pm2 и выполните её под sudo, например:
$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot
$ pm2 save

PM2 будет автоматически поднимать процесс после перезагрузки. Для обновлений используйте pm2 stop и pm2 start.

Совет: не храните секреты в файлах проекта. Используйте переменные окружения через systemd-переменные или секретный менеджер.

Шаг 6 — Установка Nginx

Добавьте официальный репозиторий nginx и установите последнюю стабильную версию:

$ sudo nano /etc/yum.repos.d/nginx.repo

Вставьте:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Установите и запустите nginx:

$ sudo dnf install -y nginx
$ nginx -v
nginx version: nginx/1.22.1
$ sudo systemctl enable nginx --now
$ sudo systemctl status nginx

Шаг 7 — Получение SSL через Certbot (Let’s Encrypt)

Для certbot мы используем snapd.

$ sudo dnf install -y epel-release
$ sudo dnf install -y snapd
$ sudo systemctl enable snapd --now
$ sudo snap install core && sudo snap refresh core
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
$ certbot --version
certbot 2.2.0

Запрос сертификата (замените email и домен):

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d strapi.example.com

Создайте Diffie-Hellman параметры для повышения безопасности:

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Проверьте dry-run обновления сертификата:

$ sudo certbot renew --dry-run

Примечание: certbot обычно устанавливает cron/systemd таймер для автоматического продления. Проверьте это в вашей системе.

Шаг 8 — Конфигурация Nginx для Strapi

Откройте основной конфиг nginx и добавьте увеличение хэша имён хостов, чтобы избежать ошибок при длинных доменных именах:

$ sudo nano /etc/nginx/nginx.conf

Добавьте строку перед include /etc/nginx/conf.d/*.conf;:

server_names_hash_bucket_size  64;

Создайте файл /etc/nginx/conf.d/strapi.conf со следующим содержимым (замените strapi.example.com на ваш домен):

server {
  # Redirect any http requests to https
  listen         80;
  listen         [::]:80;
  server_name    strapi.example.com;
  return 301     https://$host$request_uri;
}

server {
  listen                    443 ssl http2;
  listen                    [::]:443 ssl http2;
  server_name               strapi.example.com;

  access_log                /var/log/nginx/strapi.access.log;
  error_log                 /var/log/nginx/strapi.error.log;

  # TLS configuration
  ssl_certificate           /etc/letsencrypt/live/strapi.example.com/fullchain.pem;
  ssl_certificate_key       /etc/letsencrypt/live/strapi.example.com/privkey.pem;
  ssl_trusted_certificate   /etc/letsencrypt/live/strapi.example.com/chain.pem;
  ssl_protocols             TLSv1.2 TLSv1.3;

  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
  ssl_prefer_server_ciphers on;
  ssl_session_cache         shared:SSL:50m;
  ssl_session_timeout       1d;

  # OCSP Stapling ---
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;

  location / {
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_set_header        X-Forwarded-Host $http_host;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass              http://127.0.0.1:1337;
  }
}

Проверьте конфигурацию и перезапустите nginx:

$ sudo nginx -t
$ sudo systemctl restart nginx

Теперь Strapi должен быть доступен по HTTPS: https://strapi.example.com.

Strapi в режиме production

Админ-панель доступна по адресу https://strapi.example.com/admin.

Страница создания администратора Strapi

Заполните данные администратора и нажмите “Let’s start” для входа в панель.

Панель администратора Strapi

Шаг 9 — Обновление Strapi

Перед обновлением остановите процесс PM2:

$ cd ~
$ pm2 stop ecosystem.config.js

В каталоге проекта откройте package.json и обновите версии пакетов Strapi до последних стабильных. Например:

"dependencies": {
  "@strapi/strapi": "4.5.5",
  "@strapi/plugin-users-permissions": "4.5.5",
  "@strapi/plugin-i18n": "4.5.5",
  "pg": "8.6.0"
},

Замените версии на актуальные по странице релизов Strapi. Затем выполните:

$ npm install
$ NODE_ENV=production npm run build
$ cd ~
$ pm2 start ecosystem.config.js

Проверяйте журнал PM2 и логи Strapi на предмет ошибок при старте.

Критерии приёмки

  • Strapi доступен по HTTPS на вашем домене.
  • Админ-панель открывается и позволяет создать администратора.
  • Страница API (например /api) отвечает корректно.
  • Процесс запущен через PM2 и поднимается автоматически после reboot.
  • Сертификат Let’s Encrypt успешно продлевается (dry-run).

Чек-листы по ролям

DevOps:

  • Настроить резервные копии PostgreSQL.
  • Добавить мониторинг процессов (PM2 + внешняя система).
  • Настроить алерты на отказ сервиса.

Backend-разработчик:

  • Проверить миграции и плагины после обновления Strapi.
  • Запустить скрипты сборки и убедиться, что билд без ошибок.

Frontend-разработчик:

  • Убедиться, что CORS и заголовки прокси корректны.
  • Протестировать авторизацию и получение данных через API.

Администратор контента:

  • Создать тестовый материал и убедиться, что он отображается через API.
  • Проверить роли и права доступа.

Частые ошибки и способы их устранения

  • Проблема: Strapi не стартует (ошибка БД). Решение: проверить доступность PostgreSQL, параметры подключения, права пользователя.
  • Проблема: Nginx возвращает 502 Bad Gateway. Решение: проверить, запущен ли Strapi на порту 1337, проверить proxy_pass и firewall.
  • Проблема: Certbot не может получить валидацию. Решение: временно откройте порт 80 и убедитесь, что DNS указывает на сервер.

Безопасность и hardening

  • Запустите Strapi под непривилегированным UNIX-пользователем.
  • Ограничьте доступ к PostgreSQL по IP (pg_hba.conf).
  • Включите SELinux в разрешительном режиме и настройте политики (при необходимости).
  • Отключите прямой доступ к порту 1337 из интернета — только через Nginx.
  • Регулярно обновляйте Node.js, Strapi и системные пакеты.
  • Настройте резервное копирование и тесты восстановления.

План отката и бэкапы

  • Перед апдейтом создайте дамп БД: pg_dump -U strapiuser strapidb > strapidb_backup.sql.
  • Сохраните копию каталога проекта и node_modules (или используйте lock-файл и npm ci).
  • Тестируйте обновление на staging перед production.

Тест-кейсы и приёмочные проверки

  • Тест-кейс 1: Создать пользователя-админа и войти в админку.
  • Тест-кейс 2: Создать новую коллекцию и добавить запись, затем получить запись через публичный API.
  • Тест-кейс 3: Перезагрузить сервер, убедиться, что PM2 автоматически восстановил процесс.
  • Тест-кейс 4: Проверить HTTPS, редирект с HTTP на HTTPS, и что сертификат корректен.

Миграции и совместимость

  • При переходе между крупными версиями Strapi читайте релиз-ноты — возможны breaking changes.
  • Тестируйте плагины и кастомные расширения в отдельной среде.

Краткая методология развертывания (mini-playbook)

  1. Подготовить staging-окружение (идентичное production).
  2. Сделать бэкап продакшн-БД и файлов проекта.
  3. Протестировать обновление на staging.
  4. Выполнить обновление на production в maintenance-окне.
  5. Проверить критичные пути (login, CRUD для контента, API запросы).
  6. Откатить при необходимости по плану отката.

Небольшой справочник (1‑строчная глоссарий)

  • Strapi: headless CMS на Node.js.
  • PM2: менеджер процессов для Node.js.
  • Nginx: веб-сервер и обратный прокси.
  • Certbot: клиент Let’s Encrypt для выпуска SSL.
  • PostgreSQL: реляционная СУБД.

Быстрые команды диагностики

  • pm2 logs strapi
  • systemctl status nginx
  • sudo nginx -t
  • ss -tuln | grep 1337
  • psql -U strapiuser -d strapidb -h localhost -c “SELECT 1”

Edge-cases — когда этот подход может не подойти

  • Низкий объём памяти (<2 ГБ): Strapi и PostgreSQL будут работать медленно; рассмотрите выделенный DB-хост.
  • Высокая нагрузка: масштабируйте Strapi горизонтально через кластеризацию или балансировщик.
  • Необходимость хранения файлов: настройте S3-совместимое хранилище для медиафайлов.

Краткий чек перед сдачей в продакшен

  • SSL выдан и продлевается автоматически
  • PM2 запущен и сохранён список процессов
  • Бэкапы БД настроены
  • Логи собираются и мониторятся
  • Права доступа и роли протестированы

Итог

Это поэтапное руководство покрывает установку Strapi на Rocky Linux 9 с PostgreSQL, Node.js, PM2, Nginx и Certbot. После выполнения шагов у вас будет безопасное и управляемое production-окружение для Strapi.

Важно: проверяйте релиз-ноты Strapi перед обновлением и тестируйте изменения в staging.

Summary:

  • Установите PostgreSQL 15 и создайте отдельную БД и пользователя для Strapi.
  • Сборка Strapi в production-режиме и запуск через PM2 гарантируют авто-перезапуск.
  • Nginx + Certbot обеспечат безопасный доступ по HTTPS.
  • Настройте резервные копии и мониторинг перед релизом в продакшен.

Если остались вопросы — опишите вашу конфигурацию, и я помогу адаптировать шаги под неё.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как убрать мерцание веб‑камеры в Windows 11
Веб-камеры

Как убрать мерцание веб‑камеры в Windows 11

Установить Windows 8.1 офлайн — инструкция
Обновления Windows

Установить Windows 8.1 офлайн — инструкция

Как использовать кодек XVID на Android
Видео

Как использовать кодек XVID на Android

Как разблокировать пользователя на Xbox
Xbox

Как разблокировать пользователя на Xbox

Акцентный цвет недоступен в меню «Пуск» Windows 11
Windows 11

Акцентный цвет недоступен в меню «Пуск» Windows 11

Strapi на Rocky Linux 9: установка, PM2 и SSL
DevOps

Strapi на Rocky Linux 9: установка, PM2 и SSL