Тип: how-to + ограничения · Статус: локальный standalone flow работает; Docker/CI deploy требуют доработки · Источник истины:
next.config.ts,Dockerfile,.gitlab-ci.ymlи Route Handlers
Next.js настроен с output: 'standalone' и рассчитан на Node.js 24. Репозиторий умеет собрать
production output локально, но текущий Dockerfile и GitLab pipeline не образуют готовый end-to-end
deployment.
npm ci
cp .env.example .env
npm run build
npm run prodПроверьте:
curl --fail http://localhost:3000/api/health
curl --fail http://localhost:3000/api/ready
curl --fail http://localhost:3000/api/metricsnpm run prod использует next start. Container runtime запускает минимальный
.next/standalone/server.js; это разные entrypoints одного build output.
Задуманный multi-stage flow:
depsнаnode:24-alpineвыполняетnpm ciпо workspace manifests.builderкопирует source, получает build args и выполняетnpm run build.runnerкопирует standalone server, static assets иpublic/, затем работает непривилегированным пользователемnextjsна порту3000.
Docker image сейчас нельзя считать воспроизводимо собираемым:
depsвыполняетCOPY packages/design-tokens/package.json, но workspace удалён;- builder передаёт только часть variables, обязательных для импортируемых env schemas;
NEXT_PUBLIC_BFF_PATH,BACK_INTERNAL_URL,APP_ENV,FRONT_HOST,PORT,CIи serverSENTRY_DSNсреди прочего не объявлены как build args;.dockerignoreотсутствует, поэтому локальные.env, build/test artifacts и другие лишние файлы могут попасть в build context; случайно скопированный.envспособен скрыть проблему и раскрыть secrets в layers/context.
Исправление Dockerfile/.dockerignore является отдельной infrastructure задачей. Не обходите
валидацию копированием реального .env в image и не передавайте secrets как публичные build args.
Public NEXT_PUBLIC_* значения должны быть корректны на этапе build. Server variables нужны
builder из-за текущей config validation и повторно задаются контейнеру на runtime для
instrumentation/API calls.
После исправления Dockerfile runtime запуск должен передавать как минимум полный server schema
contract из environment.md. Не полагайтесь на builder ENV: final stage их не
наследует.
Sentry auth token нужен для source map upload во время production build и не должен оставаться в
final image. Предпочтителен BuildKit secret или CI secret mount, а не persisted ARG/ENV layer.
Текущий pipeline содержит stages:
codequality → test → deploy
codequalityвыполняетnpm run verify:fast.testустанавливает Chromium prerequisites и выполняетnpm run test, то есть оба Vitest projects.- Standalone Playwright E2E не запускается.
- Next.js production build не выполняется,
.nextartifacts не создаются. .gitlab/deploy.yamlсодержит только закомментированный extension point; deploy job отсутствует.
Следовательно, deploy job нельзя просто подключить к существующему artifact: он должен отдельно
построить image/bundle или получить его из нового build stage. Проверяйте также project-level и
remote GitLab includes — они не видны из репозитория и могут ожидать удалённый build job.
| Endpoint | Текущее поведение | Чего не гарантирует |
|---|---|---|
/api/health |
Всегда JSON { "message": "OK" }, status 200 |
Доступность backend, Sentry или storage |
/api/ready |
Всегда JSON { "message": "OK" }, status 200 |
Готовность зависимостей и прогрев cache |
/api/metrics |
Возвращает текущий Prometheus registry | Authentication и network-level isolation |
Используйте health как process/liveness probe. Readiness пока семантически эквивалентна liveness; не настраивайте на неё traffic gating с ожиданием upstream checks. Metrics endpoint нужно закрыть на ingress/network уровне, если он не должен быть публичным.
В production приложение отправляет X-Accel-Buffering: no, чтобы reverse proxy не буферизовал
streaming responses. Ingress всё равно нужно проверять отдельно: он может переопределить header,
timeouts или compression.
Browser API transport в production использует NEXT_PUBLIC_BACK_URL напрямую. Текущий CSP имеет
connect-src 'self' data: wss: ws: и не добавляет произвольный HTTPS backend/Sentry origin.
Cross-origin backend может быть заблокирован CSP даже при правильном CORS. До production launch
нужно либо использовать same-origin URL, либо отдельно согласованно расширить CSP и протестировать
CORS/cookies. Не ослабляйте CSP до *.
- Server runtime регистрирует OTEL и Sentry; client Sentry запускается только в production.
tracesSampleRateсейчас равен1на server и client.- Client Sentry настроен с
sendDefaultPii: true. - Prometheus registry process-local; несколько replicas отдают разные snapshots.
Перед production проверьте стоимость sampling, data retention, consent/PII policy и фактическую доставку Sentry через CSP. Не утверждайте, что observability готова к требованиям конкретного проекта без этой проверки.
- Выполнить
npm ci, полный verification и production build в чистом environment. - Устранить Docker blockers или определить другой поддерживаемый artifact flow.
- Зафиксировать build-time public URLs и runtime server secrets/URLs.
- Проверить CORS, cookie attributes и CSP для production backend/Sentry origins.
- Проверить streaming через реальный ingress.
- Решить semantics readiness и доступ к metrics.
- Проверить Sentry PII/sampling и source map upload без утечки token.
- Добавить настоящий deploy job с rollout/rollback и artifact provenance.
- Выполнить smoke tests
/api/health,/api/ready,/api/metricsи ключевого page/API flow.