Документация по деплою на RelaxDev

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

Что такое RelaxDev?

RelaxDev — это платформа, которая берёт на себя всю работу по настройке серверов, установке зависимостей и поддержанию работы вашего приложения.

Всё работает «под капотом»: вы просто импортируете код из репозитория, а мы автоматически определяем язык (Node.js, Python, React и т.д.), собираем проект и запускаем его в безопасной изолированной среде.

Мы развиваем платформу для серьёзных систем: разработка и превью — на общих серверах, препрод — на своей изолированной VM команды («+ Admin»), прод — на вашем сервере под управлением панели («Панель Prod»). Подробно — Своя VM и свой сервер.

Новое сначала выходит в бете на relaxnet.pro — сейчас там Bot Lab и MCP-коннектор для ИИ-ассистентов (ниже). Аккаунт, проекты и тариф — общие для обеих панелей.

Быстрый старт

Если у вашего проекта стандартные настройки, развернуть его можно всего в несколько кликов:

  1. Нажмите кнопку «Добавить проект».
  2. Выберите нужный репозиторий из подключенного аккаунта GitHub, GitLab, GitFLic или Gitverse.
  3. Оставьте включенным «Автоопределение стека» — система сама поймет, как собрать приложение.
  4. Нажмите «Деплой».

Через пару минут платформа завершит сборку, и ваш сайт будет доступен в сети!

Подробная настройка проекта

Для более сложных приложений в окне создания проекта доступно множество ручных настроек.

1Выбор команды

Выберите рабочую область (Team), к которой будет привязан проект. Это полезно для разделения личных проектов и командной работы.

2Репозиторий и Ветка

Укажите нужный репозиторий с исходным кодом и ветку (по умолчанию main или master). Ветку можно изменить в настройках в любой момент.

3Название проекта

Задайте понятное имя. Оно будет использоваться в панели управления и служит основой для системного домена.

4Настройка стека (Сборка)

Автоопределение: платформа сама подберёт команды для запуска (рекомендуется). Свой Dockerfile: выберите эту опцию, если вашему приложению нужна специфическая среда выполнения.

5Переменные окружения (.env)

Безопасное место для ваших секретных ключей, паролей от БД и токенов API. Добавляйте вручную в формате Ключ — Значение.

6Публичный проект и Автодеплой

Публичный проект делает его видимым в общем каталоге платформы. Автодеплой — проект обновляется автоматически при каждом push в выбранную ветку.

Служебные переменные окружения

Часть переменных платформа обрабатывает сама. Задаются в настройках проекта, вкладка «Переменные».

PORT

Контейнеры принимают трафик только на 8080. Платформа проставляет PORT и переменные рантаймов, которые его игнорируют: SERVER_PORT, UVICORN_PORT, FLASK_RUN_PORT, SANIC_PORT. Читайте порт из окружения, а не прибивайте константой — иначе домен вернёт 502.

TG_OPTION=1

Подключает контейнер к сети с глобальным IPv6. Нужен для api.telegram.org, недоступного по IPv4 с наших серверов. Для сервисов без AAAA-записей бесполезен — проверьте командой dig AAAA имя-хоста. Проектам типа «Telegram Bot» не требуется: туннель у них подключается всегда.

WEB_PORT

Публикует HTTP-эндпоинты Telegram-бота наружу. По умолчанию бот работает на long polling и домен отдаёт 404. Значение — порт, который слушает приложение внутри контейнера. Эндпоинты станут доступны из интернета без авторизации, закрывайте их в самом приложении.

RELAXDEV_PROXY_URL

Пускает исходящие запросы через прокси платформы. Нужен, когда внешний API обрывает передачу с наших адресов: соединение принимает часть данных и умирает по таймауту, при том что мелкие запросы к тому же хосту проходят нормально. Платформа проставит контейнеру HTTP_PROXY, HTTPS_PROXY и NO_PROXY в обоих регистрах — Python, Go, axios и curl подхватят их сами. Внутренние адреса (база, Redis, реестр, *.relaxdev.ru) всегда идут напрямую. Адрес прокси — в проекте: «Переменные» → «Webhook / Proxy» → «Получить адрес прокси». Если прокси нужен для одного API, удобнее подключить его точечно — см. «Вебхуки и прокси».

Node с undici читает прокси иначе

Встроенный fetch в Node построен на undici, и переменные окружения прокси он игнорирует. Сюда же относятся серверные запросы Next.js и клиенты вроде @fal-ai/client и openai. Нужен явный диспетчер — установите пакет undici и добавьте в начало приложения:

import { setGlobalDispatcher, EnvHttpProxyAgent } from 'undici';

// Читает HTTP(S)_PROXY и NO_PROXY: база, Redis и *.relaxdev.ru идут напрямую
setGlobalDispatcher(new EnvHttpProxyAgent());

В Next.js эти строки помещаются в файл instrumentation.ts в корне проекта. Java переменные тоже не читает — нужен флаг -Djava.net.useSystemProxies=true в JAVA_TOOL_OPTIONS.

Заглушки при сборке

Платформа находит в исходниках обращения вида process.env.ИМЯ и подставляет переменным, которых нет в проекте, строку auto-generated-stub-for-build. Так проект соберётся в любом случае, и это безопаснее, чем держать настоящие ключи в коде. Но заглушка остаётся и в работающем приложении: значение по умолчанию через || не сработает, а числа превратятся в NaN. Не подменяются только NODE_ENV и PORT.

Какие переменные получили заглушку, видно сразу: список с файлом и строкой стоит в начале лога сборки, а на странице проекта появляется баннер «Переменные без значения». Добавьте их во вкладке «Переменные» или уберите лишнее обращение из кода. Серверной переменной хватит обычного редеплоя, а NEXT_PUBLIC_* вшиваются в код браузера и требуют полной пересборки.

