Установка Strapi + PostgreSQL на Ubuntu
Strapi — это headless CMS, которая работает на JavaScript и позволяет создавать структуру контента, а затем получать его по API. А еще он неплохо работает в связке с фронтед фреймворками, например Next.js.
Мы установим Strapi на Ubuntu, настроим Nginx, установим бесплатный SSL-сертификат Let’s Encrypt и сделаем, чтобы все стабильно работало с помощью менеджера процессов PM2. В качестве базы данных будем использовать PostgreSQL, т.к. стандартная база данных SQLite имеет некоторые недостатки, например, проблемы с регистронезависимым поиском по русским символам.
Требования
- Node.js: v18 или v20
- Менеджер пакетов Node.js: npm (v6 и выше) или yarn
- Сервер со следующими характеристиками
Рекомендуемые | Минимальные | |
---|---|---|
CPU | 2+ ядра | 1 ядро |
Память | 4GB+ | 2GB |
Диск | 32GB+ | 8GB |
- база данных PostgreSQL 11.0 - 14.0
- Ubuntu (LTS) 20.04 - 22.04
Если ищете быстрый и удобный хостинг для ваших проектов, то рекомендую Timeweb Cloud.
![](/_next/image?url=https%3A%2F%2Fwm.timeweb.ru%2Fimages%2Fposters%2F336x280%2F336x280.jpg&w=750&q=100)
Устанавливаем npm и Node.js
Устанавливаем npm
apt install npm
Устанавливаем Node.js
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt-get install -y nodejs
Установка и настройка PostgreSQL
Обновляем индекс локальных пакетов
sudo apt update
Устанавливаем пакет Postgres и -contrib
sudo apt install postgresql postgresql-contrib
Ура, мы установили PostgreSQL. Давайте теперь настроим ее.
Создаем базу данных
sudo -i -u postgres createdb strapi-db
или таким образом с нужной кодировкой
Создаем базу данных
CREATE DATABASE "strapi-db" WITH OWNER "postgres" ENCODING 'UTF8' LC_COLLATE = 'ru_RU.UTF-8' LC_CTYPE = 'ru_RU.UTF-8' TEMPLATE template0;
Создаем пользователя базы данных
sudo -i -u postgres createuser --interactive
Получим такое сообщение в консоли.
Вводим имя роли и делаем его суперпользователем
Enter name of role to add: strapi-user
Shall the new role be a superuser? (y/n) y
Открываем командную строку PostgreSQL
sudo -u postgres psql
Обновляем профиль и указываем пароль
ALTER USER strapi-user PASSWORD 'postgres_password';
Чтобы выйти из пользователя PostgreSQL, введите: \q
Смена локали
Вам может понадобиться установить локаль, для корректного преобразования букв в верхний и нижний регистр в функциях upper, lower. Это может пригодиться, например, при реализации регистронезависимого поиска.
Смотрим какая локаль установлена
locale
Если видим подобное сообщение, то нужно поменять локаль.
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Ожидали получить следующее сообщение:
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
Выполняем команду:
dpkg-reconfigure locales
В диалоговом окне выбираем ru_RU.UTF-8 UTF-8
, перезагружаем систему командой reboot
и проверяем установились ли локали командой locale
.
Установка Strapi
Вводим команду для установки Strapi
npx create-strapi-app@latest my-project
Далее нажимаем y
и запускаем установку. В консоли будут появляться вопросы, рекомендую ответить следующим образом. Только не забудьте ввести свои параметры подключения к базе данных.
Ответы на вопросы
? Choose your installation type Custom (manual settings)
? Choose your preferred language JavaScript
? Choose your default database client postgres
? Database name: strapi-db
? Host: 127.0.0.1
? Port: 5432
? Username: strapi-user
? Password: postgres_password
? Enable SSL connection: No
SSL мы настроим позже.
Перейдите в папку проекта и выполните сборку.
Переходим в папку проекта
cd my-project
Запускаем сборку
NODE_ENV=production npm run build
В консоли наблюдаем следующее
> my-project@0.1.0 build
> strapi build
Building your admin UI with production configuration...
✔ Webpack
Compiled successfully in 32.51s
Admin UI built successfully
Сборка готова, запускаем Strapi.
Команда для запуска Strapi
node /home/strapi-user/my-project/node_modules/.bin/strapi start
При успешном запуске вы увидите следующее сообщение и сможете перейти в админ панель.
Команда для запуска Strapi
Create your first administrator by going to the administration panel at:
┌─────────────────────────────┐
│ http://localhost:1337/admin │
└─────────────────────────────┘
Сейчас Strapi запустился в режиме разработки. Далее мы пропишем запуск в режиме production в диспетчере процессов PM2.
Установка Nginx
Устанавливаем nginx
sudo apt update # обновляем список пакетов (программ), доступных для установки
sudo apt install -y nginx # устанавливаем nginx
Сконфигурируем файрвол, разрешив некоторые виды трафика.
Сконфигурируем файрвол
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
Открыли два порта: 80 и 443, на них приходят http и https запросы к серверу и 22 порт для соединения по SSH.
Включаем файрвол
sudo ufw enable
Включаем nginx и добавляем в автозапуск
sudo systemctl enable --now nginx
Редактируем файл конфигурации nginx
sudo nano /etc/nginx/sites-available/default
Конфиг Nginx вы можете посмотреть в официальной документации и настроить под свои нужды: https://docs.strapi.io/dev-docs/deployment/nginx-proxy#nginx-virtual-host
В конфигурации мы будем сопоставлять псевдоним strapi c localhost:1337, настроим это в файле upstream.conf.
Nginx Upstream
# path: /etc/nginx/conf.d/upstream.conf
# Strapi server
upstream strapi {
server 127.0.0.1:1337;
}
Конфигурация для поддомена выглядит так
# path: /etc/nginx/sites-available/strapi.conf
server {
# Listen HTTP
listen 80;
server_name api.example.com;
# Redirect HTTP to HTTPS
return 301 https://$host$request_uri;
}
server {
# Listen HTTPS
listen 443 ssl;
server_name api.example.com;
# SSL config
ssl_certificate /path/to/your/certificate/file;
ssl_certificate_key /path/to/your/certificate/key;
# Proxy Config
location / {
proxy_pass http://strapi;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $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_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass_request_headers on;
}
}
После обновления конфигурации обязательно проверьте ее на ошибки.
Проверяем конфигурацию на ошибки
sudo nginx -t
Если все ок, то в консоли будет следующее сообщение
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Если ошибок нет, то можно перезагрузить nginx
sudo systemctl reload nginx
Можно пробовать открывать свой api.example.com
Установка PM2
PM2 будет автоматически запускать Strapi после перезагрузки сервера и обеспечивать бесперебойную работу.
Переходим в корневой каталог
cd ~
Устанавливаем PM2
sudo npm install pm2@latest -g
Создаем файл конфигурации PM2
sudo nano ecosystem.config.js
Не забудьте указать свои параметры подключения к базе данных.
Добавляем в файл настройки
module.exports = {
apps: [
{
name: 'strapi',
cwd: '/home/strapi-user/my-project',
script: 'npm',
args: 'start',
env: {
NODE_ENV: 'production',
DATABASE_HOST: 'localhost',
DATABASE_PORT: '5432',
DATABASE_NAME: 'strapi-db',
DATABASE_USERNAME: strapi-user,
DATABASE_PASSWORD: 'postgres_password',
},
},
],
};
Запускаем Strapi в фоновом режиме
pm2 start ecosystem.config.js
Устанавливаем запуск Strapi при запуске сервера
pm2 startup
В консоли видим следующее
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u strapi-user--hp /home/strapi-user
Сохраняем список процессов PM2
pm2 save
Если прейти на страницу Strapi, то мы увидим, что он теперь запущен в режиме production, на это будет указывать соответствующая надпись.
Установка Let’s Encrypt
Устанавливаем certbot
sudo snap install --classic certbot
Устанавливаем certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Открываем на текущей машине два порта: 80 и 443
sudo ufw allow 'Nginx Full'
Удаляем разрешение профиля HTTP
sudo ufw delete allow 'Nginx HTTP'
Получаем сертификат
sudo certbot --nginx -d my_domain -d
Вместо my_domain укажите свой домен. При установке нужно будет указать почту и согласиться с условиями в консоли.
В итоге мы установили Strapi с базой данных PostgreSQL и настроили все необходимое для работы сервера.
Больше информации в официальной документации Strapi: https://docs.strapi.io/dev-docs/setup-deployment
Следующим шагом может быть деплой frontend приложения. Как это сделать на примере Next.js смотрите тут: Деплой приложения Next.js на Ubuntu VPS