SSR · CI/CD · 2026

2026 SSR на удалённом Mac:
Next.js и Nuxt — память Node и параллелизм сборки

26.03.2026 Фронтенд / Full-stack 9 мин чтения

Для кого материал: для фронтенд- и fullstack-инженеров, которые собирают SSR на Next.js или Nuxt на удалённом Mac — по SSH на арендованный Apple Silicon, как self-hosted runner или как префлайт-узел перед продакшеном. Ключевые слова для runbook и SEO: удалённый Mac, Next.js, Nuxt, память Node, параллелизм сборки. Задача — не «теория тюнинга», а исполняемые переменные окружения и верхние границы, которые можно закоммитить рядом с YAML пайплайна, чтобы продакшен-подобные next build и nuxt build не падали с непрозрачным OOM, когда узел слабее ноутбука разработчика. Monorepo и изоляция версий Node описаны в гайдах: pnpm, Turborepo и удалённый кэш и изоляция Node/npm на удалённом Mac; проверка деплоя и путей — в чек-листе деплоя фронтенда и Safari.

01 Лимит памяти и пороги срабатывания OOM

Компиляция SSR долго держит в RAM большие графы зависимостей: модули маршрутов, серверные бандлы, карты кода, иногда дублирующийся разбор AST при параллельных плагинах. На срезе CI с удалённым Mac редко приходит вежливый stack trace — чаще JavaScript heap out of memory, код выхода 134 или 137 после вмешательства OOM-killer.

Практическое правило порога: если типичный resident set size одной сборки стабильно превышает ~70% памяти, зарезервированной под эту задачу до пиков пререндера, вы уже в зоне риска: пики приходят на минификации, статической генерации или упаковке Nitro, а не на первом проходе TypeScript.

Исполняемое исправление: задайте жёсткий потолок кучи V8, чтобы процесс упал с понятной ошибкой, а не «утонул» в swap на macOS. Перед шагом сборки в той же оболочке:

  • Куча на задачу: export NODE_OPTIONS="--max-old-space-size=8192" (на хостах с 16 ГБ ОЗУ чаще стартуют с 6144; 12288–16384 — только если на машине реально есть запас и одновременно идёт одна сборка).
  • Паритет CI: ту же строку NODE_OPTIONS продублируйте в GitHub Actions, GitLab, Jenkins и SSH-сессии — иначе цифры «на MacBook работает» не совпадут с раннером удалённого Mac.
  • Шум телеметрии: для Next.js в CI полезно export NEXT_TELEMETRY_DISABLED=1; вместе с установкой по frozen lockfile это снижает фоновую нагрузку на узел.

02 Параллельные воркеры и связь с CPU — таблица

Apple Silicon показывает много ядер, но SSR — смесь CPU-транспиляции и память-ёмких графов. Увеличение воркеров сверх пропускной способности RAM не ускоряет wall time — оно повышает вероятность параллельных OOM. «Максимум воркеров» считайте произведением числа ядер и бюджета кучи на процесс.

Если оркеструете несколько пакетов, ограничьте и конкурентность оркестратора (например --concurrency у Turborepo), чтобы две тяжёлые SSR-сборки не пиковали одновременно — см. выше ссылку на чек-лист monorepo и удалённый кэш.

Производительные ядра (типичный уровень M4) Безопасное число параллельных SSR-сборок на одном хосте Стартовый --max-old-space-size на сборку (МБ) Заметки
4 1 6144–8192 Резервируйте RAM под sshd, файловые вотчеры и кэш ОС; не смешивайте с тяжёлым Playwright в том же окне.
8 1 (крупные приложения) / 2 (меньше по графу) 4096–6144 каждая При >300 маршрутах или тяжёлом i18n держите 1 задачу; вторую ставьте в очередь.
10+ 2 4096–8192 каждая Следите за swap; если в Activity Monitor давление памяти «жёлтое», сначала уменьшайте число задач, а не наращивайте heap.
  • Пул libuv: опционально UV_THREADPOOL_SIZE=8 для нативно-нагруженных графов зависимостей; не превышайте число производительных ядер.
  • Тесты и сборки: лимитируйте Jest/Vitest отдельно (--maxWorkers=50% или явное число); не переносите настройки «машины сборки» на шарды E2E.

03 Каталоги кэша и стратегия очистки

