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

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 endpointONREZA FunctionsПерепишите handler на export default { fetch(request, ctx) }.
Webhook от Stripe, GitHub, Telegram, ResendONREZA FunctionsХороший сценарий, если подпись проверяется в коде и не нужен тяжёлый SDK.
Auth gate перед страницами приложенияEdge Rules + ONREZA FunctionPipeline step может проверить cookie/token и передать запрос в @app.
Middleware, redirects, headers, A/B, geo-routingEdge Rules; для динамики — ONREZA FunctionПростые правила держите в onreza.rules.toml, вычисления — в функции.
Session cache, rate limit countersKV Store через ctx.kvПодходит для короткоживущего состояния на уровне окружения.
Запросы к PostgreSQL из функцииCompute или внешний HTTP APIВ public beta ONREZA Functions не открывают прямой SQL-клиент.
Supabase Storage / файловые операцииCompute, Static или внешний Storage APIStatic assets не входят в source snapshot функции.
WebSocket relay, realtime proxyComputeONREZA Functions не держат долгоживущие соединения.
Scheduled/background functionsПока не переносите в ONREZA FunctionsИспользуйте внешний scheduler, deploy hook или Compute endpoint до появления публичного контракта.
Deno/npm/jsr/private packages, _shared modulesCompute или переписывание в self-contained functionONREZA 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.

Supabase-функция обычно выглядит примерно так:

supabase/functions/hello/index.ts
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:

functions/hello.nrz-fn.ts
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.

В 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.

В 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" },
],
}
functions/require-session.nrz-fn.ts
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 clientCompute + Managed PostgreSQL или внешняя БД
Делает простой HTTP-запрос к внешнему APIONREZA Function с обычным fetch
Хранит session/cache/rate-limit statectx.kv
Загружает, обрабатывает или отдаёт файлыStatic, Compute или внешний Storage API
Генерирует картинки, PDF, screenshots, большие payload’ыCompute

В public beta ONREZA Functions не являются местом для прямых database/storage клиентов и не публикуют assets вместе с функцией. Это продуктовая граница: Functions остаются короткими handlers, а приложения с зависимостями и файлами работают в Compute.

  • HTTP fetch handlers.
  • 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.
  • Deno runtime compatibility и Deno.* APIs.
  • npm:, jsr:, deno.land/x, import maps, deno.json.
  • _shared modules, 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.
  1. Составьте список функций в supabase/functions/* и отметьте, какие из них HTTP-only, webhook, auth/middleware, DB/Storage-heavy или WebSocket-heavy.
  2. Для каждой функции выберите слой ONREZA по таблице выше: ONREZA Functions, Edge Rules, Compute, Static, KV или Managed PostgreSQL.
  3. Перепишите self-contained HTTP handlers в *.nrz-fn.ts и замените Deno.env на ctx.env.
  4. Перенесите routing в onreza.rules.toml; auth-gates делайте pipeline step с failure = "closed".
  5. Для функций с зависимостями создайте Compute-приложение и перенесите туда SDK, database clients, обработку файлов и WebSocket-логику.
  6. Запустите nrz functions check, затем задеплойте preview и проверьте реальные маршруты, логи и ожидаемую модель оплаты.