Supabase Edge Functions -> ONREZA Platform
Supabase Edge Functions — это
серверные TypeScript-функции на Deno-compatible runtime. Они часто живут рядом с
Supabase Auth, Postgres, Storage, Realtime, secrets и CLI-структурой
supabase/functions/<name>/index.ts.
В ONREZA нет цели запускать Supabase Edge Functions без изменений. Правильная миграция — разложить каждый сценарий по слоям ONREZA: ONREZA Functions, Compute, Edge Rules, KV Store и Managed PostgreSQL.
Что куда переносить
Заголовок раздела «Что куда переносить»| Supabase-сценарий | В ONREZA | Комментарий |
|---|---|---|
| Простой HTTP endpoint | ONREZA Functions | Перепишите handler на export default { fetch(request, ctx) }. |
| Webhook от Stripe, GitHub, Telegram, Resend | ONREZA Functions | Хороший сценарий, если подпись проверяется в коде и не нужен тяжёлый SDK. |
| Auth gate перед страницами приложения | Edge Rules + ONREZA Function | Pipeline step может проверить cookie/token и передать запрос в @app. |
| Middleware, redirects, headers, A/B, geo-routing | Edge Rules; для динамики — ONREZA Function | Простые правила держите в onreza.rules.toml, вычисления — в функции. |
| Session cache, rate limit counters | KV Store через ctx.kv | Подходит для короткоживущего состояния на уровне окружения. |
| Запросы к PostgreSQL из функции | Compute или внешний HTTP API | В public beta ONREZA Functions не открывают прямой SQL-клиент. |
| Supabase Storage / файловые операции | Compute, Static или внешний Storage API | Static assets не входят в source snapshot функции. |
| WebSocket relay, realtime proxy | Compute | ONREZA Functions не держат долгоживущие соединения. |
| Scheduled/background functions | Пока не переносите в ONREZA Functions | Используйте внешний scheduler, deploy hook или Compute endpoint до появления публичного контракта. |
Deno/npm/jsr/private packages, _shared modules | Compute или переписывание в self-contained function | ONREZA Functions public beta публикуют один самостоятельный entry file. |
Быстрое решение
Заголовок раздела «Быстрое решение»| Вопрос | Ответ |
|---|---|
Функция принимает HTTP request и быстро возвращает Response? | Начните с ONREZA Functions. |
Нужны node_modules, SDK, локальные helper-файлы или сборка? | Используйте Compute. |
| Код работает как middleware перед приложением? | Используйте Edge Rules pipeline. |
| Нужно хранить небольшое состояние для auth, sessions или rate limit? | Используйте ctx.kv. |
| Нужны WebSocket, long polling или свой HTTP server? | Используйте Compute. |
| Функция работает только потому, что Supabase автоматически проверяет JWT? | Явно перенесите auth-логику в функцию или pipeline. |
Перенос handler
Заголовок раздела «Перенос handler»Supabase-функция обычно выглядит примерно так:
Deno.serve(async (req) => { const secret = Deno.env.get("API_SECRET"); const { name } = await req.json();
return Response.json({ message: `Hello ${name}`, hasSecret: Boolean(secret), });});В ONREZA функция становится самостоятельным entry file:
export const config = { name: "hello",} as const;
export default { async fetch(request, ctx) { const secret = ctx.env.API_SECRET; const { name } = await request.json();
await ctx.log.info("hello request", { invocationId: ctx.invocation.id, });
return Response.json({ message: `Hello ${name}`, hasSecret: Boolean(secret), }); },};Главные изменения:
Deno.serve(...)заменяется наexport default { fetch(...) };Deno.env.get(...)заменяется наctx.env;console.*лучше заменить наctx.log;- имя функции задаётся через
config.nameили имя файла*.nrz-fn.*; - route задаётся не именем папки, а правилом в
onreza.rules.toml.
Привязка route
Заголовок раздела «Привязка route»В Supabase live URL обычно имеет вид:
https://<project-ref>.supabase.co/functions/v1/helloВ ONREZA вы сами выбираете публичный route через Edge Rules:
schema = "EDGE_RULE_SET_V1"source = { origin = "build" }
[[rule]]id = "hello-api"when.path = { prefix = "/api/hello" }when.method = ["POST"]action.pipeline = { override = true, steps = [ { handle = "hello" }, ],}После этого функция обслуживает /api/hello в выбранном окружении. Preview и
production имеют независимые rulesets и environment bindings, поэтому тестовую
миграцию можно сначала поднять в preview.
Auth и verify_jwt
Заголовок раздела «Auth и verify_jwt»В Supabase auth может быть частью платформенной проверки (verify_jwt) или
обёртки вокруг handler. В ONREZA сделайте auth явным:
- публичный webhook проверяет подпись провайдера в самом handler;
- user-facing endpoint проверяет cookie/JWT/API key в ONREZA Function;
- auth перед приложением оформляется как route pipeline step с
failure = "closed"; - секреты храните в environment bindings и читайте через
ctx.env.
[[rule]]id = "dashboard-auth"when.path = { prefix = "/dashboard" }action.pipeline = { steps = [ { use = "require-session", mode = "request", failure = "closed" }, { handle = "@app" }, ],}export const config = { name: "require-session",} as const;
export default { async request(request, ctx) { const sessionId = request.headers.get("cookie")?.match(/session=([^;]+)/)?.[1]; if (!sessionId) return Response.redirect(new URL("/login", request.url), 307);
const session = await ctx.kv.get(`session:${sessionId}`); if (!session) return Response.redirect(new URL("/login", request.url), 307);
ctx.locals.sessionId = sessionId; return request; },};Если текущая Supabase-функция полагается на Supabase Auth/RLS и
@supabase/supabase-js, не переносите её механически. Либо оставьте Supabase как
внешний backend и вызывайте нужный HTTPS API через fetch, либо перенесите
backend-часть в Compute, где можно использовать полноценные зависимости.
База данных и файлы
Заголовок раздела «База данных и файлы»Supabase Edge Functions часто обращаются к Supabase Postgres и Storage из того же handler. В ONREZA разделите этот код по назначению:
| Что делает функция | Рекомендуемый путь |
|---|---|
| Читает/пишет реляционные данные через SDK или SQL client | Compute + Managed PostgreSQL или внешняя БД |
| Делает простой HTTP-запрос к внешнему API | ONREZA Function с обычным fetch |
| Хранит session/cache/rate-limit state | ctx.kv |
| Загружает, обрабатывает или отдаёт файлы | Static, Compute или внешний Storage API |
| Генерирует картинки, PDF, screenshots, большие payload’ы | Compute |
В public beta ONREZA Functions не являются местом для прямых database/storage клиентов и не публикуют assets вместе с функцией. Это продуктовая граница: Functions остаются короткими handlers, а приложения с зависимостями и файлами работают в Compute.
Что поддерживается сейчас
Заголовок раздела «Что поддерживается сейчас»- HTTP
fetchhandlers. - Web APIs:
Request,Response,Headers,URL, streams, web crypto. - Обычный outbound
fetchс ограничениями платформы. ctx.envдля environment bindings.ctx.kvдля небольшого состояния на уровне окружения.ctx.log,ctx.invocation,ctx.locals, короткийctx.waitUntil.- Route pipeline вокруг Static, Compute или terminal-функции.
- Локальная проверка через
nrz functions check.
Что пока не поддерживается в ONREZA Functions
Заголовок раздела «Что пока не поддерживается в ONREZA Functions»- Deno runtime compatibility и
Deno.*APIs. npm:,jsr:,deno.land/x, import maps,deno.json._sharedmodules, local relative imports, private npm packages.@supabase/supabase-jsи другие package imports внутри Functions.- Прямые SQL, Redis, S3/Storage clients из Functions.
- WebSocket servers, listeners, long polling и свой HTTP server.
- Scheduled/background customer API.
- Static files, generated bundles, sourcemaps, WASM/native addons.
- Streaming responses как production-контракт без response body cap.
Следите за ONREZA Functions: когда новая возможность становится публичным контрактом, она появляется там с лимитами и примерами.
Скорее всего не будет поддерживаться в ONREZA Functions
Заголовок раздела «Скорее всего не будет поддерживаться в ONREZA Functions»Эти сценарии не являются временным пробелом. Они противоречат границе short-lived Functions и должны жить в Compute или Static:
- запуск произвольного
node_modules/package manager во время вызова функции; - долгоживущий server lifecycle,
listen, WebSocket server; - subprocess, shell, FFI, native addons;
- ambient access к host environment вместо явных bindings;
- Functions как архив для assets, больших bundle’ов и static file serving;
- полная совместимость с Deno CLI/runtime layout.
Порядок миграции
Заголовок раздела «Порядок миграции»- Составьте список функций в
supabase/functions/*и отметьте, какие из них HTTP-only, webhook, auth/middleware, DB/Storage-heavy или WebSocket-heavy. - Для каждой функции выберите слой ONREZA по таблице выше: ONREZA Functions, Edge Rules, Compute, Static, KV или Managed PostgreSQL.
- Перепишите self-contained HTTP handlers в
*.nrz-fn.tsи заменитеDeno.envнаctx.env. - Перенесите routing в
onreza.rules.toml; auth-gates делайте pipeline step сfailure = "closed". - Для функций с зависимостями создайте Compute-приложение и перенесите туда SDK, database clients, обработку файлов и WebSocket-логику.
- Запустите
nrz functions check, затем задеплойте preview и проверьте реальные маршруты, логи и ожидаемую модель оплаты.