Как перестать бояться и начать деплоить: ваше первое продакшн-окружение
Вы написали крутое 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 — крутой