# Настройка PM2

Эта инструкция поможет вам настроить работу вашего сайта так, чтобы оно всегда было доступно и автоматически запускалось после перезагрузки сервера.

{% hint style="warning" %}
Большинство команд в этой инструкции необходимо выполнять от имени пользователя с правами администратора <mark style="color:red;">**(root)**</mark>. Чтобы переключиться в режим администратора, используйте команду:

`sudo -l root`

Однако некоторые команды должны выполняться от имени обычного пользователя сайта (без привилегий администратора). В таких случаях явно указано, если нужно выйти из режима администратора и использовать обычного пользователя.

`su -l имя_пользователя`
{% endhint %}

## Шаг 1: Подготовка сервера

Сначала обновите все необходимые пакеты на сервере. Выполните команды одну за другой:

```bash
sudo apt update
sudo apt upgrade -y
sudo apt install curl gnupg git -y
```

## ШАГ 2: Установка NodeJS 22 и npm 11

Node.js – это среда выполнения JavaScript, которая необходима для работы веб-приложений на стороне сервера.

#### 1. Выполните следующие команды в терминале:

```bash
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install nodejs -y
```

#### 2. Обновите npm до последней доступной версии (рекомендуется):

```bash
sudo npm install -g npm@latest
```

Проверьте, что Node.js установлен правильно:

```bash
node -v
npm -v
```

<figure><img src="/files/M5E7nYQE5sdxljes7qCF" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Если версия npm устарела, обязательно выполните команду из шага №2 выше, чтобы обеспечить совместимость с последними библиотеками и инструментами.
{% endhint %}

## ШАГ 3: Установка pm2

pm2 – это программа, которая следит, чтобы ваш сайт всегда работал.

Выполните команду:

```bash
sudo npm install pm2@latest -g
```

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

```bash
pm2 -v
```

<figure><img src="/files/S1pGoH6xuXExt6NSZ6nU" alt="" width="375"><figcaption></figcaption></figure>

## ШАГ 4: Подготовка проекта на основном домене (через FastPanel)

Эти шаги помогут вам загрузить и правильно расположить файлы вашего проекта на основном домене через панель управления FastPanel.

#### Как разместить проект:

1. Откройте панель управления FastPanel.
2. Перейдите в раздел **«Сайты» → «Файлы»** вашего **основного сайта**.
3. Если вы ещё не распаковали проект на сервере:
   * Загрузите архив с проектом с вашего компьютера в корневой каталог вашего сайта через встроенный файловый менеджер FastPanel.
   * Распакуйте архив непосредственно в этом же каталоге.
4. Проверьте, что структура файлов проекта после распаковки выглядит именно так:

```
ваш_проект/
├── dist/
│   └── exchanger/
│       └── server/
│           └── server.mjs
├── logs/ (если папки нет, создайте её через панель)
└── (другие файлы)
```

{% hint style="info" %}

## Важно

Убедитесь, что папка **logs** присутствует в корневом каталоге проекта. Если её нет, создайте её прямо здесь же через файловый менеджер FastPanel.

Эта папка необходима для корректной работы приложения, в ней будут храниться логи проекта.
{% endhint %}

## ШАГ 5: Создание файла конфигурации pm2

{% hint style="danger" %}

## Важно:

* Не запускайте и не создавайте конфигурационный файл PM2 от имени пользователя <mark style="color:red;">**root**</mark>.
* Используйте только <mark style="color:green;">**обычного пользователя**</mark> сайта (тот, под которым загружены файлы через панель управления FastPanel).
* Это необходимо для предотвращения возможных проблем с правами доступа и корректной работы вашего проекта.
* Запуск PM2 под правильным пользователем обеспечивает стабильную и безопасную работу приложения, сохраняя корректные права доступа к файлам и папкам проекта.
  {% endhint %}

### Как переключиться с root на нужного пользователя сайта?

Если в данный момент вы работаете от имени root и вам нужно перейти к пользователю вашего сайта, выполните следующую команду:

```bash
su -l имя_пользователя
```

**Пример:**

Если ваш пользователь называется siteuser, выполните:

```
su -l siteuser
```

После переключения убедитесь, что вы теперь работаете под нужным пользователем (команда для проверки):

```bash
whoami
```

Вывод должен быть именем вашего пользователя, например: **`siteuser`**

### Создание файла конфигурации:

1. Авторизуйтесь в панели управления FastPanel.
2. В боковом меню перейдите в раздел **«Сайты»**.
3. Выберите **ваш основной домен** и перейдите в раздел **«Файлы»**.
4. В открывшейся директории сайта откройте папку вашего проекта, обычно это:

Перейдите в директорию сайта (пример):

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

5. Создайте новый файл прямо в этой папке и назовите его:

```
ecosystem.config.cjs
```

6. Скопируйте в этот файл следующий конфиг:

```bash
module.exports = {
  apps: [
    {
      name: 'iexexchanger',
      script: 'dist/exchanger/server/server.mjs',
      cwd: __dirname,
      instances: 'max',
      exec_mode: 'cluster',
      autorestart: true,
      watch: false,
      max_memory_restart: '1G',
      env: {
        NODE_ENV: 'production',
        PORT: 4000,
        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: false,
      listen_timeout: 3000,
      kill_timeout: 2000,
      exp_backoff_restart_delay: 100
    },
  ],
};
```

7. Сохраните файл (нажмите кнопку **«Сохранить»** в FastPanel).

## ШАГ 6: Запуск проекта

Теперь файл конфигурации создан, вам нужно запустить его через терминал от имени пользователя сайта.

1. Перейдите в директорию проекта командой:

```bash
cd www/<ваш_домен>
```

2. Запустите PM2, используя ранее созданный файл конфигурации:

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

3. Для того чтобы процессы запускались автоматически при перезагрузке сервера, выполните команду:

```bash
pm2 startup && pm2 save
```

## ШАГ 7: Настройка автозапуска pm2

{% hint style="warning" %}
Автоматический запуск приложения через pm2 необходим, чтобы сайт продолжал стабильно работать после каждой перезагрузки сервера.
{% endhint %}

Настройте автоматический запуск pm2 после перезагрузки сервера:

**Эти действия выполните под пользователем&#x20;**<mark style="color:red;">**root**</mark>**&#x20;или с помощью sudo:**

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

```bash
su -l root
```

Выполните команду настройки автозапуска pm2 для вашего пользователя FastPanel:

```bash
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u <имя_пользователя> --hp /var/www/<имя_пользователя>/data
```

**Пример:**

Если ваш пользователь называется siteuser, команда будет выглядеть так:

```bash
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u siteuser --hp /var/www/siteuser/data
```

После выполнения вы получите подтверждение о правильной настройке автозапуска.

Рекомендуется убедиться в том, что всё настроено корректно:

* Перезагрузите сервер:

```bash
sudo reboot
```

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

```bash
pm2 status
```

Приложение должно автоматически запуститься и иметь статус **online**.

## Полезные команды pm2

{% hint style="danger" %}

## Внимание!!!&#x20;

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

Эти команды потребуются только в том случае, если в процессе эксплуатации приложения вы заметите сбои, нестабильность работы или необходимость перезапуска сервиса.
{% endhint %}

* Остановить приложение:

```
pm2 stop iexexchanger
```

* Перезапустить приложение:

```
pm2 restart iexexchanger
```

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

```
pm2 logs iexexchanger
```


---

# Agent Instructions: 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:

```
GET https://docs.iexexchanger.com/nachalo-raboty/ustanovka/shag-4-zapusk-processov/nastroika-pm2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
