> 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/help-center/administrirovanie/obsluzhivanie/nastroika-i-rabota-pm2-dlya-frontend.md).

# Настройка и работа PM2 для Frontend

PM2 используется для запуска Frontend-сервера Angular SSR в рабочем режиме (Production).

В отличие от обычного статического сайта, Frontend iEXExchanger запускает Node.js-приложение, которое отвечает за генерацию HTML-страниц, обработку маршрутов, мультиязычность, SEO и взаимодействие с Backend.

PM2 позволяет:

* запускать Frontend как фоновый процесс;
* автоматически перезапускать сервер при сбоях;
* сохранять логи работы;
* автоматически запускать Frontend после перезагрузки сервера;
* управлять запуском, остановкой и перезапуском приложения.

По умолчанию Frontend работает на локальном порту:

```
127.0.0.1:4000
```

Nginx принимает запросы пользователей и передаёт их в Angular SSR:

```mermaid
graph TD
  https://ваш_домен --> 127.0.0.1:4000
```

## Перед началом

Перед настройкой убедитесь, что:

* Frontend уже установлен;
* выполнена сборка проекта;
* настроен Nginx;
* установлен Node.js;
* установлен PM2;
* существует файл `.env`;
* существует папка `dist/exchanger`.

## Где находится PM2-конфигурация

Файл конфигурации PM2 находится в корне Frontend-проекта:

```
/var/www/имя_пользователя_frontend/data/www/ваш_домен/ecosystem.config.cjs
```

Структура проекта должна выглядеть примерно так:

```
/var/www/имя_пользователя_frontend/data/www/ваш_домен/

├── dist/
│   └── exchanger/
│       ├── browser/
│       └── server/
├── logs/
├── .env
└── ecosystem.config.cjs
```

## Создание папки логов

Перед первым запуском создайте папку для логов:

```bash
mkdir -p logs
```

В ней будут храниться журналы работы Frontend.

## Рекомендуемая конфигурация PM2

Для большинства проектов рекомендуется использовать следующую конфигурацию:

```javascript
module.exports = {
    apps: [
        {
            name: 'iexexchanger',
            script: 'dist/exchanger/server/server.mjs',
            cwd: __dirname,

            instances: 1,
            exec_mode: 'fork',

            autorestart: true,
            watch: false,

            max_memory_restart: '1G',

            env: {
                NODE_ENV: 'production',
                PORT: 4000,
                HOST: '127.0.0.1',
                PM2: 'true',
            },

            log_date_format: 'YYYY-MM-DD HH:mm:ss Z',

            error_file: 'logs/err.log',
            out_file: 'logs/out.log',

            merge_logs: true,
            time: true,

            wait_ready: true,
            listen_timeout: 10000,
            kill_timeout: 5000,
            exp_backoff_restart_delay: 100,
        },
    ],
};
```

Данная конфигурация подходит для большинства серверов и рекомендуется использовать её без изменений.

## Описание основных параметров

{% stepper %}
{% step %}

### name

Название процесса.

```javascript
name: 'iexexchanger'
```

Именно это имя используется во всех командах PM2.

Например:

```bash
pm2 status
pm2 logs iexexchanger
pm2 restart iexexchanger
```

{% endstep %}

{% step %}

### script

Файл запуска Angular SSR.

```javascript
script: 'dist/exchanger/server/server.mjs'
```

Если структура проекта стандартная, менять этот путь не требуется.
{% endstep %}

{% step %}

### cwd

Рабочая директория процесса.

```javascript
cwd: __dirname
```

Frontend использует текущую директорию для поиска файла `.env`.

Если параметр указан неправильно, приложение может не загрузить настройки окружения.
{% endstep %}

{% step %}

### instances

Количество одновременно работающих процессов.

По умолчанию рекомендуется:

```javascript
instances: 1
```

Этого достаточно для большинства обменных пунктов.
{% endstep %}

{% step %}

### exec\_mode

Режим запуска процесса.

Рекомендуемое значение:

```javascript
exec_mode: 'fork'
```

Именно этот режим используется по умолчанию.
{% endstep %}

{% step %}

### autorestart

Автоматический перезапуск после сбоя.

```javascript
autorestart: true
```

Рекомендуется всегда оставлять включённым.
{% endstep %}

{% step %}

### watch

Автоматический перезапуск при изменении файлов.

```javascript
watch: false
```

Для Production всегда рекомендуется использовать:

