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

Compute

Compute — рантайм для серверных приложений. В отличие от статических деплоев (файлы на CDN) и Edge Functions (V8 isolate), Compute запускает полноценный серверный процесс с файловой системой, WebSocket, native modules и доступом к платформенным API.

ЗадачаПодходит?
Next.js SSR / App RouterДа
Remix SSRДа
Express / Fastify / Hono APIДа
Кастомный Bun HTTP-серверДа
WebSocket серверДа
Статический сайт (Vite, CRA)Нет — используйте STATIC
Edge Functions (auth, redirects)Нет — используйте ISOLATE

Next.js SSR определяется автоматически. Настройка не требуется — standalone output и process.env.PORT обрабатываются платформой.

Минимальный пример для Express / Bun:

server.ts
import express from "express";
const app = express();
const PORT = parseInt(process.env.PORT || "3000");
app.get("/", (req, res) => {
res.json({ hello: "world" });
});
app.listen(PORT, "0.0.0.0", () => {
console.log(`Server running on port ${PORT}`);
});
// ✅ Правильно — читает порт из окружения
const PORT = parseInt(process.env.PORT || "3000");
app.listen(PORT, "0.0.0.0");
// ❌ Неправильно — захардкоженный порт
app.listen(3000);
// ❌ Неправильно — слушает только на localhost
app.listen(PORT, "127.0.0.1");

Важно: сервер должен слушать на 0.0.0.0 (все интерфейсы), не на 127.0.0.1. Платформа проверяет доступность извне сетевого пространства процесса.

ФреймворкПоддержка process.env.PORT
Next.js standaloneАвтоматически
RemixАвтоматически
ExpressТребуется ручная настройка
FastifyТребуется ручная настройка
HonoТребуется ручная настройка
Bun.serveТребуется ручная настройка

Compute-процессы автоматически масштабируются до нуля при отсутствии трафика:

  1. Активный — обрабатывает запросы
  2. Заморожен — после 15 секунд без запросов процесс приостанавливается (SIGSTOP). Память выгружается. Возобновление за 1-50ms при следующем запросе.
  3. Остановлен — после 2 минут в замороженном состоянии процесс полностью завершается. Следующий запрос запустит cold start.
ПараметрЗначение по умолчаниюНастраивается
Память256 MBДа
CPUSharedДа
PIDs512
Таймаут запуска30 секунд
Файловая системаRead-only + overlay
Размер /tmp256 MB
Размер записываемого слоя512 MB
Исходящий трафик25 Mbit/s

Настройки памяти и CPU задаются в Settings → Compute или через manifest.

Корневая файловая система (/output) — read-only с overlay. Ваше приложение может записывать файлы, но записи хранятся во временном слое:

  • Записи теряются при scale-to-zero (полная остановка процесса)
  • Записи сохраняются при заморозке/разморозке (SIGSTOP/SIGCONT)
  • Максимальный размер записываемого слоя — 512 MB

Для временных файлов используйте /tmp (256 MB).

Каждый sandbox ограничен скоростью исходящего трафика в 25 Mbit/s. Это защитный механизм — предотвращает злоупотребления и обеспечивает стабильность соседних процессов.

Compute-процессы имеют полный доступ к интернету (HTTP, базы данных, внешние API) с ограничениями на отправку email:

ВозможностьHobbyPRO
HTTP/HTTPS запросыДаДа
Подключение к БД (PostgreSQL, MySQL, Redis, MongoDB)ДаДа
WebSocket соединенияДаДа
Отправка email (SMTP, порты 465/587/2525)НетДа (до 100 соединений/мин)

Переменные окружения задаются в Settings → Environment Variables и автоматически передаются в процесс:

// Стандартный доступ
const dbUrl = process.env.DATABASE_URL;
// Или через Runtime SDK
import { env } from '@onreza/runtime/env';
const dbUrl = env.get("DATABASE_URL");

Системные переменные, которые платформа устанавливает автоматически:

ПеременнаяОписание
PORTПорт, на котором должен слушать сервер
NODE_ENVproduction
HOSTNAME0.0.0.0
HOME/tmp
TMPDIR/tmp
PATHСтандартные системные пути
USERonreza
LANGC.UTF-8

В Compute-приложениях доступны все платформенные API через SDK @onreza/runtime:

Если Compute-процесс падает (crash, OOM, необработанное исключение), ONREZA автоматически перезапускает его:

  • До 10 перезапусков в окне 5 минут
  • Задержка между попытками увеличивается экспоненциально: 1с, 2с, 4с, 8с, 16с, 30с (максимум)
  • После 10 неудачных перезапусков деплой помечается как Failed

Во время перезапуска входящие запросы получают HTTP 503 с заголовком Retry-After, что позволяет клиентам повторить запрос позже.

ONREZA непрерывно мониторит потребление памяти каждого Compute-процесса и автоматически реагирует на проблемы — вплоть до бесшовной перезагрузки при утечках.

Если ваше приложение стабильно использует более 80% выделенной памяти в течение минуты, платформа автоматически увеличивает лимит (×1.5), не прерывая работу процесса. Масштабирование происходит мгновенно и прозрачно.

Масштабирование ограничено hard cap — максимальным лимитом памяти вашего плана. Потребление сверх стартового лимита тарифицируется по метрике Memory GB-сек.

Если память продолжает расти линейно более 2.5 минут (pattern: потребление растёт, а не стабилизируется), платформа определяет это как утечку памяти:

  1. Продолжает увеличивать лимит, давая приложению время работать
  2. Отправляет уведомление о предполагаемой утечке
  3. Если утечка достигает hard cap — запускает бесшовную перезагрузку

Когда утечка памяти достигает максимального лимита, ONREZA не убивает процесс, а выполняет zero-downtime замену:

  1. Запускается свежий экземпляр приложения с начальным лимитом памяти
  2. Новый экземпляр проходит health check
  3. Трафик мгновенно переключается на новый экземпляр
  4. Старый (утекающий) процесс корректно завершается
СостояниеЧто происходитДействие платформы
НормаПотребление < 80% лимитаМониторинг
ДавлениеP80 > 80% более 60 секундАвтоматическое увеличение лимита ×1.5
УтечкаЛинейный рост 2.5+ минутУведомление + продолжение масштабирования
Hard capУтечка достигла максимумаБесшовная перезагрузка (blue-green)

Приложение не запустилось за 30 секунд.

Частые причины:

  1. Неправильный порт — используйте process.env.PORT, не захардкоженное значение
  2. Dev-сервер в productionvite dev, next dev, webpack-dev-server не работают в production. Соберите приложение и запустите production-сервер
  3. Слушает на localhost — используйте 0.0.0.0, не 127.0.0.1
  4. Тяжёлая инициализация — если приложению нужно больше 30 секунд на старт, оптимизируйте инициализацию

Сервер запустился, но не отвечает на запросы.

  1. Убедитесь что сервер слушает на 0.0.0.0, не на 127.0.0.1
  2. Проверьте что process.env.PORT используется

Процесс превысил лимит памяти.

  1. Увеличьте лимит в Settings → Compute
  2. Проверьте утечки памяти в приложении
  3. Для Next.js: standalone build оптимальнее, чем next start