Нужен фолбэк — читайте через квадратные скобки: process.env['API_URL'] || 'дефолт'. Такую запись платформа не трогает, и значение по умолчанию сработает. Не подходит для NEXT_PUBLIC_* (Next.js вшивает в браузерный код только запись через точку) и не поможет, если переменные проверяются уже при сборке, например zod или t3-env.

Переезд с Vercel: переменные и база

Переменные — одной вставкой

Выгрузите переменные проекта из Vercel в файл:

npx vercel link
npx vercel env pull .env.vercel --environment=production

Вставьте содержимое файла целиком во вкладку «Переменные» — при создании проекта или в готовом — или загрузите сам файл. Кавычки снимаются, служебные VERCEL_* и TURBO_* пропускаются, совпадающие ключи обновляются. Подсказка «Переезжаете с Vercel?» есть прямо в блоке переменных. Значения с пометкой Sensitive Vercel не выгружает — их нужно вписать вручную.

База — по строке подключения

Создайте базу во вкладке «База данных». Если в проекте уже был DATABASE_URL (например, от Neon), он сохраняется как OLD_DATABASE_URL, а на его место встаёт новая база. В блоке «Импорт из другой базы данных» старая строка подставится сама — остаётся нажать «Запустить импорт». Строку можно брать как есть, вместе с пулером: искать DIRECT_URL или адрес без пулера не нужно.

После импорта проверьте данные и удалите из переменных старые строки подключения.

Код под serverless

На Vercel каждая функция живёт отдельно, на RelaxDev приложение работает одним постоянным процессом. Настройки клиента базы под serverless и пулер Neon вроде max: 1 и prepare: false здесь не нужны: с обычным пулом запросы страницы идут параллельно.

Вебхуки и прокси

Во вкладке «Переменные» есть раздел Webhook / Proxy — всё о связи с внешними сервисами. Это два разных направления: вебхук — когда внешний сервис приходит к вам, прокси — когда ваше приложение ходит наружу. Там же карточка TG_OPTION=1 — прямой выход в Telegram по IPv6.

Приёмник вебхуков

Telegram, платёжные системы и другие сервисы из-за границы не всегда стабильно достукиваются до серверов в России. Приёмник даёт постоянный адрес https://hook.relaxweb.ru/r/… на зарубежном сервере: он принимает вебхук и пересылает его в ваш проект по указанному пути, заголовки — без изменений. Пересылать можно только в свой проект.

  • Telegram — одной кнопкой. Если в переменных есть токен бота, «Подключить к Telegram» ставит вебхук через приёмник. Видно, куда сейчас смотрит вебхук, сколько обновлений ждёт доставки и последнюю ошибку. Секрет из TELEGRAM_WEBHOOK_SECRET приходит в заголовке X-Telegram-Bot-Api-Secret-Token.
  • У каждого приёмника виден счётчик запросов и ответ проекта на последний из них.
  • Адрес утёк — «Сменить адрес»: старый перестанет работать.

Исходящий прокси

Если внешний API не открывается с наших серверов — таймауты, обрыв загрузки файлов, — запросы к нему можно пустить через зарубежный прокси платформы. Адрес — по кнопке «Получить адрес прокси». Прокси принимает соединения только с серверов платформы и работает для HTTPS.

  • Точечно (рекомендуем). Добавьте адрес в переменные под своим именем, например OUTBOUND_PROXY_URL, и используйте его только в нужном запросе. База, Redis и остальной трафик идут напрямую.
  • На весь проект — RELAXDEV_PROXY_URL. Платформа выставит контейнеру HTTP_PROXY, HTTPS_PROXY и NO_PROXY (см. раздел о переменных выше).
import { fetch, ProxyAgent } from 'undici';

const proxy = new ProxyAgent(process.env['OUTBOUND_PROXY_URL']);
const res = await fetch('https://api.example.com/...', { dispatcher: proxy });

fetch и ProxyAgent берите из одного пакета undici: агент из пакета вместе со встроенным fetch Node может не работать из-за разницы версий. В Python — параметр proxy у клиента httpx.

ИИ-агенты и MCP: Cursor, Claude Code, Codex

Для ИИ-агентов есть готовая инструкция: как подготовить репозиторий к деплою на RelaxDev и как разобрать ошибки сборки — порт 8080, переменные и заглушки, Dockerfile, Telegram-боты, вебхуки и прокси, базы данных, переезд с Vercel. Достаточно дать агенту ссылку.

Что написать агенту

Подготовь проект к деплою на RelaxDev по инструкции
https://relaxdev.ru/.well-known/skills/relaxdev-deploy/SKILL.md
и перечисли, что мне нужно настроить в панели.

Если сборка упала — вставьте агенту лог из панели и ту же ссылку: в инструкции есть таблица симптомов и причин.

Чтобы агент знал о RelaxDev всегда

  • Claude Code — сохраните файл инструкции в проект как .claude/skills/relaxdev-deploy/SKILL.md: агент подключит его сам, когда речь зайдёт о деплое.
  • Cursor — сохраните его как правило проекта .cursor/rules/relaxdev.mdc или добавьте ссылку на инструкцию в AGENTS.md.
  • Любой агент с доступом в интернет — ссылка в запросе, как в примере выше.

Что агент не сделает за вас

Агент готовит репозиторий: порт, Dockerfile, команды запуска, код под переменные. Переменные окружения, базу, домен и запуск сборки задаёте вы в панели — агент подскажет, что именно добавить. Сборка запускается кнопкой в панели или push в ветку проекта.

Bot Lab и MCP-коннектор — в бете на relaxnet.pro

Bot Lab (Telegram-боты без GitHub: симулятор Telegram, тесты сценариев, деплой в один клик) и MCP-сервер для Claude, Claude Code и Codex — новые возможности, которые мы сначала запускаем в бете платформы — relaxnet.pro. Аккаунт и проекты там общие с relaxdev.ru, тариф один на обе панели. Пока эти функции работают только на relaxnet.pro; позже, скорее всего, появятся и здесь.