```javascript
false
```

{% endstep %}

{% step %}

### max\_memory\_restart

Максимальный объём памяти, после которого PM2 автоматически перезапустит процесс.

По умолчанию:

```javascript
max_memory_restart: '1G'
```

Рекомендации:

```
512M — небольшой сервер
1G — рекомендуется для большинства проектов
2G — высокая нагрузка и большой объём памяти
```

{% endstep %}

{% step %}

### env

Переменные окружения.

```javascript
env: {
    NODE_ENV: 'production',
    PORT: 4000,
    HOST: '127.0.0.1',
    PM2: 'true',
}
```

Основные параметры:

* `NODE_ENV` включает production-режим;
* `PORT` должен совпадать с настройкой Nginx;
* `HOST` ограничивает доступ только локальным сервером;
* `PM2=true` сообщает приложению, что оно запущено через PM2.
  {% endstep %}

{% step %}

### wait\_ready

```javascript
wait_ready: true
```

Frontend сообщает PM2 о готовности после полного запуска сервера.

Рекомендуется всегда оставлять включённым.
{% endstep %}

{% step %}

### listen\_timeout

Максимальное время ожидания запуска.

```javascript
listen_timeout: 10000
```

По умолчанию 10 секунд.
{% endstep %}

{% step %}

### kill\_timeout

Время корректного завершения процесса.

```javascript
kill_timeout: 5000
```

{% endstep %}

{% step %}

### Логи

```javascript
error_file: 'logs/err.log'
out_file: 'logs/out.log'
```

`out.log`

Обычный вывод приложения.

`err.log`

Ошибки Frontend.
{% endstep %}
{% endstepper %}

***

## Почему рекомендуется использовать fork

Для большинства проектов рекомендуется:

```javascript
instances: 1,
exec_mode: 'fork',
```

Такой режим:

* проще в настройке;
* проще диагностируется;
* использует меньше памяти;
* отлично подходит для большинства обменных пунктов.

Начинать работу рекомендуется именно с него.

## Когда использовать cluster

Режим `cluster` можно использовать только при высокой нагрузке.

Например:

```javascript
instances: 2,
exec_mode: 'cluster',
```

Использовать `cluster` рекомендуется, если:

* сервер имеет несколько CPU;
* достаточно оперативной памяти;
* сайт получает большое количество запросов;
* Frontend уже стабильно работает в режиме `fork`.

Не рекомендуется сразу использовать:

```javascript
instances: 'max'
```

Если сервер имеет 8 ядер, PM2 создаст 8 процессов, что значительно увеличит потребление памяти.

***

## Запуск Frontend

Перейдите в каталог проекта:

```bash
cd /var/www/имя_пользователя_frontend/data/www/ваш_домен
```

Запустите Frontend:

```bash
pm2 start ecosystem.config.cjs
```

Проверьте статус:

```bash
pm2 status
```

Если всё настроено правильно, процесс будет иметь статус:

```
online
```

После этого сохраните конфигурацию:

```bash
pm2 save
```

## Автоматический запуск после перезагрузки

Чтобы Frontend автоматически запускался после перезагрузки сервера:

```bash
pm2 startup
```

PM2 покажет команду, которую необходимо выполнить от имени `root`.

После выполнения снова сохраните процессы:

```bash
pm2 save
```

Проверить можно командой:

```bash
pm2 resurrect
pm2 status
```

## Перезапуск Frontend

После:

* обновления Frontend;
* изменения `.env`;
* изменения PM2-конфигурации;

выполните:

```bash
pm2 restart ecosystem.config.cjs --update-env
```

Параметр:

```
--update-env
```

заставляет PM2 перечитать файл `.env`.

Если изменился только код приложения:

```bash
pm2 restart iexexchanger
```

## Остановка Frontend

Остановить:

```bash
pm2 stop iexexchanger
```

Запустить снова:

```bash
pm2 start ecosystem.config.cjs
```

Удалить процесс:

```bash
pm2 delete iexexchanger
```

После повторного запуска выполните:

```bash
pm2 save
```

## Просмотр логов

Просмотр логов в реальном времени:

```bash
pm2 logs iexexchanger
```

Последние строки:

```bash
pm2 logs iexexchanger --lines 100
```

Также логи находятся в папке:

```
logs/out.log
logs/err.log
```

***

## Очистка логов

Очистить логи PM2:

```bash
pm2 flush
```

Проверить размер папки:

