Какой тип сервиса выбрать
При создании сервиса вы выбираете его тип. Тип определяет, что платформа запустит после сборки и получит ли сервис домен. Вариантов три:
| Тип | Что запускается | Домен |
|---|---|---|
| Сервер с HTTP | ваш процесс, который слушает порт и отвечает на запросы | да, автоматически |
| Статический сайт | ничего из вашего кода: собранные файлы раздаёт веб-сервер платформы | да, автоматически |
| Воркер | ваш процесс без входящего HTTP | нет |
Первые два типа это Web-сервисы: они видны из интернета и получают домен. Именно так они называются в остальных статьях. Воркер наружу не выходит.
Выбор сводится к двум вопросам:
1. Нужно ли принимать запросы из интернета по своему адресу?
- Нет, приложение только само куда-то ходит или работает в фоне → Воркер
- Да → второй вопрос
2. Есть ли в репозитории серверный код, который нужно запустить?
- Да, свой сервер отвечает на запросы → Сервер с HTTP
- Нет, сборка выдаёт готовые файлы → Статический сайт
Сервер с HTTP
Выбирайте, если приложение обслуживает входящие HTTP-запросы своим кодом: HTTP API, веб-приложение, сайт с серверной частью. Такой сервис получает поддомен с TLS-сертификатом (доступен по HTTPS), к нему можно подключить собственный домен.
Обязательное условие: приложение слушает порт из переменной PORT на адресе 0.0.0.0, см. подготовку кода.
Сюда же относится случай, когда один сервер отдаёт и API, и собранный фронтенд. Наличие React или Vue в зависимостях ничего не меняет: если ваш код запускается и отвечает на запросы, это сервер, а не статика.
Статический сайт
Выбирайте, если сборка выдаёт готовые файлы и своего сервера в репозитории нет: лендинг, документация, SPA на Vite/React/Vue, Astro, Hugo. Платформа соберёт репозиторий и раздаст указанную папку сборки готовым веб-сервером.
Порт и команда запуска у этого типа не задаются: запускать нечего. Подробности, настройка папки сборки и работа с переменными окружения описаны в статье «Статический сайт».
Воркер
Выбирайте, если приложение не принимает входящий HTTP, а работает в фоне и само инициирует действия:
- бот на long-polling (сам опрашивает сервер мессенджера);
- потребитель очереди или брокера сообщений (RabbitMQ, Kafka, Redis);
- фоновый обработчик, планировщик внутри процесса, синхронизация данных.
Воркер не получает домен и не слушает порт. Ему по-прежнему доступны переменные окружения и подключение к базе данных внутри проекта.
Частый случай: Telegram-бот
Бота можно построить двумя способами, и от этого зависит тип сервиса:
- Long-polling (бот сам опрашивает Telegram:
run_polling(),bot.launch()): входящий HTTP не нужен. Это Воркер. - Webhook (Telegram сам присылает обновления на ваш HTTPS-адрес): нужен публичный домен для приёма запросов. Это Сервер с HTTP.
Для большинства ботов проще и надёжнее long-polling, то есть Воркер.
Нужны и то, и другое
Один сервис соответствует одному типу. Если системе нужен и HTTP API, и фоновый обработчик, создайте два сервиса в одном проекте. Они делят частную сеть проекта и обращаются друг к другу по внутренним адресам, см. «Связь сервисов».
Так же решается и связка «статический сайт + API»: отдельный сервис со статикой и отдельный с сервером.
Если тип выбран неверно
Тип можно изменить в настройках сервиса, пока не прошло ни одного успешного развёртывания. После этого он фиксируется, и для смены нужно создать новый сервис. Как выглядит каждая из двух ошибок и что с ней делать, описано в статье «Статический сайт».
Health-check
Платформа может периодически проверять «здоровье» контейнера и перезапускать его при сбое. Проверка выключена по умолчанию и необязательна, включается в настройках сервиса. Разница по типам:
- Сервер с HTTP: при включении проверка использует HTTP-порт приложения, достаточно указать путь (например,
/health). - Воркер: так как у него нет HTTP-порта, включить проверку можно только если процесс сам поднимет небольшой HTTP-эндпоинт, и тогда его порт указывается явно.
- Статический сайт: проверка почти бесполезна. Отвечает веб-сервер платформы, и он вернёт успешный ответ на любой путь, пока контейнер жив.
Влияет ли тип на оплату
Нет. Оплата берётся за проект по его тарифу, а не за отдельные сервисы. Добавление воркера рядом с сервером не создаёт отдельного счёта, но оба сервиса делят вычислительные ресурсы проекта, поэтому следите, чтобы им хватало памяти в рамках тарифа. Подробнее в статье «Оплата».