# Веб-приложения и воркеры

> Приложение с адресом и фоновый воркер: чем они отличаются, зачем вебу порт и почему у воркера его нет.

Раздел: Приложение
Источник: https://nodbox.ru/docs/apps/types/

---
Приложение на платформе бывает двух видов: веб-приложение и воркер. Веб-приложение отвечает на запросы по HTTPS и получает адрес на домене платформы, поэтому ему нужен порт. Воркер - фоновый обработчик без адреса и без порта: он работает постоянно, а не только по запросу. Вид выбирается при создании приложения и потом не меняется.

## Как выбрать вид

Веб-приложение нужно, когда к приложению кто-то обращается по сети: браузер, мобильный клиент, чужой сервис. Воркер нужен, когда приложение само берёт работу и ничего не принимает.

| Задача | Вид |
| --- | --- |
| Сайт или API | веб-приложение |
| Бот на вебхуках | веб-приложение |
| Разбор очереди | воркер |
| Рассылки | воркер |
| Обработка данных | воркер |

Бот на вебхуках - веб-приложение, потому что вебхук - это запрос к твоему адресу. Задач по расписанию платформа не запускает: видов два, третьего нет.

Выбор нельзя исправить правкой. Веб, ставший воркером, потерял бы адрес, по которому его уже зовут, поэтому смена вида - это новое приложение. Заведи нужное и удали лишнее.

## Чем виды отличаются

| Свойство | Веб-приложение | Воркер |
| --- | --- | --- |
| Принимает запросы | да | нет |
| Адрес на домене платформы | есть | нет |
| Свой домен | можно привязать | привязать нельзя |
| Порт | обязателен | не задаётся |
| Протокол, проверка готовности, время на запрос | настраиваются | не настраиваются |
| Сон без запросов | включён по умолчанию, можно выключить | не бывает |
| Метрики на обзоре | запросы, время ответа, память | процессор, перезапуски, память |
| Значение `type` в API | `web` | `worker` |

Размер, переменные и секреты, источник кода, версии и откат у обоих видов общие.

## Веб-приложению нужен порт

Порт - номер, на котором процесс приложения принимает запросы. Платформа отправляет на него трафик с адреса приложения, а снаружи отдаёт HTTPS, поэтому порт задаётся при создании и правится в настройках приложения. Как выбрать порт, протокол и проверку готовности, разобрано на странице [Порт, протокол и проверка готовности](/docs/apps/runtime/).

Адрес приложение получает сразу: HTTPS на нём работает без настройки. Свой домен привязывается отдельно, подробности - в разделах [Адрес и HTTPS](/docs/domains/address/) и [Свой домен](/docs/domains/custom-domain/).

Без запросов веб-приложение может уснуть и не тарифицироваться, а первый запрос его будит: [Сон и пробуждение](/docs/apps/sleep/).

## Воркер не принимает запросов

Слушать у воркера некому, поэтому всё, что связано с запросами, ему не положено:

- адреса на домене платформы нет, и в списке адресов проекта воркера нет
- свой домен привязать нельзя: запрос на привязку к воркеру отвечает `422`
- порт, протокол, путь проверки готовности и время на запрос не задаются
- сна нет: будить воркера нечем, ведь запросов к нему не приходит

Воркер не засыпает, поэтому ты платишь за круглосуточную работу. Цена берётся с размера приложения, как у веб-приложения с выключенным сном. Например, Eco 256 стоит 190 ₽ в месяц. Все размеры и цены - в разделе [Размеры приложения](/docs/apps/sizes/).

Из настроек масштаба у воркера остаётся один потолок: «Максимум экземпляров». Подробности - на странице [Автомасштабирование](/docs/apps/scaling/).

Состояния воркера читаются теми же словами, что у веб-приложения, кроме «Спит»: сна у воркера нет. Слова разобраны в разделе [Состояния приложения](/docs/observability/states/).

## Вид выбирается на странице «Новое приложение»

Вид выбирается в карточке «Что это за приложение». Там два варианта, «Веб-приложение» и «Воркер», по умолчанию выбран веб. Карточка сразу предупреждает, что выбор делается один раз.

От выбора меняется остальная форма:

| Карточка | Веб-приложение | Воркер |
| --- | --- | --- |
| Имя | «Имя и адрес» и поле «Порт приложения» | «Имя», порта нет |
| Масштаб | «Сон и масштаб» | «Масштаб», только максимум экземпляров |
| Как обращаться к приложению | есть: протокол, проверка готовности, время на запрос | нет |
| Сколько это будет стоить | «Пока работает» и «Пока спит» | «Работает всегда» |

После создания вид виден в трёх местах:

- на странице приложения: в заголовке стоит «Веб-приложение» или «Воркер», а на вкладке «Обзор» в карточке «Как настроено» есть строка «Тип». Строки «Порт» у воркера нет
- в списке приложений: у воркера в окне карточки вместо адреса стоит слово «воркер»
- в обзоре: у воркера плитки «Процессор» и «Перезапуски» вместо «Запросов за сутки» и «Времени ответа». Ноль перезапусков значит, что процесс не падал

Вида в настройках приложения нет: менять его нечем.

## В API вид задаёт поле type

Поле `type` принимает `web` или `worker`. Оно необязательно: без него создаётся веб-приложение. Ответ отдаёт `type` всегда, у воркера `port` равен `null`.

Создание воркера из готового образа:

```json
{
  "name": "mailer",
  "type": "worker",
  "source_type": "image",
  "image_ref": "ghcr.io/liza/mailer:1.4"
}
```

Это `POST /api/v1/applications` с правом токена «деплоить» и обязательным заголовком `Idempotency-Key`. Ответ - `201`, первая версия заказывается сразу.

Чем вид определяет запрос, видно по ответам `422`:

| Что прислано | `web` | `worker` |
| --- | --- | --- |
| `port` | обязателен | запрещён |
| `protocol`, `health_check_path`, `request_timeout_seconds` | можно | запрещены |
| `sleep_enabled`, `sleep_after_seconds` | применяются | принимаются и не применяются: сон у воркера всегда выключен |
| `type` в `PATCH /api/v1/applications/{id}` | запрещён | запрещён |

Запрещённое поле не пропускается молча: клиент, который прислал воркеру порт, получает `422` с названным полем. Сон - исключение, потому что панель присылает настройки масштаба одним блоком. Привязка домена к воркеру отвечает `422` по полю `application_id`: «Домен открывает веб-приложение, а у фонового процесса адреса нет».

## Что дальше

- [Порт, протокол и проверка готовности](/docs/apps/runtime/) - что слушает веб-приложение и когда версия готова
- [Сон и пробуждение](/docs/apps/sleep/) - как веб-приложение засыпает без запросов
- [Автомасштабирование](/docs/apps/scaling/) - сколько экземпляров держит приложение
- [Размеры приложения](/docs/apps/sizes/) - процессор, память и цены
- [Состояния приложения](/docs/observability/states/) - что значат «Работает», «Спит» и «Упало»