Войти нужно на relaxnet.pro — и в браузере, и при подключении коннектора: ассистент откроет вход на relaxnet.pro и попросит разрешить доступ. Через коннектор он создаёт ботов в Bot Lab, пишет код, деплоит, читает логи, прогоняет тесты в симуляторе Telegram, меняет переменные и работает с базой проекта через SQL. Токены не нужны, доступ отзывается в профиле.

  • Claude (сайт и приложения) — Настройки → Коннекторы → Добавить пользовательский коннектор, адрес https://relaxnet.pro/api/mcp.
  • Claude Code — первая команда ниже, затем в Claude Code введите /mcp и войдите в браузере.
  • Codex (терминал и приложение) — две следующие команды: добавить сервер и войти. Затем откройте новый чат — инструменты подгружаются при запуске сессии.
claude mcp add --transport http relaxnet https://relaxnet.pro/api/mcp

codex mcp add relaxnet --url https://relaxnet.pro/api/mcp
codex mcp login relaxnet

Подробно — Claude, Codex и MCP и Bot Lab на relaxnet.pro.

Для ИИ-ассистентов и поисковых агентов есть и общий контекст о платформе: llms.txt, llms-full.txt и каталог навыков ai-catalog.json.

Git-провайдеры и источники деплоя

Поддерживаемые провайдеры

GitHub

github.com — подключение, автодеплой по push, приватные репозитории

GitLab

gitlab.com — покдлючение, автодеплой по push, приватные репозитории

Gitverse

gitverse.ru — российский Git-хостинг, автодеплой, миграция и синхронизация

GitFlic

gitflic.ru — российский Git-хостинг, вход через OAuth, автодеплой, миграция и синхронизация

Смена источника деплоя

Проект может хранить репозитории сразу у нескольких провайдеров (GitHub, GitLab, Gitverse, GitFlic). В настройках проекта — вкладка «Источник деплоя» — можно переключиться на любой привязанный репозиторий без пересоздания проекта. Изменение применяется на следующем деплое.

При смене источника автоматически обновляется активная ветка и иконка провайдера в интерфейсе.

Выбор папки проекта (rootDir)

При создании проекта и в настройках доступен визуальный picker папок репозитория. Поддерживается для GitHub, GitLab, Gitverse и GitFlic.

Удобно для монорепо: деплойте только нужную подпапку (apps/frontend, packages/api и т.п.) без изменения структуры репозитория.

# Пример монорепо
my-monorepo/
apps/frontend/ ← rootDir для фронтенда
apps/backend/ ← rootDir для API
packages/shared/

Gitverse — миграция и синхронизация

Платформа поддерживает полный цикл работы с Gitverse — российским git-хостингом. Подключите аккаунт Gitverse в профиле, и в настройках проекта появятся:

📦 Миграция

Копирует репозиторий из GitHub или GitLab в Gitverse в один клик. Исходный репозиторий остаётся нетронутым.

🔄 Синхронизация

Обновляет Gitverse-репо последними изменениями из GitHub/GitLab. Запускается вручную кнопкой «Sync» или автоматически при автодеплое.

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

GitFlic — вход, миграция и синхронизация

GitFlic поддерживается полностью — можно войти на платформу напрямую через аккаунт GitFlic (OAuth), либо привязать его личным токеном в настройках профиля.

В настройках проекта доступен перенос репозитория на GitFlic с GitHub, GitLab или Gitverse — с сохранением истории коммитов и веток. Исходный репозиторий при этом не изменяется.

Автодеплой по push

При создании проекта платформа сама добавляет вебхук в репозиторий — для GitHub, GitLab, GitVerse и GitFlic. Дальше сборку запускает каждый push, нажимать ничего не нужно. Это вебхуки Git-провайдера; приём вебхуков вашим приложением — в разделе «Вебхуки и прокси».

Что происходит после push

  • В ветку проекта — сборка и выкат новой версии. В истории деплоев видно автора push и коммит.
  • В другую ветку — превью-окружение на отдельном адресе, если превью включены в настройках проекта. Ветку удалили — превью удаляется вместе с ней; если провайдер не прислал событие удаления, превью удалится само через 72 часа.
  • Автодеплой выключен — push сборку не запускает, новая версия выкатывается кнопкой «Редеплой».
  • Раннеры заняты — сборка встаёт в очередь и стартует, как только освободится место.

Push есть, а сборки нет

  1. Проверьте, что push был в ветку, выбранную в проекте, и что автодеплой включён.
  2. В настройках репозитория откройте раздел вебхуков. Там должен быть адрес https://relaxdev.ru/api/webhook/github (у остальных провайдеров в конце gitlab, gitverse или gitflic), а последние доставки — без ошибок.
  3. Вебхука нет — значит, у подключённого аккаунта не хватило прав на настройки репозитория или истёк токен. Обновите подключение в профиле или напишите в поддержку.

Сборщики и стеки

Тип сборки определяется при создании проекта по файлам репозитория. Поменять его можно в настройках проекта — изменение применится на следующем деплое.

Next.js, Nuxt, TanStack Start

SSR-приложения: сборка и запуск Node-сервера

Vite, React, Angular

фронтенд-приложения: сборка через npm run build

Node.js, NestJS, Express

по package.json: команды build и start

Python

FastAPI, Flask, Django, aiohttp — по requirements.txt или pyproject.toml

Go

по go.mod: статический бинарник в маленьком образе

PHP, Laravel

по composer.json, корень сайта — папка public

Java

Maven или Gradle: по pom.xml или build.gradle

HTML

статический сайт без сборки, в том числе из AI-конструктора

Docker

ваш Dockerfile — для всего остального

Свой Dockerfile

Dockerfile из репозитория используется, только когда тип сборки — Docker. При любом другом типе платформа генерирует Dockerfile сама, а ваш не применяется. Если правки в Dockerfile «не работают», первым делом проверьте тип сборки в настройках проекта.

