Введение: почему VPS — лучший выбор для продакшена
Разработка JavaScript-приложения на Node.js — это только половина дела. Вторая, не менее важная часть — деплой на production-сервер. Многие начинающие разработчики используют бесплатные хостинги (Heroku, Render, Vercel), но для серьёзных проектов рано или поздно потребуется VPS (Virtual Private Server).
VPS даёт полный контроль над окружением: вы сами выбираете версию Node.js, настраиваете веб-сервер, управляете процессами и ресурсами. В этой статье мы разберём пошаговый процесс деплоя JavaScript-приложения на VPS с использованием современных инструментов: Nginx как reverse proxy, PM2 для управления процессами, Let's Encrypt для SSL и GitHub Actions для автоматизации.
Шаг 1: Подготовка сервера и установка необходимого ПО
Первый шаг — подключение к вашему VPS (обычно через SSH) и установка базового набора инструментов. Предположим, вы используете Ubuntu 22.04 LTS.
# Обновляем пакеты
sudo apt update && sudo apt upgrade -y
# Устанавливаем Node.js (рекомендуется через NodeSource)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Проверяем версии
node -v
npm -v
# Устанавливаем Git (если ещё не установлен)
sudo apt install git -y
# Устанавливаем Nginx
sudo apt install nginx -y
Также обязательно настройте базовый файрвол (UFW):
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
Шаг 2: Клонирование репозитория и настройка приложения
Теперь нужно перенести код приложения на сервер. Самый простой способ — клонировать репозиторий из GitHub/GitLab.
# Переходим в директорию /var/www (стандартная для веб-проектов)
cd /var/www
# Клонируем репозиторий (замените на свой URL)
sudo git clone https://github.com/ваш-username/ваш-репозиторий.git myapp
# Даём права текущему пользователю
sudo chown -R $USER:$USER /var/www/myapp
# Переходим в папку приложения
cd /var/www/myapp
# Устанавливаем зависимости
npm install --production
Создайте файл .env для переменных окружения (порт, ключи API, строка подключения к БД):
# Пример .env
PORT=3000
NODE_ENV=production
DATABASE_URL=mongodb://localhost:27017/myapp
JWT_SECRET=ваш-секретный-ключ
Шаг 3: Настройка PM2 для управления процессом
PM2 — это менеджер процессов для Node.js, который автоматически перезапускает приложение при падении и поддерживает его работу в фоне.
# Устанавливаем PM2 глобально
sudo npm install -g pm2
# Запускаем приложение (если entry point — app.js или server.js)
pm2 start app.js --name "myapp"
# Сохраняем список процессов для автостарта при перезагрузке
pm2 save
pm2 startup systemd
После выполнения pm2 startup вы увидите команду, которую нужно выполнить с правами root. Скопируйте и выполните её.
Проверить статус можно командой pm2 status. Если приложение запущено, оно будет доступно по адресу http://ваш-ip:3000 (порт из .env).
Шаг 4: Настройка Nginx как reverse proxy
Прямой доступ к Node.js через порт 3000 — не лучшая практика. Лучше использовать Nginx как прокси-сервер, который будет принимать запросы на 80-й порт (HTTP) и перенаправлять их на ваше приложение.
Создайте конфигурационный файл для вашего домена (или IP):
sudo nano /etc/nginx/sites-available/myapp
Вставьте следующий код:
server {
listen 80;
server_name ваш-домен.ru www.ваш-домен.ru;
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;
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;
}
}
Активируйте конфигурацию и перезагрузите Nginx:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t # проверка синтаксиса
sudo systemctl reload nginx
Теперь ваше приложение доступно по домену (или IP-адресу) без указания порта.
Шаг 5: Установка SSL-сертификата (HTTPS)
Без HTTPS современный сайт выглядит непрофессионально и небезопасно. Используем Certbot от Let's Encrypt.
# Устанавливаем Certbot
sudo apt install certbot python3-certbot-nginx -y
# Получаем сертификат (укажите ваш домен)
sudo certbot --nginx -d ваш-домен.ru -d www.ваш-домен.ru
# Следуйте инструкциям на экране
После успешной установки Certbot автоматически обновит конфигурацию Nginx, добавив редирект с HTTP на HTTPS и настройки SSL. Сертификат обновляется автоматически раз в 90 дней.
Шаг 6: Автоматизация деплоя через GitHub Actions (CI/CD)
Чтобы не заходить на сервер каждый раз при обновлении кода, настроим автоматический деплой. Создайте в корне репозитория файл .github/workflows/deploy.yml:
name: Deploy to VPS
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm install --production
pm2 restart myapp
Блоги
Рекомендаций по книгам
Читайте также