Деплой Docker контейнеров
Развёртывание Docker-образов и Dockerfile прямо из репозитория. Сборка на своих раннерах, авто-SSL, свой домен, серверы в РФ и оплата в рублях.
Автодеплой из Git
Платформа сама скачает код с Репозитория, соберет проект и запустит его.
Готовая среда
Не нужно настраивать Nginx или Linux. Под капотом надежные серверы RelaxDev.
Свои домены и SSL
Привяжите свой домен в 1 клик, а платформа автоматически выпустит Let's Encrypt SSL.
Если проект уже описан Dockerfile, платформа соберёт образ и запустит контейнер без дополнительной настройки: достаточно подключить репозиторий. Это универсальный путь для стеков, которые не покрывает автоопределение — Go, Rust, PHP, Java, C# или связки с системными зависимостями.
Сборка идёт на собственных раннерах платформы, а не во внешних CI: очередей и лимитов минут нет, до трёх проектов собираются параллельно, каждая сборка изолирована в отдельном контейнере. Готовый образ разворачивается на серверах в России с автоматическим HTTPS.
Как задеплоить Docker?
1. Положите Dockerfile в корень репозитория
Платформа находит его автоматически и отдаёт ему приоритет над автоопределением стека. Путь можно переопределить в настройках, если Dockerfile лежит в подпапке монорепозитория.
2. Прокиньте порт из переменной окружения
Контейнер должен слушать порт из переменной PORT на хосте 0.0.0.0. Инструкция EXPOSE носит справочный характер — важно, какой порт реально слушает процесс внутри.
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
ENV PORT=8080
EXPOSE 8080
CMD ["node", "dist/main.js"]3. Задайте переменные окружения
Секреты передаются платформой в контейнер при запуске — не зашивайте их в образ через ARG или ENV в Dockerfile, иначе они останутся в слоях образа.
4. Соберите и опубликуйте
После сборки контейнер получает рабочий HTTPS-адрес, к нему подключается свой домен. Логи сборки и рантайма доступны в панели, статус контейнера отслеживается мониторингом.
Сравнение платформ
| Платформа | Статус | Оплата |
|---|---|---|
| Heroku | Не работает с РФ | Оплата картой РФ невозможна |
| Render | Доступен частично | Оплата только в валюте |
| Fly.io | Доступен частично | Нужна зарубежная карта |
| RelaxDev | Серверы в РФ | Рубли, есть бесплатный тариф |
Ключевое отличие от аренды обычного VPS: не нужно самому держать демон Docker, писать деплой-скрипты, настраивать реверс-прокси и следить за сертификатами. Вы отвечаете за Dockerfile, платформа — за сборку, запуск, HTTPS и перезапуск при сбое.
Частые ошибки и решения
Образ собрался, но контейнер сразу останавливается
Процесс в CMD завершается вместо того, чтобы работать постоянно. Контейнер живёт ровно столько, сколько живёт главный процесс: он должен оставаться на переднем плане, без демонизации.
Адрес отдаёт 502 при рабочем контейнере
Процесс слушает 127.0.0.1 или порт, отличный от PORT. Внутри контейнера localhost изолирован — привязывайтесь к 0.0.0.0 и читайте порт из переменной окружения.
Сборка идёт слишком долго
Копируйте манифесты зависимостей отдельным слоем перед копированием исходников — тогда кеш не сбрасывается на каждое изменение кода. Используйте multi-stage сборку и добавьте .dockerignore, чтобы не тащить node_modules и .git в контекст.
FAQ
Можно ли запустить готовый образ из реестра?
Основной сценарий — сборка из Dockerfile в вашем репозитории. Для приватных базовых образов доступ настраивается через переменные окружения проекта.
Поддерживаются ли multi-stage сборки?
Да, это рекомендуемый подход: он заметно уменьшает итоговый образ и ускоряет запуск контейнера.
Что с docker-compose?
Проект разворачивается как отдельный сервис. Многосервисную схему собирают из нескольких проектов на платформе, связывая их переменными окружения и общей базой.
Где посмотреть логи сборки?
Полный лог сборки и рантайм-логи контейнера доступны в панели проекта в реальном времени.
Сохраняются ли данные внутри контейнера?
Файловая система контейнера эфемерна: при пересборке она обнуляется. Для постоянных данных используйте базу данных или файловое хранилище платформы.