Ваш TypeScript-код готов к покорению мира? Пора отправлять его в продакшен
Вы написали идеальное TypeScript-приложение. Локально всё летает, типы строгие, код красивый. Но как только встаёт вопрос «А как это запустить на сервере?», многие разработчики впадают в ступор. Знакомо?
Деплой TypeScript-приложений — это не rocket science, но и не «просто скопировал папку». В этой статье мы разберём три основных подхода: классический VPS, современный Docker и облачные платформы. Вы узнаете, как правильно собрать TypeScript-проект, настроить окружение и автоматизировать выкатку обновлений. Поехали!
Шаг 1: Подготовка TypeScript-приложения к деплою
Прежде чем думать о серверах, нужно убедиться, что ваше приложение готово к работе вне локальной среды. TypeScript — это надстройка, которая компилируется в JavaScript. На сервере Node.js не понимает .ts файлы напрямую (если вы не используете ts-node, что для продакшена не рекомендуется).
Сборка проекта
Убедитесь, что в вашем package.json прописаны правильные скрипты:
{
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"dev": "ts-node-dev --respawn src/index.ts"
},
"main": "dist/index.js"
}
Команда npm run build создаст папку dist с готовым JS-кодом. Именно эту папку мы будем деплоить.
Совет: добавьте "outDir": "./dist" в tsconfig.json и настройте exclude для node_modules:
{
"compilerOptions": {
"outDir": "./dist",
"rootDir": "./src",
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
Метод 1: Классический VPS — полный контроль
VPS (Virtual Private Server) — это арендованный сервер, где вы — царь и бог. Подходит для проектов, где нужен полный контроль над окружением. Рассмотрим деплой на Ubuntu 22.04.
Настройка сервера
- Подключаемся по SSH:
ssh root@ваш_IP - Обновляем пакеты:
apt update && apt upgrade -y - Устанавливаем Node.js 20.x:
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt install -y nodejs - Устанавливаем PM2 — менеджер процессов для Node.js:
npm install -g pm2
Деплой приложения
Самый простой способ — скопировать файлы через SCP или Git. Рекомендую Git:
git clone https://github.com/ваш-репозиторий/проект.git /var/www/myapp
cd /var/www/myapp
npm install
npm run build
pm2 start dist/index.js --name "myapp"
pm2 save
pm2 startup
Важно: настройте Nginx как reverse proxy, чтобы приложение было доступно по 80 порту:
server {
listen 80;
server_name ваш-домен.ru;
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;
}
}
Не забудьте настроить SSL через Certbot — это бесплатно и обязательно для современного веба.
Метод 2: Docker — контейнеризация для воспроизводимости
Docker решает главную проблему VPS: «На моей машине работает!». Контейнер содержит всё необходимое — Node.js, зависимости, собранный код. Окружение идентично на любой ОС.
Dockerfile для TypeScript
Создаём многоэтапную сборку (multi-stage build) — это уменьшает финальный образ:
# Этап 1: сборка TypeScript
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Этап 2: production образ
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/index.js"]
Собираем и запускаем:
docker build -t my-ts-app .
docker run -d -p 3000:3000 --name myapp my-ts-app
Docker Compose для продакшена
Если у вас есть база данных или Redis, используйте docker-compose.yml:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
postgres_data:
Запуск одной командой: docker-compose up -d. Красота, правда?
Метод 3: Облачные платформы — деплой в один клик
Если не хотите возиться с серверами, используйте облачные сервисы: Railway, Fly.io, Render или Heroku (хотя он уже не тот). Они берут на себя управление инфраструктурой.
Деплой на Railway (покажу на примере)
- Загрузите проект на GitHub.
- Зайдите на Railway.app, нажмите «New Project» → «Deploy from GitHub repo».
- Выберите репозиторий. Railway сам определит, что это Node.js проект.
- Добавьте переменные окружения в разделе Variables.
- Настройте команду сборки:
npm run build, команду запуска:npm start.
Всё! Через пару минут ваше TypeScript-приложение будет работать на домене вида myapp.up.railway.app. Можно подключить свой домен и настроить автоматический деплой при пуше в main.
Плюсы облаков: не надо думать о сервере, автоматические SSL-сертификаты, легко масштабировать.
Минусы: дороже VPS на больших объёмах, меньше контроля.
CI/CD: Автоматизируем деплой TypeScript-приложений
Ручной деплой —