Depository of News

Архитектура контейнеризации Next.js: оркестрация Docker Compose, супервизоры процессов и разделение окружений

habrahabr.ru · world

Исторически развертывание приложений на базе Node.js на физических серверах или виртуальных машинах (VPS) опиралось на менеджеры процессов, среди которых стандартом де-факто стал PM2. В традиционных операционных системах PM2 решал фундаментальные задачи однопоточной природы Node.js: перезапуск при сбоях, автоматический запуск после перезагрузки ОС, ротацию журналов и вертикальное масштабирование на все доступные ядра центрального процессора посредством модуля cluster среды выполнения. Однако фундаментальный сдвиг в сторону микросервисной и контейнерной архитектуры видоизменил распределение ответственности между компонентами инфраструктуры. В экосистеме Docker базовой парадигмой является изоляция одного процесса в рамках одного контейнера. Попытка интеграции PM2 внутрь Docker-контейнера создает избыточный архитектурный слой — супервизор над другим супервизором. Демон Docker вместе с оркестраторами (Docker Compose, Kubernetes, Nomad) самостоятельно отслеживает жизненный цикл контейнеров, реализует политики перезапуска ( restart: unless-stopped ) и собирает метрики. Если внутри контейнера запускается стандартный демон PM2, дочерний процесс Node.js может аварийно завершиться или зависнуть в цикле утечки памяти, но для внешнего оркестратора контейнер продолжит отображаться как работоспособный, поскольку процесс самого менеджера PM2 остается активным. Начиная с версии 12, фреймворк Next.js предлагает встроенный режим сборки output: "standalone" . Данный механизм задействует алгоритм трассировки файлов зависимостей ( @vercel/nft ), сканирует дерево импортов и генерирует минимальный рабочий каталог .next/standalone . В него помещаются исключительно используемые в продакшене модули и скомпилированный HTTP-сервер server.js . Это позволяет отказаться от громоздкой команды next start , требующей наличия всей исходной директории node_modules , и сократить размер итогового образа Docker с 1–1.5 ГБ до компактных 100–150 МБ. Читать далее

Read full article →