> For the complete documentation index, see [llms.txt](https://docs.iexexchanger.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.iexexchanger.com/knowledge-base/servery-domeny-i-infrastruktura/overview/process-map/supervisor-and-pm2.md).

# Настройка Supervisor и PM2

Supervisor управляет долгоживущими процессами серверной части, а PM2 — только SSR клиентского сайта. Сначала определите нужный состав по [карте процессов](/knowledge-base/servery-domeny-i-infrastruktura/overview/process-map.md), затем создавайте конфигурации.

## Кто и чем управляет

| Процесс            | Менеджер                        | Пользователь               |
| ------------------ | ------------------------------- | -------------------------- |
| Horizon            | Supervisor                      | Владелец серверного сайта  |
| Reverb             | Supervisor                      | Владелец серверного сайта  |
| `pulse:check`      | Supervisor, если нужен          | Владелец серверного сайта  |
| `pulse:work`       | Supervisor, только Redis ingest | Владелец серверного сайта  |
| Laravel Scheduler  | Cron                            | Владелец серверного сайта  |
| SSR `iexexchanger` | PM2                             | Владелец клиентского сайта |

Эти операции не выполняются из админки. Для встроенной проверки Horizon и Pulse техническому администратору нужно право «Разрешить доступ к мониторингу данных».

## Общие требования Supervisor

В каждом файле замените:

* `<ПУТЬ_BACKEND>` — каталог текущей серверной поставки с `artisan`;
* `<BACKEND_USER>` — владельца серверного сайта;
* `<ПУТЬ_ЖУРНАЛА>` — существующий непубличный каталог, доступный владельцу;
* значения ожидания остановки — с учётом максимального времени рабочих задач.

Не запускайте Laravel-процессы от `root`.

## Horizon

Файл `/etc/supervisor/conf.d/iex-horizon.conf`:

```ini
[program:iex-horizon]
command=/opt/php84/bin/php artisan horizon
directory=<ПУТЬ_BACKEND>
user=<BACKEND_USER>
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=<ПУТЬ_ЖУРНАЛА>/horizon.log
stopwaitsecs=<БОЛЬШЕ_МАКСИМАЛЬНОГО_ВРЕМЕНИ_ЗАДАНИЯ>
```

Один Horizon запускает все группы из `config/horizon.php`. Не создавайте дополнительный `queue:work` для уже перечисленных там очередей.

## Reverb

Файл `/etc/supervisor/conf.d/iex-reverb.conf`:

```ini
[program:iex-reverb]
command=/opt/php84/bin/php artisan reverb:start
directory=<ПУТЬ_BACKEND>
user=<BACKEND_USER>
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=<ПУТЬ_ЖУРНАЛА>/reverb.log
```

Перед запуском настройте внутренний bind, публичный WSS и origins по статье [«Laravel Reverb и WebSocket»](/knowledge-base/servery-domeny-i-infrastruktura/overview/process-map/reverb.md).

## Pulse check — условно

Создавайте `/etc/supervisor/conf.d/iex-pulse-check.conf` только когда Pulse включён и нужна карточка серверов:

```ini
[program:iex-pulse-check]
command=/opt/php84/bin/php artisan pulse:check
directory=<ПУТЬ_BACKEND>
user=<BACKEND_USER>
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=<ПУТЬ_ЖУРНАЛА>/pulse-check.log
```

## Pulse work — только Redis ingest

Создавайте `/etc/supervisor/conf.d/iex-pulse-work.conf` только если конфигурация Pulse использует Redis ingest:

```ini
[program:iex-pulse-work]
command=/opt/php84/bin/php artisan pulse:work
directory=<ПУТЬ_BACKEND>
user=<BACKEND_USER>
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=<ПУТЬ_ЖУРНАЛА>/pulse-work.log
```

При ingest `storage` этого процесса быть не должно.

## Применение Supervisor

```bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status
```

Ожидайте RUNNING только у процессов, которые действительно включены в текущей конфигурации. Если Supervisor показывает FATAL или частые перезапуски, сначала откройте конкретный журнал и проверьте команду от `<BACKEND_USER>`.

## Laravel Scheduler

У владельца серверного сайта должна быть одна запись cron:

```cron
* * * * * cd <ПУТЬ_BACKEND> && /opt/php84/bin/php artisan schedule:run >> /dev/null 2>&1
```

Не создавайте одинаковый Scheduler одновременно в crontab нескольких пользователей и в другом планировщике панели.

## PM2 для клиента

Войдите от владельца клиентского сайта:

```bash
cd <ПУТЬ_CLIENT>
test -f ecosystem.config.cjs
test -f dist/exchanger/server/server.mjs
mkdir -p logs
pm2 start ecosystem.config.cjs --env production
pm2 describe iexexchanger
```

Штатная конфигурация — один процесс `iexexchanger` в режиме fork на `127.0.0.1:4000`. Полный ecosystem-файл приведён в [«Что такое PM2»](/knowledge-base/servery-domeny-i-infrastruktura/overview/process-map/pm2.md).

Для автозапуска выполните `pm2 startup`, проверьте выданную команду и пользователя, затем сохраните проверенный список через `pm2 save`.

## Перезапуск после обновления

| Компонент                         | Команда после переключения кода                                     |
| --------------------------------- | ------------------------------------------------------------------- |
| Horizon                           | `/opt/php84/bin/php artisan horizon:terminate`                      |
| Pulse, если его процессы запущены | `/opt/php84/bin/php artisan pulse:restart`                          |
| Reverb, если включён              | `/opt/php84/bin/php artisan reverb:restart`                         |
| Клиентский SSR после сборки       | `pm2 restart ecosystem.config.cjs --only iexexchanger --update-env` |

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

## Проверка после перезагрузки сервера

1. `supervisorctl status` показывает нужные Laravel-процессы в RUNNING.
2. `artisan horizon:status` подтверждает Horizon.
3. Под владельцем клиента `pm2 list` показывает один `iexexchanger` online.
4. Внутренний SSR отвечает на `127.0.0.1:4000`.
5. Клиентский сайт и панель открываются по HTTPS.
6. Безопасная задача проходит очередь.
7. Чат работает без обновления страницы.
8. Pulse показывает данные только тех recorders и серверов, которые включены.

RUNNING и online подтверждают процесс, но не конечный результат. Всегда завершайте проверкой пользовательского сценария.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.iexexchanger.com/knowledge-base/servery-domeny-i-infrastruktura/overview/process-map/supervisor-and-pm2.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