Устаревший кэш на общих хостах удалённого Mac даёт дрейф «локально зелёно, на CI красно» и быстрее забивает небольшие SSD, чем повторные npm install. Разделите пути «удалить, чтобы сбросить поведение» и «удалить, чтобы освободить диск», чтобы дежурный инженер случайно не снёс тёплый кэш посреди инцидента.

  • Next.js: артефакты в .next/; персистентный webpack-кэш часто в .next/cache/. Жёсткий сброс — удалить весь .next перед next build.
  • Nuxt 3: dev-артефакты в .nuxt/; прод-вывод в .output/; метаданные Vite нередко в node_modules/.cache/. Скрипт очистки при смене пресета Nitro или серверных маршрутов должен убирать .nuxt и .output.
  • pnpm store: не удаляйте store как «быстрый фикс» одного приложения — используйте pnpm store prune после переноса проектов.
  • Расписание: еженедельный cron или maintenance-job в CI, который подрезает выходы сборок старше N дней, плюс проверка df -h перед ночными пайплайнами.

04 FAQ о стабильности удалённого узла

Почему тот же коммит собирается на ноутбуке, а на арендованном Mac падает по OOM? Разные значения NODE_OPTIONS, меньший единый пул памяти или матрица CI, где две SSR-сборки идут параллельно со Storybook. Закрепите одну тяжёлую сборку на этап и синхронизируйте флаги кучи.

Всегда ли ставить воркеры на «максимум» ради скорости? Нет: больше воркеров — выше пик RSS; оптимум обычно между 50% и 100% производительных ядер только если в этот шаг машина отдана одной сборке.

Диск заполнился посреди сборки — что ломается первым? У Next может не записаться .next/cache; у Nuxt/Vite инкрементальный кэш может повредиться. Падайте шагом, освободите место, удалите кэши фреймворка, переустановите с frozen lockfile и пересоберите.

Нужен ли Rosetta в 2026? На Apple Silicon предпочитайте arm64-бинарники Node; x64 под эмуляцией тратит больше памяти и замедляет CI настолько, что маскируются гонки.

05 Матрица Next.js vs Nuxt и чек-лист

Таблица для внутренних доков и user-data self-hosted runner: какие ручки команды ждут в Slack при инциденте. Дополняет таблицу конкурентности выше и связывается с практикой CI/CD и профилированием производительности узла.

Тема Next.js (SSR / эра App Router) Nuxt 3 (Vite + Nitro)
Главный рычаг RAM NODE_OPTIONS=--max-old-space-size=… вокруг next build Тот же NODE_OPTIONS вокруг nuxt build; пики при упаковке Nitro
Типичные каталоги кэша .next/, особенно .next/cache .nuxt/, .output/, node_modules/.cache
Логика параллелизма Ограничить job-матрицу; одно крупное next build на окно хоста Кап параллельных Nuxt-сборок; апгрейды Vite/Nitro — с инвалидацией кэша
Сигнал CI/CD Ошибки кучи на этапах сбора данных страниц / пререндер OOM на серверном бандле или фазах rollup Nitro
  1. Экспортируйте NODE_OPTIONS и NEXT_TELEMETRY_DISABLED (Next) в той же оболочке, что запускает сборку.
  2. Одна тяжёлая SSR-сборка на этап, пока профилирование RSS не докажет обратное.
  3. Скрипт удаления кэша (.next / .nuxt / .output) повесьте на флаг в runbook.
  4. В начале CI логируйте uname -m, node -p process.arch и свободную память для триажа регрессий.
Вывод

Память Node и параллелизм сборки — согласованные входы CI/CD: поднимайте heap только когда одна задача владеет машиной, и не компенсируйте лишними параллельными SSR одним лишь --max-old-space-size. Зафиксируйте каталоги Next.js и Nuxt, автоматизируйте очистку и держите раннеры удалённого Mac на arm64-цепочке для предсказуемых пайплайнов в 2026 году.

Выделенный Apple Silicon под CI

Арендуйте удалённый Mac под SSR-сборки — настройка памяти и воркеров без сюрпризов

Mac Mini M4 с предсказуемым объёмом RAM, arm64 Node и запасом диска под .next и .output. Откройте страницу покупки без обязательного входа в аккаунт: посмотрите тарифы, выберите регион и план, оформите заказ и подключите пайплайн или SSH к стабильному хосту — как в разделе помощи по доступу.

RAM под SSR CI/CD Apple Silicon
Купить без входа