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

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

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

Начать курс

Введение: от разработки к продакшену на VPS

Деплой TypeScript приложения на VPS (Virtual Private Server) — это ключевой этап жизненного цикла любого веб-проекта. В отличие от простого размещения на shared-хостинге, VPS даёт полный контроль над окружением, что критично для современных TypeScript-приложений, работающих с Node.js, Express, NestJS или Next.js.

В этой статье мы рассмотрим продвинутый процесс деплоя: от компиляции TypeScript до настройки production-окружения с автоматическим рестартом, балансировкой нагрузки и мониторингом. Вы узнаете, как превратить сырой код в стабильно работающий сервис.

1. Подготовка TypeScript приложения к продакшену

1.1. Настройка сборки и конфигурации

Первый шаг — убедиться, что ваш tsconfig.json оптимизирован для продакшена. Вот рекомендуемая конфигурация:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "lib": ["ES2020"],
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist", "tests"]
}

Добавьте в package.json скрипты для сборки и запуска:

{
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js",
    "dev": "ts-node src/index.ts",
    "clean": "rm -rf dist"
  }
}

1.2. Управление переменными окружения

Используйте .env файлы с библиотекой dotenv. Для продакшена создайте отдельный файл .env.production:

NODE_ENV=production
PORT=3000
DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp_prod
DB_USER=app_user
DB_PASSWORD=secure_password_here
REDIS_URL=redis://localhost:6379

Загружайте конфигурацию в зависимости от окружения:

import dotenv from 'dotenv';
import path from 'path';

const envFile = process.env.NODE_ENV === 'production' 
  ? '.env.production' 
  : '.env.development';

dotenv.config({ path: path.resolve(__dirname, `../${envFile}`) });

export const config = {
  port: parseInt(process.env.PORT || '3000', 10),
  db: {
    host: process.env.DB_HOST || 'localhost',
    port: parseInt(process.env.DB_PORT || '5432', 10),
    name: process.env.DB_NAME || 'myapp',
    user: process.env.DB_USER || 'user',
    password: process.env.DB_PASSWORD || '',
  },
  redis: {
    url: process.env.REDIS_URL || 'redis://localhost:6379',
  },
  isProduction: process.env.NODE_ENV === 'production',
};

2. Настройка VPS и деплой приложения

2.1. Базовая настройка сервера

После покупки VPS (рекомендуем Ubuntu 22.04 LTS) выполните первичную настройку:

  • Обновление пакетов: sudo apt update && sudo apt upgrade -y
  • Установка Node.js 20 LTS: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt install -y nodejs
  • Установка Git: sudo apt install git -y
  • Создание пользователя: sudo adduser deployer && sudo usermod -aG sudo deployer

2.2. Клонирование и сборка проекта

Подключитесь к серверу по SSH и выполните:

# Переключаемся на пользователя
sudo -i -u deployer
cd ~

# Клонируем репозиторий
git clone https://github.com/your-username/your-app.git
cd your-app

# Устанавливаем зависимости
npm ci --only=production

# Собираем TypeScript
npm run build

# Создаем .env файл для продакшена
nano .env.production

2.3. Настройка PM2 для управления процессами

PM2 — это продвинутый менеджер процессов для Node.js приложений. Установите и настройте его:

# Установка PM2 глобально
sudo npm install -g pm2

# Создание конфигурационного файла ecosystem.config.js
nano ecosystem.config.js

Пример конфигурации для TypeScript приложения:

module.exports = {
  apps: [{
    name: 'my-ts-app',
    script: './dist/index.js',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
    },
    env_file: './.env.production',
    watch: false,
    max_memory_restart: '1G',
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    merge_logs: true,
  }]
};

Запустите приложение:

pm2 start ecosystem.config.js
pm2 save
pm2 startup  # Настройка автостарта при перезагрузке сервера

3. Настройка Nginx и SSL-сертификатов

3.1. Конфигурация Nginx как reverse proxy

Установите Nginx и настройте его для проксирования запросов к вашему Node.js приложению:

sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/myapp

Базовая конфигурация для TypeScript приложения:

server {
    listen 80;
    server_name your-domain.com www.your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        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;
        proxy_cache_bypass $http_upgrade;
    }

    # Статические файлы (                

Блоги

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