```bash
du -sh logs
```

## Проверка работы Frontend

Проверьте локальный порт:

```bash
curl -I http://127.0.0.1:4000
```

Если сервер отвечает, Frontend успешно работает.

Если ответа нет:

```bash
pm2 status
pm2 logs iexexchanger
```

***

## Проверка файла .env

Перед запуском или перезапуском Frontend рекомендуется проверить основные параметры файла `.env`.

Особое внимание обратите на:

```env
ALLOWED_HOSTS=ваш_домен,app.ваш_домен
```

Если используется несколько доменов или `www`, добавьте их через запятую.

Также проверьте поддерживаемые языки:

```env
SUPPORTED_LANGUAGES=ru,en,es,fr,pl,uk,zh,ka,kk
```

И язык по умолчанию:

```env
DEFAULT_LANGUAGE=ru
```

После изменения любого из этих параметров необходимо выполнить:

```bash
pm2 restart ecosystem.config.cjs --update-env
```

***

## Связь PM2 и Nginx

PM2 запускает Angular SSR на:

```
127.0.0.1:4000
```

Nginx принимает запросы пользователей и передаёт их Frontend.

Если PM2 остановлен, Nginx не сможет получить ответ и пользователь увидит ошибку:

```
502 Bad Gateway
```

***

## После обновления Frontend

После загрузки новой версии Frontend рекомендуется:

1. Проверить наличие новой сборки:

```
dist/exchanger
```

2. Проверить файл `.env`.
3. Перезапустить Frontend:

```bash
pm2 restart ecosystem.config.cjs --update-env
```

4. Проверить статус:

```bash
pm2 status
```

5. Проверить работу сайта:

```bash
curl -I https://ваш_домен
```

***

## Типовые проблемы

<details>

<summary>502 Bad Gateway</summary>

Проверьте:

```bash
pm2 status
pm2 logs iexexchanger --lines 100
curl -I http://127.0.0.1:4000
```

</details>

<details>

<summary>Frontend работает, но сайт не открывается</summary>

Проверьте:

* настройки Nginx;
* порт `4000`;
* совпадает ли порт в `.env`, PM2 и Nginx.

</details>

<details>

<summary>Ошибка DEFAULT_LANGUAGE или SUPPORTED_LANGUAGES</summary>

Проверьте параметры:

```env
SUPPORTED_LANGUAGES=ru,en
DEFAULT_LANGUAGE=ru
```

После изменения:

```bash
pm2 restart ecosystem.config.cjs --update-env
```

</details>

<details>

<summary>Ошибка ALLOWED_HOSTS</summary>

Проверьте:

```env
ALLOWED_HOSTS=example.com,app.example.com
```

Не рекомендуется использовать:

```env
ALLOWED_HOSTS=*
```

</details>

<details>

<summary>Backend API недоступен</summary>

Проверьте:

```env
API_URL=https://app.example.com
```

Не используйте:

```env
API_URL=/backend-api
```

или

```env
API_URL=https://example.com/backend-api
```

</details>

<details>

<summary>PM2 не использует .env</summary>

Убедитесь, что:

* `ecosystem.config.cjs` находится в корне проекта;
* используется:

```javascript
cwd: __dirname
```

* Frontend перезапущен командой:

```bash
pm2 restart ecosystem.config.cjs --update-env
```

</details>

## Краткий чек-лист

1. Создайте папку логов.

```bash
mkdir -p logs
```

2. Проверьте `.env`.
3. Проверьте `ecosystem.config.cjs`.
4. Запустите Frontend.

```bash
pm2 start ecosystem.config.cjs
```

5. Проверьте статус.

```bash
pm2 status
```

6. Сохраните процессы.

```bash
pm2 save
```

7. Настройте автозапуск.

```bash
pm2 startup
pm2 save
```

8. Проверьте локальный порт.

```bash
curl -I http://127.0.0.1:4000
```

9. Проверьте работу сайта.

```bash
curl -I https://ваш_домен
```

***

## Рекомендуемая настройка

Для большинства обменных пунктов рекомендуется использовать:

```javascript
instances: 1,
exec_mode: 'fork',
```

Переходить на режим `cluster` имеет смысл только после появления высокой нагрузки и при наличии достаточного запаса процессорных ресурсов и оперативной памяти.


---

# 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/help-center/administrirovanie/obsluzhivanie/nastroika-i-rabota-pm2-dlya-frontend.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.
