От локальной разработки до продакшена: деплой TypeScript приложений в 2024

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

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

Начать курс

Ваш 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 (покажу на примере)

  1. Загрузите проект на GitHub.
  2. Зайдите на Railway.app, нажмите «New Project» → «Deploy from GitHub repo».
  3. Выберите репозиторий. Railway сам определит, что это Node.js проект.
  4. Добавьте переменные окружения в разделе Variables.
  5. Настройте команду сборки: npm run build, команду запуска: npm start.

Всё! Через пару минут ваше TypeScript-приложение будет работать на домене вида myapp.up.railway.app. Можно подключить свой домен и настроить автоматический деплой при пуше в main.

Плюсы облаков: не надо думать о сервере, автоматические SSL-сертификаты, легко масштабировать.

Минусы: дороже VPS на больших объёмах, меньше контроля.

CI/CD: Автоматизируем деплой TypeScript-приложений

Ручной деплой —

Блоги

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