Перейти к содержимому

Build Output Manifest

Build Output Manifest — JSON-файл .onreza/manifest.json, который описывает что нужно развернуть и где это должно работать. Это контракт между вашим проектом и платформой.

Платформа читает манифест и выполняет ровно то, что в нём написано:

  • Статические файлы → CDN (мгновенная отдача, кэширование)
  • Серверные процессы → Compute sandbox (полный Node.js/Bun)

Ничего делать не нужно. nrz deploy автоматически создаёт манифест для статических сайтов.

nrz deploy определяет тип фреймворка и генерирует манифест автоматически. Никаких дополнительных пакетов устанавливать не нужно.

nrz deploy создаёт два слоя: статические ассеты → CDN, серверный процесс → Compute.

Создайте .onreza/manifest.json в output-директории вашего билда:

{
"version": 1,
"layers": [
{ "name": "site", "target": "STATIC", "directory": "." }
],
"routes": [
{ "pattern": "^/.*$", "layer": "site" }
]
}

Слой — это набор файлов с указанием, где их запускать:

Target Что это Когда использовать
STATIC CDN-раздача файлов HTML, CSS, JS, изображения, шрифты
COMPUTE Полный серверный процесс Next.js standalone, Express, Fastify — полный Node.js/Bun

Один деплой может содержать несколько слоёв. Статика раздаётся через CDN мгновенно, а static/compute usage покрывается общим usage credit и затем extra usage budget.

Маршруты определяют, какой STATIC или COMPUTE слой отвечает на URL после того, как edge уже применил Edge Rules и route pipeline:

{
"routes": [
{ "pattern": "^/_next/static/.*$", "layer": "static", "priority": 100 },
{ "pattern": "^/api/.*$", "layer": "server", "priority": 20 },
{ "pattern": "^/.*$", "layer": "server", "priority": 0 }
]
}

Как работает внутри terminal routing:

  1. Маршруты сортируются по priority (больше = проверяется раньше)
  2. Первый regex-match побеждает
  3. Запрос отправляется в слой, указанный в layer
Тип маршрута Priority
Hashed assets (/_next/static/) 100
Конкретные статические страницы 50
ISR страницы 30
API routes 20
Catch-all (серверный fallback) 0

Поле priority опционально (default: 0), но рекомендуется указывать явно при наличии нескольких маршрутов.

{
"version": 1,
"layers": [
{ "name": "site", "target": "STATIC", "directory": "dist" }
],
"routes": [
{ "pattern": "^/.*$", "layer": "site", "priority": 0 }
]
}
Поле Тип Обязательно Описание
name string да Уникальное имя слоя (до 64 символов)
target "STATIC" да Тип слоя
directory string да Директория с файлами относительно output-директории
Поле Тип Обязательно Описание
name string да Уникальное имя слоя
target "COMPUTE" да Тип слоя
directory string да Директория с серверным процессом
entry string да Путь к entry файлу
runtime object нет Настройки ресурсов
Поле Тип Обязательно Описание
pattern string да Regex-паттерн для URL (Rust regex синтаксис)
layer string да Имя слоя из layers
priority number нет Приоритет (default: 0, больше = раньше)
methods HttpMethod[] нет HTTP методы: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
revalidate number нет Время кэша в секундах (ISR). Только для COMPUTE слоёв
fallthrough boolean нет При 404 перейти к следующему маршруту. Default: true для STATIC, false для остальных

Когда STATIC-маршрут с fallthrough: true (default для всех STATIC) не находит файл в хранилище, запрос переходит к следующему подходящему маршруту вместо 404.

{
"routes": [
{ "pattern": "^/.*\\..*$", "layer": "static", "priority": 50 },
{ "pattern": "^/.*$", "layer": "server", "priority": 0 }
]
}
  • GET /favicon.ico → паттерн ^/.*\\..*$ совпал → STATIC (файл есть) → CDN
  • GET /style.css → паттерн ^/.*\\..*$ совпал → STATIC (файл есть) → CDN
  • GET /unknown.js → паттерн ^/.*\\..*$ совпал → STATIC (файла нет, fallthrough) → ^/.*$ → server → SSR
  • GET /about → паттерн ^/.*\\..*$ не совпал (нет расширения) → ^/.*$ → server → SSR напрямую
Задача Target
Статические файлы STATIC
Короткий HTTP handler, webhook, auth helper ONREZA Functions
Auth/middleware вокруг маршрутов Edge Rules pipeline + ONREZA Functions
SSR framework, API server, WebSocket, native modules COMPUTE

Правило: build output manifest описывает только deployment content: STATIC и COMPUTE. Functions публикуются отдельным self-contained entry source payload, а static redirects/rewrites/headers/cache задаются через Edge Rules.

Для COMPUTE слоёв можно задать лимиты ресурсов в поле runtime:

{
"name": "server",
"target": "COMPUTE",
"directory": "standalone",
"entry": "server.js",
"runtime": {
"timeoutMs": 60000,
"memoryMb": 512
}
}
Параметр COMPUTE default Описание
timeoutMs 300 000 (5 мин) Таймаут выполнения
memoryMb 256 Лимит памяти

Legacy middleware field удалён из build output manifest. Динамическую логику пишите как Edge Rules pipeline с ONREZA Function step, а простые redirects/rewrites/headers/cache переносите в статические Edge Rules.

Подробнее о миграции Middleware

Необязательные метаданные для dashboard и отладки:

{
"meta": {
"framework": { "name": "astro", "version": "5.2.0" }
}
}

Платформа показывает их в dashboard: «Deployed with Astro 5.2.0». Можно добавить любые поля — платформа сохраняет, но не валидирует содержимое. Максимальный размер: 16 KB.

Если манифест невалиден, деплой отклоняется с понятным сообщением:

Manifest validation failed:
layers[1].entry: Entry not found: "server/entry.mjs"
routes[2].layer: Route references unknown layer: "cdn"
See: docs.onreza.ru/manifest

Паттерны маршрутов используют синтаксис Rust regex crate. Следующие JavaScript-специфичные фичи не поддерживаются и вызовут ошибку валидации:

  • Lookahead / lookbehind: (?=...), (?!...), (?<=...), (?<!...)
  • Backreferences: \1, \2 и т.д.
  • Atomic groups: (?>...)

Используйте явные альтернативы. Например, вместо ^/((?!_next/static).*)$ используйте два маршрута с разными приоритетами.

Параметр Лимит
Слоёв на деплой 10
Маршрутов на деплой 200
Длина паттерна 500 символов
Длина name слоя 64 символа
Длина directory 256 символов
Длина entry 512 символов
Размер meta (JSON) 16 KB
Задача Pattern
Точный путь ^/about$
С trailing slash ^/about/?$
Dynamic segment ^/blog/[^/]+$
Wildcard ^/api/.*$
Catch-all ^/.*$
Hashed assets ^/_next/static/.*$
Multiple segments ^/blog/[^/]+/comments$
  • ONREZA Functions — HTTP functions на Bun runtime
  • Edge Rulesonreza.rules.toml, порядок edge-pipeline и CLI/UI приоритеты
  • Middleware — миграция на ONREZA Functions middleware