Деплой JavaScript приложения на VPS: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему 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

Блоги

Рекомендаций по книгам