На время установки зависимостей платформа ставит NODE_ENV=development, чтобы поставились devDependencies. В одностадийной сборке это значение остаётся в образе, и приложение работает в режиме разработки. Делайте multi-stage сборку и задавайте ENV NODE_ENV=production в финальной стадии.

Порт 8080

Трафик приходит в контейнер только на порт 8080. Платформа передаёт его в PORT, а рантаймам, которые PORT не читают, — в SERVER_PORT, UVICORN_PORT, FLASK_RUN_PORT и другие. Слушайте 0.0.0.0 и порт из окружения. После запуска сборщик проверяет, отвечает ли приложение на 8080, и пишет результат в лог сборки: при несовпадении домен отдаст 502.

Telegram-боты

  • У проекта типа «Telegram Bot» свой сборщик. api.telegram.org с наших серверов доступен только по IPv6, и нужная сеть подключается к боту сама. С переменной RELAXDEV_PROXY_URL бот вместо этого ходит в Telegram через прокси.
  • Бот работает на long polling, и запрос к адресу проекта вернёт 404. Чтобы открыть HTTP наружу (вебхук Telegram, мини-приложение), задайте переменную WEB_PORT — порт, который слушает бот.
  • Веб-проекту, который сам обращается к Telegram API, добавьте переменную TG_OPTION=1 или пустите запросы к Telegram через прокси.

Prisma

Если в проекте есть Prisma, при сборке выполняется prisma generate, а при сборке с доступом к БД схема применяется командой prisma db push с учётом версии: для Prisma 7 — без флага --skip-generate, которого в ней нет. Если Prisma в проекте нет, сборка её не трогает и не скачивает.

Подсказки после сборки

После неудачной сборки в панели проекта появляется подсказка: что сломалось и как это исправить. Частые ошибки — типы TypeScript, файл не найден в COPY, неверный порт — распознаются сразу, редкие разбирает нейросеть, на это уходит до минуты. После успешной сборки в том же месте показывается список переменных без значения. Полный лог сборки — в истории деплоев.

Параметры сборки

Нажмите стрелку рядом с кнопкой «Редеплой» — откроется панель параметров.

Деплой конкретного коммита или ветки

Вставьте SHA коммита, ссылку на Git commit или имя ветки. Платформа выкатит именно эту версию. Удобно для отката или тестирования фичи-ветки.

abc1234
main / feature/my-branch
https://gitverse.com/user/repo/commit/abc1234

Сборка без кэша Docker

Галочка «Без кэша Docker» запускает полную чистую сборку — все слои пересобираются заново. Помогает когда зависимости обновились, а Docker-слои остались старыми.

Rollback

В истории деплоев нажмите «Откатить» рядом с любым успешным деплоем. Платформа запустит тот же Docker-образ без пересборки — занимает секунды.

Собственные раннеры

Сборки идут на наших раннерах — без лимитов и оплаты GitHub Actions.

Быстрый старт

Сборка начинается сразу после push, если есть свободный раннер.

Параллельные сборки

До 5 сборок одновременно, остальные ждут в очереди. Сборки одного проекта идут по очереди.

Изолированные сборки

Каждая сборка в отдельном Docker-контейнере на том же сервере.

Сборка с доступом к БД

Для Next.js проектов с generateStaticParams которые генерируют страницы из базы данных при сборке.

Когда нужно: если ваш Next.js сайт генерирует статические страницы из БД (например, страницы товаров, статей, специалистов) — без доступа к БД при сборке Next.js выдаст ошибку Can't reach database server.

Как включить

  1. 1. Создайте PostgreSQL в разделе «База данных» проекта
  2. 2. В разделе «База данных» или «Настройки» включите тумблер «Сборка с доступом к БД»
  3. 3. Запустите редеплой — платформа автоматически использует специальный билдер

При включённом режиме Docker-сборка происходит в той же сети что и ваша БД. DATABASE_URL автоматически передаётся в контейнер сборки — generateStaticParams работает корректно.

Превью-окружения

Превью — это отдельная копия проекта, собранная из другой ветки и запущенная в собственном контейнере на собственном адресе. Продакшн при этом продолжает работать на прежнем образе: превью не может его заменить, остановить или изменить его домен.

Зачем это нужно

  • →Показать незаконченную работу заказчику по ссылке, не выкатывая её на боевой сайт
  • →Проверить рискованное изменение до того, как оно попадёт к пользователям
  • →Вести две задачи параллельно: две ветки — две ссылки, они не мешают друг другу
  • →Поднять старую версию из истории деплоев и сравнить её с текущей

Как создать

  1. 1. Откройте вкладку «Окружения» в проекте
  2. 2. Выберите ветку из списка и нажмите «Создать»
  3. 3. Через 1–3 минуты превью будет доступно по адресу проект-git-ветка.preview.relaxdev.ru
  4. 4. Кнопка с круговой стрелкой пересобирает превью из свежего кода ветки

Создавать и удалять превью может любой участник команды с ролью редактора или выше — быть владельцем проекта не требуется.

Адрес и индексация

Каждое превью получает поддомен третьего уровня с автоматическим HTTPS-сертификатом. Все превью-адреса закрыты от поисковых систем заголовком X-Robots-Tag: noindex, поэтому дублей вашего сайта в выдаче не появится.

База данных превью

По умолчанию превью подключается к той же базе, что и продакшн. Это удобно для проверки вёрстки, но опасно для веток с миграциями: изменение схемы затронет боевые данные. Режим переключается во вкладке «Окружения» → «Переменные и БД».

Как в продакшнеПревью работает с боевой базой. Подходит только для изменений, не трогающих данные.
Только схемаРекомендуемый режим. Платформа создаёт отдельную базу со структурой продакшна, но без данных. Миграции и сиды приложение накатывает само.
Схема и данныеОтдельная база со структурой и копией данных. Создаётся дольше и занимает место на диске.
Своя строкаПлатформа ничего не создаёт и не подменяет — впишите свой DATABASE_URL в переменные превью, например от внешнего провайдера.

