Деплой: VPS, Railway, Vercel

Практические инструкции деплоя Node.js-приложения на три типа платформ: VPS (полный контроль), Railway (PaaS, минимальная настройка), Vercel (для frontend и serverless API).

Зачем нужно

Знать несколько способов деплоя полезно: каждый подходит для своих задач. Vercel — мгновенный деплой React/Next.js. Railway — backend + PostgreSQL без администрирования. VPS — максимальный контроль и минимальная стоимость для серьёзных проектов.

Где используется

  • Vercel: SPA, Next.js, serverless API
  • Railway: Node.js API с базой данных, Discord-боты, сервисы
  • VPS: production backend с Docker, сложные конфигурации, несколько сервисов

Основной контент

Деплой на Vercel (Next.js / SPA)

npm install -g vercel
vercel login

# Деплой (первый раз — спросит настройки)
vercel

# Production деплой
vercel --prod
# vercel.json() для React Router SPA
{
  "rewrites": [{ "source": "/(.*)", "destination": "/" }]
}

Или через GitHub: Settings → Integrations → GitHub → выбрать репо → каждый push в main деплоится автоматически.

Деплой на Railway

npm install -g @railway/cli
railway login

# В директории проекта
railway init           # создать проект
railway up             # задеплоить
railway open           # открыть в браузере

# Добавить PostgreSQL
railway add --plugin postgresql
# DATABASE_URL автоматически добавится в переменные окружения

# Просмотр логов
railway logs

# Переменные окружения
railway variables set JWT_SECRET=mysecret
railway variables      # список
// package.json — Railway автоматически запускает npm start
{
  "scripts": {
    "start": "node dist/index.js",
    "build": "tsc"
  }
}

Деплой на VPS (пошагово)

# 1. Подготовка сервера (Ubuntu 22.04)
ssh root@SERVER_IP

# Создать пользователя
adduser deploy
usermod -aG sudo deploy

# Скопировать SSH-ключ для нового пользователя
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

# Установить Docker
curl -fsSL https://get.docker.com | sh
usermod -aG docker deploy

# Выйти и зайти под deploy
exit
ssh deploy@SERVER_IP
# 2. Клонировать репо и запустить
git clone https://github.com/myuser/myapp.git /var/www/myapp
cd /var/www/myapp

# Создать .env с продакшн-переменными
nano .env

# Запустить через docker-compose
docker compose -f docker-compose.yml up -d

# Проверить
docker compose ps
docker compose logs -f
# 3. Nginx + SSL
sudo apt install nginx certbot python3-certbot-nginx

# Создать конфиг
sudo nano /etc/nginx/sites-available/myapp
# (конфиг reverse proxy → localhost:3000)

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t && sudo nginx -s reload

# SSL
sudo certbot --nginx -d myapp.com -d www.myapp.com

Автодеплой на VPS через GitHub Actions

# .github/workflows/deploy.yml
name: Deploy to VPS

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.VPS_HOST }}
          username: deploy
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /var/www/myapp
            git pull origin main
            docker compose up -d --build
            docker image prune -f

Сравнение подходов

Аспект Vercel Railway VPS
Время до деплоя 5 минут 10 минут 1-2 часа
Стоимость Бесплатно / $20 $5+ $3-6/мес
Масштабирование Авто Авто Вручную
БД Только внешняя Встроенная Self-hosted
Контроль Низкий Средний Полный

Частые ошибки

  • Деплоить секреты в Vercel/Railway через открытый репозиторий — использовать только dashboard environment variables
  • Не настроить HEALTHCHECK и readiness — платформа думает что сервис готов до его реальной инициализации
  • VPS без firewall — открыты все порты, только SSH + 80 + 443 должны быть публичными
  • Не делать docker image prune на VPS — диск заполняется старыми образами

Связанные темы

Ресурсы