javascript

Полный деплой Strapi CMS + Nuxt.js на Ubuntu

  • воскресенье, 1 марта 2026 г. в 00:00:09
https://habr.com/ru/articles/1004920/

Пошаговое руководство по развёртыванию блога с нуля: Strapi CMS (админка и API) и Nuxt.js (фронтенд) на VPS Ubuntu. В итоге — работающий блог за Nginx с возможностью включить SSL по отдельной инструкции.

1. Подготовка сервера

Подключитесь к VPS по SSH. Обновите систему и при необходимости задайте пароль root:

sudo apt update && sudo apt upgrade -y
sudo passwd root   # опционально: установить пароль root

2. Создание пользователя Ubuntu

Работать под root небезопасно. Создайте отдельного пользователя для приложений и переключитесь на него.

# Создать пользователя (подставьте своё имя, например deploy)
sudo adduser deploy

# Добавить в группу sudo и переключиться
sudo usermod -aG sudo deploy
sudo su - deploy

Дальнейшие шаги выполняйте от имени этого пользователя. При необходимости настроить SSH-ключ для deploy — добавьте свой authorized_keys в ~/.ssh в его домашней директории.

3. Установка пакетов и фаервол

Установите нужные пакеты:

sudo apt install -y curl nginx nano git ufw

Откройте порты и включите UFW:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS (на случай последующей настройки SSL)
sudo ufw enable

4. Установка Node.js 24 через NVM

Устанавливаем NVM, затем Node.js 24 (LTS-линия):

# Установка NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash

# Подгрузить NVM в текущую сессию (вместо перезапуска shell)
. "$HOME/.nvm/nvm.sh"

# Установка Node.js 24
nvm install 24

Проверка версий:

node -v   # ожидается v24.13.1 (или актуальная v24.x)
npm -v    # ожидается 11.8.0 (или актуальная 11.x)

Чтобы NVM подхватывался при каждом входе, в ~/.bashrc уже должна быть строка подключения скрипта NVM — при установке она добавляется автоматически.

5. Установка PM2

PM2 — менеджер процессов для Node.js: держит приложения запущенными и перезапускает при сбоях.

npm install -g pm2
pm2 update

pm2 update синхронизирует PM2 с системой (рекомендуется после первой установки).

6. Клонирование проектов

Создайте каталог для сайтов и склонируйте репозитории (подставьте свои URL):

sudo mkdir -p /var/www
sudo chown $USER:$USER /var/www
cd /var/www

git clone https://github.com/your-user/nuxt-blog.git client
git clone https://github.com/your-user/strapi-blog.git server

client — фронтенд на Nuxt, server — бэкенд и админка Strapi.

7. Подготовка Nuxt.js

В каталоге client в package.json должны быть скрипты для dev, build и продакшн-запуска:

"scripts": {
  "dev": "nuxt dev",
  "build": "nuxt build",
  "start": "nuxt start"
}

Для продакшена соберите приложение:

cd /var/www/client
npm ci
npm run build

8. Подготовка Strapi

В каталоге server установите зависимости и при необходимости задайте переменные окружения (БД, APP_KEYS, API_TOKEN_SALT, ADMIN_JWT_SECRET, JWT_SECRET — см. документацию Strapi). Для быстрого старта достаточно .env с HOST=0.0.0.0 и PORT=1337.

cd /var/www/server
npm ci
# При необходимости: npm run build (для production-режима)

9. Настройка Nginx

Nginx будет проксировать запросы на Nuxt (порт 3000) и Strapi (порт 1337).

Сайт Nuxt (фронтенд блога):

sudo nano /etc/nginx/sites-available/nuxt.conf
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Сайт Strapi (админка и API):

sudo nano /etc/nginx/sites-available/strapi.conf
server {
    listen 80;
    server_name panel.example.com;

    location / {
        proxy_pass http://localhost:1337;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Замените example.com и panel.example.com на свои домены или IP на время проверки.

Включите сайты и перезагрузите Nginx:

sudo ln -s /etc/nginx/sites-available/nuxt.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/strapi.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

10. Конфигурация PM2

В каждом проекте создайте ecosystem.config.cjs для запуска через PM2.

Nuxt — в /var/www/client/ecosystem.config.cjs:

module.exports = {
  apps: [
    {
      name: 'client-dev',
      script: 'npm',
      args: 'run dev',
      cwd: '/var/www/client',
      env: { NODE_ENV: 'development' }
    },
    {
      name: 'client-prod',
      script: 'npm',
      args: 'run start',
      cwd: '/var/www/client',
      env: { NODE_ENV: 'production' }
    }
  ]
};

Strapi — в /var/www/server/ecosystem.config.cjs:

module.exports = {
  apps: [
    {
      name: 'server-dev',
      script: 'npm',
      args: 'run develop',
      cwd: '/var/www/server',
      env: {
        NODE_ENV: 'development',
        HOST: '0.0.0.0',
        PORT: 1337
      }
    },
    {
      name: 'server-prod',
      script: 'npm',
      args: 'run start',
      cwd: '/var/www/server',
      env: {
        NODE_ENV: 'production',
        HOST: '0.0.0.0',
        PORT: 1337
      }
    }
  ]
};

Для продакшена используйте client-prod и server-prod, для разработки — client-dev и server-dev.

11. Запуск и автозапуск

Запуск (пример для режима разработки):

cd /var/www/client
pm2 start ecosystem.config.cjs --only client-dev

cd /var/www/server
pm2 start ecosystem.config.cjs --only server-dev

Сохранить список процессов и настроить автозапуск после перезагрузки сервера:

pm2 save
pm2 startup

Выполните команду, которую выведет pm2 startup (обычно с sudo).

12. Полезные команды

pm2 list           # список процессов
pm2 logs           # логи всех приложений
pm2 logs client-dev --lines 100   # логи одного приложения
pm2 restart all    # перезапуск всех
pm2 restart client-prod server-prod   # перезапуск выбранных
pm2 save           # сохранить текущий список для автозапуска

13. Заключение

В результате у вас:

  • Отдельный пользователь Ubuntu для деплоя;

  • Node.js 24 и PM2;

  • Nuxt (фронтенд блога) и Strapi (CMS и API) за Nginx;

  • Автозапуск приложений после перезагрузки сервера;

Напоминание: разработка Strapi (Content-Types, роли, медиа) и интеграция Nuxt с API делаются заранее, до деплоя — на локальной машине или в отдельном окружении. На сервер выкатываются уже готовые проекты. Для продакшена переключите PM2 на client-prod и server-prod.