Пошаговое руководство по развёртыванию блога с нуля: 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 небезопасно. Создайте отдельного пользователя для приложений без прав sudo — под ним будут работать Nuxt и Strapi.
# Создать пользователя (подставьте своё имя, например deploy) sudo adduser deploy
Дальше в руководстве предполагаются два аккаунта:
- пользователь с правами sudo (например root) — для системных команд (sudo apt, sudo ufw, правка конфигов Nginx и т.п.);
- пользователь deploy — для работы с кодом и запуска приложений (NVM, Node.js, npm ci, PM2 и т.д.).
В нужный момент можно переключиться в 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 'Nginx Full' sudo ufw enable
Такой вариант использует готовые профили UFW: OpenSSH не даёт вам потерять доступ по SSH после включения фаервола, а Nginx Full сразу открывает оба порта 80 и 443 под будущий HTTP/HTTPS. Если SSH у вас слушает нестандартный порт, дополнительно разрешите его отдельно через sudo ufw allow <порт>/tcp.
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 deploy:deploy /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-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-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. Dev-режимы (npm run dev / npm run develop) лучше запускать локально или в отдельном окружении для разработки.
Чтобы логи PM2 не разрастались и не забивали диск, настроим ротацию через модуль pm2-logrotate:
pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 10M # максимальный размер лог-файла pm2 set pm2-logrotate:retain 7 # хранить 7 файлов на процесс pm2 set pm2-logrotate:compress true # сжимать старые логи pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
После этого логи Nuxt и Strapi будут автоматически резаться и сжиматься: история сохраняется, но один процесс не сможет забить disk space бесконечными log-файлами.
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.