Введение: Зачем деплоить JavaScript приложение на VPS?
Разработка современного веб-приложения на JavaScript (Node.js) — это только половина дела. Вторая, не менее важная часть — это деплой, то есть развертывание вашего проекта на реальном сервере, доступном в интернете. Использование виртуального частного сервера (VPS) дает вам полный контроль над окружением, в отличие от shared-хостинга. Вы можете настроить сервер под свои нужды, установить любые зависимости и обеспечить высокую производительность.
В этом руководстве мы шаг за шагом разберем процесс деплоя типичного JavaScript (Node.js) приложения на VPS. Мы рассмотрим все этапы: от начальной настройки сервера до запуска приложения в production-режиме с использованием менеджера процессов PM2 и обратного прокси-сервера Nginx. Статья ориентирована на разработчиков, уже знакомых с основами Node.js и командной строкой Linux.
1. Подготовка VPS и начальная настройка
Первый шаг — аренда VPS у любого провайдера (DigitalOcean, Linode, Vultr или российские аналоги). Рекомендуемый минимальный тариф: 1 vCPU, 1-2 GB RAM. Операционная система — Ubuntu 22.04 LTS (или новее).
1.1. Подключение к серверу по SSH
После получения IP-адреса и root-пароля, подключитесь к серверу из вашего терминала:
ssh root@ваш_IP_сервера
Если вы используете SSH-ключ (рекомендуется), укажите путь к приватному ключу:
ssh -i ~/.ssh/id_rsa root@ваш_IP_сервера
1.2. Создание пользователя и базовая безопасность
Никогда не работайте под root постоянно. Создайте нового пользователя и дайте ему sudo-права:
adduser myuser
usermod -aG sudo myuser
Затем настройте SSH-ключ для нового пользователя (скопируйте публичный ключ с вашей локальной машины) и отключите вход по паролю в файле /etc/ssh/sshd_config:
PasswordAuthentication no
Перезапустите SSH-сервис: sudo systemctl restart sshd.
1.3. Установка необходимого ПО
Обновите пакетный менеджер и установите Node.js (рекомендуем LTS версию через NodeSource), Git и Nginx:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs git nginx
Проверьте версии: node -v и npm -v.
2. Клонирование репозитория и установка зависимостей
Теперь, когда сервер готов, перенесем на него код вашего приложения.
2.1. Клонирование проекта
Перейдите в домашнюю директорию пользователя и клонируйте репозиторий с GitHub (или другого Git-хостинга):
cd /home/myuser
git clone https://github.com/ваш_логин/ваш_репозиторий.git myapp
cd myapp
2.2. Установка зависимостей и тестовый запуск
Установите все npm-пакеты, указанные в package.json:
npm install
Если в проекте используется переменные окружения (например, для базы данных или API-ключей), создайте файл .env и заполните его:
nano .env
Пример содержимого:
PORT=3000
DATABASE_URL=mongodb://localhost:27017/mydb
NODE_ENV=production
Запустите приложение вручную, чтобы убедиться, что оно работает:
node app.js
Проверьте доступность через curl http://localhost:3000 или откройте в браузере http://ваш_IP:3000 (предварительно разрешив порт в фаерволе). Если все работает, остановите процесс (Ctrl+C).
3. Настройка менеджера процессов PM2
Приложение, запущенное через node app.js, остановится, как только вы закроете SSH-сессию. Для постоянной работы используется PM2 — менеджер процессов для Node.js, который автоматически перезапускает приложение при падении и управляет логами.
3.1. Установка и запуск
sudo npm install -g pm2
pm2 start app.js --name "myapp"
Проверьте статус:
pm2 status
Вы должны увидеть строку с вашим приложением и статусом "online".
3.2. Настройка автозапуска
Чтобы PM2 запускался вместе с сервером, выполните:
pm2 startup systemd
Скрипт выведет команду, которую нужно скопировать и выполнить. Затем сохраните список процессов:
pm2 save
4. Настройка обратного прокси через Nginx
Ваше приложение сейчас работает на порту 3000 (или другом). Чтобы пользователи могли обращаться к нему по стандартным портам 80 (HTTP) и 443 (HTTPS), настроим Nginx как reverse proxy.
4.1. Конфигурация Nginx
Создайте новый файл конфигурации для вашего домена (или используйте IP-адрес):
sudo nano /etc/nginx/sites-available/myapp
Вставьте следующую конфигурацию (замените your_domain.com на ваш домен или IP):
server {
listen 80;
server_name your_domain.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;
}
}
Сохраните файл и создайте символическую ссылку в sites-enabled:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/