В режимах с созданием базы платформа сама подставляет DATABASE_URLи DIRECT_URL при сборке — значения из редактора переменных на превью не влияют. Готовая строка подключения показывается в панели, её можно скопировать и открыть базу в DBeaver или DataGrip.

База создаётся при сборке превью. Смена режима удаляет старые базы — после этого превью нужно пересобрать, чтобы применилась новая настройка. При удалении превью его база удаляется вместе с ним.

Переменные окружения

Пока для превью ничего не задано, оно наследует переменные продакшна. Кнопка «Скопировать из продакшна» создаёт отдельный набор, который можно править независимо — например, подставить тестовые ключи платёжной системы вместо боевых.

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

Блок «Реально применяется» показывает итоговый набор, который уедет в сборку, с пометкой источника каждого значения: из продакшна, общее для превью, переопределение ветки или подставлено платформой.

Слияние веток

Проверенную ветку можно влить в продакшн прямо из панели, не переходя в интерфейс Git-провайдера. Перед слиянием показывается, сколько коммитов впереди и сколько файлов затронуто. После слияния срабатывает обычный автодеплой и продакшн обновляется сам. Конфликты слияния платформа не разрешает — их нужно устранить в репозитории вручную.

Слияние из панели работает для GitHub. Для GitLab, GitVerse и GitFlic используйте интерфейс провайдера — превью при этом работают одинаково для всех четырёх.

Время жизни и лимиты

  • Превью живёт 72 часа, отсчёт обновляется при каждой пересборке
  • По истечении срока контейнер, образ и база удаляются автоматически
  • Одновременно можно держать до 5 превью на проект
  • Ресурсы превью вдвое меньше продакшн-лимитов проекта

Ограничения. Превью не создаются для Telegram-ботов: два экземпляра с одним токеном конфликтуют при получении обновлений и ломают работающего бота. Также превью недоступны для статических HTML-проектов, загруженных без Git-репозитория.

Базы данных PostgreSQL

PostgreSQL 17 разворачивается в один клик. Платформа сама создаёт кластер, генерирует доступы, шифрует пароли и прописывает DATABASE_URL в переменные окружения. Ручная настройка не требуется.

📥 Импорт данных

Вставьте строку подключения к существующей PostgreSQL — платформа снимет дамп и развернёт структуру и данные в новой базе. Строку можно брать как есть, вместе с пулером Neon: искать DIRECT_URL не нужно. Если в проекте уже был DATABASE_URL, при создании базы он сохраняется как OLD_DATABASE_URL и сам подставляется в форму импорта. Подходит для переезда с Neon, Supabase, Railway, Vercel Postgres.

🔒 Безопасная изоляция

По умолчанию база спрятана в приватной Docker-сети и недоступна из интернета. Но вы можете сами открыть внешний порт для нужных IP-адресов.

⚡ Авто-подключение

DATABASE_URL автоматически встаёт в переменные окружения при создании БД и обновляется при изменении настроек пула.

🇷🇺 Данные внутри РФ

Вся инфраструктура на серверах в России. Никаких зависимостей от Neon, Supabase или Vercel Postgres.

Прямой доступ (db push, DBeaver)

Во вкладке «Доступ к БД» можно открыть внешний порт для подключения к базе напрямую. В целях безопасности доступ разрешён только с указанных вами IP-адресов (Whitelist).

Как узнать свой IP для белого списка:
  • Локальный ПК (DBeaver, DataGrip): Зайдите на 2ip.ru (если включен VPN — IP изменится).
  • Облачные IDE (Project IDX, Codespaces) или терминал: Выполните команду curl ifconfig.me. IP облачной среды всегда отличается от вашего домашнего, поэтому без его добавления prisma db push выдаст ошибку соединения.

Пул соединений — PgBouncer

При росте трафика число соединений с PostgreSQL увеличивается — появляются задержки и ошибки таймаута. PgBouncer работает как диспетчер: принимает все входящие запросы и распределяет их по ограниченному числу реальных соединений к базе.

// Без пула
100 пользователей → 100 соединений к PostgreSQL
// С PgBouncer
200 пользователей → PgBouncer → 160 соединений к PostgreSQL
Макс. клиентов

Одновременных подключений через пул.

FREE100
PRO400
BUSINESS∞
Соединений к БД

Реальных соединений PgBouncer к PostgreSQL.

FREE50
PRO200
BUSINESS5 000
Таймаут ожидания

Секунд запрос ждёт свободное соединение.

FREE20с
PRO30с
BUSINESS60с

DataLens — аналитика данных

Во вкладке DataLens в настройках БД можно подключить базу данных проекта к Yandex DataLens для построения дашбордов и аналитики.

🔗 Прямое подключение

DataLens подключается к PostgreSQL напрямую по хосту, порту и кредам — данные в реальном времени без экспортов.

🔒 Приватная ссылка

Генерируется уникальная ссылка с токеном. Без токена — 401. Токен можно отозвать и пересоздать в любой момент.

⚡ Обновление вручную

Кнопка «Обновить данные вручную» немедленно выполняет SQL-запрос и обновляет файл в хранилище.

🌙 Автообновление

Сохранённый SQL-запрос выполняется автоматически каждую ночь — DataLens всегда получает свежие данные.

Как подключить к DataLens

  1. Откройте вкладку DataLens в настройках БД проекта
  2. Нажмите «Создать ссылку для DataLens» — генерируется токен
  3. Напишите SQL-запрос и нажмите «Обновить данные вручную»
  4. Скопируйте ссылку с токеном
  5. В DataLens: Создать подключение → Файлы → вставьте ссылку
# Ссылка выглядит так:
https://relaxdev.ru/api/projects/{id}/datalens-export?token={token}

Доступно на тарифах PRO, Pro Team и BUSINESS.

Redis

Управляемый Redis 7 — один контейнер на команду, подключается в один клик прямо из панели проекта.

✅ Доступен на всех тарифах, включая FREE

