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

ONREZA Compute

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

SSR-фреймворки (Next.js, Remix, Astro SSR) — это тоже Compute: серверный рендеринг выполняется в полноценном Bun-процессе.

Задача Подходит?
Next.js SSR / App Router Да
Remix SSR Да
Express / Fastify / Hono API Да
Кастомный Bun HTTP-сервер Да
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, запускает процесс и ждёт, пока приложение начнёт принимать трафик.
Параметр Значение по умолчанию Настраивается
Оценка памяти для размещения 256 МБ Автоматически
Максимальная память Hobby — 1 ГБ, Pro — 4 ГБ, Enterprise — 8 ГБ По плану
CPU Shared Да
PIDs 512
Таймаут запуска 30 секунд
Файловая система Read-only + overlay
Размер /tmp 256 MB
Размер записываемого слоя 512 MB
Исходящий трафик 25 Mbit/s

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

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

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

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

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

План + тип деплоя Приоритет
Hobby, preview
PRO, preview
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) Нет Нет

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-сервер в 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