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

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.

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"
[[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 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 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 и проверьте реальные маршруты, логи и ожидаемую модель оплаты.