DevOps

Как перенести монрепозиторий с Windows на Ubuntu Server

Пошаговое руководство по переносу монрепозитория React + NestJS + TypeORM + PostgreSQL с Windows на Ubuntu без GUI. Избегайте ошибок npm и node_modules: установка Node.js, npm ci, PostgreSQL, PM2 и Nginx для быстрого продакшена.

1 ответ 1 просмотр

Как перенести монрепозиторий проекта с Windows на Ubuntu Server (без GUI)?

Стек технологий:

  • Фронтенд: React + TypeScript + Tailwind CSS
  • Бэкенд: NestJS + TypeScript + TypeORM
  • База данных: PostgreSQL
  • Монрепозиторий: Vita

Проект запущен в продакшене на Windows и работает стабильно. При переносе на Ubuntu возникли ошибки при установке через npm (включая проблемы в node_modules), хотя на Windows всё работало идеально.

Как правильно перенести проект, чтобы избежать ошибок и быстро настроить его на Linux-сервере без длительной отладки?

Чтобы перенести монрепозиторий проекта на стеке React + TypeScript + Tailwind CSS, NestJS + TypeORM и PostgreSQL с Windows на Ubuntu Server без GUI и избежать ошибок npm в node_modules, начните с удаления node_modules, копирования чистого кода и свежей установки через npm ci после настройки системных пакетов вроде build-essential и libpq-dev. Это решает проблемы node-gyp для нативных модулей вроде pg в TypeORM, которые не переносятся с Windows из-за бинарных различий. Далее настройте PostgreSQL, соберите фронт и бэк с Vite/NestJS, и запустите через PM2 для продакшена — весь процесс займёт меньше часа при правильном подходе.


Содержание


Почему возникают ошибки npm при переносе с Windows на Ubuntu

Перенос монрепозитория с Windows на Ubuntu часто заканчивается крахом из-за node_modules — представьте: на Windows всё летает, а на сервере npm install сыплет ошибками вроде “node-gyp rebuild failed” или “pg: libpq not found”. Почему так? Всё дело в нативных модулях. Они компилируются под конкретную ОС и архитектуру: бинарники для Windows (x64) не работают на Linux (aarch64 или x86_64), плюс CRLF-символы в файлах путают скрипты.

Типичная картина: TypeORM с pg требует PostgreSQL-dev заголовков, Tailwind/Vite — специфичные линкеры. А в монрепо с Vite workspaces (я предполагаю, Vita — это Vite с монрепо-поддержкой) зависимости переплетаются, и копирование node_modules усугубляет хаос. Разработчики на Stack Overflow подтверждают: никогда не переносите node_modules целиком. Вместо этого — чистый код и rebuild на новой машине. Коротко: Windows генерит файлы с \r\n, Linux ожидает \n; плюс отсутствие системных lib’ов вроде python3 для gyp.

Но это решаемо. Главное — не копировать мусор.


Подготовка Ubuntu Server: установка Node.js и зависимостей

Сначала обновите систему и создайте non-root юзера — безопасность прежде всего. Подключитесь по SSH как root или sudo, выполните:

bash
apt update && apt upgrade -y
adduser deployer # ваш юзер для проекта
usermod -aG sudo deployer
su - deployer

Установите Node.js LTS (20.x на 2026 год) через NodeSource — apt-версия часто устаревшая. Гайд от dev.to рекомендует именно это:

bash
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v # должно показать v20.x.x
npm -v # 10.x+

Далее системные пакеты для npm/node-gyp и PostgreSQL (pg для TypeORM):

bash
sudo apt install -y build-essential python3 python3-pip libpq-dev git curl wget unzip
sudo apt install -y postgresql postgresql-contrib # БД сразу

Почему python3? Node-gyp его жрёт для компиляции. libpq-dev — для pg-модуля. Без них npm install взорвётся. Git нужен для clone. Проверьте: gcc --version и psql --version. Готово? Переходим к коду.


Перенос кода монрепозитория

Не архивируйте всю папку с node_modules! Сделайте ZIP или git clone чистого репозитория. На Windows:

  1. git status — убедитесь, что .gitignore игнорирует node_modules, dist, .env.
  2. git checkout main (или ваша ветка).
  3. ZIP: исключите node_modules: powershell Compress-Archive -Path * -Exclude node_modules,dist -DestinationPath project.zip
  4. Или push в GitHub/GitLab, если приватно.

На Ubuntu (как deployer):

bash
git clone https://github.com/your/repo.git # или scp project.zip и unzip
cd repo
git config core.autocrlf false # фикс CRLF
npm run prepare # если есть husky/pre-commit

Stack Overflow подчёркивает: для монрепо с Vite/NestJS чистый transfer обязателен. Проверьте package.json workspaces: должны быть “frontend”, “backend” или подобное. Если Vite — убедитесь в vite.config.ts: preserveSymlinks: true.

Код на месте. Теперь магия.


Установка зависимостей в монрепо: npm ci и фикс node-gyp

Вот где ломается 90% переносов. npm install — зло для продакшена, используйте npm ci. В корне монрепо:

bash
rm -rf node_modules package-lock.json # если скопировали случайно
npm ci --production=false # сначала все devDeps для build

