Перейти к основному содержанию
HTML и серверный код остаются в Next.js. На CDN загружается только содержимое .next/static, доступное как _next/static. Файлы из public требуют отдельных URL. Поведение assetPrefix описано в документации Next.js.

1. Выберите адрес доставки

Общий CDN: https://cdn.erlcrussia.com/YOUR_TEAM_SLUG/releases/RELEASE_ID. Кастомный домен: https://files.example.com/releases/RELEASE_ID после регистрации, DNS/TLS-проверки. В API поле domain — это slug команды либо подтверждённое имя домена, без схемы и без префикса релиза.

2. Настройте production-сборку

next.config.js
Загружайте и запускайте одну и ту же production-сборку. После загрузки файлов запустите Next.js командой npm run start в своей среде размещения. Для кастомного домена укажите его адрес в CDN_ASSET_PREFIX перед сборкой.

3. Привяжите пользовательский ключ

Задайте API_BASE=https://api.erlcrussia.com. Пользовательские CDN-маршруты требуют erlcrussia-api-key; мастер-ключ для них не используется. Не помещайте ключ в NEXT_PUBLIC_*, HTML или JavaScript приложения.

4. Загрузите файлы до запуска релиза

Для каждого файла .next/static/RELATIVE_PATH отправьте запрос с путём releases/RELEASE_ID/_next/static/RELATIVE_PATH:
Для CSS используйте text/css, для шрифтов — MIME соответствующего формата. Не задавайте общий Content-Type: multipart/form-data вручную: boundary добавляет клиент. compress=false сохраняет байты и SHA-256 сборки. Для собственного домена замените domain на files.example.com. HTTP 200 возвращает { "success": true, "asset": { ... } }. Занятый явный путь даёт 409; не считайте это успешной перезаписью. Сравните SHA-256 существующего ассета или используйте новый RELEASE_ID. При 429 ждите Retry-After/Retry-After и повторяйте только отклонённый запрос. Загружайте последовательно с учётом общего лимита, а не сотнями параллельных запросов. Не загружайте всю .next: там находятся серверный код и конфигурация. Исходные карты .map публикуйте только при осознанной необходимости. Старые релизы сохраняйте, пока их используют открытые вкладки.

5. Картинки и другие public-файлы

Обычный img запрашивает CDN напрямую. При использовании оптимизации next/image браузер может обращаться к локальному /_next/image; это отдельный механизм. assetPrefix не переносит HTML, API, Server Actions и динамические данные Next.js на CDN.

6. Проверьте результат

В Network проверьте домен JS/CSS/шрифтов, MIME, CORS и HTTP 200. Сравните байты с исходными файлами, затем HEAD, Range (206) и условный запрос по ETag (304). Нажмите интерактивную кнопку: наличие HTML ещё не доказывает выполнение JavaScript. CDN доставляет заранее загруженные файлы. originUrl задаёт адрес перенаправления для корня домена или отсутствующего объекта, а не источник автоматической загрузки. Загрузите файлы сборки через API до публикации релиза. Пути, начинающиеся с _next/static/, получают immutable в CDN. Если перед _next стоит префикс релиза, текущая реализация применяет обычный Cache-Control; проверяйте фактический заголовок. Сброс кэша CDN не очищает браузерный кэш и сам по себе не подтверждает очистку Cloudflare.