Введение: от разработки к продакшену на 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;
}
# Статические файлы (