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

ONREZA Compute

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

SSR-фреймворки (Next.js, Remix, Astro SSR) — это тоже Compute: серверный рендеринг выполняется в отдельном процессе на совместимом Node.js или Bun. Python ASGI/WSGI и Dart/Go HTTP executable используют тот же механизм запуска и проверки готовности. Поддерживаемые версии и способы сборки приведены в матрице фреймворков.

Задача Подходит?
Next.js SSR / App Router Да
Remix SSR Да
Express / Fastify / Hono API Да
Кастомный Bun HTTP-сервер Да
Python ASGI/WSGI Да
Dart / Go HTTP executable Да
WebSocket сервер Да
Статический сайт (Vite, CRA) Нет — используйте STATIC
Лёгкие event-handlers (auth, redirects, webhooks) Нет — используйте ONREZA Functions

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. Активный — процесс обрабатывает запросы и держит in-process state.
  2. Остановлен — после idle timeout процесс полностью завершается и освобождает выделенные ему runtime-ресурсы.
  3. Новый запрос — платформа создаёт новый sandbox, запускает процесс и ждёт, пока приложение начнёт принимать трафик.

Остановка выполняется асинхронно после истечения таймаута простоя. Активные HTTP-запросы, WebSocket-соединения и проверки развёртывания удерживают процесс.

Статические файлы обслуживаются отдельно от серверного процесса и кешируются на Edge. Ответы серверных приложений Compute не сохраняются в общем Edge-кеше. Кеширование внутри приложения или фреймворка управляется самим приложением.

Параметр Значение по умолчанию Настраивается
Оценка памяти для размещения 256 МБ Автоматически
Максимальная память Hobby — 1 GiB, Pro — 8 GiB, Enterprise — по договору По плану
CPU 1 vCPU; максимум Hobby — 2 vCPU, Pro — 8 vCPU, Enterprise — по договору Да
PIDs 512 —
Таймаут запуска 30 секунд —
Файловая система Read-only + overlay —
Размер /tmp 256 MB —
Размер записываемого слоя 512 MB —
Исходящий трафик 25 Mbit/s —

Лимит CPU задаётся в Settings → Compute или через manifest. Повышение доступного потолка не меняет сохранённый лимит CPU: больший лимит нужно выбрать явно. Максимальную память определяет план; коэффициенты начисления CU не задают соотношение CPU и доступной памяти.

CPU на сервере — общий ресурс, разделяемый между всеми запущенными приложениями. Каждому процессу назначен лимит CPU (максимум, который он может использовать) и приоритет (доля при конкуренции).

Лимит — жёсткий потолок. Если вы задали лимит CPU в настройках, приложение никогда не превысит его — даже если сервер временно свободен.

Приоритет работает только при нагрузке. Когда несколько процессов одновременно нуждаются в CPU, ONREZA распределяет ресурс пропорционально приоритету. Если конкуренции нет, приоритет не влияет — все получают сколько нужно.

Приоритет зависит от плана и типа деплоя:

План + тип деплоя Приоритет
Hobby, preview 1×
PRO, preview 5×
Hobby, production 10×
Enterprise, preview 20×
PRO, production 50×
Enterprise, production 100×

На практике это означает, что production-деплой на PRO получит в 50 раз больше процессорного времени, чем preview на Hobby, если оба окажутся под нагрузкой одновременно.

Корневая файловая система (/output) использует immutable artifact как нижний слой и writable ephemeral overlay. Ваше приложение может записывать файлы, но записи хранятся только во временном слое:

  • Записи теряются при stop, redeploy и scale-to-zero
  • Максимальный размер записываемого слоя — 512 MB

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

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

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

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

Корневой сертификат Минцифры России (Russian Trusted Root CA) установлен и включён в доверенные по умолчанию наряду со стандартными публичными центрами сертификации. Это действует при сборке приложения, в Compute и ONREZA Functions. Для обычного fetch не нужно скачивать сертификат или добавлять PEM-файлы в проект.

Если приложение явно задаёт tls.ca/ca или библиотека использует собственное хранилище сертификатов, она может не использовать доверие платформы. Уберите ручной список CA, если он был нужен только для поддержки сертификатов Минцифры. Проверка имени сервера и срока действия сертификата остаётся включённой.

Compute работает в инфраструктуре Selectel и дополнительно применяет платформенный denylist для портов, которые Selectel блокирует на границе сети из-за риска abuse, amplification-атак или небезопасных устаревших протоколов.

Порты Протокол Назначение
17 TCP/UDP QOTD
111 TCP/UDP ONC RPC / SunRPC
135 TCP/UDP Microsoft EPMAP
137, 138, 139 TCP/UDP NetBIOS
389 TCP/UDP LDAP
427 TCP/UDP SLP
445 TCP/UDP SMB
520 UDP RIP
1900 UDP SSDP
3702 UDP WS-Discovery
11211 TCP/UDP Memcached

SMTP-порты 25, 465, 587 и 2525 заблокированы на всех планах. Для отправки писем используйте HTTPS API email-провайдера.

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

// Стандартный доступ
const dbUrl = process.env.DATABASE_URL;

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

Переменная Описание
PORT Порт, на котором должен слушать сервер
NODE_ENV production
HOSTNAME 0.0.0.0
HOME /tmp
TMPDIR /tmp
XDG_CACHE_HOME /tmp/.cache
PATH Стандартные системные пути
USER onreza
LANG C.UTF-8

В Compute-приложениях используйте стандартные runtime API и платформенные переменные окружения. Для edge/auth state используйте ONREZA Functions bindings, а оптимизацию изображений вызывайте через URL endpoint:

Если Compute-процесс завершается из-за ошибки или нехватки памяти (OOM), платформа пробует восстановить его. Задержка между попытками увеличивается. Повторяющиеся сбои ограничены бюджетом перезапусков: после 10 сбоев или 5 OOM за полчаса запуск приостанавливается на 10 минут. Повторное развертывание позволяет восстановить исправленное приложение сразу.

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

Платформа наблюдает фактическое потребление и регулирует рабочий объём памяти без остановки процесса. При росте нагрузки он расширяется в пределах лимита плана. После устойчивого снижения потребления платформа осторожно уменьшает рабочий объём, чтобы освободить место для других приложений на сервере.

Лимит плана доступен уже при запуске. Приложению не нужно пережить OOM, чтобы платформа разрешила использовать больше памяти. Изменение рабочего объёма само по себе не увеличивает плату: Compute считается по фактическому потреблению CPU и памяти, покрывается usage credit и вашим extra usage budget.

Устойчивый рост памяти вблизи лимита вызывает уведомление. Он может быть связан с нагрузкой, кэшем или утечкой; проверьте метрики и логи приложения.

Если памяти не хватает, процесс может завершиться с OOM. Уведомление показывает установленный лимит и наблюдаемый пик потребления. Платформа применяет обычный перезапуск при сбое, сохраняя лимит плана. Для устранения причины может потребоваться оптимизация приложения или увеличение доступных ресурсов.

Изменения лимита памяти и доли CPU применяются к работающему процессу, когда платформа получает обновлённые настройки. Если новое количество CPU требует другого размещения, платформа готовит новый экземпляр, проверяет его готовность и переключает трафик. Для такой замены нужна свободная ёмкость; при её нехватке используется обычный перезапуск.

Снижение лимита памяти ниже текущего потребления может привести к OOM. Перед уменьшением ресурсов проверьте потребление приложения.

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

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

  1. Неправильный порт — используйте process.env.PORT, не захардкоженное значение
  2. Dev-сервер в production — vite 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