⚡️ После подключения REDIS_URL автоматически появляется в переменных окружения проекта.

🔒 Каждая команда получает изолированный инстанс с отдельным паролем.

🔄 Поддерживает кэш, сессии, очереди, pub/sub и rate limiting.

📡 Для Socket.io с несколькими репликами: используйте Redis Pub/Sub адаптер — платформа уже обеспечивает подключение.

# Переменная добавляется автоматически

REDIS_URL=●●●●●●●●●●●●●●●●

Socket.io с несколькими репликами:

// Синхронизация реплик через Redis адаптер

import { createAdapter } from "@socket.io/redis-adapter"

import { createClient } from "redis"

const pub = createClient({ url: process.env.REDIS_URL })

const sub = pub.duplicate()

io.adapter(createAdapter(pub, sub))

Домены и SSL

Каждый проект сразу получает адрес {name}.relaxdev.ruс HTTPS. Свой домен подключается двумя A-записями и добавлением во вкладке «Домены» — сертификат Let's Encrypt выпускается и продлевается автоматически. Подробный разбор с примерами — в статье «Домены и DNS на RelaxDev».

Записи у регистратора

ТипИмяЗначение
A@72.56.37.162
Awww72.56.37.162 (или CNAME на основной домен)

Других A- и AAAA-записей у имени быть не должно. NS — только родные, у регистратора или в Cloudflare. Почтовые записи (MX, SPF, DKIM) не трогайте: к сайту они не относятся. Если у домена есть CAA, в ней должен быть разрешён letsencrypt.org.

Порядок подключения

  1. Пропишите записи у регистратора или в Cloudflare.
  2. Проверьте их на dnschecker.org: во всех регионах у A должен быть только 72.56.37.162. Для проекта на VM (своя VM «+ Admin» и другие VM-площадки) — 135.136.191.56: вкладка «Домены» такого проекта сама покажет нужный адрес.
  3. Добавьте домен во вкладке «Домены». Панель сама проверит DNS через публичные резолверы: если записи ещё не на нас, она покажет, что не так, и без подтверждения домен не добавит.
  4. Сертификат выпустится автоматически, обычно за минуту.

Не оставляйте домен с неправильными записями

Домен в проекте сразу получает заказ сертификата. Если записи указывают не на нас, попытки проваливаются, а Let's Encrypt после пяти неудач в час для одного имени временно перестаёт выдавать для него сертификаты. Записи не готовы — удалите домен из проекта, исправьте DNS и добавьте заново. Через час всё ещё нет HTTPS — напишите в поддержку.

↔️ www или без www

Добавьте оба имени и выберите главное: с www на без www, наоборот или оба открывают сайт. Второй вариант отдаёт постоянный редирект 301. Применяется без пересборки.

↩️ Перенаправление доменов

Постоянный редирект всего домена на другой адрес — старое имя на новое, опечатку на основной. Путь и параметры можно сохранять. Снимается в любой момент, домен снова откроет проект.

🔀 Поддомены

app.example.ru добавляется как отдельный домен со своей A-записью. Для поисковиков поддомен — отдельный сайт; если цель — продвигать один сайт, раздел example.ru/app выгоднее.

✳️ Wildcard

Все поддомены *.example.ru разом и один сертификат на них — для сервисов, где у каждого клиента свой поддомен. Тариф PRO Team. Нужные записи (CNAME _acme-challenge и две A) панель покажет при включении и сама проверит DNS.

🌍 Зарубежный вход

Часть зарубежных VPN режет трафик к российским адресам. Для таких посетителей домен можно открыть через сервер за границей: сертификат и маршрут остаются прежними, меняется A-запись — панель покажет, на какую.

🇷🇺 Кириллические домены

пример.рф вводится как есть: хранится в punycode (xn--…), показывается кириллицей, записи те же. Чтобы Google показывал в выдаче название, а не xn--…, добавьте на главную разметку WebSite.

Частые проблемы

  • Cloudflare. Записи должны быть в режиме «DNS only» (серое облако). В режиме прокси настройки SSL Cloudflare зацикливают редиректы и мешают выпуску сертификата.
  • Переезд с Vercel. Удалите домен в Vercel (Settings → Domains → Remove), уберите записи 76.76.21.21, 216.198.79.1 и cname.vercel-dns.com, а если NS были у Vercel — верните NS регистратора или перенесите на Cloudflare.
  • Записи поменяли, а открывается старое. Резолверы помнят прежнее значение до истечения TTL (у Reg.ru минимум час). Кэш можно сбросить у Google и Cloudflare.
  • В панели регистратора всё верно, а DNS отдаёт лишний адрес. Бывает, что регистратор отдаёт запись, которой не видно в его интерфейсе. Надёжный выход — перенести NS на Cloudflare.

Мониторинг ресурсов

Ваши проекты работают внутри изолированных виртуальных машин (VM). Доступны прозрачные инструменты контроля:

CPU & RAM

Отслеживайте потребление процессора и памяти. Помогает вовремя заметить утечки памяти в коде.

Сеть (Net I/O)

График входящего и исходящего трафика для анализа активности пользователей.

Runtime Logs

Логи приложения в реальном времени. Незаменимый инструмент для поиска и исправления ошибок.

Авто-перезапуск

Если проект исчерпает доступную память, система автоматически перезапустит контейнер.

Хранилище файлов и Storage API

Файлы лежат в бакете объектного хранилища Yandex Cloud и раздаются через CDN cdn.relaxdev.ru. У платформы есть своя копия хранилища и запасной адрес files.relaxdev.ru: он отдаёт тот же файл по тому же пути — из Yandex Cloud, а при его сбое из своей копии. Ссылки на cdn.relaxdev.ru менять не нужно: добавьте files.relaxdev.ru запасным. Storage API возвращает обе ссылки — url и fallbackUrl.

