MAATRIX / Блог / Деплой монорепозитория на один VPS

Деплой монорепозитория на один VPS

Блог MAATRIX · 2026-07-07

Фронт, API и воркер в одном репозитории — удобно разрабатывать, но нужно грамотно задеплоить. Развернём монорепо на VPS: соберём затронутые пакеты, запустим сервисы и разведём их по доменам nginx.

Почему монорепо и один VPS

['Монорепозиторий (Turborepo, Nx, pnpm workspaces) держит фронт, бэкенд и общие пакеты вместе: единые версии, общий код, атомарные изменения. Разворачивать несколько сервисов из него удобно на одном VPS с root — вы сами решаете, что и где запускать.', 'Сборка монорепо — это тяжёлый Node-процесс с кэшем. NVMe + быстрые ядра AMD EPYC у MAATRIX ускоряют install и build, а на одном сервере можно поднять сразу фронт, API и воркеры без переплат за отдельные инстансы.', 'Типичная ошибка — размазывать монорепо по нескольким платным сервисам: фронт на одном хостинге, API на другом, воркер на третьем. Это дорого и усложняет деплой, ведь версии кода на сервисах расходятся. Один VPS с root решает задачу элегантно: вы клонируете репозиторий, собираете нужные пакеты и запускаете все процессы рядом, разводя их по портам и доменам. Для команд из России удобно и то, что зарубежный сервер оплачивается картой РФ, СБП, криптой или токеном MAAT.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для монорепозитория

Готовим сервер

['
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -\napt install -y nodejs nginx git\nnpm install -g pnpm pm2\npnpm -v && pm2 -v
', 'Клонируем репозиторий и ставим зависимости всего воркспейса одной командой:', '
git clone https://github.com/USER/monorepo /opt/app\ncd /opt/app\npnpm install --frozen-lockfile
']

Сборка только затронутого

['Turborepo кэширует и собирает лишь изменённые пакеты — это резко ускоряет деплой:', '
pnpm turbo run build\n# или собрать конкретные пакеты\npnpm turbo run build --filter=web --filter=api
', 'Кэш Turborepo лежит в node_modules/.cache/turbo; на NVMe повторные сборки почти мгновенные. Флаг --filter позволяет собирать и деплоить только реально изменившиеся приложения — если правился лишь apps/api, нет смысла пересобирать фронт. В связке с CI это сокращает время релиза в разы.']

Запуск сервисов через PM2

['Опишем все процессы монорепо в одном ecosystem-файле /opt/app/ecosystem.config.js:', "
module.exports = {\n  apps: [\n    { name: 'web',    cwd: 'apps/web',    script: 'pnpm', args: 'start', env: { PORT: 3000 } },\n    { name: 'api',    cwd: 'apps/api',    script: 'pnpm', args: 'start', env: { PORT: 4000 } },\n    { name: 'worker', cwd: 'apps/worker', script: 'pnpm', args: 'start' }\n  ]\n};
", 'Один ecosystem-файл описывает все процессы монорепо: PM2 поднимет их разом, будет следить за падениями и рестартить. Флаги cwd и env задают рабочую директорию и порт для каждого приложения, чтобы сервисы не конфликтовали. Запускаем всё и включаем автостарт после ребута:', '
cd /opt/app\npm2 start ecosystem.config.js\npm2 save\npm2 startup systemd
']

nginx-роутинг и частые ошибки

['Разводим сервисы по доменам: фронт на основном домене, API на поддомене. nginx слушает 443 и проксирует на локальные порты, которые наружу закрыты файрволом — публично торчит только сам nginx.', '
server {\n    listen 443 ssl http2;\n    server_name example.com;\n    location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; }\n}\nserver {\n    listen 443 ssl http2;\n    server_name api.example.com;\n    location / { proxy_pass http://127.0.0.1:4000; proxy_set_header Host $host; }\n}
', '
nginx -t && systemctl reload nginx
', '
  • pnpm install падает по памяти — добавьте swap или используйте --frozen-lockfile и больший тариф.
  • Сервис не стартует после ребута — забыли pm2 save и pm2 startup.
  • Конфликты портов — задавайте PORT в env каждого приложения явно.
', 'Для нулевого даунтайма при релизе используйте pm2 reload ecosystem.config.js вместо restart — PM2 перезапускает процессы по очереди, не обрывая обслуживание. Один VPS от MAATRIX держит весь монорепо-стек, а ежедневные бэкапы фиксируют состояние сервера перед каждым релизом.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для монорепозитория

Частые вопросы

Turborepo или Nx?

Оба кэшируют и собирают инкрементально. Turborepo проще для JS/TS-проектов, Nx мощнее для крупных полиглот-монорепо.

PM2 или Docker для монорепо?

PM2 проще и легче на одном сервере; Docker удобнее, если нужна строгая изоляция окружений между сервисами.

Хватит ли одного VPS?

Для среднего проекта да. При росте нагрузки выносите тяжёлые сервисы на отдельный VPS — апгрейд тарифа делается без переезда.