Как перенести монрепозиторий с Windows на Ubuntu Server
Пошаговое руководство по переносу монрепозитория React + NestJS + TypeORM + PostgreSQL с Windows на Ubuntu без GUI. Избегайте ошибок npm и node_modules: установка Node.js, npm ci, PostgreSQL, PM2 и Nginx для быстрого продакшена.
Как перенести монрепозиторий проекта с 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
- Подготовка Ubuntu Server: установка Node.js и зависимостей
- Перенос кода монрепозитория
- Установка зависимостей в монрепо: npm ci и фикс node-gyp
- Настройка PostgreSQL и TypeORM
- Сборка и запуск фронтенда и бэкенда
- Продакшен-деплой с PM2 и Nginx
- Проверка и распространённые проблемы
- Источники
- Заключение
Почему возникают ошибки 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, выполните:
apt update && apt upgrade -y
adduser deployer # ваш юзер для проекта
usermod -aG sudo deployer
su - deployer
Установите Node.js LTS (20.x на 2026 год) через NodeSource — apt-версия часто устаревшая. Гайд от dev.to рекомендует именно это:
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):
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:
git status— убедитесь, что .gitignore игнорирует node_modules, dist, .env.git checkout main(или ваша ветка).- ZIP: исключите node_modules:
powershell Compress-Archive -Path * -Exclude node_modules,dist -DestinationPath project.zip - Или push в GitHub/GitLab, если приватно.
На Ubuntu (как deployer):
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. В корне монрепо:
rm -rf node_modules package-lock.json # если скопировали случайно
npm ci --production=false # сначала все devDeps для build
Для Vite монрепо (React/Tailwind/NestJS): workspaces автоматически линкнутся в NPM 7+. Если ошибка node-gyp:
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 уже стоит. Настройте:
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):
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 это не скомпилится — помните?
Сборка и запуск фронтенда и бэкенда
Соберите. В корне:
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:
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.
Источники
- 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
- 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
- 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
- Vite Configuration — Настройки preserveSymlinks и workspaces для монрепо: https://vite.dev/config/
- 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
- 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. Удачи!