Документация RelaxDev

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

Что такое RelaxDev?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 — с сохранением истории коммитов и веток. Исходный репозиторий при этом не изменяется.

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

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

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

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

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

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

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

Rollback

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

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

Сборки запускаются прямо на нашем сервере — никаких очередей и лимитов Git Actions.

Мгновенный старт

Деплой начинается сразу после push — нет ожидания свободного слота.

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

До 3 проектов собираются одновременно. Очередь автоматически.

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

Каждая сборка в отдельном 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 в переменные окружения. Ручная настройка не требуется.

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

Вставьте URL существующей PostgreSQL-базы — платформа снимет дамп и развернёт структуру и данные в новом кластере. Подходит для переезда с Neon, Supabase, Railway.

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

По умолчанию база спрятана в приватной 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. Доступен сразу после первого успешного деплоя, без каких-либо настроек.

🔗 Кастомный домен

Добавьте домен во вкладке «Домены», пропишите A-запись на IP сервера у регистратора, нажмите «Обновить SSL» — сертификат Let's Encrypt выпустится автоматически.

📋 Несколько доменов

На один проект можно привязать несколько доменов — все маршрутизируются на один контейнер. Количество доменов зависит от тарифа.

🔒 Авто-SSL

SSL-сертификаты генерируются, валидируются и продлеваются автоматически через Let's Encrypt и Traefik. Поддерживаются все привязанные домены.

Поддомены и редиректы

🔀 Поддомен клиента

Привяжите поддомен вашего собственного домена — например app.example.com или 1.domen.ru. Настраивается так же, как и основной домен: A-запись + авто-SSL.

↩️ Редирект с домена

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

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

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

CPU & RAM

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

Сеть (Net I/O)

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

Runtime Logs

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

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

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

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

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

В менеджере файлов есть чекбокс «Оптимизировать в 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/<email>/<имя-проекта>/avatars/1700000000000-photo.webp",
#   "path": "users/<email>/<имя-проекта>/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, 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/<email>/<имя-проекта>/avatars/...jpg",
#       "url":  "https://cdn.relaxdev.ru/users/<email>/<имя-проекта>/avatars/...jpg",
#       "size": 20413, "lastModified": "..." }
#   ]
# }

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

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

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

# Ответ: { "success": true, "deleted": "users/<email>/<имя-проекта>/avatars/1700000000000-photo.jpg" }

Поддержка

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

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