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

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
Быстрый план
- Подготовка сервера и пакетов
- Настройка firewall
- Установка PostgreSQL и создание БД
- Установка Node.js и Strapi
- Управление процессом через PM2
- Установка Nginx и получение SSL через Certbot
- Конфигурация Nginx и финальная проверка
- Обновление 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://
.
После проверки остановите сервер (Ctrl+C) и удалите временное правило firewall (порт 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
.
Админ-панель доступна по адресу https://strapi.example.com/admin
.
Заполните данные администратора и нажмите “Let’s start” для входа в панель.
Шаг 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)
- Подготовить staging-окружение (идентичное production).
- Сделать бэкап продакшн-БД и файлов проекта.
- Протестировать обновление на staging.
- Выполнить обновление на production в maintenance-окне.
- Проверить критичные пути (login, CRUD для контента, API запросы).
- Откатить при необходимости по плану отката.
Небольшой справочник (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.
- Настройте резервные копии и мониторинг перед релизом в продакшен.
Если остались вопросы — опишите вашу конфигурацию, и я помогу адаптировать шаги под неё.
Похожие материалы

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

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

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

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

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