html
<!-- Основной адрес — cdn.relaxdev.ru, запасной — тот же путь на files.relaxdev.ru -->
<img src="https://cdn.relaxdev.ru/users/<id>/<имя-проекта>/photo.webp"
     onerror="this.onerror=null;this.src=this.src.replace('cdn.relaxdev.ru','files.relaxdev.ru')">

У каждого проекта есть собственная папка в объектном хранилище. Загружать, получать список и удалять файлы можно из кода через токен STORAGE_API_KEY(вкладка «API Доступ» в менеджере файлов). Все файлы проекта живут внутри префикса users/<id>/<project>/в общем хранилище, и изолированы от других пользователей. <id> — номер создателя проекта, почты в ссылках нет; у проектов, созданных раньше, на этом месте почта — их ссылки не менялись. Путь к файлу берите из ответа API (path, url), а не собирайте сами.

В менеджере файлов есть чекбокс «Оптимизировать в WebP» (включён по умолчанию): картинки сжимаются прямо в браузере перед отправкой в хранилище.

Где хранить ключ

  • Внутри платформы — хранить не нужно. Когда вы нажимаете «Сгенерировать ключ», он автоматически записывается в переменные окружения проекта (envVars). После «Запустить редеплой» токен прокидывается в контейнер и доступен в коде как process.env.STORAGE_API_KEY.
  • Локально или во внешних сервисах — хранить нужно. Скопируйте ключ и положите в локальный .env: STORAGE_API_KEY=sk_rd_...
  • Забыли ключ? Откройте «API Доступ», нажмите 👁️ и скопируйте снова — он всегда лежит в envVars.
Токен даёт прямой доступ на запись и удаление файлов. Используйте его только на сервере (API-роуты, Server Actions, Node.js-скрипты) и никогда — в клиентском коде в браузере.

POST — загрузка файла

Растровые изображения (JPEG, PNG, BMP, TIFF) по умолчанию автоматически оптимизируются в WebP — обычно это в 2–4 раза меньше по весу без видимой потери качества. Конвертация выполняется на стороне платформы, у файла меняется расширение на .webp, а в ответе появляется поле webp. Чтобы загрузить файл как есть, передайте -F "webp=false". GIF, SVG и уже-WebP не трогаются.

bash
curl -X POST https://relaxdev.ru/api/v1/storage/upload \
-H "Authorization: Bearer $STORAGE_API_KEY" \
-F "file=@./photo.jpg" \
-F "path=avatars"        # необязательная подпапка
# -F "webp=false"        # отключить оптимизацию (по умолчанию webp=true)

# Ответ:
# {
#   "success": true,
#   "url":  "https://cdn.relaxdev.ru/users/<id>/<имя-проекта>/avatars/1700000000000-photo.webp",
#   "fallbackUrl": "https://files.relaxdev.ru/users/<id>/<имя-проекта>/avatars/1700000000000-photo.webp",
#   "path": "users/<id>/<имя-проекта>/avatars/1700000000000-photo.webp",
#   "webp": true
# }

Тот же запрос из серверного кода Node.js / Next.js:

javascript
const form = new FormData();
form.append("file", fileBlob, "photo.jpg");
form.append("path", "avatars");
// form.append("webp", "false"); // по умолчанию оптимизация включена

