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

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

Что такое RelaxDev?

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

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

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

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

  1. Нажмите кнопку «Добавить проект».
  2. Выберите нужный репозиторий из подключенного аккаунта GitHub, GitLab или 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-хостинг, автодеплой, миграция и синхронизация

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

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

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

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

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

Удобно для монорепо: деплойте только нужную подпапку (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 — проект будет деплоиться полностью из российской инфраструктуры.

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

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

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

Вставьте 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 работает корректно.

Базы данных PostgreSQL

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

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

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

🔒 Изоляция по умолчанию

База доступна только внутри Docker-сети вашего проекта. Порт закрыт снаружи на уровне файрвола. Для подключения из DBeaver / DataGrip — обратитесь в поддержку.

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

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

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

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

Пул соединений — 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" }

Поддержка

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

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