Для Vite монрепо (React/Tailwind/NestJS): workspaces автоматически линкнутся в NPM 7+. Если ошибка node-gyp:

bash
npm rebuild # или npm run rebuild если скрипт

Для pg/TypeORM: npm install pg --build-from-source. Лучшая практика из SO: ci использует lock-файл, idempotentно. В монрепо запустите из root: npm ci && npm run build позже.

Проблемы? Лог: npm ci --verbose. Tailwind postcss — проверьте node version >=18. Готово, когда ls node_modules покажет пакеты без ошибок.


Настройка PostgreSQL и TypeORM

PostgreSQL уже стоит. Настройте:

bash
sudo systemctl start postgresql
sudo -u postgres psql
CREATE USER yourdbuser WITH PASSWORD 'strongpass';
CREATE DATABASE yourdb;
GRANT ALL PRIVILEGES ON DATABASE yourdb TO yourdbuser;
\q

В NestJS (backend/package.json или app.module.ts):

typescript
TypeOrmModule.forRoot({
 type: 'postgres',
 host: 'localhost',
 port: 5432,
 username: 'yourdbuser',
 password: 'strongpass',
 database: 'yourdb',
 autoLoadEntities: true,
 synchronize: false, // прод: false!
}),

.env: DB_HOST=localhost etc. Перезапустите psql для теста: psql -U yourdbuser -d yourdb -h localhost. TypeORM мигрирует при первом запуске (ormconfig или cli).

Без libpq-dev это не скомпилится — помните?


Сборка и запуск фронтенда и бэкенда

Соберите. В корне:

bash
npm run build # или lerna/vite build для workspaces

Фронт (React/Vite/Tailwind): cd frontend && npm run build — dist готов. Сервируйте статически позже.

Бэк (NestJS): cd backend && npm run start:dev для теста. Полный: npm run start:prod. Vite config требует: server: { port: 3001 }, Tailwind в tailwind.config.js — postcss уже соберёт.

Тест: curl localhost:3000/api/health. Работает? К продакшену.


Продакшен-деплой с PM2 и Nginx

PM2 — король для Node. Установите: npm i -g pm2.

Backend ecosystem.config.js:

js
module.exports = {
 apps: [{
 name: 'nest-backend',
 script: 'dist/main.js',
 cwd: './backend',
 env: { NODE_ENV: 'production' },
 }],
};

Запуск: pm2 start ecosystem.config.js --env production. Фронт: Nginx.

Nginx config (/etc/nginx/sites-available/default):

server {
 listen 80;
 root /path/to/repo/frontend/dist;
 index index.html;
 location /api/ { proxy_pass http://localhost:3000; }
}

sudo nginx -t && sudo systemctl restart nginx. PM2 autostart: pm2 startup && pm2 save. DigitalOcean гайд — bible для этого.

Логи: pm2 logs.


Проверка и распространённые проблемы

Всё сломалось? Чеклист:

  • node-gyp: sudo apt install python3 make g++.
  • pg error: export PG_CONFIG=/usr/bin/pg_config.
  • Vite HMR/monorepo: vite-tsconfig-paths плагин.
  • Port busy: sudo netstat -tlnp | grep 3000.
  • OOM: pm2 start --max-memory-restart 500M.
  • Tailwind не стилизует: purge в config, rebuild.

Мониторинг: pm2 monit. Лог ошибок? journalctl -u postgresql. Типичная засада — права: chown -R deployer:deployer /path/to/repo.

Если монрепо Vite как в примере GitHub, добавьте tsconfig paths. Тестируйте поэтапно — от deps до curl.


Источники

  1. Migrating Node.js/npm project from Windows to Linux — Решение ошибок node-gyp и pg при переносе: https://stackoverflow.com/questions/66335009/migrating-node-js-npm-project-from-windows-to-linux
  2. Move NodeJS server from Windows to Linux VPS — Полный гайд по установке Node.js и PM2 на Ubuntu: https://dev.to/andreik/move-nodejs-server-from-windows-to-linux-vps-5953
  3. Best practice for Node.js deployment: node_modules — Рекомендации по npm ci вместо install для продакшена: https://stackoverflow.com/questions/50693283/best-practice-for-nodejs-deployment-directly-moving-node-modules-to-server-or
  4. Vite Configuration — Настройки preserveSymlinks и workspaces для монрепо: https://vite.dev/config/
  5. How To Set Up a Node.js Application for Production on Ubuntu 20.04 — Деплой с PM2, Nginx и PostgreSQL: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-20-04
  6. Vite Monorepo — Пример настройки Vite с NPM workspaces и TypeScript: https://github.com/adiun/vite-monorepo

Заключение

Перенести монрепозиторий с Windows на Ubuntu Server без ошибок npm — это свежие deps через npm ci, системные пакеты и PM2/Nginx для стабильности. Вы сэкономите часы отладки, если следовать шагам: подготовка → перенос → ci → БД → build → deploy. Добавьте GitHub Actions для CI/CD в следующий раз. Теперь ваш React/NestJS-проект летает в проде на Linux — быстрее и дешевле Windows. Удачи!

Авторы
Проверено модерацией
Модерация