const res = await fetch("https://relaxdev.ru/api/v1/storage/upload", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.STORAGE_API_KEY}` },
body: form,
});
const { url, fallbackUrl, webp } = await res.json();

GET — список файлов

bash
curl "https://relaxdev.ru/api/v1/storage/files?path=avatars" \
-H "Authorization: Bearer $STORAGE_API_KEY"

# Ответ:
# {
#   "success": true,
#   "files": [
#     { "path": "users/<id>/<имя-проекта>/avatars/...jpg",
#       "url":  "https://cdn.relaxdev.ru/users/<id>/<имя-проекта>/avatars/...jpg",
#       "fallbackUrl": "https://files.relaxdev.ru/users/<id>/<имя-проекта>/avatars/...jpg",
#       "size": 20413, "lastModified": "..." }
#   ]
# }

DELETE — удаление файла

Передайте полный path из ответа загрузки или списка. Удалять можно только внутри папки своего проекта.

bash
curl -X DELETE "https://relaxdev.ru/api/v1/storage/files?path=users/<id>/<имя-проекта>/avatars/1700000000000-photo.jpg" \
-H "Authorization: Bearer $STORAGE_API_KEY"

# Ответ: { "success": true, "deleted": "users/<id>/<имя-проекта>/avatars/1700000000000-photo.jpg" }
# Вместо path можно передать ссылку на файл — с cdn.relaxdev.ru или files.relaxdev.ru

Своя VM («+ Admin») и свой сервер («Панель Prod»)

Препрод на платформе и прод на своём сервере — окружения проекта: экземпляры со своей базой и доменами, вкладками в проекте, с выкаткой того же коммита. Всё в одном месте — что выбрать, окружения, перенос, домены и базы: Своя VM и свой сервер.

PRO, PRO Team, Business

тариф

Проекты на общих серверах платформы.

Для разработки, тестов и превью.

по тарифу

+ Admin

надбавка

Своя VM команды на серверах платформы, SSH без root.

Только к тарифу: «PRO + Admin», «PRO Team + Admin», Business.

от 500 до 4 000 ₽/мес

Панель Prod

свой сервер

Ваш сервер под управлением панели — для продакшена с данными ваших пользователей.

Отдельный тариф: вместе с основным или без него. Логи и дампы баз у нас не хранятся.

1000 ₽/мес

+ Admin — своя VM команды

Надбавка к PRO, PRO Team или Business — отдельно не подключается. Отдельная виртуальная машина вашей команды на серверах платформы: её ресурсы только ваши, соседние проекты на неё не влияют.

Размер
1–4 vCPU, 2–8 ГБ памяти, 20–100 ГБ диска — выбираете при заказе.
Цена
250 ₽ за vCPU + 125 ₽ за ГБ памяти + 25 ₽ за ГБ диска сверх 20 ГБ, посуточно с баланса.
Адреса
Своего IP у VM нет — она за общим входом платформы 135.136.191.56. Проекты сами получают адрес <имя>.vm.relaxdev.ru, свой домен — A-запись на 135.136.191.56 во вкладке «Домены».
Доступ
SSH по вашему ключу, без root. Docker, Traefik, сертификаты и обновления обслуживает платформа.

Как подключить

  1. Страница VM → «+ Admin · своя VM» или настройки проекта, блок «Своя VM · + Admin». Подключает первый владелец команды — по его тарифу и балансу.
  2. Выберите размер, вставьте открытый SSH-ключ (ssh-ed25519 … или ssh-rsa …) и логин. На балансе должна быть сумма за месяц выбранной VM — сразу списываются только первые сутки.
  3. VM создаётся 5–15 минут, затем придёт письмо с командой входа. Если создать не получилось, деньги вернутся на баланс.

Проекты и базы

  • Новые проекты команды запускаются на VM. Работающий проект переносится в его настройках: код пересобирается из Git, база копируется, Redis начинается пустым, старый адрес отвечает 301, свои домены переезжают. Если сборка не пройдёт, перенос откатится сам.
  • Кластер PostgreSQL команды работает на VM. Подключаться к базе со своего компьютера, из DBeaver или CI можно через внешний доступ по белому списку IP — во вкладке «База данных» проекта.
  • Базы на VM бэкапятся каждую ночь, копии хранятся 3 дня. Копию вручную можно снять во вкладке «Бэкапы» базы.
  • Свой домен проекта на VM — A-запись на 135.136.191.56, сертификат выпустится сам. Это общий вход всех VM: по голому IP сайт не откроется, вход различает проекты по имени домена.
  • Пока недоступны на VM: пул PgBouncer, импорт базы по ссылке, DataLens и сборка с доступом к БД.

SSH и консоль

  • Команда входа — в карточке своей VM на странице VM, вида ssh -p 22NN c-логин@135.136.191.56. Ключ один, его можно сменить там же.
  • По SSH доступно: процессы VM (top, ps), домашняя папка, git, свои утилиты в ~/bin и pip --user, обмен файлами по scp, доступ в интернет.
  • Нет прав root, доступа к Docker и проброса портов: контейнеры, Traefik и сертификаты обслуживает платформа, поэтому их нельзя сломать по неосторожности.
  • Логи и управление контейнерами — в консоли на странице VM: docker ps, stats, logs, перезапуск и остановка (владелец и редактор команды). Логи, метрики, деплои и откаты — во вкладках проекта.
  • Участники команды видят её VM на странице VM; заказывает и управляет первый владелец команды.

Оплата и отказ

  • Не хватает денег — придёт письмо, через 24 часа VM выключится, диск хранится 14 дней. После пополнения VM включится сама.
  • Отказаться можно на странице VM в любой момент: VM выключится, списания прекратятся. Диск хранится 14 дней, затем VM удаляется вместе с данными.

Панель Prod — свой сервер

Ваш сервер под управлением панели: сборка, деплой, свои домены и сертификаты — как на наших VM. Логи на платформу не передаются, дампы и бэкапы баз платформа не делает и не хранит. Отдельный тариф — вместе с основным или без него; лимиты тарифа на сервере не действуют.

Что нужно

  • Сервер x86_64 с Ubuntu или Debian и публичным IPv4: открыт SSH, свободны порты 80 и 443.
  • Данные для входа по SSH — один раз: IP, порт, логин root или отдельного пользователя с sudo (например, relaxdev), пароль или закрытый ключ. Панель ставит Docker и Traefik, заводит пользователя relax со своим ключом и дальше входит под ним. Ваши данные для входа не сохраняются.
  • Домен для адресов проектов, например apps.example.com.

Домены и адреса

  • Домен при подключении нужен только для технических адресов: каждый проект получает <имя>.apps.example.com с сертификатом HTTPS. Для этого две A-записи на IP сервера: apps.example.com и *.apps.example.com.
  • Свои домены проектов (example.com, www.example.com) добавляются как обычно во вкладке «Домены» — A-запись на IP вашего сервера, сертификат выпустится сам.
  • По голому IP сайт не откроется: проектов на сервере несколько, и Traefik различает их по имени домена; сертификаты HTTPS выпускаются на имена доменов.

Проекты и базы

  • Новые приложения и HTML-сайты команды запускаются на сервере. Работающий проект переносится из его настроек, блок «Своя VM или свой сервер»: код пересобирается, база копируется.
  • Есть и своя VM — «Панель Prod» подключается рядом с ней. Проекты с VM переезжают на сервер все разом (база и Redis у команды общие): страница VM → «Панель Prod» → «Перенести всю VM». Если хоть одна сборка не пройдёт, всё вернётся на VM; после переноса VM можно отключить.
  • Кластер PostgreSQL команды работает на вашем сервере; бэкапы баз — на вашей стороне.
  • Логи — последние строки прямо с сервера во вкладке проекта.

Как подключить

  1. Страница VM → «Панель Prod». Подключает первый владелец команды — по нему идут списания.
  2. На балансе должна быть сумма за месяц; сразу списываются только первые сутки.
  3. Настройка сервера занимает несколько минут. Не получилось — списанное вернётся на баланс.

Персональные данные

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

Для продакшена рекомендуем отдельный сервер под вашим управлением, подключённый через Панель Prod, а платформу — для разработки, тестирования и превью.

Подаёте уведомление в Роскомнадзор и нужны сведения о размещении — напишите на support@relaxdev.ru, мы предоставим актуальную информацию.

Ваши данные как клиента обрабатываются по Политике обработки персональных данных.

Поддержка

В панели управления встроен полноценный чат поддержки.

  • История: Вся история переписки сохраняется.
  • Файлы: Вы можете прикреплять скриншоты логов или фрагменты кода прямо в чат.
  • Мы всегда готовы помочь разобраться с ошибками сборки, базами данных и настройкой окружения.