Деплой JavaScript приложений на PythonLib: VPS, Docker и Cloud

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

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

Начать курс

Как перестать бояться и начать деплоить: ваше первое продакшн-окружение

Вы написали крутое JavaScript-приложение. Оно работает локально, тесты проходят, а в консоли — ни одной ошибки. Но как только встаёт вопрос «а как это запустить на реальном сервере?», у многих начинается паника. VPS, Docker, облачные платформы — звучит как что-то из области DevOps, а не фронтенда или бэкенда на Node.js.

На самом деле всё проще, чем кажется. В этой статье мы разберём три основных подхода к деплою JavaScript-приложений: на VPS, в Docker и в облако. Я покажу реальные примеры кода, объясню плюсы и минусы каждого метода, и вы сможете выбрать то, что подходит именно вашему проекту.

Что такое деплой и зачем он вообще нужен?

Деплой (deploy) — это процесс развёртывания вашего приложения на сервере, где оно будет доступно пользователям 24/7. Локальная разработка — это только первый шаг. Без деплоя ваш проект остаётся просто набором файлов на вашем компьютере.

Для JavaScript-разработчиков особенно актуальны три сценария:

  • Деплой на VPS — полный контроль над сервером.
  • Деплой в Docker — изоляция и воспроизводимость окружения.
  • Деплой в облачные платформы — минимальная возня с инфраструктурой.

Давайте разберём каждый вариант подробно.

Деплой на VPS: ручное управление и полный контроль

VPS (Virtual Private Server) — это виртуальный сервер, на который вы можете поставить любую ОС и настроить всё вручную. Это классика, которая даёт максимум гибкости.

Шаг 1: Выбор и настройка сервера

Для начала арендуем VPS (например, у DigitalOcean, Hetzner или Timeweb). Минимальная конфигурация для Node.js — 1 vCPU и 1 GB RAM. Выбираем Ubuntu 22.04 LTS.

После получения доступа по SSH делаем базовую настройку:

ssh root@ваш_IP_сервера

# Обновление пакетов
apt update && apt upgrade -y

# Установка Node.js 20.x
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs

# Проверка
node -v
npm -v

Шаг 2: Клонирование репозитория и установка зависимостей

Предположим, ваше приложение лежит на GitHub. Клонируем его на сервер:

git clone https://github.com/ваш_username/ваш_репозиторий.git
cd ваш_репозиторий
npm install --production

Шаг 3: Настройка переменных окружения

Никогда не храните секреты в коде. Создайте файл .env:

nano .env

# Пример содержимого
PORT=3000
DATABASE_URL=mongodb://localhost:27017/myapp
JWT_SECRET=ваш_супер_секретный_ключ

Шаг 4: Запуск через PM2

PM2 — это менеджер процессов для Node.js. Он автоматически перезапускает приложение при падении и поддерживает его работу:

npm install -g pm2
pm2 start app.js --name "my-app"
pm2 save
pm2 startup

Готово! Ваше приложение работает на порту 3000. Чтобы сделать его доступным по 80-му порту, используйте Nginx как reverse proxy.

apt install nginx -y
nano /etc/nginx/sites-available/default

Внутри файла пропишите:

server {
    listen 80;
    server_name ваш_домен.ру;

    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;
    }
}

Перезапустите Nginx:

nginx -t
systemctl restart nginx

Плюсы VPS: полный контроль, можно настроить что угодно, низкая стоимость.

Минусы: нужно самому заниматься безопасностью, бэкапами, обновлениями.

Деплой в Docker: контейнеризация для воспроизводимости

Docker решает главную проблему VPS: «на моей машине всё работает». Контейнер содержит всё необходимое — от Node.js до системных библиотек. Вы гарантируете, что приложение поведёт себя одинаково на любом сервере.

Шаг 1: Создание Dockerfile

В корне проекта создаём файл Dockerfile:

# Используем официальный образ Node.js
FROM node:20-alpine

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем package.json и package-lock.json
COPY package*.json ./

# Устанавливаем зависимости
RUN npm install --production

# Копируем исходный код
COPY . .

# Открываем порт
EXPOSE 3000

# Команда запуска
CMD ["node", "app.js"]

Шаг 2: Сборка и запуск контейнера

Локально собираем образ и проверяем:

docker build -t my-js-app:latest .
docker run -p 3000:3000 -d my-js-app

Если всё работает — отлично. Теперь загружаем образ в Docker Hub или в приватный registry:

docker tag my-js-app:latest ваш_username/my-js-app:latest
docker push ваш_username/my-js-app:latest

Шаг 3: Docker Compose для продакшна

Если у вас несколько сервисов (например, приложение + база данных), используйте docker-compose.yml:

version: '3.8'

services:
  app:
    image: ваш_username/my-js-app:latest
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=mongodb://mongo:27017/myapp
    depends_on:
      - mongo

  mongo:
    image: mongo:6
    volumes:
      - mongo-data:/data/db

volumes:
  mongo-data:

Запускаем одной командой:

docker-compose up -d

Плюсы Docker: воспроизводимость, изоляция, легко масштабировать.

Минусы: дополнительный слой абстракции, нужно разбираться с оркестрацией для продакшна.

Деплой в облачные платформы: минимум хлопот

Если не хотите возиться с серверами и Docker, используйте облачные платформы (Platform as a Service). Они сами управляют инфраструктурой. Для JavaScript лучшие варианты:

  • Vercel — идеально для Next.js и статики.
  • Netlify — крутой

Блоги

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