# Обзор

Добро пожаловать в официальную документацию iEXExchanger.

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

Независимо от того, устанавливаете ли вы iEXExchanger впервые или уже используете платформу в рабочем проекте, здесь вы найдёте необходимые инструкции и технические рекомендации.

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Настройка окружения</strong></td><td>Подготовка сервера к работе iEXExchanger</td><td><a href="/files/qalazjOlG5TqI04VKBRx">/files/qalazjOlG5TqI04VKBRx</a></td><td><a href="/pages/2YxTR8JYRNlP8jG4E9lw">/pages/2YxTR8JYRNlP8jG4E9lw</a></td></tr><tr><td><strong>Nginx</strong></td><td>Конфигурация Frontend, Backend API и WebSocket.</td><td><a href="/files/UJTOdwpxrbDfAXBSWDYa">/files/UJTOdwpxrbDfAXBSWDYa</a></td><td><a href="/pages/E9WKesM7XwCwE0IsKTAh">/pages/E9WKesM7XwCwE0IsKTAh</a></td></tr><tr><td><strong>Cron</strong></td><td>Настройка автоматического запуска</td><td><a href="/files/egRYRFDfWk92pFwhyK88">/files/egRYRFDfWk92pFwhyK88</a></td><td><a href="/pages/VQTz35uLnAox2blCwlqe">/pages/VQTz35uLnAox2blCwlqe</a></td></tr></tbody></table>

### Что входит в документацию

Документация охватывает все этапы работы с платформой, включая:

* подготовку сервера и инфраструктуры;
* регистрацию домена и настройку DNS;
* получение и активацию лицензии;
* установку Backend и Frontend;
* настройку веб-сервера, базы данных, Redis, очередей и фоновых процессов;
* запуск и проверку работоспособности системы;
* обновление платформы;
* настройку административной панели;
* управление валютами, направлениями, резервами и курсами;
* подключение модулей и внешних интеграций;
* настройку безопасности и контроля доступа;
* диагностику, обслуживание и устранение распространённых ошибок;
* API, SDK и материалы для разработчиков.

### Структура документации

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

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

### Поиск информации

Если нужную инструкцию не удаётся найти вручную, воспользуйтесь поиском в верхней части документации.

<button type="button" class="button primary" data-action="ask" data-icon="gitbook-assistant">Ask a question…</button>

Также доступен встроенный AI-помощник, который использует содержимое документации и помогает быстро найти нужную статью, объяснить назначение параметров или подсказать решение типовых проблем.

### С чего начать

Если вы впервые устанавливаете iEXExchanger, рекомендуем придерживаться следующего порядка:

1. Ознакомьтесь с системными требованиями.
2. Подготовьте сервер и доменное имя.
3. Получите и активируйте лицензию.
4. Установите Backend и Frontend.
5. Настройте серверное окружение и выполните первый запуск.
6. Проверьте работоспособность системы.
7. Выполните первоначальную настройку платформы.
8. Подключите необходимые интеграции и дополнительные модули.

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


# Активация лицензии

Перед установкой iEXExchanger необходимо создать лицензию и привязать к ней основной домен проекта. Без завершения процедуры активации загрузка установочного архива будет недоступна.

{% hint style="danger" %}

### Важно

Перед сохранением домена внимательно проверьте правильность введённого адреса.

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

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

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

{% stepper %}
{% step %}

### Войдите в личный кабинет

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

1. Перейдите на [официальный сайт iEXExchanger.](https://iexexchanger.com/)
2. В правом верхнем углу нажмите на значок пользователя.
3. Выполните вход с использованием вашего email и пароля.
4. После авторизации откройте меню пользователя и перейдите в личный кабинет.
   {% endstep %}

{% step %}

### Откройте раздел «Мои заказы»

1. В левом меню выберите раздел **«Мои заказы»**.
2. Найдите оплаченный заказ с лицензией iEXExchanger.
3. Если лицензия ещё не привязана к домену, возле заказа будет доступна кнопка **«Создать лицензию»**.

Свободный слот означает, что к данной лицензии ещё не привязан ни один домен.
{% endstep %}

{% step %}

### Создайте лицензию и привяжите домен

Нажмите кнопку **«Создать лицензию».**

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

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

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

Количество доступных полей зависит от типа приобретённой лицензии.

Например:

* **PRO —** позволяет привязать один основной домен.
* **PRO Plus —** позволяет привязать несколько доменов в рамках условий лицензии.

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

<details>

<summary>Правильный формат домена</summary>

example.com

</details>

<details>

<summary>Неправильные варианты</summary>

```
https://example.com
http//example.com
www.example.com
example.com/
```

</details>

После ввода домена нажмите **«Сохранить домены».**
{% endstep %}

{% step %}

### Дождитесь завершения активации

После сохранения лицензия будет отправлена на первичную активацию.

<figure><img src="/files/8wIwQCf6PMfRIIn4V4IZ" alt=""><figcaption></figcaption></figure>

Статус лицензии изменится на: <mark style="color:$warning;">**Идет активация**</mark>

Первичная активация выполняется вручную и обычно занимает **до 4 часов в рабочее время.**

До завершения активации скачивание файлов продукта будет недоступно.
{% endstep %}

{% step %}

### Откройте доступ к лицензиям

После завершения активации домена перейдите в раздел **«Лицензия обменника».**

<figure><img src="/files/24bqVBtxIAYlS4CG74fa" alt=""><figcaption></figcaption></figure>

Если двухфакторная защита ещё не настроена, система не позволит получить доступ к лицензиям и предложит сначала подключить один из способов дополнительной защиты аккаунта.

Для продолжения необходимо:

<figure><img src="/files/oYnQaZaBZ7ztvnQ9MGjb" alt="" width="563"><figcaption></figcaption></figure>

1. Перейти в раздел **«Настройки»** личного кабинета.
2. Подключить **Google Authenticator (2FA)** или сохранить и активировать **резервные коды восстановления**.
3. Завершить настройку выбранного способа защиты.
4. Вернуться в раздел **«Лицензия обменника».**

После этого система запросит подтверждение личности:

* через одноразовый код из Google Authenticator;
* либо через резервный код восстановления.

После успешного подтверждения откроется полный доступ к лицензиям, скачиванию файлов продукта и обновлений.
{% endstep %}
{% endstepper %}

*<mark style="color:red;">В целях безопасности доступ к лицензиям невозможен без настроенной двухфакторной защиты или резервных кодов восстановления. Это требование является обязательным для всех аккаунтов iEXExchanger.</mark>*


# Файлы лицензии и релизы

После успешной активации лицензии откройте раздел **«Лицензия обменника»** и выберите необходимую лицензию.

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

На странице лицензии расположен раздел **«Релизы и файлы лицензии»**, содержащий все файлы, необходимые для установки, обновления и дальнейшей работы системы.

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

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

{% hint style="success" %}
Для первичной установки iEXExchanger скачайте следующие файлы из одной актуальной версии продукта:

* Файл лицензии домена;
* Frontend (Установка);
* Backend (Установка).

После получения указанных файлов можно переходить к следующему этапу — установке Backend и Frontend на сервер.
{% endhint %}

***

## Файл лицензии домена

Файл лицензии домена используется для активации продукта на сервере и подтверждения права использования iEXExchanger на привязанном домене.

Для каждого домена система автоматически создаёт отдельный файл лицензии.

Чтобы скачать файл лицензии:

1. Откройте страницу лицензии.
2. Найдите блок **«Файл лицензии домена».**
3. Нажмите кнопку загрузки рядом с архивом лицензии.

После скачивания вы получите ZIP-архив с лицензионными файлами.

{% hint style="info" %}
Файл лицензии создаётся индивидуально для каждого домена и может использоваться только на домене, который был указан при активации лицензии.
{% endhint %}

## Релизы системы

Ниже блока лицензии располагаются доступные версии продукта.

Каждая версия содержит собственный набор файлов для установки и обновления системы.

Перед скачиванием файлов убедитесь, что выбрана актуальная версия продукта.

Рекомендуется использовать версию со статусом: <mark style="color:purple;">**Актуальная**</mark>

<mark style="color:red;">Для новых установок использование архивных версий не рекомендуется.</mark>

### Установочные файлы

В блоке **«Установка»** находятся архивы для первоначального развёртывания системы.

Для новой установки необходимо скачать оба файла.

{% stepper %}
{% step %}

### Frontend

Клиентская часть обменного пункта, которая устанавливается на основной домен сайта.

Пример: `example.com`
{% endstep %}

{% step %}

### Backend

Административная панель, API и серверная часть системы.

Устанавливается на технический поддомен.

Пример: `app.example.com`
{% endstep %}
{% endstepper %}

### Файлы обновлений

В блоке **«Обновление»** расположены архивы для обновления уже установленной системы.

Если вы выполняете установку iEXExchanger впервые, скачивать данные файлы не требуется.

Архивы обновлений используются только для обновления существующих установок.

***

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

* Используйте только актуальную версию продукта.
* Не смешивайте файлы из разных версий системы.
* Не используйте архивные релизы для новых проектов без необходимости.
* Не используйте файлы из раздела **«Обновление»** при первичной установке.
* Храните скачанный файл лицензии до завершения установки системы.


# Работа с AI

Документацию iEXExchanger можно подключить к AI-ассистенту, чтобы быстрее находить настройки, подготавливать инструкции и разбирать проблемы на основе опубликованных материалов.

Для работы доступны:

* MCP-сервер документации;
* готовый навык `SKILL.md`;
* Markdown-версии отдельных страниц;
* индекс `llms.txt`;
* полный снимок документации `llms-full.txt`.

{% hint style="info" %}
Этот раздел относится к внешним AI-инструментам. Он не включает встроенные AI-функции iEXExchanger и не предоставляет доступ к административной панели, серверу, базе данных, заявкам или другим данным обменного пункта.
{% endhint %}

## Способы работы

### MCP

{% content-ref url="/pages/bCnuD0cboWHUB1cSH6an" %}
[MCP](/nachalo-raboty/rabota-s-ai/mcp)
{% endcontent-ref %}

MCP позволяет подключить опубликованную документацию к совместимому AI-клиенту.

После подключения клиент сможет:

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

Подключение и проверка описаны на странице «MCP документации iEXExchanger».

### AI-ассистенты и SKILL.md

{% content-ref url="/pages/PfCGzbrNawYBa4Wxpz92" %}
[AI-ассистенты и SKILL](/nachalo-raboty/rabota-s-ai/ai-assistenty-i-skill)
{% endcontent-ref %}

`SKILL.md` содержит постоянные правила работы с документацией iEXExchanger.

Навык объясняет AI-ассистенту:

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

Готовый файл и пути установки для Claude, Codex, Cursor, VS Code и других клиентов приведены на странице «AI-ассистенты и SKILL.md».

{% hint style="warning" %}
Файл `SKILL.md` не содержит всю документацию и не подключает её автоматически. Для получения содержимого страниц AI-ассистенту дополнительно нужен MCP, доступ к опубликованным страницам или загруженные Markdown-файлы.
{% endhint %}

### Markdown и AI-ready файлы

Если AI-клиент не поддерживает MCP, передайте ему:

* Markdown-версию нужной страницы;
* индекс `llms.txt`;
* карту `sitemap.md`;
* части полного снимка `llms-full.txt`.

Этот способ подходит для разовых вопросов, локальных баз знаний и клиентов без поддержки удалённых MCP-серверов.

## Что выбрать

| Задача                                      | Способ                                | Результат                                       |
| ------------------------------------------- | ------------------------------------- | ----------------------------------------------- |
| Задать вопрос по одной найденной инструкции | Markdown-версия страницы              | AI получает полное содержимое одной страницы    |
| Искать по всей документации                 | MCP документации                      | AI самостоятельно находит и открывает материалы |
| Постоянно работать с iEXExchanger           | MCP и SKILL.md                        | AI использует документацию по единым правилам   |
| Работать без MCP                            | `llms.txt` и нужные Markdown-страницы | Материалы передаются вручную                    |
| Создать локальную базу знаний               | Все части `llms-full.txt`             | AI получает полный снимок документации          |

{% hint style="info" %}
Для постоянной работы рекомендуется использовать MCP вместе с `SKILL.md`.

MCP предоставляет актуальные страницы, а навык задаёт правила поиска, точности и безопасности.
{% endhint %}

## Быстрый запуск

1. Выберите способ подключения документации.
2. Подключите MCP или передайте AI нужные Markdown-файлы.
3. Установите `SKILL.md`, если клиент поддерживает навыки.
4. Начните новый диалог.
5. Отправьте проверочный запрос.
6. Убедитесь, что ответ содержит точные сведения и ссылки на страницы.

Для проверки используйте следующий запрос:

{% prompt description="Проверка подключения документации" icon="sparkles" %}

```markdown
Используй документацию iEXExchanger как основной источник.

Найди инструкцию по созданию валюты.

Укажи:

1. Что нужно подготовить до создания.
2. Точный путь в панели управления.
3. Основные действия.
4. Как проверить результат.
5. Прямые ссылки на использованные страницы.

Не отвечай по памяти и не добавляй сведения, которых нет в документации.
```

{% endprompt %}

Подключение работает корректно, если AI:

* нашёл подходящие страницы;
* прочитал их полное содержимое;
* сохранил точные названия элементов интерфейса;
* не добавил неподтверждённые настройки;
* объяснил способ проверки;
* приложил прямые ссылки на источники.

## Адреса документации

{% stepper %}
{% step %}

### MCP

```
https://docs.iexexchanger.com/~gitbook/mcp
```

Используется совместимыми AI-клиентами для поиска и чтения опубликованной документации.
{% endstep %}

{% step %}

### Индекс документации

```
https://docs.iexexchanger.com/llms.txt
```

Содержит список страниц и ссылки на их Markdown-версии.

Используйте `llms.txt`, чтобы найти нужный материал, если точный адрес страницы неизвестен.
{% endstep %}

{% step %}

### Карта документации

```
https://docs.iexexchanger.com/sitemap.md
```

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

{% hint style="warning" %}
`llms.txt` и `sitemap.md` помогают найти страницу, но не заменяют чтение её полного содержимого.
{% endhint %}
{% endstep %}

{% step %}

### Полный снимок

```
https://docs.iexexchanger.com/llms-full.txt
https://docs.iexexchanger.com/llms-full.txt/2
https://docs.iexexchanger.com/llms-full.txt/3
https://docs.iexexchanger.com/llms-full.txt/4
```

Все части вместе содержат полный снимок опубликованной документации.

Используйте полный снимок, когда:

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

Не загружайте все части без необходимости. Для одного вопроса обычно достаточно `llms.txt` и нескольких связанных страниц.
{% endstep %}

{% step %}

### Отдельная страница

Чтобы открыть Markdown-версию опубликованной страницы, добавьте `.md` в конец её адреса.

Пример:

```
https://docs.iexexchanger.com/nachalo-raboty/rabota-s-ai/mcp.md
```

Используйте этот способ, когда нужная инструкция уже найдена и вопрос относится к одной функции.
{% endstep %}
{% endstepper %}

## Что можно спросить

AI может помочь:

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

Пример запроса:

{% prompt description="Найти настройку" %}

```markdown
Используя документацию iEXExchanger, найди, где настраивается автоматическое обновление основных курсов.

Укажи:

1. Точный путь в панели управления.
2. Назначение документированных параметров.
3. Связанные настройки и зависимости.
4. Как проверить результат.
5. Прямые ссылки на использованные страницы.

Не добавляй настройки, которых нет в документации.
```

{% endprompt %}

## Как передать контекст

AI видит только сведения, которые доступны в документации или переданы в запросе.

Для вопроса по панели управления укажите:

* версию iEXExchanger;
* раздел или страницу;
* что вы пытаетесь настроить;
* ожидаемый результат;
* фактическое поведение;
* точный текст сообщения или статуса;
* последние изменения.

Для серверной проблемы укажите:

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

Проблемным компонентом может быть:

* Frontend;
* Backend;
* Nginx;
* PostgreSQL;
* Redis;
* Reverb;
* PHP-FPM;
* PM2;
* очередь.

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

* входящую и исходящую валюту;
* ожидаемое поведение;
* фактическое поведение;
* состояние валют;
* состояние направления;
* наличие резерва;
* проверяемую сумму;
* источник курса;
* применяемые ограничения.

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

## Ограничения

AI не может самостоятельно определить:

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

MCP и файлы документации предоставляют доступ только к опубликованным материалам.

Они не предоставляют доступ к:

* административной панели;
* SSH;
* панели управления сервером;
* базе данных;
* рабочему файлу `.env`;
* заявкам;
* данным клиентов;
* резервам;
* реквизитам;
* API-ключам;
* лицензии;
* персональным данным.

Через документацию нельзя:

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

## Проверка ответа

Перед применением инструкции убедитесь, что:

* указаны использованные страницы;
* ссылки открываются;
* ответ относится к вашей версии iEXExchanger;
* учтены операционная система и способ установки;
* названия разделов, полей и статусов указаны точно;
* AI прочитал полные страницы;
* подтверждённые сведения отделены от предположений;
* отсутствующие команды и параметры не придуманы;
* сначала предложены безопасные проверки;
* описан ожидаемый результат;
* указан конкретный способ проверки;
* подтверждённые риски объяснены;
* перед рискованным изменением подготовлена резервная копия.

Подробные рекомендации и готовые запросы приведены на странице «Оптимизация работы с AI».

{% hint style="danger" %}
Не выполняйте команды удаления, восстановления базы данных, изменения SSH, Firewall, Nginx, PostgreSQL или системных служб только потому, что их предложил AI.

Сначала подтвердите причину, область изменения, ожидаемый результат и возможность восстановления.
{% endhint %}

## Актуальность документации

MCP и Markdown-ссылки используют текущую опубликованную версию документации.

Изменения, которые ещё не опубликованы, через MCP, `.md`, `llms.txt` и `llms-full.txt` недоступны.

Файлы, загруженные вручную, не обновляются автоматически.

После обновления документации:

1. Удалите старые копии из AI-проекта.
2. Повторно загрузите `llms.txt`.
3. При необходимости повторно загрузите части `llms-full.txt`.
4. Замените сохранённые Markdown-страницы.
5. Начните новый диалог.
6. Повторите проверочный запрос.

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

## Безопасность

Не передавайте AI:

* пароли;
* содержимое рабочего `.env`;
* seed-фразы;
* приватные ключи;
* SSH-ключи;
* API-токены;
* ключи и пароли мерчантов;
* пароли базы данных;
* данные SMTP;
* реальные платёжные реквизиты;
* документы клиентов;
* персональные данные;
* данные реальных заявок;
* полные журналы с токенами;
* заголовки авторизации.

Проверяйте не только текст запроса, но и прикреплённые файлы, снимки экрана, журналы и вывод терминала.

Заменяйте секретные значения шаблонами:

```dotenv
APP_KEY=<скрыто>
DB_DATABASE=<имя_базы>
DB_USERNAME=<пользователь_базы>
DB_PASSWORD=<скрыто>
API_TOKEN=<скрыто>
```

Для доменов используйте:

```
https://ваш_домен
https://app.ваш_домен
```

{% hint style="danger" %}
Не разрешайте AI автоматически удалять файлы, восстанавливать базу данных или изменять рабочую конфигурацию сервера без проверки человеком, понимания последствий и актуальной резервной копии.
{% endhint %}


# MCP

Подключите документацию iEXExchanger к Claude, Codex, Cursor, VS Code или другому MCP-клиенту.

MCP — Model Context Protocol — позволяет подключить документацию iEXExchanger к совместимому MCP-клиенту.

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

{% hint style="info" %}
MCP-сервер предоставляет доступ только к опубликованной документации iEXExchanger. Он не подключается к обменному пункту, административной панели или серверу и не может изменять настройки продукта.
{% endhint %}

## Что потребуется

Для подключения нужны:

* MCP-клиент с поддержкой удалённых серверов;
* транспорт **Streamable HTTP** или **HTTP**;
* исходящий HTTPS-доступ к `docs.iexexchanger.com`.

Для подключения к документации не требуются:

* учётная запись на сайте документации;
* отдельный токен документации;
* логин или пароль от iEXExchanger;
* доступ к административной панели;
* доступ к серверу обменного пункта;
* отдельный API-ключ.

Учётная запись или подходящий тариф могут потребоваться самому MCP-клиенту.

## Адрес MCP-сервера

Используйте следующий адрес:

```http
https://docs.iexexchanger.com/~gitbook/mcp
```

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

```
Название: iEXExchanger Docs
Транспорт: Streamable HTTP
Авторизация: не требуется
```

Некоторые клиенты называют транспорт просто **HTTP**.

{% hint style="info" %}
Если открыть адрес MCP-сервера как обычную страницу в браузере, может появиться ошибка `405 Method Not Allowed`. Это ожидаемое поведение: адрес предназначен для MCP-запросов, а не для просмотра в браузере.
{% endhint %}

## Подключение

{% tabs %}
{% tab title="Claude" icon="claude" %}

### Claude

Для подключения документации в Claude:

1. Откройте **Customize** — **Connectors**.
2. Нажмите иконку **+**.
3. Выберите **Add custom connector**.
4. Укажите название `iEXExchanger Docs`.
5. Вставьте адрес `https://docs.iexexchanger.com/~gitbook/mcp`.
6. Нажмите **Add**.
7. Откройте новый диалог.
8. Нажмите **+** — **Connectors**.
9. Включите созданный Connector.

В организации Team или Enterprise возможность добавления пользовательских Connectors может зависеть от роли сотрудника и настроек организации.

Подробнее: [подключение удалённых MCP-серверов в Claude](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp).

### Claude Code

Чтобы подключить документацию для всех проектов текущего пользователя, выполните:

```bash
claude mcp add --transport http iexexchanger-docs --scope user https://docs.iexexchanger.com/~gitbook/mcp
```

Проверьте список подключённых серверов:

```bash
claude mcp list
```

В запущенном Claude Code откройте состояние MCP:

```
/mcp
```

Сервер `iexexchanger-docs` должен отображаться со статусом `connected`.

Чтобы подключить документацию только к текущему проекту, перейдите в каталог проекта и выполните:

```bash
claude mcp add --transport http iexexchanger-docs --scope project https://docs.iexexchanger.com/~gitbook/mcp
```

Проектная конфигурация будет сохранена в файле:

```
.mcp.json
```

Пример ручной конфигурации:

```json
{
  "mcpServers": {
    "iexexchanger-docs": {
      "type": "http",
      "url": "https://docs.iexexchanger.com/~gitbook/mcp"
    }
  }
}
```

Поле `type` обязательно. Если указать `url` без `type`, Claude Code может определить подключение как локальный `stdio`-сервер и не запустить его.

{% hint style="warning" %}
Перед добавлением `.mcp.json` в репозиторий проверьте, что файл не содержит токены, пароли, приватные адреса или заголовки авторизации. Для документации iEXExchanger они не нужны.
{% endhint %}

Подробнее: [MCP в Claude Code](https://code.claude.com/docs/en/mcp).
{% endtab %}

{% tab title="Codex" icon="openai" %}
Добавьте MCP-сервер через Codex CLI:

```bash
codex mcp add iexexchanger-docs --url https://docs.iexexchanger.com/~gitbook/mcp
```

Проверьте список подключённых серверов:

```bash
codex mcp list
```

В интерфейсе Codex откройте состояние MCP:

```
/mcp
```

Сервер `iexexchanger-docs` должен отображаться в списке активных подключений.

Для ручной настройки откройте файл:

```
~/.codex/config.toml
```

Добавьте:

```toml
[mcp_servers.iexexchanger-docs]
url = "https://docs.iexexchanger.com/~gitbook/mcp"
```

После изменения конфигурации перезапустите Codex.

Чтобы подключить документацию только к одному проекту, создайте файл:

```
.codex/config.toml
```

Добавьте в него ту же конфигурацию:

```toml
[mcp_servers.iexexchanger-docs]
url = "https://docs.iexexchanger.com/~gitbook/mcp"
```

Проектная конфигурация используется только для доверенных проектов.

Подробнее: [настройка MCP в Codex](https://developers.openai.com/codex/mcp).
{% endtab %}

{% tab title="Cursor" icon="cursor" %}
Откройте **Settings** — **MCP** и добавьте новый MCP-сервер.

Для подключения документации к текущему проекту создайте файл:

```
.cursor/mcp.json
```

Добавьте:

```json
{
  "mcpServers": {
    "iexexchanger-docs": {
      "url": "https://docs.iexexchanger.com/~gitbook/mcp"
    }
  }
}
```

Для подключения во всех проектах используйте пользовательский файл:

```
~/.cursor/mcp.json
```

После сохранения:

1. Откройте **Settings** — **MCP**.
2. Найдите `iexexchanger-docs`.
3. Включите сервер.
4. Откройте Agent.
5. Проверьте, что инструменты документации доступны в списке.

{% hint style="warning" %}
Проектный файл `.cursor/mcp.json` может попасть в репозиторий. Не добавляйте в него пароли, токены или другие конфиденциальные данные.
{% endhint %}

Подробнее: [MCP в Cursor](https://cursor.com/docs/mcp).
{% endtab %}

{% tab title="VS Code" icon="vscode" %}
Откройте палитру команд и выполните:

```
MCP: Add Server
```

Выберите тип сервера **HTTP** и укажите адрес:

```
https://docs.iexexchanger.com/~gitbook/mcp
```

Сохраните подключение для текущего рабочего пространства или профиля пользователя.

Для ручной настройки текущего проекта создайте файл:

```
.vscode/mcp.json
```

Добавьте:

```json
{
  "servers": {
    "iexexchanger-docs": {
      "type": "http",
      "url": "https://docs.iexexchanger.com/~gitbook/mcp"
    }
  }
}
```

После сохранения:

1. Выполните команду **MCP: List Servers**.
2. Выберите `iexexchanger-docs`.
3. Запустите сервер.
4. Подтвердите доверие к подключению.
5. Откройте Chat.
6. Проверьте список доступных инструментов.

Чтобы открыть пользовательскую конфигурацию, выполните:

```
MCP: Open User Configuration
```

Серверы из пользовательской конфигурации доступны во всех рабочих пространствах текущего профиля.

Подробнее: [добавление MCP-серверов в VS Code](https://code.visualstudio.com/docs/agent-customization/mcp-servers).
{% endtab %}

{% tab title="Другой клиент" %}
Используйте следующие параметры:

```
Название: iEXExchanger Docs
URL: https://docs.iexexchanger.com/~gitbook/mcp
Транспорт: Streamable HTTP
Авторизация: отсутствует
```

Некоторые клиенты называют транспорт просто **HTTP**.

Пример общей конфигурации:

```json
{
  "name": "iexexchanger-docs",
  "transport": "streamable-http",
  "url": "https://docs.iexexchanger.com/~gitbook/mcp"
}
```

Структура конфигурационного файла зависит от клиента. Названия полей `servers`, `mcpServers`, `type`, `transport` и `url` могут отличаться.

Не копируйте конфигурацию другого клиента без проверки поддерживаемого формата.

Не выбирайте `stdio`. Этот транспорт используется для локальных процессов, а документация iEXExchanger подключается как удалённый сервер через HTTPS.
{% endtab %}
{% endtabs %}

## Проверка подключения

После добавления сервера отправьте следующий запрос:

{% prompt description="Проверка MCP документации" icon="plug" %}

```markdown
Используй MCP-сервер iexexchanger-docs.

1. Покажи доступные инструменты этого сервера.
2. Найди страницу «Валюты».
3. Полностью открой страницу:
https://docs.iexexchanger.com/learn/nastroika-obmena/currency-list-and-card
4. Назови точный путь к списку валют в панели управления.
5. Приложи ссылку на использованную страницу.

Не отвечай по памяти и не вызывай sendFeedback во время проверки.
```

{% endprompt %}

Подключение работает, если клиент открыл страницу документации и указал путь:

**«Основное» — «Валюты» — «Список валют»**

На сервере должны быть доступны следующие инструменты:

```
searchDocumentation
getPage
askQuestion
sendFeedback
```

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

## Правила постоянной работы

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

{% prompt description="Правила работы с документацией iEXExchanger" icon="head-side-circuit" %}

```markdown
Используй MCP-сервер iexexchanger-docs как основной источник информации по iEXExchanger.

Перед ответом выполни поиск по точной задаче. Для подробной инструкции полностью прочитай относящиеся к вопросу страницы через getPage.

Отвечай на русском языке простым техническим языком. Сохраняй точные названия разделов, кнопок, полей, статусов, команд, файлов, переменных и параметров.

Не смешивай разные версии iEXExchanger, операционные системы, панели управления сервером и способы установки.

Если найденные страницы противоречат друг другу, не объединяй инструкции. Перечисли различия и попроси уточнить версию iEXExchanger или используемое окружение.

Не придумывай отсутствующие настройки, пути, порты, значения и поведение продукта. Если точного ответа нет, укажи, каких сведений не хватает.

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

Для каждого изменения объясни, как проверить результат.

В конце ответа перечисли использованные страницы документации со ссылками.

Не вызывай sendFeedback без моего прямого запроса.
```

{% endprompt %}

Для Codex сохраните правила в файле:

```
AGENTS.md
```

Для Claude Code используйте:

```
CLAUDE.md
```

Для Cursor добавьте правила в настройки текущего проекта.

## Инструменты MCP

| Инструмент            | Назначение                                                                   |
| --------------------- | ---------------------------------------------------------------------------- |
| `searchDocumentation` | Ищет подходящие страницы и возвращает найденные фрагменты со ссылками        |
| `getPage`             | Открывает полное Markdown-содержимое выбранной страницы                      |
| `askQuestion`         | Подготавливает ответ по документации и прикладывает использованные источники |
| `sendFeedback`        | Отправляет команде iEXExchanger сообщение о проблеме в документации          |

Для подробной или потенциально опасной инструкции не ограничивайтесь ответом `askQuestion` или отдельным фрагментом поиска.

Сначала выполните `searchDocumentation`, затем откройте относящиеся к задаче страницы через `getPage`.

`sendFeedback` не редактирует и не публикует страницы. Инструмент отправляет сообщение команде iEXExchanger, поэтому вызывайте его только намеренно и не передавайте через него конфиденциальные данные.

## Возможности MCP

После подключения клиент сможет:

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

Доступ предоставляется к текущей опубликованной версии документации.

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

## Ограничения доступа

MCP документации не предоставляет доступ к:

* административной панели iEXExchanger;
* панели управления сервером;
* SSH и системным службам;
* базе данных;
* рабочему файлу `.env`;
* файлам Frontend и Backend;
* заявкам;
* данным клиентов;
* резервам;
* реквизитам;
* API-ключам и токенам;
* лицензии iEXExchanger;
* персональным и платёжным данным.

Через MCP документации нельзя:

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

{% hint style="warning" %}
Claude Code, Codex, Cursor, VS Code и другие клиенты могут отдельно иметь доступ к терминалу, файлам проекта или внешним сервисам.

Эти разрешения не относятся к `iexexchanger-docs`. Проверяйте доступ используемого клиента и отдельно подтверждайте потенциально опасные действия.
{% endhint %}

## Безопасность

Не отправляйте через подключённые клиенты:

* пароли;
* рабочий файл `.env`;
* seed-фразы;
* приватные ключи;
* SSH-ключи;
* API-токены;
* ключи мерчантов;
* пароли базы данных;
* данные SMTP;
* платёжные реквизиты;
* документы клиентов;
* персональные данные;
* реальные данные заявок;
* журналы с токенами;
* заголовки авторизации.

Перед отправкой проверяйте текст запроса, прикреплённые файлы, скриншоты и вывод терминала.

{% hint style="warning" %}
Не размещайте конфиденциальную информацию на опубликованных страницах документации.

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

## Если клиент не поддерживает MCP

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

* Markdown-версию отдельной страницы;
* файл `llms.txt`;
* файл `llms-full.txt`.

Основной список страниц:

```
https://docs.iexexchanger.com/llms.txt
```

Полное содержимое документации:

```
https://docs.iexexchanger.com/llms-full.txt
```

`llms.txt` содержит структуру документации и ссылки на страницы.

`llms-full.txt` содержит объединённый текст опубликованных материалов и подходит для клиентов, которые умеют загружать текстовые файлы, но не поддерживают MCP.

## Решение проблем

<details>

<summary>MCP-сервер возвращает ошибку в браузере</summary>

**Симптом:** при открытии адреса MCP-сервера в браузере появляется `405 Method Not Allowed` или другая ошибка метода запроса.

**Причина:** MCP-сервер не предназначен для просмотра как обычная веб-страница.

**Как исправить:** добавьте адрес в совместимый MCP-клиент и выполните проверочный запрос из этой инструкции.

**Проверка результата:** клиент должен показать инструменты сервера и открыть найденную страницу документации.

</details>

<details>

<summary>Сервер не появляется в клиенте</summary>

**Симптом:** после добавления подключения сервер отсутствует в списке или отображается с ошибкой.

**Что проверить:**

* адрес указан без пробелов и дополнительных символов;
* выбран транспорт **Streamable HTTP** или **HTTP**;
* сервер сохранён;
* сервер включён;
* клиент перезапущен после изменения конфигурации;
* подключение не ожидает подтверждения доверия.

Точный адрес:

```
https://docs.iexexchanger.com/~gitbook/mcp
```

Для Claude Code выполните:

```bash
claude mcp list
```

Для Codex выполните:

```bash
codex mcp list
```

Для VS Code выполните:

```
MCP: List Servers
```

**Проверка результата:** сервер должен отображаться без ошибки подключения.

</details>

<details>

<summary>Claude Code сообщает об отсутствующем type</summary>

**Симптом:** Claude Code сообщает, что у MCP-сервера есть `url`, но отсутствует `type`.

**Причина:** в `.mcp.json` указан адрес сервера, но не указан тип транспорта.

**Как исправить:** добавьте поле:

```json
"type": "http"
```

Полная конфигурация:

```json
{
  "mcpServers": {
    "iexexchanger-docs": {
      "type": "http",
      "url": "https://docs.iexexchanger.com/~gitbook/mcp"
    }
  }
}
```

**Проверка результата:** выполните `claude mcp list`. Сервер должен отображаться со статусом `connected`.

</details>

<details>

<summary>Сервер подключён, но не используется</summary>

**Симптом:** клиент отвечает без обращения к документации.

**Причина:** клиент не выбрал инструменты `iexexchanger-docs` или использовал другой источник.

**Как исправить:** явно укажите в запросе:

```
Используй MCP-сервер iexexchanger-docs.
Сначала выполни searchDocumentation, затем открой найденные страницы через getPage.
```

Если подключено несколько MCP-серверов, временно отключите ненужные инструменты и начните новый диалог.

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

</details>

<details>

<summary>Инструменты сервера не отображаются</summary>

**Симптом:** сервер подключён, но `searchDocumentation`, `getPage`, `askQuestion` и `sendFeedback` отсутствуют в списке.

**Причина:** клиент не завершил получение списка инструментов или использует сохранённое состояние предыдущего подключения.

**Как исправить:**

1. Отключите `iexexchanger-docs`.
2. Перезапустите MCP-клиент.
3. Включите сервер повторно.
4. Откройте новый диалог.
5. Проверьте список инструментов.

В VS Code можно выбрать сервер через **MCP: List Servers** и выполнить его перезапуск.

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

</details>

<details>

<summary>Подключение блокируется сетью</summary>

**Симптом:** клиент не может установить соединение с MCP-сервером.

Проверьте доступ к основному домену документации:

```
https://docs.iexexchanger.com
```

Клиенту нужен исходящий HTTPS-доступ к `docs.iexexchanger.com`.

Соединение могут блокировать:

* VPN;
* Proxy;
* Firewall;
* корпоративная сеть;
* DNS-фильтрация;
* правила безопасности устройства.

После изменения сетевых настроек перезапустите клиент.

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

</details>

<details>

<summary>Найдены противоречащие друг другу страницы</summary>

**Симптом:** клиент нашёл несколько инструкций с разными командами, путями или параметрами.

**Как исправить:** попросите клиента:

1. Перечислить найденные страницы.
2. Полностью открыть каждую страницу через `getPage`.
3. Указать различающиеся сведения.
4. Не объединять противоречащие инструкции.

Дополнительно укажите используемую версию iEXExchanger, операционную систему и способ установки.

**Проверка результата:** ответ должен разделять инструкции по версиям или окружениям, а не объединять их в один порядок действий.

</details>

<details>

<summary>Страница не находится через поиск</summary>

**Симптом:** `searchDocumentation` не возвращает нужную статью.

**Что проверить:**

* страница опубликована;
* название введено без ошибки;
* запрос содержит точное название функции;
* используется MCP-сервер `iexexchanger-docs`.

Если известен полный адрес страницы, передайте его напрямую в `getPage`.

Пример:

```
Через getPage полностью открой страницу:
https://docs.iexexchanger.com/learn/nastroika-obmena/currency-list-and-card
```

**Проверка результата:** `getPage` должен вернуть полное Markdown-содержимое выбранной страницы.

</details>


# AI-ассистенты и SKILL

Добавьте навык iEXExchanger в Claude, Codex, Cursor, VS Code или другой AI-ассистент для работы с документацией продукта.

`SKILL.md` позволяет добавить в AI-ассистент постоянные правила работы с документацией iEXExchanger.

После установки навыка ассистент сможет:

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

`SKILL.md` не содержит всю документацию внутри себя. Он объясняет ассистенту, где искать информацию, как проверять источники и какие правила соблюдать при подготовке ответа.

{% hint style="info" %}
Навык предназначен для работы с документацией. Он не предоставляет доступ к административной панели, серверу, базе данных, заявкам или другим данным обменного пункта.
{% endhint %}

## Как работает навык

Для полноценной работы используются три компонента:

| Компонент             | Назначение                                           | Обновление                                          |
| --------------------- | ---------------------------------------------------- | --------------------------------------------------- |
| `SKILL.md`            | Задаёт правила поиска, ответа и безопасности         | Скопированную версию нужно обновлять вручную        |
| MCP документации      | Позволяет искать и открывать опубликованные страницы | Использует актуальное содержимое при каждом запросе |
| `llms.txt` и Markdown | Используются, если клиент не поддерживает MCP        | Загруженные копии нужно периодически заменять       |

Рекомендуемый вариант — установить `SKILL.md` и подключить MCP документации. В этом случае навык определяет порядок работы, а MCP предоставляет актуальное содержимое страниц.

{% hint style="warning" %}
Один файл `SKILL.md` не загружает документацию автоматически. Ассистенту также нужен MCP, доступ к страницам документации через интернет или заранее загруженные файлы.
{% endhint %}

## Готовый SKILL.md

Создайте папку `iexexchanger-docs`, добавьте в неё файл `SKILL.md` и скопируйте следующее содержимое.

{% code title="SKILL.md" expandable="true" %}

```markdown
---
name: iexexchanger-docs
description: Используй при вопросах об установке, настройке, эксплуатации, обновлении или диагностике iEXExchanger. Ищи подтверждённые сведения в документации iEXExchanger, сохраняй точные названия элементов и отвечай на русском языке, если пользователь не попросил другой язык.
---

# Документация iEXExchanger

Используй опубликованную документацию iEXExchanger как основной источник информации о продукте.

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

# Источники

Основные источники документации:

- MCP: `https://docs.iexexchanger.com/~gitbook/mcp`
- Индекс документации: `https://docs.iexexchanger.com/llms.txt`
- Полная документация, часть 1: `https://docs.iexexchanger.com/llms-full.txt`
- Полная документация, часть 2: `https://docs.iexexchanger.com/llms-full.txt/2`
- Полная документация, часть 3: `https://docs.iexexchanger.com/llms-full.txt/3`
- Полная документация, часть 4: `https://docs.iexexchanger.com/llms-full.txt/4`

Markdown-версию опубликованной страницы обычно можно открыть, добавив `.md` в конец её адреса.

# Порядок работы

1. Определи точную задачу пользователя.
2. Установи, влияет ли на ответ версия iEXExchanger, операционная система, панель управления сервером или способ установки.
3. Найди относящиеся к задаче страницы документации.
4. Полностью прочитай выбранные страницы, а не только фрагменты поиска.
5. Сопоставь сведения из связанных страниц.
6. Сохрани точные названия разделов, кнопок, полей, вкладок, статусов, команд, файлов, переменных и параметров.
7. Отдели подтверждённое поведение продукта от диагностических предположений.
8. Подготовь конкретную инструкцию и объясни, как проверить результат.
9. Приложи прямые ссылки на использованные страницы.
10. Если подтверждённого ответа нет, прямо укажи, каких сведений не хватает.

# Работа через MCP

Когда доступны инструменты MCP:

- используй `searchDocumentation`, чтобы найти подходящие страницы;
- используй `getPage`, чтобы полностью открыть каждую выбранную страницу;
- используй `askQuestion` только для быстрого поиска ответа с источниками;
- не ограничивайся `askQuestion` при подготовке подробной, многоэтапной или потенциально опасной инструкции;
- вызывай `sendFeedback` только по прямому запросу пользователя.

Перед подробным ответом сначала выполни `searchDocumentation`, затем открой найденные страницы через `getPage`.

Не вызывай `sendFeedback` автоматически. Не передавай через него конфиденциальные или персональные данные.

# Работа без MCP

Если MCP недоступен:

1. Открой `https://docs.iexexchanger.com/llms.txt`.
2. Найди страницу, относящуюся к задаче.
3. Открой Markdown-версию выбранной страницы.
4. Полностью прочитай все связанные страницы.
5. Используй `llms-full.txt` только для задач, охватывающих несколько разделов, или при создании локальной базы знаний.

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

# Правила ответа

- Отвечай на русском языке, если пользователь не попросил другой язык.
- Пиши простым техническим языком.
- Сохраняй точные названия элементов интерфейса.
- Не переименовывай кнопки, поля, вкладки, статусы и права.
- Не смешивай разные версии iEXExchanger.
- Не смешивай разные операционные системы, панели управления сервером и способы установки.
- Не придумывай маршруты, команды, порты, пути, переменные, значения по умолчанию, права, ограничения или статусы.
- Не добавляй функцию только потому, что она обычно встречается в похожих продуктах.
- Для последовательных действий используй нумерованный список.
- Для каждой практической инструкции указывай ожидаемый результат и конкретный способ проверки.
- В конце ответа перечисляй использованные страницы со ссылками.

Если найденные страницы противоречат друг другу, не объединяй их механически. Укажи различия и попроси уточнить версию продукта или окружение.

# Работа с сервером

Перед рекомендацией действия, которое может изменить рабочий сервер:

1. Начни с безопасной диагностики без изменения данных.
2. Объясни назначение команды или настройки.
3. Укажи ожидаемый результат.
4. Предупреди о подтверждённых рисках.
5. Потребуй актуальную резервную копию, если действие может повлиять на данные или доступность проекта.
6. Добавь способ проверки результата.
7. Укажи способ возврата только тогда, когда он подтверждён документацией.

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

# Ограничения доступа

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

- административной панели iEXExchanger;
- SSH и системным службам;
- панели управления сервером;
- базе данных;
- рабочему файлу `.env`;
- файлам Frontend и Backend;
- заявкам и данным клиентов;
- резервам и реквизитам;
- API-ключам и токенам;
- лицензии;
- персональным и платёжным данным.

Не создавай впечатление, что MCP или документация позволяют изменить обменный пункт.

# Безопасность

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

- пароли;
- seed-фразы;
- приватные ключи;
- SSH-ключи;
- API-токены;
- данные мерчантов;
- пароли базы данных;
- данные SMTP;
- платёжные реквизиты;
- персональные документы;
- данные клиентов;
- содержимое реальных заявок.

Если пользователь прислал журнал, конфигурацию, снимок экрана или вывод терминала, проверь, не содержатся ли в них секретные значения.
```

{% endcode %}

Название папки должно совпадать со значением `name`:

```
iexexchanger-docs
```

Итоговая структура:

```
iexexchanger-docs/
└── SKILL.md
```

Не добавляйте в `SKILL.md` пароли, токены, приватные адреса или другие секретные данные.

## Установка навыка

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

{% tabs %}
{% tab title="Claude" icon="claude" %}
Для использования навыка только в одном проекте сохраните файл по пути:

```
.claude/skills/iexexchanger-docs/SKILL.md
```

Для использования во всех проектах текущего пользователя:

```
~/.claude/skills/iexexchanger-docs/SKILL.md
```

После добавления файла откройте Claude Code и явно запустите навык:

```
/iexexchanger-docs
```

Claude Code также может применить навык автоматически, когда запрос соответствует его описанию.

Если каталог `.claude/skills` был создан после запуска текущей сессии и навык не появился, перезапустите Claude Code.

Подробнее: [навыки Claude Code](https://code.claude.com/docs/en/skills).
{% endtab %}

{% tab title="Codex" icon="openai" %}
Для использования навыка в одном проекте сохраните файл по пути:

```
.agents/skills/iexexchanger-docs/SKILL.md
```

Для использования во всех проектах текущего пользователя:

```
~/.agents/skills/iexexchanger-docs/SKILL.md
```

Откройте Codex и выполните:

```
/skills
```

Убедитесь, что `iexexchanger-docs` появился в списке.

Для явного применения навыка укажите его в запросе:

```
$iexexchanger-docs
```

Codex также может выбрать навык автоматически, когда задача соответствует полю `description`.

Изменения в навыках обычно обнаруживаются автоматически. Если новый файл не появился, перезапустите Codex.

Подробнее: [навыки Codex](https://developers.openai.com/codex/build-skills).
{% endtab %}

{% tab title="Cursor" icon="cursor" %}
Для использования в текущем проекте сохраните файл по пути:

```
.cursor/skills/iexexchanger-docs/SKILL.md
```

Для использования во всех проектах текущего пользователя:

```
~/.cursor/skills/iexexchanger-docs/SKILL.md
```

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

```
.agents/skills/iexexchanger-docs/SKILL.md
```

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

После добавления файла:

1. Откройте настройки Cursor.
2. Перейдите в раздел **Skills**.
3. Найдите `iexexchanger-docs`.
4. Откройте новый Agent Chat.
5. Выполните `/iexexchanger-docs`.

Cursor также может применить навык автоматически, если запрос соответствует его описанию.

Подробнее: [навыки Cursor](https://cursor.com/docs/skills).
{% endtab %}

{% tab title="VS Code" icon="vscode" %}
Для текущего проекта рекомендуется использовать путь:

```
.agents/skills/iexexchanger-docs/SKILL.md
```

Также VS Code поддерживает проектный путь:

```
.github/skills/iexexchanger-docs/SKILL.md
```

Для использования во всех проектах текущего пользователя:

```
~/.agents/skills/iexexchanger-docs/SKILL.md
```

Также поддерживается пользовательский путь:

```
~/.copilot/skills/iexexchanger-docs/SKILL.md
```

Выберите один путь и не создавайте несколько одинаковых копий.

После добавления файла:

1. Откройте Chat.
2. Введите `/skills`.
3. Откройте список доступных навыков.
4. Найдите `iexexchanger-docs`.
5. Начните новый диалог.

Для явного запуска выберите навык из списка команд или введите его название после `/`.

Подробнее: [Agent Skills в VS Code](https://code.visualstudio.com/docs/agent-customization/agent-skills).
{% endtab %}

{% tab title="Другой клиент" %}
Если клиент поддерживает стандарт Agent Skills, сохраните папку `iexexchanger-docs` в каталоге навыков, указанном в его документации.

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

```
папка_навыков/
└── iexexchanger-docs/
    └── SKILL.md
```

Если клиент не поддерживает навыки:

1. Прикрепите `SKILL.md` к проекту или диалогу.
2. Добавьте его содержимое в постоянные инструкции.
3. Укажите, что правила относятся ко всем вопросам по iEXExchanger.
4. Подключите MCP или предоставьте нужные страницы документации.

Наличие файла с именем `SKILL.md` само по себе не означает, что клиент его использует. Клиент должен поддерживать навыки или получить прямое указание прочитать файл.
{% endtab %}
{% endtabs %}

## Подключение документации

После установки навыка подключите MCP документации iEXExchanger.

Используйте следующий адрес:

```
https://docs.iexexchanger.com/~gitbook/mcp
```

Через MCP ассистент сможет:

* искать страницы;
* открывать полное содержимое найденных материалов;
* получать актуальную опубликованную версию;
* прикладывать ссылки на источники.

Если MCP не поддерживается, используйте индекс:

```
https://docs.iexexchanger.com/llms.txt
```

Для загрузки полного содержимого доступны:

```
https://docs.iexexchanger.com/llms-full.txt
https://docs.iexexchanger.com/llms-full.txt/2
https://docs.iexexchanger.com/llms-full.txt/3
https://docs.iexexchanger.com/llms-full.txt/4
```

Не загружайте все части без необходимости. Для одного вопроса обычно достаточно `llms.txt` и нескольких связанных Markdown-страниц.

## Проверка навыка

После установки начните новый диалог и отправьте следующий запрос:

{% prompt description="Проверка навыка iEXExchanger" icon="file-code" %}

```markdown
Примени навык iexexchanger-docs.

Найди в документации iEXExchanger инструкцию по созданию валюты.

Укажи:

1. Что нужно подготовить до создания.
2. Точные названия действий и полей.
3. Как проверить результат.
4. Прямые ссылки на использованные страницы.

Не отвечай по памяти и не добавляй сведения, которых нет в документации.
```

{% endprompt %}

Навык работает корректно, если ассистент:

* обратился к документации iEXExchanger;
* прочитал полную страницу;
* сохранил точные названия элементов интерфейса;
* не добавил неподтверждённые параметры;
* объяснил способ проверки;
* приложил прямые ссылки на источники;
* сообщил о недостатке информации, если точного ответа нет.

## Примеры запросов

{% prompt description="Найти настройку" %}

```markdown
Примени навык iexexchanger-docs.

Найди в документации iEXExchanger, где настраивается автоматическое обновление курсов.

Укажи точный путь к разделу, назначение подтверждённых параметров и способ проверки результата.

Не добавляй настройки, которых нет в документации.
```

{% endprompt %}

{% prompt description="Подготовить инструкцию" icon="list-check" %}

```markdown
Примени навык iexexchanger-docs.

Подготовь инструкцию по настройке Nginx для Frontend и Backend iEXExchanger.

Сначала установи, какой способ установки и окружение используются. Не смешивай разные варианты.

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

{% endprompt %}

{% prompt description="Найти причину проблемы" icon="triangle-exclamation" %}

```markdown
Примени навык iexexchanger-docs.

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

Сначала перечисли безопасные проверки.

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

{% endprompt %}

{% prompt description="Проверить инструкцию" icon="shield-check" %}

```markdown
Примени навык iexexchanger-docs.

Проверь следующую инструкцию по iEXExchanger по актуальной документации.

Отдельно укажи:

1. Какие действия подтверждены.
2. Какие действия противоречат документации.
3. Какие сведения не удалось проверить.
4. Какие страницы использовались.

Не исправляй инструкцию предположениями.
```

{% endprompt %}

## Обновление навыка

Скопированный `SKILL.md` не обновляется автоматически.

После публикации новой версии навыка:

1. Замените старый файл `SKILL.md`.
2. Проверьте, что имя папки осталось `iexexchanger-docs`.
3. Удалите лишние копии навыка.
4. Начните новый диалог.
5. Повторите проверочный запрос.

Документация, которую ассистент получает через MCP, обновляется отдельно и не хранится внутри `SKILL.md`.

## Безопасность

Не передавайте AI-ассистенту реальные:

* пароли;
* seed-фразы;
* приватные ключи;
* SSH-ключи;
* API-токены;
* данные мерчантов;
* пароли базы данных;
* данные SMTP;
* платёжные реквизиты;
* документы клиентов;
* персональные данные;
* данные реальных заявок;
* рабочий файл `.env`.

Проверяйте прикреплённые файлы, снимки экрана, журналы и вывод терминала. Они также могут содержать секретные значения.

{% hint style="danger" %}
Не разрешайте ассистенту автоматически удалять файлы, восстанавливать базу данных, изменять SSH, Firewall или рабочую конфигурацию сервера без проверки человеком, понимания последствий и актуальной резервной копии.
{% endhint %}

## Решение проблем

### Навык не появился в клиенте

**Симптом:** `iexexchanger-docs` отсутствует в списке навыков.

**Что проверить:**

* файл называется точно `SKILL.md`;
* файл находится внутри папки `iexexchanger-docs`;
* выбран правильный каталог для используемого клиента;
* во frontmatter указаны `name` и `description`;
* значение `name` совпадает с названием папки;
* файл сохранён в формате Markdown;
* нет второй копии навыка с тем же именем.

Для Codex итоговый путь должен выглядеть так:

```
.agents/skills/iexexchanger-docs/SKILL.md
```

Для Claude Code:

```
.claude/skills/iexexchanger-docs/SKILL.md
```

Для Cursor:

```
.cursor/skills/iexexchanger-docs/SKILL.md
```

После проверки начните новую сессию или перезапустите клиент.

**Проверка результата:** `iexexchanger-docs` должен появиться в списке доступных навыков.

### Навык установлен, но не применяется автоматически

**Симптом:** ассистент отвечает без поиска в документации.

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

**Как исправить:** запустите навык явно.

Для Claude Code и Cursor:

```
/iexexchanger-docs
```

Для Codex:

```
$iexexchanger-docs
```

Затем повторите вопрос.

**Проверка результата:** ассистент должен обратиться к документации и приложить ссылки на использованные страницы.

### Ассистент отвечает общими словами

**Симптом:** ответ не содержит точных названий, действий и ссылок.

**Что проверить:**

* навык действительно загружен;
* MCP подключён;
* клиент имеет доступ к интернету;
* страницы были полностью открыты;
* запрос содержит конкретную задачу;
* ассистенту передана версия iEXExchanger и окружение, если они влияют на ответ.

Явно укажите:

```
Примени навык iexexchanger-docs.
Сначала найди страницы документации, затем полностью прочитай их и приложи ссылки.
```

**Проверка результата:** ответ должен содержать подтверждённую инструкцию и прямые ссылки.

### MCP недоступен

**Симптом:** ассистент не может использовать `searchDocumentation` или `getPage`.

**Причина:** MCP-сервер не подключён, отключён или не поддерживается клиентом.

**Как исправить:** подключите MCP по инструкции «MCP документации iEXExchanger».

Если клиент не поддерживает MCP, передайте ему:

```
https://docs.iexexchanger.com/llms.txt
```

Затем добавьте Markdown-страницы, относящиеся к задаче.

**Проверка результата:** ассистент должен открыть страницы документации и сослаться на них в ответе.

### Используется устаревшая копия навыка

**Симптом:** ассистент применяет старые источники или правила.

**Причина:** в проекте или пользовательском каталоге осталась предыдущая версия `SKILL.md`.

**Что проверить:**

* проектный каталог навыков;
* пользовательский каталог навыков;
* другие совместимые каталоги;
* одинаковые навыки с именем `iexexchanger-docs`.

Удалите лишние копии и оставьте только актуальную версию.

После замены файла начните новый диалог.

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


# Оптимизация работы с AI

Выберите подходящий источник документации iEXExchanger, передайте необходимый контекст и проверяйте ответы перед применением.

Качество ответа AI зависит не только от выбранной модели. Важно предоставить подходящие страницы документации, описать окружение, поставить точную задачу и заранее определить, как проверить результат.

Используйте эту страницу при установке, настройке, эксплуатации и диагностике iEXExchanger.

Точный и полезный ответ должен:

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

{% hint style="info" %}
Для регулярной работы подключите MCP документации и добавьте готовый навык со страницы «AI-ассистенты и SKILL.md».

Для разового вопроса обычно достаточно Markdown-версии одной или нескольких страниц.
{% endhint %}

## Выбор источника документации

Не передавайте AI всю документацию, если вопрос относится к одной функции. Чем точнее выбран источник, тем меньше посторонней информации попадёт в контекст и тем проще получить конкретный ответ.

{% tabs %}
{% tab title="MCP" %}
Используйте MCP для регулярной работы, поиска по документации и вопросов, которые затрагивают несколько связанных разделов.

Адрес MCP-сервера:

```
https://docs.iexexchanger.com/~gitbook/mcp
```

Через MCP совместимый AI-инструмент сможет:

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

Порядок подключения приведён на странице «MCP документации iEXExchanger».
{% endtab %}

{% tab title="Одна страница" %}
Добавьте `.md` в конец адреса опубликованной страницы, чтобы открыть её Markdown-версию.

Пример:

```
https://docs.iexexchanger.com/nachalo-raboty/rabota-s-ai/mcp.md
```

Используйте этот вариант, когда:

* нужная инструкция уже найдена;
* вопрос относится к одной функции;
* страницу нужно прикрепить к диалогу;
* AI не может корректно прочитать обычную веб-страницу.

Перед подготовкой ответа попросите AI прочитать страницу полностью, а не использовать только её заголовок или отдельный фрагмент.
{% endtab %}

{% tab title="Карта документации" %}
Для поиска нужной страницы используйте:

```
https://docs.iexexchanger.com/llms.txt
https://docs.iexexchanger.com/sitemap.md
```

`llms.txt` содержит список материалов и ссылки на их Markdown-версии.

`sitemap.md` показывает структуру документации и помогает найти нужный раздел, когда точное название страницы неизвестно.

{% hint style="warning" %}
Карта помогает найти материал, но не заменяет чтение его полного содержимого. Не подготавливайте подробную инструкцию только по названию страницы или короткому поисковому фрагменту.
{% endhint %}
{% endtab %}

{% tab title="Полный снимок" %}
Для локальной базы знаний или AI-инструмента без поддержки MCP используйте:

```
https://docs.iexexchanger.com/llms-full.txt
https://docs.iexexchanger.com/llms-full.txt/2
https://docs.iexexchanger.com/llms-full.txt/3
https://docs.iexexchanger.com/llms-full.txt/4
```

Все части вместе содержат полный снимок опубликованной документации.

Используйте его, когда:

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

Загруженные файлы не обновляются автоматически.
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Начинайте с `llms.txt` и нескольких страниц по теме. Подключайте полный снимок только тогда, когда задача действительно требует большого объёма документации.
{% endhint %}

## Как составить точный запрос

Используйте следующую структуру:

```
Источник + задача + контекст + ограничения + формат ответа + проверка
```

### Источник

Укажите, что ответ должен основываться на документации iEXExchanger, подключённом MCP или приложенных Markdown-файлах.

Не ограничивайтесь фразой «изучи документацию». Попросите найти относящиеся к задаче страницы, прочитать их полностью и приложить ссылки.

### Задача

Опишите один конкретный результат.

Например:

* найти настройку;
* подготовить инструкцию;
* проверить конфигурацию;
* определить причину ошибки;
* сравнить два способа настройки;
* проверить существующую инструкцию.

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

### Контекст

Укажите сведения, которые могут изменить ответ:

* версию iEXExchanger;
* операционную систему;
* способ установки;
* наличие панели управления сервером;
* используемый компонент;
* наблюдаемый результат;
* последние изменения.

Если контекста недостаточно, попросите AI сначала задать уточняющие вопросы.

### Ограничения

Заранее определите допустимые действия.

Например:

```
Сначала предложи только безопасные проверки без изменения конфигурации.

Не смешивай инструкции для FastPanel и чистого сервера.

Не перезапускай службы и не изменяй файлы, пока причина не подтверждена.
```

### Формат ответа

Попросите дать:

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

### Проверка

Попросите объяснить, как убедиться, что настройка применена или проблема устранена.

Фраза «проверьте, что всё работает» не является достаточной проверкой. Должен быть указан конкретный сценарий и ожидаемый результат.

## Пример точного запроса

Недостаточно:

```
Почему не работает Nginx?
```

В таком запросе не указаны компонент, окружение, симптом, последние изменения и допустимые действия.

Более точный вариант:

```
По документации iEXExchanger помоги диагностировать ошибку 502 Bad Gateway у Frontend.

Окружение:
- версия iEXExchanger: <версия>;
- операционная система: <ОС>;
- способ установки: <FastPanel или чистый сервер>;
- компонент: Frontend;
- проблема появилась после: <действие или неизвестно>;
- точный текст ошибки: <ошибка>.

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

Отдели подтверждённые действия от диагностических предположений.

Для каждой проверки укажи:
1. цель;
2. команду или действие;
3. ожидаемый результат;
4. что означает отклонение;
5. ссылку на использованную страницу.
```

## Какой контекст передать

Набор необходимых сведений зависит от задачи.

{% tabs %}
{% tab title="Панель управления" %}
Укажите:

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

Если точный путь неизвестен, попросите AI найти его в документации.

Не переименовывайте поля и статусы своими словами, если можете скопировать их точные названия из интерфейса.
{% endtab %}

{% tab title="Сервер" %}
Укажите:

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

К проблемному компоненту могут относиться:

* Frontend;
* Backend;
* Nginx;
* PostgreSQL;
* Redis;
* Reverb;
* очередь;
* PM2;
* PHP-FPM.

Не отправляйте полный файл `.env`, полные журналы или большой вывод терминала без предварительной проверки на секретные данные.
{% endtab %}

{% tab title="Обмен и курсы" %}
Укажите:

* валюту или направление обмена;
* где именно возникает проблема;
* ожидаемое поведение;
* фактическое поведение;
* состояние валют;
* состояние направления;
* наличие резерва;
* проверяемую сумму;
* источник курса;
* применяемые ограничения.

Ограничения могут зависеть от страны, языка, города, суммы, верификации и других настроек.

Не передавайте данные реального клиента или реальной заявки.
{% endtab %}

{% tab title="Установка и обновление" %}
Укажите:

* текущую версию iEXExchanger;
* целевую версию;
* операционную систему;
* FastPanel или чистый сервер;
* способ текущей установки;
* этап, на котором возникла проблема;
* точный текст ошибки;
* наличие актуальной резервной копии.

Попросите AI не смешивать инструкции для разных способов установки и версий продукта.
{% endtab %}
{% endtabs %}

## Безопасный порядок работы

При диагностике или изменении рабочей системы соблюдайте следующий порядок.

1. Сформулируйте один проверяемый результат.
2. Найдите относящиеся к задаче страницы документации.
3. Полностью прочитайте выбранные материалы.
4. Выполните проверки без изменения данных и конфигурации.
5. Сопоставьте результаты с документацией.
6. Подтвердите причину проблемы.
7. Внесите одно необходимое изменение.
8. Повторите исходный сценарий.
9. Проверьте журналы, статусы или результат в интерфейсе.
10. Верните изменение, если ожидаемый результат не достигнут и способ возврата заранее определён.

### Безопасные проверки

Для серверной проблемы сначала можно проверить:

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

Для панели управления сначала проверьте:

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

Не переходите к изменению конфигурации, если причина остаётся только предположением.

### Одно изменение за раз

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

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

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

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

## Постоянная инструкция

Сохраните следующий текст в инструкциях AI-проекта или добавляйте его перед важными вопросами.

{% prompt description="Инструкция для точных ответов по iEXExchanger" icon="file-check" %}

```markdown
Используй документацию iEXExchanger как основной источник.

Перед ответом найди относящиеся к задаче страницы и прочитай их полностью. Не делай подробный вывод только по заголовкам или фрагментам поиска.

Сохраняй точные названия разделов, кнопок, полей, вкладок, статусов, команд, файлов, переменных и параметров.

Учитывай версию iEXExchanger, операционную систему, способ установки и используемый компонент. Если этих сведений недостаточно, сначала запроси их.

Не смешивай инструкции для разных версий, операционных систем, панелей управления сервером и способов установки.

Отделяй подтверждённые сведения от предположений. Если точного ответа в документации нет, прямо скажи об этом и укажи, какой информации не хватает.

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

Для каждого действия укажи:

1. Цель.
2. Ожидаемый результат.
3. Способ проверки.
4. Подтверждённый риск.
5. Ссылку на источник.

Не придумывай отсутствующие настройки, команды, пути, порты, переменные, значения по умолчанию или поведение продукта.
```

{% endprompt %}

Для постоянного применения этих правил установите готовый навык со страницы «AI-ассистенты и SKILL.md».

## Готовые запросы

{% prompt description="Найти настройку" %}

```markdown
Используя документацию iEXExchanger, найди настройку автоматического обновления основных курсов.

Укажи:

1. Точный путь в панели управления.
2. Назначение подтверждённых параметров.
3. От каких компонентов зависит обновление.
4. Как проверить результат.
5. Прямые ссылки на использованные страницы.

Не добавляй настройки, которых нет в документации.
```

{% endprompt %}

{% prompt description="Направление не отображается" icon="arrows-left-right" %}

```markdown
По документации iEXExchanger помоги определить, почему направление обмена не отображается на клиентском сайте.

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

Сначала дай только безопасные проверки в правильной последовательности.

Для каждой проверки укажи:

1. Что проверить.
2. Где это проверить.
3. Какой результат ожидается.
4. Что означает отклонение.
5. На какой странице документации это описано.

Отдели подтверждённые причины от диагностических предположений.
```

{% endprompt %}

{% prompt description="Диагностика серверной ошибки" icon="server" %}

```markdown
Используя документацию iEXExchanger, помоги диагностировать следующую проблему:

<опишите симптом и точный текст ошибки>

Окружение:
- версия iEXExchanger: <версия>;
- операционная система: <ОС>;
- способ установки: <способ>;
- панель управления сервером: <панель или отсутствует>;
- компонент: <Frontend, Backend, Nginx, PostgreSQL, Reverb или другой>;
- последние изменения: <действие или неизвестно>.

Сначала предложи только безопасные проверки и команды чтения состояния.

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

Для каждой проверки укажи ожидаемый результат.

В конце приложи ссылки на использованные страницы.
```

{% endprompt %}

{% prompt description="Проверить готовую инструкцию" icon="shield-check" %}

```markdown
Проверь следующую инструкцию по документации iEXExchanger:

<вставьте инструкцию>

Раздели результат на четыре части:

1. Подтверждённые действия.
2. Действия, которые противоречат документации.
3. Сведения, которые не удалось проверить.
4. Использованные страницы.

Не исправляй неподтверждённые части предположениями.
```

{% endprompt %}

## Проверка ответа перед применением

Перед выполнением инструкции убедитесь, что:

* использованы страницы документации iEXExchanger;
* приложенные ссылки открываются;
* AI прочитал полное содержимое страниц;
* ответ относится к вашей версии и окружению;
* названия меню, полей и статусов указаны точно;
* команды не содержат придуманных путей, портов или переменных;
* подтверждённые сведения отделены от предположений;
* сначала предложены безопасные проверки;
* объяснён ожидаемый эффект;
* указаны реальные риски;
* описан конкретный способ проверки результата;
* перед рискованным изменением создана резервная копия;
* способ возврата подтверждён заранее.

{% hint style="danger" %}
Не выполняйте на рабочем сервере команды удаления, восстановления базы данных, изменения SSH, Firewall, Nginx, PostgreSQL или системных служб только потому, что их предложил AI.

Сначала подтвердите причину, область изменения, ожидаемый результат и возможность восстановления.
{% endhint %}

## Защита данных

Не передавайте AI:

* пароли;
* содержимое рабочего `.env`;
* seed-фразы;
* приватные ключи;
* SSH-ключи;
* API-токены;
* ключи и пароли мерчантов;
* пароли базы данных;
* данные SMTP;
* реальные платёжные реквизиты;
* документы клиентов;
* персональные данные;
* данные реальных заявок;
* журналы с заголовками авторизации.

Проверяйте не только текст запроса, но и прикреплённые файлы, снимки экрана, журналы и вывод терминала.

Заменяйте секретные значения безопасными шаблонами:

```dotenv
APP_KEY=<скрыто>
DB_DATABASE=<имя_базы>
DB_USERNAME=<пользователь_базы>
DB_PASSWORD=<скрыто>
API_TOKEN=<скрыто>
```

Для доменов используйте:

```
https://ваш_домен
https://app.ваш_домен
```

Не скрывайте названия полей, команды и сообщения об ошибках, если они не содержат конфиденциальных данных. Они могут быть важны для диагностики.

## Актуальность источников

MCP и Markdown-ссылки обращаются к текущей опубликованной версии документации.

Изменения, которые ещё не опубликованы, недоступны через MCP, `.md`, `llms.txt` и `llms-full.txt`.

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

После обновления документации:

1. Удалите устаревшие копии из AI-проекта.
2. Повторно загрузите `llms.txt`.
3. При необходимости повторно загрузите все части `llms-full.txt`.
4. Замените сохранённые Markdown-страницы.
5. Начните новый диалог.
6. Повторите проверочный запрос.

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

## Решение проблем

<details>

<summary>AI не может открыть ссылки</summary>

**Симптом:** AI сообщает, что не получил содержимое страницы, или отвечает без использования указанной ссылки.

**Причина:** используемый инструмент не имеет доступа к интернету или не умеет открывать внешние страницы.

**Как исправить:** подключите MCP документации или скачайте нужные Markdown-страницы и прикрепите их к диалогу.

Не просите AI отвечать по странице, содержимое которой он не смог получить.

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

</details>

<details>

<summary>Ответ получился слишком общим</summary>

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

**Причина:** запрос не содержит конкретной задачи и достаточного контекста либо AI не прочитал полные страницы.

**Как исправить:** укажите версию, окружение, компонент, симптом и ожидаемый результат. Попросите открыть полные страницы и приложить ссылки.

**Проверка результата:** ответ должен содержать конкретные действия, ожидаемый результат и способ проверки.

</details>

<details>

<summary>Предложена настройка, которой нет в панели</summary>

**Симптом:** AI указывает поле, вкладку или раздел, которого нет в используемой версии iEXExchanger.

**Причина:** ответ основан на предположении, другой версии продукта или стороннем источнике.

**Как исправить:** попросите указать точное название страницы документации и фрагмент, подтверждающий существование настройки.

Если подтверждающего источника нет, считайте настройку неподтверждённой.

**Проверка результата:** путь и название элемента должны совпасть с документацией и интерфейсом.

</details>

<details>

<summary>Получены противоречивые инструкции</summary>

**Симптом:** в одном ответе используются разные команды, пути или способы установки.

**Причина:** смешаны разные версии iEXExchanger, операционные системы, способы установки или старые загруженные файлы.

**Как исправить:** укажите конкретную версию и окружение. Попросите разделить источники и не объединять различающиеся инструкции.

Если противоречие остаётся, не применяйте ни один из вариантов до его уточнения.

**Проверка результата:** итоговая инструкция должна относиться только к одному подтверждённому окружению.

</details>

<details>

<summary>AI утверждает, что изучил всю документацию</summary>

**Симптом:** AI заявляет о полном изучении документации, но не может перечислить использованные страницы.

**Причина:** ответ подготовлен без подтверждённого чтения необходимых материалов.

**Как исправить:** попросите перечислить страницы, открыть их полностью и указать, какие сведения были взяты из каждого источника.

**Проверка результата:** в ответе должны быть прямые ссылки и подтверждённые сведения из выбранных страниц.

</details>

<details>

<summary>Используется устаревшая копия</summary>

**Симптом:** ответ содержит старые команды, названия или порядок действий.

**Причина:** в AI-проекте остались ранее загруженные файлы.

**Как исправить:** удалите старые копии, загрузите актуальные страницы и начните новый диалог.

**Проверка результата:** ответ должен соответствовать текущей опубликованной документации.

</details>

## Итоговая проверка

Ответ готов к применению, если:

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

{% hint style="success" %}
AI должен ускорять поиск информации и подготовку инструкции, но не заменять проверку документации и контроль человека над рабочей системой.
{% endhint %}


# AI-возможности документации

На каждой странице документации iEXExchanger доступно меню **«Спросить»**. Через него можно задать вопрос встроенному помощнику, скопировать содержимое страницы, открыть её в формате Markdown или передать в поддерживаемый AI-инструмент.

Из этого же меню можно быстро подключить всю документацию через MCP к VS Code, Claude Code, Codex или другому совместимому клиенту.

{% hint style="info" %}
Доступные действия работают только с опубликованной документацией iEXExchanger. Они не предоставляют доступ к административной панели, серверу, базе данных, заявкам или настройкам обменного пункта.
{% endhint %}

## Меню «Спросить»

Меню находится в правой верхней части открытой страницы.

Чтобы открыть список действий, нажмите **«Спросить»** или иконку раскрытия рядом с ним.

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

Для быстрого вопроса по одной странице используйте копирование, Markdown или открытие в ChatGPT и Claude.

Для постоянной работы со всей документацией подключите MCP.

## Действия с текущей страницей

{% stepper %}
{% step %}

### GitBook-помощник

Это точное название встроенного помощника в текущем интерфейсе документации.

Он позволяет задавать вопросы по опубликованным материалам iEXExchanger, не копируя текст страницы и не переходя в другой инструмент.

Примеры вопросов:

```
Что нужно подготовить перед созданием валюты?
```

```
Какие настройки влияют на отображение направления обмена?
```

```
Как проверить результат настройки, описанной на этой странице?
```

Помощник использует опубликованную документацию, но не видит фактические значения в вашей административной панели и не знает текущее состояние сервера.

Если вопрос относится к конкретному обменному пункту, дополнительно укажите:

* версию iEXExchanger;
* используемый раздел;
* ожидаемый результат;
* фактическое поведение;
* точный текст ошибки;
* последние выполненные изменения.

Не передавайте пароли, токены, платёжные реквизиты и персональные данные.
{% endstep %}

{% step %}

### Копировать страницу

Действие копирует содержимое открытой страницы для использования в другом приложении или AI-инструменте.

Используйте его, когда:

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

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

Пример:

```
Ниже приведена страница документации iEXExchanger.

На её основе подготовь последовательную инструкцию.

Сохрани точные названия разделов, вкладок, полей и статусов.

Не добавляй сведения, которых нет в переданном тексте.

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

{% hint style="warning" %}
Перед отправкой проверьте скопированный текст и дополнительные сведения в запросе. Не добавляйте к ним секретные или персональные данные.
{% endhint %}
{% endstep %}

{% step %}

### Посмотреть как Markdown

Действие открывает текущую страницу как обычный Markdown-текст без визуального оформления документации.

Используйте его, когда нужно:

* просмотреть исходное содержимое страницы;
* скопировать отдельный фрагмент;
* сохранить материал в файл;
* передать прямую Markdown-ссылку;
* загрузить страницу в AI-инструмент без поддержки MCP.

Markdown-версию можно открыть и вручную. Для этого добавьте `.md` в конец адреса страницы.

Пример:

```
https://docs.iexexchanger.com/nachalo-raboty/rabota-s-ai/mcp.md
```

{% hint style="info" %}
Markdown-версия содержит только открытую страницу. Для поиска по всей документации и чтения связанных материалов используйте MCP.
{% endhint %}
{% endstep %}

{% step %}

### Открыть в ChatGPT

Действие открывает текущую страницу в ChatGPT с подготовленным контекстом.

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

После перехода уточните задачу:

```
Используй переданную страницу документации iEXExchanger как основной источник.

Объясни порядок настройки простым техническим языком.

Сохрани точные названия разделов, вкладок, кнопок и полей.

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

Не добавляй настройки, команды или ограничения, которых нет на странице.
```

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

Если вопрос относится к нескольким разделам, подключите MCP или передайте дополнительные Markdown-страницы.
{% endstep %}

{% step %}

### Открыть в Claude

Действие открывает текущую страницу в Claude с подготовленным контекстом.

Этот вариант также подходит для быстрого вопроса по одной инструкции.

Пример запроса:

```
Используй переданную страницу документации iEXExchanger.

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

Сохрани точные названия элементов интерфейса.

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

Не придумывай отсутствующие поля, значения или ограничения.
```

Если Claude открылся без содержимого страницы, вернитесь в документацию, выберите **«Копировать страницу»** и вставьте текст в диалог вручную.
{% endstep %}
{% endstepper %}

***

## Подключение документации через MCP

MCP позволяет подключить всю опубликованную документацию iEXExchanger к совместимому клиенту.

После подключения клиент сможет:

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

Адрес MCP-сервера:

```
https://docs.iexexchanger.com/~gitbook/mcp
```

Полная ручная настройка, проверка инструментов и решение проблем описаны на странице «MCP документации iEXExchanger».

### «Подключиться к MCP»

Используйте это действие для подключения документации к MCP-клиенту, для которого в меню нет отдельного пункта.

Клиенту потребуются следующие параметры:

```
Название: iEXExchanger Docs
URL: https://docs.iexexchanger.com/~gitbook/mcp
Транспорт: Streamable HTTP
Авторизация: не требуется
```

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

Если автоматическое подключение не сработало, добавьте сервер вручную по инструкции «MCP документации iEXExchanger».

### «Подключиться к VSCode»

Действие передаёт параметры MCP-сервера в VS Code.

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

После открытия:

1. Подтвердите добавление MCP-сервера.
2. Откройте палитру команд.
3. Выполните **MCP: List Servers**.
4. Найдите сервер документации iEXExchanger.
5. Запустите сервер.
6. Подтвердите доверие к подключению.
7. Откройте Chat и проверьте доступные инструменты.

Если переход не сработал, настройте сервер вручную через `.vscode/mcp.json`.

### «Подключиться к Claude Code»

Действие передаёт параметры MCP-сервера в Claude Code.

После подключения проверьте список серверов:

```bash
claude mcp list
```

В запущенном Claude Code также можно выполнить:

```
/mcp
```

Сервер документации должен отображаться в списке подключений.

Если автоматическое добавление не сработало, выполните ручную команду:

```bash
claude mcp add --transport http --scope user iexexchanger-docs https://docs.iexexchanger.com/~gitbook/mcp
```

Затем повторно выполните:

```bash
claude mcp list
```

### «Подключиться к Codex»

Действие передаёт параметры MCP-сервера в Codex.

После подключения проверьте список серверов:

```bash
codex mcp list
```

В интерфейсе Codex можно дополнительно выполнить:

```
/mcp
```

Если автоматическое подключение не сработало, добавьте сервер вручную:

```bash
codex mcp add iexexchanger-docs --url https://docs.iexexchanger.com/~gitbook/mcp
```

После добавления повторно проверьте список:

```bash
codex mcp list
```

## Что выбрать

| Задача                                     | Действие                                           | Результат                                                   |
| ------------------------------------------ | -------------------------------------------------- | ----------------------------------------------------------- |
| Быстро задать вопрос внутри документации   | **«GitBook-помощник»**                             | Помощник отвечает по опубликованным материалам              |
| Передать одну страницу вручную             | **«Копировать страницу»**                          | Содержимое можно вставить в любой поддерживаемый инструмент |
| Получить текст без оформления              | **«Посмотреть как Markdown»**                      | Открывается Markdown-версия текущей страницы                |
| Задать разовый вопрос во внешнем AI        | **«Открыть в ChatGPT»** или **«Открыть в Claude»** | Текущая страница передаётся как контекст                    |
| Постоянно искать по всей документации      | **«Подключиться к MCP»**                           | Клиент получает поиск и чтение опубликованных страниц       |
| Добавить документацию в рабочий инструмент | Подключение к VS Code, Claude Code или Codex       | MCP-сервер добавляется в выбранный клиент                   |

{% hint style="info" %}
Для одного вопроса по уже открытой странице обычно достаточно помощника, копирования страницы или открытия в ChatGPT и Claude.

Для постоянной работы с разными разделами используйте MCP.
{% endhint %}

## Проверка подключения MCP

После подключения отправьте следующий запрос:

{% prompt description="Проверка документации iEXExchanger" icon="plug" %}

```markdown
Используй MCP-сервер iexexchanger-docs.

1. Покажи доступные инструменты сервера.
2. Найди страницу «Валюты».
3. Полностью открой найденную страницу.
4. Назови точный путь к списку валют в панели управления.
5. Приложи ссылку на использованную страницу.

Не отвечай по памяти.
```

{% endprompt %}

Подключение работает, если клиент:

* нашёл страницу документации;
* открыл её полное содержимое;
* указал точный путь;
* приложил ссылку на источник.

Ожидаемый путь: **«Основное» — «Валюты» — «Список валют»**

## Ограничения доступа

Меню **«Спросить»**, Markdown-страницы и MCP предоставляют доступ только к опубликованной документации.

Они не позволяют:

* открыть административную панель;
* прочитать настройки вашего обменного пункта;
* получить доступ к SSH;
* выполнить команду на сервере;
* прочитать рабочий `.env`;
* подключиться к базе данных;
* посмотреть заявки;
* получить данные клиентов;
* изменить резерв;
* получить платёжные реквизиты;
* установить обновление;
* изменить файлы Frontend или Backend.

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

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


# Системные требования

Для установки и стабильной работы iEXExchanger требуется Linux-сервер с полноценным административным доступом.

На одном сервере могут одновременно работать Frontend, Backend, PostgreSQL, Redis, Node.js, очереди, WebSocket, аналитика, уведомления и другие фоновые процессы. Поэтому сервер нужно выбирать с запасом ресурсов, а не только исходя из размера файлов проекта.

Для большинства обменных пунктов на начальном и среднем этапе отдельные серверы для каждого компонента не требуются.

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

Быстро выбрать сервер можно по следующей таблице.

<table><thead><tr><th width="192.23046875">Вариант</th><th>Ресурсы</th><th>Когда использовать</th></tr></thead><tbody><tr><td><strong>Стартовый</strong></td><td>2–4 vCPU, 8 GB RAM, 50+ GB NVMe</td><td>Новый обменный пункт, первоначальная установка и небольшая нагрузка</td></tr><tr><td><strong>Рекомендуемый</strong></td><td>4 vCPU, 16 GB RAM, 80+ GB NVMe</td><td>Основной production-сервер для большинства проектов</td></tr><tr><td><strong>Высокая нагрузка</strong></td><td>8+ vCPU, 32+ GB RAM, 150+ GB NVMe</td><td>Большое количество посетителей, заявок, направлений и фоновых процессов</td></tr></tbody></table>

Для большинства production-проектов рекомендуется начинать с **4 vCPU, 16 GB RAM и 80+ GB NVMe**. Такая конфигурация позволяет разместить основные компоненты iEXExchanger на одном сервере и оставляет запас для роста нагрузки.

{% hint style="info" %}
Если вы не знаете, какую конфигурацию выбрать, используйте рекомендуемый вариант: **4 vCPU, 16 GB RAM, 80+ GB NVMe**.
{% endhint %}

## Операционная система и программное окружение

Для iEXExchanger требуется Linux-сервер.

В текущей технической документации iEXExchanger используются Debian 12 и Ubuntu 24.04. Для существующих инструкций с FastPanel также применяется Debian 12.

### Основные требования

| Компонент                | Требование                 |
| ------------------------ | -------------------------- |
| **Операционная система** | Debian 12 или Ubuntu 24.04 |
| **Web-сервер**           | Nginx                      |
| **Backend**              | PHP 8.4                    |
| **База данных**          | PostgreSQL 18              |
| **Кеш и очереди**        | Redis                      |
| **Frontend SSR**         | Node.js 24                 |
| **Frontend-процессы**    | PM2                        |
| **Backend-процессы**     | Supervisor                 |
| **Защищённые PHP-файлы** | ionCube Loader для PHP 8.4 |

Панель управления сервером не является обязательным требованием iEXExchanger. Сервер можно настраивать непосредственно через Linux и SSH.

Если выбранная инструкция установки предусматривает FastPanel, используйте требования и последовательность действий именно этой инструкции.

## Что работает на сервере

При стандартной установке на одном production-сервере могут одновременно работать:

* Frontend SSR;
* Backend;
* PostgreSQL;
* Redis;
* Laravel Horizon;
* Laravel Reverb;
* Laravel Pulse;
* очереди;
* уведомления;
* аналитика;
* фоновые задачи;
* Node.js;
* PM2;
* Supervisor;
* Nginx.

Именно поэтому для основного production-сервера рекомендуется 16 GB RAM, даже если новый проект на старте способен работать с 8 GB.

## Выбор процессора

Процессор влияет на скорость обработки запросов Backend, административной панели, клиентского Frontend SSR, заявок, очередей и фоновых процессов.

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

* AMD EPYC;
* AMD Ryzen;
* Intel Xeon;
* современные Intel Core.

Для iEXExchanger важно не только количество vCPU, но и производительность отдельного ядра.

Сервер с меньшим количеством современных быстрых ядер может работать быстрее, чем сервер с большим количеством медленных виртуальных ядер.

Для проектов с высокой нагрузкой предпочтительны современные AMD EPYC или сопоставимые по производительности процессоры.

## Оперативная память

Оперативная память используется не только Backend.

Одновременно RAM потребляют PostgreSQL, Redis, PHP, Node.js, PM2, Supervisor, Laravel Horizon, Laravel Reverb, Laravel Pulse, очереди, аналитика и другие процессы.

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

| Нагрузка         | RAM            |
| ---------------- | -------------- |
| Небольшой проект | 8 GB           |
| Production       | 16 GB          |
| Высокая нагрузка | 32 GB и больше |

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

Если все основные компоненты размещены на одном сервере, **16 GB RAM является рекомендуемым вариантом для production**.

## Дисковая подсистема

Для production рекомендуется использовать NVMe.

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

{% stepper %}
{% step %}

### NVMe

NVMe — рекомендуемый вариант для основного production-сервера.

Если при сопоставимой стоимости доступен выбор между обычным SSD и NVMe, выбирайте NVMe.
{% endstep %}

{% step %}

### SSD

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

Для активно работающего production-проекта предпочтительнее NVMe.
{% endstep %}

{% step %}

### HDD

HDD не рекомендуется использовать как основной рабочий диск iEXExchanger.

Низкая скорость чтения и записи может замедлять PostgreSQL, очереди и другие процессы, активно работающие с диском.

HDD можно использовать как отдельное хранилище резервных копий, если такой вариант подходит для вашей схемы резервирования.
{% endstep %}
{% endstepper %}

## Свободное место на диске

Не рассчитывайте необходимый объём диска только по размеру файлов iEXExchanger.

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

* PostgreSQL;
* журналов;
* пользовательских файлов;
* изображений;
* экспортов;
* временных файлов;
* архивов обновлений;
* резервных копий.

Поэтому для production рекомендуется начинать минимум с **80 GB NVMe** и оставлять свободный запас.

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

## PostgreSQL

Актуальная конфигурация iEXExchanger использует:

```
PostgreSQL 18
```

PostgreSQL рекомендуется размещать на SSD или NVMe.

Для большинства проектов база данных может работать на том же сервере, что Frontend, Backend и Redis.

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

## PHP

Backend iEXExchanger использует:

```
PHP 8.4
```

Основные PHP-расширения:

```
bcmath
curl
dom
gmp
intl
mbstring
openssl
pdo_pgsql
pgsql
redis
simplexml
soap
sodium
xml
zip
```

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

```
imagick
yaml
ffi
```

`json` входит в современные версии PHP и отдельно обычно не устанавливается.

## ionCube Loader

Для production-файлов Backend требуется ionCube Loader, совместимый с:

```
PHP 8.4
```

После установки необходимо проверить, что ionCube Loader подключён именно к той версии PHP, через которую работает Backend.

## Node.js и PM2

Frontend iEXExchanger использует серверный рендеринг — SSR.

Требуемая версия:

```
Node.js 24
```

PM2 используется для запуска и контроля Frontend-процесса.

Frontend SSR работает через Node.js, а Backend и основная серверная логика iEXExchanger работают через PHP.

## Redis

Redis используется внутренними компонентами iEXExchanger.

Для большинства проектов Redis может работать на одном сервере вместе с приложением и PostgreSQL.

Перенос Redis на отдельный сервер требуется только при соответствующей нагрузке.

{% hint style="warning" %}
Не открывайте Redis для публичного доступа из интернета.
{% endhint %}

## Supervisor

Supervisor используется для управления длительно работающими процессами Backend.

После установки необходимо настроить процессы, предусмотренные инструкцией установки iEXExchanger.

Проверяйте их состояние после:

* обновления iEXExchanger;
* перезагрузки сервера;
* изменения серверной конфигурации;
* изменения PHP;
* восстановления сервера.

## Nginx

Nginx обслуживает Frontend и Backend iEXExchanger.

Он используется для:

* HTTPS;
* Frontend SSR;
* передачи запросов в Backend;
* WebSocket;
* статических файлов;
* дополнительных правил доступа.

Используйте конфигурацию Nginx, предназначенную для установленной версии iEXExchanger.

Не переносите конфигурацию из старой версии продукта без проверки изменений.

## Требования к доступу к серверу

Для установки нужен сервер с полноценным административным доступом.

Вы должны иметь возможность:

* подключаться по SSH;
* устанавливать системные пакеты;
* настраивать Nginx;
* устанавливать и настраивать PHP;
* устанавливать PostgreSQL;
* устанавливать Redis;
* использовать Supervisor;
* устанавливать Node.js и PM2;
* управлять системными службами;
* изменять системные конфигурации.

Обычный хостинг без полноценного административного доступа для такой установки не подходит. Это следует из требований iEXExchanger к управлению Linux-системой и серверными службами.

## Выбор локации сервера

Выбирайте дата-центр ближе к основной аудитории обменного пункта.

Например, если большая часть клиентов находится в Европе, предпочтительнее европейская локация.

Чем дальше клиент находится от сервера, тем выше задержка при выполнении динамических запросов.

CDN способен ускорить доставку статических ресурсов, но не устраняет физическую задержку между пользователем, Backend и базой данных.

## Что проверить у хостинг-провайдера

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

* наличие нужной локации;
* стабильность сети;
* возможность увеличить CPU и RAM;
* возможность увеличить диск;
* наличие snapshots или резервных копий;
* наличие полноценного IPv4;
* SSH-доступ;
* возможность переустановить операционную систему;
* наличие rescue-режима или другого способа восстановления доступа.

Особенно важна возможность масштабировать сервер без полного переноса проекта на новую инфраструктуру.

## CDN и защита от DDoS

Для публичного обменного пункта рекомендуется использовать Cloudflare или другой совместимый сервис CDN и защиты от DDoS.

CDN может использоваться для:

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

{% hint style="warning" %}
Не применяйте обычное статическое кеширование ко всем страницам iEXExchanger без отдельной настройки.
{% endhint %}

Не следует кешировать как обычный статический контент:

* API;
* административную панель;
* страницы заявок;
* авторизованные разделы;
* платёжные страницы;
* другие персонализированные ответы Backend.

Неправильные правила CDN могут нарушить работу API, авторизации, WebSocket и обработки заявок.

## Масштабирование

Не нужно сразу создавать инфраструктуру из нескольких серверов.

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

```
4 vCPU
16 GB RAM
80+ GB NVMe
```

Если ресурсов становится недостаточно, сначала определите фактическое узкое место.

Обычно масштабирование выполняется последовательно:

1. Увеличьте оперативную память.
2. Увеличьте количество или производительность vCPU.
3. Увеличьте объём и производительность NVMe.
4. Перенесите PostgreSQL на отдельный сервер, если именно база данных создаёт основную нагрузку.
5. Перенесите Redis или фоновые процессы, если это требуется по результатам мониторинга.
6. Используйте несколько экземпляров приложения и балансировку при дальнейшем росте нагрузки.

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

## Что рекомендуется заказать

Для обычного production-проекта iEXExchanger оптимальной отправной точкой является:

| Параметр            | Рекомендация                              |
| ------------------- | ----------------------------------------- |
| **ОС**              | Debian 12 или Ubuntu 24.04                |
| **CPU**             | 4 vCPU                                    |
| **RAM**             | 16 GB                                     |
| **Диск**            | 80+ GB NVMe                               |
| **Сеть**            | Стабильное подключение и полноценный IPv4 |
| **Доступ**          | Полный SSH-доступ                         |
| **Масштабирование** | Возможность увеличить CPU, RAM и диск     |
| **Резервирование**  | Snapshots или резервные копии             |

На сервере должны быть доступны или устанавливаться:

```
Nginx
PHP 8.4
ionCube Loader
PostgreSQL 18
Redis
Supervisor
Node.js 24
PM2
```

Для небольшого проекта можно начать с **2–4 vCPU, 8 GB RAM и 50+ GB NVMe**.

Для проекта с высокой нагрузкой рекомендуется рассматривать **8+ vCPU, 32+ GB RAM и 150+ GB NVMe**.

При дальнейшем росте увеличивайте ресурсы на основании фактической нагрузки сервера, PostgreSQL, Redis и фоновых процессов, а не только количества клиентов или направлений обмена.


# Выбор и регистрация домена

Домен — это адрес обменного пункта в интернете, по которому пользователи будут открывать сайт.

Примеры:

```
myexchange.com
cryptochange.net
fastswap.io
```

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

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

{% hint style="warning" %}
После регистрации лицензии iEXExchanger и привязки её к выбранному домену изменить этот домен нельзя.

Перед регистрацией лицензии убедитесь, что выбрали окончательный домен, который будет использоваться для проекта.
{% endhint %}

## Перед регистрацией домена

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

Условия добавления обменного пункта опубликованы на странице:

[Условия включения обменного пункта в мониторинг BestChange](https://www.bestchange.ru/wiki/add.html)

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

Также не используйте названия, которые копируют или имитируют:

* другие обменные пункты;
* банки;
* криптовалютные биржи;
* платёжные системы;
* финансовые сервисы;
* известные интернет-сервисы и бренды.

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

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

{% hint style="warning" %}
Проверяйте название и домен до их окончательного выбора и регистрации лицензии iEXExchanger.

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

## Как проверить название для BestChange

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

{% stepper %}
{% step %}

### Предварительная проверка на сайте BestChange

Откройте:

[Условия включения обменного пункта в мониторинг BestChange](https://www.bestchange.ru/wiki/add.html)

Найдите пункт **2**, в котором указаны требования к названию и доменному имени обменного пункта.

В этом пункте доступна ссылка: **«Тут вы можете провести предварительную проверку названия»**

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

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

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

{% step %}

### Проверка через поддержку BestChange

Если после предварительной проверки остаются сомнения, обратитесь в поддержку BestChange по электронной почте.

Укажите:

* предполагаемое название обменного пункта;
* доменное имя, которое планируете использовать.

Такой способ особенно полезен, если выбранное название похоже на уже существующий проект, отличается от него несколькими символами или может ассоциироваться с известным сервисом.

Лучше уточнить возможность использования названия заранее, чем менять бренд и домен после запуска проекта.
{% endstep %}
{% endstepper %}

## Дополнительная проверка домена

Даже если вы не планируете сразу добавлять обменный пункт в BestChange, перед покупкой домена рекомендуется проверить выбранное название самостоятельно.

{% stepper %}
{% step %}

### Поисковые системы

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

Проверьте, не используется ли оно другим:

* обменным пунктом;
* финансовым сервисом;
* банком;
* биржей;
* платёжной системой;
* известным интернет-проектом.

Обращайте внимание не только на полностью одинаковые названия, но и на похожее написание и произношение.
{% endstep %}

{% step %}

### Другие мониторинги обменников

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

Это позволит обнаружить возможный конфликт до регистрации домена и запуска сайта.
{% endstep %}

{% step %}

### Бренды и торговые марки

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

Лучше выбрать самостоятельное название, которое не создаёт впечатления, что ваш обменный пункт связан с другой компанией.
{% endstep %}
{% endstepper %}

***

## Как выбрать домен

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

При выборе учитывайте:

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

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

{% hint style="info" %}
Если вы выбираете между несколькими доменами, не регистрируйте лицензию iEXExchanger, пока окончательно не определитесь с основным вариантом.
{% endhint %}

## Регистрация домена

Зарегистрировать домен можно у любого подходящего регистратора.

Общий порядок:

1. Откройте сайт выбранного регистратора.
2. Введите желаемое доменное имя.
3. Проверьте его доступность.
4. Добавьте домен в корзину.
5. Создайте учётную запись или войдите в существующую.
6. Оплатите регистрацию.
7. После покупки откройте управление доменом в личном кабинете регистратора.

После регистрации домен можно подключать к DNS и серверу.

## Рекомендуемые регистраторы

iEXExchanger не требует использования конкретного регистратора. Выбирайте сервис с подходящими доменными зонами, способами оплаты и полноценным управлением DNS.

{% stepper %}
{% step %}

### Namecheap

Крупный международный регистратор.

Подходит для большинства международных проектов и предоставляет инструменты для управления доменами и DNS.

Доступны:

* большой выбор доменных зон;
* управление DNS;
* WHOIS-защита для поддерживаемых доменов;
* управление несколькими доменами из одного аккаунта.
  {% endstep %}

{% step %}

### Cloudflare Registrar

Подходит для проектов, которые планируют использовать Cloudflare для DNS, CDN и защиты сайта.

Удобен тем, что домен и DNS можно управлять в одной системе.
{% endstep %}

{% step %}

### REG.RU

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

Доступны:

* регистрация доменов;
* зоны `.RU` и `.РФ`;
* управление DNS;
* локальные способы оплаты.
  {% endstep %}

{% step %}

### GoDaddy

Крупный международный регистратор с большим выбором доменных зон.

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

## Рекомендуемая схема доменов iEXExchanger

Для нового проекта iEXExchanger используется основной домен для Frontend и технический поддомен `app` для Backend.

| Назначение   | Адрес                   |
| ------------ | ----------------------- |
| **Frontend** | `https://ваш_домен`     |
| **Backend**  | `https://app.ваш_домен` |

Например, если выбран основной домен:

```
example.com
```

структура будет следующей:

```
Frontend: https://example.com
Backend: https://app.example.com
```

`https://example.com` — основной домен клиентской части обменного пункта.

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

`https://app.example.com` — технический поддомен Backend.

На нём находятся административная панель, API и другие серверные функции iEXExchanger.

{% hint style="info" %}
Для новых проектов рекомендуется сразу использовать схему `ваш_домен` и `app.ваш_домен`. Эта схема используется в технической документации iEXExchanger.
{% endhint %}

## Домен и лицензия iEXExchanger

Лицензия iEXExchanger регистрируется для конкретного основного домена проекта.

Перед привязкой лицензии ещё раз проверьте:

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

{% hint style="danger" %}
После регистрации лицензии и привязки домена заменить его на другой нельзя.

Не используйте временный, тестовый или ещё не утверждённый домен для регистрации основной лицензии.
{% endhint %}

Технический поддомен Backend создаётся на основе основного домена:

```
app.ваш_домен
```

Например:

```
Основной домен: example.com
Backend: app.example.com
```

Поэтому окончательный основной домен лучше определить до начала настройки всей инфраструктуры проекта.

## Что делать после регистрации домена

После покупки окончательного домена необходимо подготовить его к установке iEXExchanger.

Последовательность дальнейших действий:

1. Подготовьте сервер.
2. Настройте DNS основного домена.
3. Создайте поддомен `app.ваш_домен`.
4. Настройте DNS для Backend.
5. При необходимости подключите Cloudflare.
6. Добавьте основной домен и Backend на сервер.
7. Выпустите SSL-сертификаты.
8. Зарегистрируйте лицензию iEXExchanger на окончательный домен.
9. Перейдите к установке iEXExchanger.

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


# Установка

Как правильно установить, обновить или перенести сайт. Возможные ошибки этих процессов.


# Подготовка к установке

Перед началом установки рекомендуется внимательно ознакомиться с данным разделом. Соблюдение указанных рекомендаций позволит избежать распространённых ошибок и значительно упростит процесс установки и дальнейшей эксплуатации системы.

{% hint style="info" %}

### Поддержка и услуги по установке

Вся информация, необходимая для самостоятельной установки iEXExchanger, подробно описана в данной документации. Инструкция регулярно обновляется и содержит все основные этапы настройки сервера, установки компонентов и запуска системы.

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

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

**Первичная установка iEXExchanger для одного домена выполняется бесплатно в рамках лицензии.**

Если требуется установка на дополнительные домены, перенос системы, повторная установка, настройка тестовых стендов или другие работы, они выполняются на платной основе согласно действующим тарифам.

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

<https://iexexchanger.com/services>

Мы рекомендуем сначала ознакомиться с документацией и попробовать выполнить установку самостоятельно. Если на любом этапе возникнут сложности, наша команда всегда готова помочь с профессиональным развёртыванием и настройкой системы.
{% endhint %}

## Важная информация

{% stepper %}
{% step %}

### Скриншоты в документации

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

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

* версии FastPanel;
* операционной системы сервера;
* используемого хостинг-провайдера;
* индивидуальных настроек сервера.

Такие отличия являются нормальными и не влияют на общий порядок установки.

При выполнении инструкции ориентируйтесь на аналогичные элементы интерфейса и последовательность действий, а не на полное визуальное совпадение со скриншотами.
{% endstep %}

{% step %}

### Использование обозначения «ваш\_домен»

В документации регулярно используется обозначение: <mark style="color:red;">**ваш\_домен**</mark>

Это условное название, которое применяется исключительно в примерах.

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

Пример:

```
Домен обменника: test.ru
В инструкции: https://ваш_домен
Фактически: https://test.ru
```

{% hint style="info" %}
Всегда заменяйте обозначение <mark style="color:red;">**«ваш\_домен»**</mark> на фактический домен вашего проекта.
{% endhint %}

Также рекомендуется внимательно проверять правильность написания доменных имён. Ошибки или опечатки в домене могут привести к некорректной работе системы и дополнительным затратам времени на диагностику.
{% endstep %}

{% step %}

### Загрузка файлов на сервер

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

Использование пользователя <mark style="color:red;">**root**</mark> для загрузки файлов проекта не рекомендуется.

Почему это важно:

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

Пример:

* <mark style="color:$success;">Правильно: загрузка файлов под пользователем сайта (например,</mark> <mark style="color:$success;"></mark><mark style="color:$success;">**siteuser**</mark><mark style="color:$success;">)</mark>
* <mark style="color:red;">Неправильно: загрузка файлов под пользователем</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark>

Соблюдение данного правила позволит избежать большинства проблем, связанных с правами доступа к файлам проекта.
{% endstep %}

{% step %}

### Использование готовых установочных архивов

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

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

Перед запуском любого скрипта рекомендуется:

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

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

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

Ручная установка позволяет лучше понимать процесс настройки системы, упрощает диагностику возможных ошибок и обеспечивает более предсказуемый результат.
{% endstep %}
{% endstepper %}

***

## Требования к серверу

Перед началом установки убедитесь, что сервер полностью соответствует системным требованиям iEXExchanger.

От конфигурации сервера напрямую зависят:

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

Перед переходом к следующему шагу обязательно ознакомьтесь с требованиями к серверу и убедитесь, что используемая инфраструктура соответствует рекомендациям продукта.

***

### Получение файлов для установки

Для установки системы потребуется скачать следующие файлы:

* архив Frontend;
* архив Backend;
* архив лицензии домена.

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

* лицензия успешно активирована;
* домен привязан к лицензии;
* у вас есть доступ к личному кабинету iEXExchanger;
* доступ к лицензиям подтверждён через двухфакторную защиту.

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

* Активация лицензии — создание лицензии и привязка домена.
* Файлы лицензии и релизы — получение файла лицензии, Frontend и Backend архивов.

{% content-ref url="/pages/n6k9Dtawg6HRkoDP9EOD" %}
[Активация лицензии](/nachalo-raboty/aktivaciya-licenzii)
{% endcontent-ref %}

{% content-ref url="/pages/hSsHgydQTzax5c06kVsd" %}
[Файлы лицензии и релизы](/nachalo-raboty/faily-licenzii-i-relizy)
{% endcontent-ref %}


# Настройка FastPanel


# Домены и SSL

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

Также на данном этапе необходимо настроить SSL-сертификаты для обоих доменов, чтобы обеспечить работу системы по защищённому протоколу HTTPS.

## Архитектура доменов

По умолчанию iEXExchanger использует следующую структуру:

<table><thead><tr><th width="272.203125">Назначение</th><th>Пример</th></tr></thead><tbody><tr><td>Основной домен</td><td><code>example.com</code></td></tr><tr><td>Технический поддомен</td><td><code>app.example.com</code></td></tr></tbody></table>

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

Технический поддомен используется для API, панели управления, очередей, WebSocket-соединений и других серверных компонентов системы.

## Требования перед началом

Перед выполнением дальнейших действий убедитесь, что:

* домен зарегистрирован;
* домен направлен на IP-адрес сервера;
* DNS-записи обновлены;
* сервер доступен из сети Интернет;
* имеется доступ к FastPanel.

## Авторизация в FastPanel

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

Перейдите в панель управления FastPanel по адресу, предоставленному вашим хостинг-провайдером.&#x20;

Обычно адрес панели имеет следующий формат: `https://IP_СЕРВЕРА:8888`

*Введите логин и пароль администратора, затем нажмите кнопку **«Войти».***

***

## Создание доменов в FastPanel

На данном этапе необходимо создать два сайта:

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

{% stepper %}
{% step %}

### Основной домен

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

1. В левом меню панели управления перейдите в раздел **«Сайты».**
2. Нажмите кнопку **«Создать сайт».**
3. В появившемся окне выберите тип сайта **«PHP»**

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

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

{% hint style="info" %}
**В открывшейся форме заполните следующие поля:**

* **Какой домен подключаем?** Укажите адрес вашего основного домена (например, ваш\_домен).
* **К какому IP-адресу?** Убедитесь, что выбран правильный IP-адрес вашего сервера.
* **DNS-аккаунт:** Оставьте значение по умолчанию (как правило, это ваш провайдер, например FASTVPS).
* **Добавить www-алиас (опционально):** Включите этот пункт, если хотите, чтобы сайт был доступен также по адресу **[www.ваш\\\_домен](http://www.ваш\\_домен).**
  {% endhint %}

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

Нажмите кнопку **«Следующий шаг»**, чтобы перейти к настройке конфигурации сайта.
{% endstep %}

{% step %}

### Конфигурация сайта <a href="#page-km1fxyyqtgl240tigfug-konfiguraciya-saita" id="page-km1fxyyqtgl240tigfug-konfiguraciya-saita"></a>

На этапе конфигурации FastPanel автоматически предложит стандартные параметры, которые подходят для большинства случаев.

<figure><img src="/files/Eks3Ifz4oYgNReb1be8b" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}

## **Важно**

* На данном этапе не изменяйте настройки.
* Оставьте все параметры по умолчанию.
* В следующих шагах документации мы подробно рассмотрим и настроим необходимые параметры специально для работы обменника.
  {% endhint %}

Нажмите кнопку **«Создать сайт»** и дождитесь завершения процедуры.

<figure><img src="/files/NcmsCuzLwle97fkIr20o" alt="" width="375"><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

## Технический поддомен

Для создания поддомена повторите описанную выше процедуру:

В разделе **«Сайты»** нажмите кнопку **«Создать сайт»**.

Выберите тип сайта **«PHP».**

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

В поле домена укажите поддомен в формате: **app.**<mark style="color:$danger;">**ваш\_домен**</mark>

IP-адрес сервера и DNS-аккаунт должны совпадать с настройками основного домена.

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

Нажмите кнопку **«Следующий шаг»**, затем кнопку **«Создать сайт»**, оставив все параметры без изменений.

<figure><img src="/files/1ODB6uJA3o26x4sNNi0z" alt="" width="563"><figcaption></figcaption></figure>

После завершения создания поддомена рядом с кнопкой **«Посмотреть»** будет доступен файл конфигурации.

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

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

{% hint style="info" %}

## Важно

После создания поддомена `app.ваш_домен` обязательно скачайте файл конфигурации, расположенный рядом с кнопкой «Посмотреть».

Данный файл содержит важную информацию, которая потребуется на следующих этапах установки:

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

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

Без данных из данного файла настройка файла `.env`, подключение базы данных и выполнение части серверных команд будет невозможна.
{% endhint %}

***

## Настройка SSL-сертификатов (HTTPS)

После создания доменов необходимо настроить SSL-сертификаты для обоих сайтов.

Использование SSL обеспечивает безопасную передачу данных между пользователями и сервером, корректную работу авторизации, API, cookie, платёжных модулей и других компонентов системы.

После завершения настройки следующие адреса должны открываться по HTTPS:

```
https://ваш_домен
https://app.ваш_домен
```

{% hint style="info" %}

### Важная информация

В рамках данной инструкции используется самоподписанный SSL-сертификат, который создаётся средствами FastPanel.

Данный сертификат необходим для корректной работы HTTPS-соединения на этапе установки и дальнейшей настройки системы.

После завершения установки вы можете использовать любой удобный способ организации HTTPS и защиты трафика, включая Cloudflare, StormWall, Let’s Encrypt или другие решения.

Выбор способа защиты и выпуска публичных SSL-сертификатов остаётся на усмотрение владельца проекта и не влияет на процесс установки iEXExchanger, описанный в данной документации.
{% endhint %}

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

Перед выпуском сертификатов убедитесь, что:

* основной домен уже создан в FastPanel;
* поддомен `app.ваш_домен` уже создан в FastPanel;
* DNS-записи домена указывают на IP-адрес сервера;
* домены успешно открываются через браузер по HTTP.

Если домен был привязан к серверу недавно, может потребоваться некоторое время для обновления DNS-записей.

***

{% stepper %}
{% step %}

### SSL-сертификат для основного домена

В панели управления FastPanel перейдите в раздел **«Сайты»** и выберите основной домен.

Откройте раздел **«SSL-сертификаты».**

<figure><img src="/files/JtzQPgQvhzlKPbxqlnmK" alt="" width="563"><figcaption></figcaption></figure>

Нажмите кнопку **«Новый сертификат».**

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

В открывшемся окне выберите тип сертификата.

В рамках данной инструкции используется тип сертификата **«Самоподписанный»**.

<figure><img src="/files/eFon6N22MVqvGYbPreIc" alt="" width="563"><figcaption></figcaption></figure>

Заполните необходимые поля:

* **Email** — укажите свой почтовый адрес для получения уведомлений.
* **Длина ключа** — выберите рекомендуемое значение **2048**.
* **Основной домен** — автоматически указан ваш основной домен.
* **Срок действия** — установите рекомендуемый срок действия сертификата **365** дней.

После заполнения формы нажмите кнопку **«Сохранить».**

Дождитесь завершения процедуры выпуска сертификата.

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

После успешного создания сертификат будет автоматически привязан к основному домену.
{% endstep %}

{% step %}

### SSL-сертификат для технического поддомена

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

В разделе **«Сайты»** выберите: `app.ваш_домен`

Перейдите в раздел **«SSL-сертификаты».**

Нажмите кнопку **«Новый сертификат».**

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

В открывшемся окне выберите тип сертификата.

В рамках данной инструкции используется тип сертификата **«Самоподписанный».**

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

Заполните необходимые поля:

* **Email** — укажите свой почтовый адрес для получения уведомлений.
* **Длина ключа** — выберите рекомендуемое значение **2048**.
* **Основной домен** — автоматически указан ваш технический домен.
* **Срок действия** — установите рекомендуемый срок действия сертификата **365** дней.

После заполнения формы нажмите кнопку **«Сохранить».**

Дождитесь завершения процедуры выпуска сертификата.

<figure><img src="/files/lQOE0IlVIW6RCgXoz4ny" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


# Настройка Frontend

Frontend представляет собой клиентскую часть обменного пункта, которая будет доступна пользователям по основному домену сайта.

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

После завершения настройки Frontend должен быть доступен по адресу: `https://ваш_домен`

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

Перед выполнением данного этапа убедитесь, что:

* основной домен уже создан в FastPanel;
* SSL-сертификат для основного домена настроен;
* архив Frontend скачан из личного кабинета iEXExchanger;
* вы имеете доступ к панели управления FastPanel.

***

## Загрузка файлов Frontend

В панели управления FastPanel перейдите в раздел **«Сайты»** и выберите основной домен: `ваш_домен`&#x20;

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

Перейдите в раздел **«Файлы».**

<figure><img src="/files/MYNI8tpZiOsDqK3tgYKO" alt="" width="563"><figcaption></figcaption></figure>

Откроется корневая директория сайта.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

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

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

После завершения загрузки распакуйте архив непосредственно в корневую директорию сайта.

## Проверка структуры проекта

После распаковки в корневой директории сайта должна присутствовать директория: `dist/exchanger`

Именно она содержит готовую клиентскую часть системы и SSR-сервер Angular.

<figure><img src="/files/7kgJG3PedMGsbS7uGCS7" alt=""><figcaption></figcaption></figure>

Если после распаковки появилась дополнительная вложенная папка, перенесите содержимое архива в корень сайта.

***

## Создание файла .env

После загрузки файлов необходимо создать конфигурационный файл Frontend.

В корневой директории проекта создайте новый файл: `.env`

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

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

```dotenv
NODE_ENV=production
PORT=4000
HOST=127.0.0.1

PM2=true

SUPPORTED_LANGUAGES=ru,en
DEFAULT_LANGUAGE=ru

ALLOWED_HOSTS=ваш_домен,app.ваш_домен
API_URL=https://app.ваш_домен

CSS_VERSION=1

CUSTOM_THEME=custom-theme
CUSTOM_THEME_URL=/static/theme/custom-theme.css
```

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/Yep95n9UPE2CNtlKuOdV" %}
[Настройка языков](/help-center/administrirovanie/nastroika-yazykov)
{% endcontent-ref %}

После создания файла сохраните изменения.

### Настройка параметров

Обязательно измените следующие параметры:

{% stepper %}
{% step %}

#### ALLOWED\_HOSTS

Укажите основной домен обменного пункта.

Пример: `ALLOWED_HOSTS=example.com,app.example.com`
{% endstep %}

{% step %}

#### API\_URL

Укажите адрес технического поддомена.

Пример: `API_URL=https://app.example.com`
{% endstep %}

{% step %}

### SUPPORTED\_LANGUAGES

Список языков, доступных на сайте. Языки указываются через запятую.

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

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

Важно: язык должен существовать в самой сборке Frontend. Нельзя просто добавить язык в `.env`, если в `dist/exchanger/browser/` нет папки этого языка.
{% endstep %}
{% endstepper %}

## Создание конфигурации PM2

Для последующего запуска Frontend необходимо создать конфигурационный файл PM2.

В корневой директории проекта создайте новый файл: `ecosystem.config.cjs`

Добавьте в него следующий код:

```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,
        },
    ],
};
```

Для обычного production-сервера в FastPanel рекомендуется начинать с одного процесса:

```nginx
instances: 1
exec_mode: 'fork'
```

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

```nginx
instances: 'max'
exec_mode: 'cluster'
```

{% hint style="warning" %}
Режим `cluster` и `instances: 'max'` можно использовать только на более мощных серверах после проверки нагрузки.
{% endhint %}

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/DuHV80FzCgEAUZtTdCqx" %}
[Настройка Fork и Cluster в PM2](/help-center/upravlenie-serverom/pm2/nastroika-fork-i-cluster-v-pm2)
{% endcontent-ref %}

После добавления конфигурации нажмите кнопку **«Сохранить»**.


# Настройка Backend

Backend — это серверная часть iEXExchanger. Она отвечает за работу API, административной панели, PostgreSQL, авторизации, очередей, уведомлений, платёжных модулей и внутренних системных процессов.

Backend устанавливается на технический поддомен:

```
https://app.ваш_домен
```

На этом этапе необходимо загрузить файлы Backend и лицензии, настроить файл `.env`, подключить PostgreSQL 18, импортировать начальную базу данных, установить обязательные PHP-модули и настроить сайт в FastPanel.

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

Перед выполнением данного этапа убедитесь, что:

* технический поддомен `app.ваш_домен` уже создан в FastPanel;
* SSL-сертификат для поддомена настроен;
* архив Backend скачан из личного кабинета iEXExchanger;
* архив лицензии скачан из личного кабинета iEXExchanger;
* файл конфигурации FastPanel для поддомена сохранён;
* Frontend уже установлен и настроен;
* у вас есть доступ к панели управления FastPanel.

***

## Подготовка файлов проекта

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

{% stepper %}
{% step %}

### Загрузка файлов Backend

В панели управления FastPanel перейдите в раздел **«Сайты».**

Выберите технический поддомен: `app.ваш_домен`

Перейдите в раздел **«Файлы».**

<figure><img src="/files/qmoFUlqU5AhdLCwYrtKN" alt="" width="563"><figcaption></figcaption></figure>

Откроется корневая директория сайта.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

Загрузите архив Backend, полученный в личном кабинете iEXExchanger, используя кнопку **«Загрузить»** в верхней части файлового менеджера.

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

После завершения загрузки распакуйте архив непосредственно в корневую директорию поддомена.

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

{% step %}

### Загрузка файлов лицензии

После загрузки Backend необходимо загрузить лицензионные файлы.

В корневую директорию Backend загрузите архив лицензии.

После завершения загрузки распакуйте архив лицензии.

Не переименовывайте лицензионные файлы и не изменяйте их содержимое.
{% endstep %}

{% step %}

### Проверка структуры Backend

После распаковки в корневой директории поддомена должны присутствовать основные файлы и директории Laravel-проекта:

```
app/
bootstrap/
config/
database/
public/
resources/
routes/
storage/
vendor/
artisan
composer.json
composer.lock
.env
```

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

Особенно важно наличие директории: `public`

Именно она будет указана в FastPanel как рабочая директория сайта.

Также убедитесь, что в корне проекта присутствует файл: `artisan`

Он потребуется на следующих этапах установки для выполнения служебных команд Laravel.
{% endstep %}
{% endstepper %}

## Настройка приложения

На данном этапе производится настройка основных параметров Backend, лицензии и доменной конфигурации системы.

{% stepper %}
{% step %}

### Настройка файла .env

В корневой директории проекта найдите файл: `.env`

Откройте его для редактирования.
{% endstep %}

{% step %}

### Основные параметры приложения

Проверьте и настройте основные параметры приложения:

```
APP_NAME=iEXExchanger

APP_ENV=production
APP_DEBUG=false

APP_URL=https://app.ваш_домен

API_URL=https://app.ваш_домен
FRONTEND_URL=https://ваш_домен
```

Где:&#x20;

* **https\://**<mark style="color:red;">**ваш\_домен**</mark> — основной домен обменного пункта.
* **<https://app>.**<mark style="color:red;">**ваш\_домен**</mark> — технический поддомен Backend.
  {% endstep %}

{% step %}

### Настройка ключа лицензии

Для корректной работы системы необходимо указать лицензионный ключ в файле `.env`.

Лицензионный ключ можно получить в личном кабинете iEXExchanger.

**Получение лицензионного ключа**

1.

```
<figure><img src="/files/BbpRwpA2hGhwuhgAYaHF" alt=""><figcaption></figcaption></figure>
```

2. Авторизуйтесь в личном кабинете на официальном сайте iEXExchanger.
3. В левом меню откройте раздел **«Лицензия обменника».**
4. При первом открытии раздела подтвердите доступ с помощью Google Authenticator или резервного секретного кода.
5. В списке лицензий найдите лицензию, привязанную к вашему домену.
6. Скопируйте значение из поля **«Код лицензии».**

**Добавление ключа в .env**

Откройте файл `.env` и укажите полученный ключ: `LICENSE_KEY=ваш_лицензионный_ключ`

Пример: `LICENSE_KEY=K5044-67606-U7684-36813`
{% endstep %}

{% step %}

### Настройка пути к административной панели

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

Укажите параметр: `APP_ADMIN_PATH=ваш_путь_к_админке`

Пример: `APP_ADMIN_PATH=iexadmin`

После настройки административная панель будет доступна по адресу:&#x20;

`https://app.ваш_домен/iexadmin`

Рекомендуется использовать уникальный путь.
{% endstep %}

{% step %}

### Итоговый пример доменных настроек .env

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

```dotenv
APP_URL=https://app.ваш_домен
API_URL=https://app.ваш_домен
FRONTEND_URL=https://ваш_домен
APP_ADMIN_PATH=iexadmin
```

{% endstep %}
{% endstepper %}

## Настройка PostgreSQL

PostgreSQL 18 должен быть установлен, подключён к FastPanel и подготовлен до настройки Backend.

Если этот этап ещё не выполнен, сначала перейдите к инструкции:

{% content-ref url="/pages/nTV8YubEHpIQWlwePofG" %}
[Подключение PostgreSQL](/server-i-dannye/rabota-s-postgresql/podklyuchenie-postgresql)
{% endcontent-ref %}

В результате должны быть созданы:

* отдельная основная база PostgreSQL для iEXExchanger;
* отдельный пользователь основной базы;
* база `pulse_pg` для Laravel Pulse;
* пользователь `pulse_pg`.

Административная роль `fastuser` используется только для подключения PostgreSQL к FastPanel.

{% hint style="danger" %}
Не указывайте `fastuser` в файле `.env` и не используйте эту роль для подключения iEXExchanger. Backend и Laravel Pulse должны работать через отдельных пользователей своих баз данных.
{% endhint %}

## Настройка баз данных

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

{% stepper %}
{% step %}

### Настройка основной базы данных

Используйте реквизиты основной базы, созданной при подключении PostgreSQL 18.

Пример:

```
Сервер баз данных: PostgreSQL 18 local
Хост: 127.0.0.1
Порт: 5432
Имя базы: app_example_com_pg
Пользователь: app_example_com_pg
Пароль: пароль основной базы
```

Добавьте параметры подключения в файл `.env`:

```
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432

DB_DATABASE=app_example_com_pg
DB_USERNAME=app_example_com_pg
DB_PASSWORD="ПАРОЛЬ_ОСНОВНОЙ_БАЗЫ"
DB_SSLMODE=disable
```

{% endstep %}

{% step %}
Замените имя базы, имя пользователя и пароль реальными значениями из FastPanel.

Параметр `DB_SSLMODE=disable` используется для локального подключения, когда PostgreSQL и Backend находятся на одном сервере.

### Импорт основной базы данных&#x20;

После настройки подключения необходимо импортировать начальную структуру и системные данные iEXExchanger.

В панели управления FastPanel откройте технический поддомен: `app.ваш_домен`

В блоке **«Управление сайтом»** перейдите в раздел **«Базы данных».**

<figure><img src="/files/Y9tzFb9z0JbGgLBFmAOD" alt="" width="563"><figcaption></figcaption></figure>

В списке баз данных найдите базу, привязанную к вашему техническому поддомену.

<figure><img src="/files/6fpFH4k1vZqvE2eprb7S" alt=""><figcaption></figcaption></figure>

Справа от базы данных нажмите кнопку меню **«⋮».**&#x20;

В открывшемся меню выберите пункт: **Загрузить SQL-дамп**

После этого выберите файл базы данных из распакованного архива Backend:

`database/iex_data.sql`

Дождитесь завершения импорта.

{% hint style="warning" %}
Используйте файл `database/iex_data.sql` из того же архива Backend, который устанавливается на сервер. Не импортируйте дамп от другой версии iEXExchanger и не используйте старый дамп MySQL.
{% endhint %}
{% endstep %}

{% step %}

### Настройка базы данных Laravel Pulse

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

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

Для Pulse используется отдельная база PostgreSQL:

```
Имя базы: pulse_pg
Пользователь: pulse_pg
Порт: 5432
```

Добавьте параметры подключения в файл `.env`:

```
PULSE_DB_CONNECTION=pgsql-pulse
PULSE_DB_HOST=127.0.0.1
PULSE_DB_PORT=5432

PULSE_DB_DATABASE=pulse_pg
PULSE_DB_USERNAME=pulse_pg
PULSE_DB_PASSWORD="ПАРОЛЬ_БАЗЫ_PULSE"
PULSE_DB_SSLMODE=disable
```

Замените пароль реальным значением.

Пароль базы Pulse не должен совпадать с паролем основной базы. База `pulse_pg` также не должна использовать пользователя основной базы или административную роль `fastuser`.
{% endstep %}
{% endstepper %}

## Настройка авторизации и безопасности

На данном этапе производится настройка взаимодействия Frontend и Backend.

{% stepper %}
{% step %}

### Настройка сессий

Укажите следующие параметры:

```
SESSION_DRIVER=database
SESSION_SECURE_COOKIE=true
SESSION_DOMAIN=.ваш_домен
SESSION_COOKIE=iexexchanger_session
```

Пример: `SESSION_DOMAIN=.example.com`

Обратите внимание на точку перед доменом.

Она необходима для корректной работы авторизации между основным доменом и техническим поддоменом.
{% endstep %}

{% step %}

### Настройка CORS и Sanctum

Для корректной работы Frontend и Backend настройте следующие параметры:

```
CORS_ALLOWED_ORIGINS=https://ваш_домен,https://app.ваш_домен
CORS_SUPPORTS_CREDENTIALS=true
SANCTUM_STATEFUL_DOMAINS=https://app.ваш_домен
```

Пример:

```
CORS_ALLOWED_ORIGINS=https://example.com,https://app.example.com
CORS_SUPPORTS_CREDENTIALS=true
SANCTUM_STATEFUL_DOMAINS=https://app.example.com
```

Не используйте пробелы между доменами.
{% endstep %}

{% step %}

### Настройка Laravel Reverb

Laravel Reverb используется системой для работы WebSocket-соединений, realtime-уведомлений, онлайн-статусов и других событий в реальном времени.

Добавьте в файл `.env` следующие параметры:

```
REVERB_HOST=app.ваш_домен
REVERB_PORT=443
REVERB_SCHEME=https
```

Пример:

```
REVERB_HOST=app.example.com
REVERB_PORT=443
REVERB_SCHEME=https
```

{% endstep %}
{% endstepper %}

## Настройка окружения сервера

Для работы Backend необходимо подготовить программное окружение сервера.

{% stepper %}
{% step %}

### Установка PHP 8.4

Перейдите: **«Настройки» — «Приложения»**

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

В поиске укажите: `php84`

Найдите приложение **«PHP 8.4».**

Установите его и дождитесь завершения установки.

После установки приложение должно иметь статус: <mark style="color:green;">**Установлен**</mark>
{% endstep %}

{% step %}

### Установка Redis

Redis используется системой для кеширования, очередей и внутренних процессов.

Перейдите: **«Настройки» — «Приложения»**

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

Найдите приложение: `redis`

Установите его.

После установки сервис должен иметь статус: <mark style="color:green;">**Установлен**</mark>
{% endstep %}

{% step %}

### Установка PHP-расширений

После установки PHP 8.4 необходимо установить обязательные расширения.

Перейдите: **«Управление» — «PHP» — «Модули PHP»**

Выберите PHP 8.4.

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

Установите следующие модули:

```
gmp
imagick
redis
yaml
sodium
pdo_pgsql
pgsql
```

{% hint style="warning" %}
Модули `pdo_pgsql` и `pgsql` необходимы для подключения PHP 8.4 к PostgreSQL.
{% endhint %}

После установки убедитесь, что каждый модуль имеет статус **«Установлен».**

Проверить драйверы PostgreSQL через SSH можно командами:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```
/opt/php84/bin/php --ri pdo_pgsql
/opt/php84/bin/php --ri pgsql
```

{% endstep %}
{% endstepper %}

## Настройка сайта в FastPanel

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

{% stepper %}
{% step %}

### Настройка типа Backend и версии PHP

Перейдите: **«Сайты» — «app.ваш\_домен» — «Настройки»**

<figure><img src="/files/HKm36UztSmZjjfG1fAGa" alt="" width="563"><figcaption></figcaption></figure>

Откройте раздел: Бэкенд (PHP, обратный прокси и т.п.)

Укажите:

<figure><img src="/files/w1qxeuxVpoo9w0gbrGdA" alt="" width="563"><figcaption></figcaption></figure>

```
Тип бэкенда: PHP
Обработчик: PHP-FPM
Версия PHP: 8.4
Количество воркеров: 2
```

{% hint style="warning" %}

## Важно

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

При необходимости количество воркеров можно увеличить.

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

\
Если вы не уверены в выборе значения, оставьте рекомендуемое значение 2. Его всегда можно изменить позже в зависимости от нагрузки на проект.
{% endhint %}

Сохраните настройки.
{% endstep %}

{% step %}

### Настройка рабочей директории

В настройках сайта обязательно укажите:&#x20;

* Рабочая поддиректория: **public**
* Файл приложения: **index.php**

Это обязательная настройка для Laravel.

Если указать другую директорию, сайт может работать некорректно или раскрыть системные файлы проекта.

После внесения изменений сохраните настройки.
{% endstep %}
{% endstepper %}


# Настройка Nginx

На этом этапе необходимо настроить Nginx для совместной работы Frontend и Backend частей iEXExchanger.

Nginx принимает входящие запросы и направляет их в нужный компонент системы:

* публичные страницы — в Angular SSR;
* API-запросы — в Laravel через PHP-FPM;
* WebSocket-соединения — в Laravel Reverb;
* изображения и загруженные файлы — в публичные каталоги Backend;
* пользовательские Frontend-файлы — в каталог `/ng-custom`;
* файлы подтверждения — в отдельный каталог Backend;
* экспортируемые файлы — в каталог экспортов.

Инструкция предназначена для установки iEXExchanger через FastPanel, когда Frontend и Backend находятся на одном сервере.

{% hint style="warning" %}
Все домены, IP-адреса, имена пользователей, пути и сокеты в инструкции являются шаблонами. Перед сохранением конфигурации замените их реальными значениями проекта.
{% endhint %}

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

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

* основной домен `ваш_домен` создан в FastPanel;
* технический поддомен `app.ваш_домен` создан в FastPanel;
* SSL-сертификаты установлены для обоих доменов;
* Frontend загружен и настроен;
* Backend загружен и настроен;
* рабочей директорией Backend является каталог `public`;
* Backend работает через PHP-FPM;
* Angular SSR запускается через PM2;
* Angular SSR слушает `127.0.0.1:4000`;
* Laravel Reverb слушает `127.0.0.1:8080`;
* у вас есть доступ к FastPanel и серверу по SSH.

## Что необходимо заменить

<table data-search="false"><thead><tr><th width="350.28125">Значение</th><th>Назначение</th></tr></thead><tbody><tr><td><code>ваш_домен</code></td><td>Основной домен Frontend</td></tr><tr><td><code>www.ваш_домен</code></td><td>Дополнительный Frontend-домен</td></tr><tr><td><code>app.ваш_домен</code></td><td>Технический домен Backend</td></tr><tr><td><code>IP_СЕРВЕРА</code></td><td>Публичный IP-адрес сервера</td></tr><tr><td><code>имя_пользователя_frontend</code></td><td>Системный пользователь Frontend</td></tr><tr><td><code>имя_пользователя_backend</code></td><td>Системный пользователь Backend</td></tr><tr><td><code>/var/run/app.ваш_домен.sock</code></td><td>Сокет PHP-FPM Backend</td></tr></tbody></table>

Пример:

```
Основной домен: example.com
Backend-домен: app.example.com

Frontend-пользователь: example_com_usr
Backend-пользователь: app_example_com_usr

PHP-FPM-сокет: /var/run/app.example.com.sock
```

## Сохранение текущей конфигурации

Перед изменениями сохраните текущую конфигурацию обоих сайтов.

Для Backend откройте:

**«Сайты» — выберите `app.ваш_домен` — «Ручная настройка» — «Frontend»**

Для Frontend откройте:

**«Сайты» — выберите `ваш_домен` — «Ручная настройка» — «Frontend»**

Скопируйте обе конфигурации в отдельные файлы. Это позволит быстро вернуть предыдущую версию, если при редактировании будет допущена ошибка.

***

## Настройка Nginx для Backend

Backend работает на техническом поддомене:

```
app.ваш_домен
```

Стандартную Laravel-конфигурацию FastPanel заменять не нужно. На стороне Backend необходимо сохранить существующую обработку PHP и добавить маршруты Laravel Reverb.

{% stepper %}
{% step %}

### Открытие конфигурации Backend

В FastPanel откройте:

**«Сайты» — выберите `app.ваш_домен` — «Ручная настройка» — «Frontend»**
{% endstep %}

{% step %}

### Проверка PHP-FPM

В конфигурации найдите стандартный PHP-блок:

```nginx
location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/run/app.ваш_домен.sock;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
}
```

В реальной конфигурации FastPanel сокет будет содержать ваш Backend-домен:

```
fastcgi_pass unix:/var/run/app.example.com.sock;
```

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

```
ls -la /var/run/app.ваш_домен.sock
```

Если файла нет, проверьте настройки PHP-FPM в FastPanel.
{% endstep %}

{% step %}

### Добавление WebSocket Laravel Reverb

После PHP-блока добавьте:

```nginx
location = /app {
    return 308 /app/;
}

location ^~ /app/ {
    proxy_pass http://iex_reverb;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;

    proxy_hide_header X-Powered-By;
    proxy_buffering off;

    proxy_connect_timeout 10s;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}
```

Маршрут `/app/` используется для WebSocket-соединений.

Через него работают:

* обновления статусов заявок;
* чат заявки;
* онлайн-статусы;
* системные события;
* уведомления в реальном времени;
* обновления административной панели.
  {% endstep %}

{% step %}

### Добавление HTTP API Laravel Reverb

После блока `/app/` добавьте:

```nginx
location = /apps {
    return 308 /apps/;
}

location ^~ /apps/ {
    proxy_pass http://iex_reverb;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header Connection "";

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;

    proxy_hide_header X-Powered-By;

    proxy_connect_timeout 10s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}
```

Маршрут `/apps/` используется внутренним HTTP API Laravel Reverb.

Он не является WebSocket-соединением, поэтому для него используется:

```
proxy_set_header Connection "";
```

WebSocket-заголовки нужны только для `/app/`.
{% endstep %}

{% step %}

### Почему proxy\_pass используется без завершающего слеша

Используется:

```
proxy_pass http://iex_reverb;
```

Без завершающего `/` Nginx сохраняет исходный URI:

```
/app/...  → /app/...
/apps/... → /apps/...
```

Если добавить завершающий слеш, путь может быть изменён при проксировании.
{% endstep %}

{% step %}

### Сохранение настройки Backend

После добавления блоков нажмите **«Сохранить»**.

Проверьте конфигурацию:

```
sudo nginx -t
```

Если ошибок нет, примените изменения:

```
sudo systemctl reload nginx
```

{% endstep %}
{% endstepper %}

***

## Настройка Nginx для Frontend

Frontend работает на основном домене:

```
ваш_домен
```

На стороне Frontend необходимо удалить стандартное проксирование FastPanel через Apache и настроить:

* Angular SSR;
* Backend API;
* Laravel Reverb;
* статические файлы Backend;
* пользовательские файлы `/ng-custom`;
* файлы подтверждения;
* экспортируемые файлы;
* кеширование;
* HTTPS.

{% stepper %}
{% step %}

### Открытие конфигурации Frontend

В FastPanel откройте:

**«Сайты» — выберите `ваш_домен` — «Ручная настройка» — «Frontend»**
{% endstep %}

{% step %}

### Удаление старых правил FastPanel

В конфигурации основного домена удалите стандартное проксирование через Apache:

```nginx
location / {
    proxy_pass http://127.0.0.1:81;
    proxy_redirect http://127.0.0.1:81/ /;
    include /etc/nginx/proxy_params;
}
```

Удалите старое правило статических файлов:

```
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpeg|avi|zip|gz|bz2|rar|swf|ico|7z|doc|docx|map|ogg|otf|pdf|ttf|tif|txt|wav|webp|woff|woff2|xls|xlsx|xml)$ {
    try_files $uri $uri/ @fallback;
}
```

Удалите named location:

```nginx
location @fallback {
    proxy_pass http://127.0.0.1:81;
    proxy_redirect http://127.0.0.1:81/ /;
    include /etc/nginx/proxy_params;
}
```

Если в конфигурации остался старый API-маршрут `/apis`, удалите:

```nginx
location /apis {
    alias /var/www/имя_пользователя_backend/data/www/app.ваш_домен/public;
    try_files $uri $uri/ @apis;
}

location @apis {
    rewrite ^/apis/(.*)$ /apis/index.php?/$1 last;
}
```

В новой конфигурации используется:

```
/backend-api/
```

Удалите старые языковые правила:

```
map $http_accept_language ...
map $cookie_lang ...
location ~ ^/(ru|en) ...
```

Удалите глобальный заголовок:

```
add_header Vary "Accept-Language, Cookie" always;
```

Языки должны обрабатываться Angular SSR, а не Nginx.
{% endstep %}

{% step %}

### Основные переменные Frontend

Внутри блока `server` добавьте:

```nginx
client_max_body_size 64m;

set $backend_domain app.ваш_домен;
set $backend_public_path /var/www/имя_пользователя_backend/data/www/app.ваш_домен/public;
set $frontend_public_path /var/www/имя_пользователя_frontend/data/www/ваш_домен/public;
```

Пример:

```nginx
client_max_body_size 64m;

set $backend_domain app.example.com;
set $backend_public_path /var/www/app_example_com_usr/data/www/app.example.com/public;
set $frontend_public_path /var/www/example_com_usr/data/www/example.com/public;
```

Параметр:

```
client_max_body_size 64m;
```

разрешает принимать запросы размером до 64 МБ.

Для загрузки файлов также проверьте PHP-настройки:

```
upload_max_filesize
post_max_size
```

{% endstep %}

{% step %}

### Настройка Gzip

Найдите:

```
gzip_comp_level 1;
```

Замените на:

```
gzip_comp_level 5;
```

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

```nginx
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 1024;

gzip_types
    text/plain
    text/css
    text/xml
    application/json
    application/javascript
    application/manifest+json
    application/xml
    application/rss+xml
    image/svg+xml
    font/ttf
    font/otf
    application/vnd.ms-fontobject;
```

Уровень `5` обеспечивает хорошее сжатие без чрезмерной нагрузки на процессор.
{% endstep %}

{% step %}

### Настройка файлов подтверждения

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

Примеры:

```
https://ваш_домен/google123456.html
https://ваш_домен/verification.txt
```

Файлы должны находиться в Backend:

```
app.ваш_домен/public/site-verification-files
```

Добавьте:

```nginx
location ~* "^/(?!(?:3rdpartylicenses\.txt|favicon\.ico|hot|index\.php|ngsw\.json|project_info\.txt|robots\.txt|valuta\.xml|web\.config)$)([A-Za-z0-9][A-Za-z0-9._-]{0,127}\.(?:txt|html|htm|xml|json))$" {
    alias $backend_public_path/site-verification-files/$1;

    types {
        text/plain       txt;
        text/html        html htm;
        application/xml  xml;
        application/json json;
    }

    default_type text/plain;

    access_log off;
    log_not_found off;
}
```

Пример:

```
Файл на сервере:
app.example.com/public/site-verification-files/google123.html

Публичный адрес:
https://example.com/google123.html
```

{% endstep %}

{% step %}

### Настройка `/ng-custom/`

Каталог `/ng-custom/` содержит Frontend-файлы, которые могут изменяться без полной пересборки Angular.

Файлы находятся в:

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

Добавьте:

```nginx
location ^~ /ng-custom/ {
    alias $frontend_public_path/ng-custom/;
    try_files $uri =404;

    add_header Cache-Control "no-store, no-cache, must-revalidate";
    add_header Pragma "no-cache";
    add_header Expires "0";

    autoindex off;
    access_log off;
    log_not_found off;
}
```

Пример проверки:

```
https://ваш_домен/ng-custom/ssr-head.html
```

Длительное кеширование отключено, поскольку содержимое файла может измениться без изменения URL.
{% endstep %}

{% step %}

### Настройка Backend API

Frontend обращается к Laravel через:

```
/backend-api/
```

Пример внешнего запроса:

```
https://ваш_домен/backend-api/client-api/v1/ping
```

Laravel должен получить путь без внешнего префикса:

```
/client-api/v1/ping
```

Добавьте:

```nginx
location = /backend-api {
    return 308 /backend-api/;
}

location ^~ /backend-api/ {
    rewrite ^/backend-api/(.*)$ /$1 break;

    include /etc/nginx/fastcgi_params;

    fastcgi_param SCRIPT_FILENAME $backend_public_path/index.php;
    fastcgi_param SCRIPT_NAME     /index.php;
    fastcgi_param DOCUMENT_ROOT   $backend_public_path;
    fastcgi_param REQUEST_URI     $uri$is_args$args;
    fastcgi_param QUERY_STRING    $query_string;

    fastcgi_param HTTP_HOST        $backend_domain;
    fastcgi_param SERVER_NAME      $backend_domain;
    fastcgi_param SERVER_PORT      443;
    fastcgi_param HTTPS            on;

    fastcgi_param HTTP_AUTHORIZATION       $http_authorization;
    fastcgi_param HTTP_X_REAL_IP           $remote_addr;
    fastcgi_param HTTP_X_FORWARDED_FOR     $proxy_add_x_forwarded_for;
    fastcgi_param HTTP_X_FORWARDED_HOST    $host;
    fastcgi_param HTTP_X_FORWARDED_PROTO   $scheme;
    fastcgi_param HTTP_X_FORWARDED_PORT    $server_port;

    # Защита от HTTPoxy.
    fastcgi_param HTTP_PROXY "";

    fastcgi_hide_header X-Powered-By;

    fastcgi_buffering off;
    fastcgi_connect_timeout 10s;
    fastcgi_read_timeout 60s;
    fastcgi_send_timeout 60s;

    fastcgi_pass unix:/var/run/app.ваш_домен.sock;
}
```

Схема работы:

```
Внешний запрос:
/backend-api/client-api/v1/ping

↓ Nginx удаляет /backend-api

Laravel получает:
/client-api/v1/ping
```

API передаётся напрямую в PHP-FPM. Запрос не проходит через внешний Backend-домен и не требует отдельного HTTPS-проксирования.
{% endstep %}

{% step %}

### Публичный API `/api/v3/`

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

Префикс `/api/v3/` сохраняется:

```
/api/v3/rates → /api/v3/rates
```

Добавьте перед общим `location /`:

```nginx
location = /api/v3 {
    return 308 /api/v3/;
}

location ^~ /api/v3/ {
    include /etc/nginx/fastcgi_params;

    fastcgi_param SCRIPT_FILENAME $backend_public_path/index.php;
    fastcgi_param SCRIPT_NAME     /index.php;
    fastcgi_param DOCUMENT_ROOT   $backend_public_path;
    fastcgi_param REQUEST_URI     $request_uri;
    fastcgi_param QUERY_STRING    $query_string;

    fastcgi_param HTTP_HOST        $backend_domain;
    fastcgi_param SERVER_NAME      $backend_domain;
    fastcgi_param SERVER_PORT      443;
    fastcgi_param HTTPS            on;

    fastcgi_param HTTP_AUTHORIZATION       $http_authorization;
    fastcgi_param HTTP_X_REAL_IP           $remote_addr;
    fastcgi_param HTTP_X_FORWARDED_FOR     $proxy_add_x_forwarded_for;
    fastcgi_param HTTP_X_FORWARDED_HOST    $host;
    fastcgi_param HTTP_X_FORWARDED_PROTO   $scheme;
    fastcgi_param HTTP_X_FORWARDED_PORT    $server_port;

    fastcgi_param HTTP_PROXY "";

    fastcgi_hide_header X-Powered-By;

    fastcgi_buffering off;
    fastcgi_connect_timeout 10s;
    fastcgi_read_timeout 60s;
    fastcgi_send_timeout 60s;

    fastcgi_pass unix:/var/run/app.ваш_домен.sock;
}
```

{% hint style="info" %}
Если публичный API через основной домен не используется, не добавляйте маршрут `/api/v3/`.
{% endhint %}
{% endstep %}

{% step %}

## Настройка изображений Backend

Добавьте:

```nginx
location ^~ /images/ {
    root $backend_public_path;
    try_files $uri =404;

    add_header Cache-Control "public, max-age=31536000, immutable";

    autoindex off;
    access_log off;
    log_not_found off;
}
```

Изображения кешируются на один год при условии, что каждый новый файл получает новый URL.
{% endstep %}

{% step %}

### Настройка Laravel Storage

Добавьте:

```nginx
location ^~ /storage/ {
    root $backend_public_path;
    try_files $uri =404;

    add_header Cache-Control "public, max-age=31536000, immutable";

    autoindex off;
    access_log off;
    log_not_found off;
}
```

{% endstep %}

{% step %}

### Настройка `/dist/`

В каталоге `/dist/` могут находиться файлы с постоянными именами:

```
/dist/assets/i18n/en.json
/dist/assets/animations/loading.json
/dist/assets/icons/locale/en.svg
/dist/assets/images/avatar_default.png
```

Их содержимое может измениться без изменения URL.

Добавьте:

```nginx
location ^~ /dist/ {
    root $backend_public_path;
    try_files $uri =404;

    add_header Cache-Control "public, max-age=0, must-revalidate";

    autoindex off;
    access_log off;
    log_not_found off;
}
```

Не используйте для всего `/dist/`:

```
immutable
```

Иначе переводы, изображения и другие файлы могут не обновляться у клиентов.
{% endstep %}

{% step %}

### Настройка `/static/`

Добавьте:

```nginx
location ^~ /static/ {
    root $backend_public_path;
    try_files $uri =404;

    autoindex off;
    access_log off;
    log_not_found off;
}
```

Явная политика кеширования не задаётся, поскольку не для всех файлов подтверждена неизменяемость URL.
{% endstep %}

{% step %}

### Настройка `/exports/`

Если файлы находятся в:

```
Backend public/exports
```

добавьте:

```nginx
location ^~ /exports/ {
    root $backend_public_path;
    try_files $uri =404;

    add_header Cache-Control "no-store, no-cache, must-revalidate";
    add_header Pragma "no-cache";
    add_header Expires "0";

    autoindex off;
    access_log off;
    log_not_found off;
}
```

Если экспорты находятся в:

```
Backend public/static/exports
```

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

```nginx
location ^~ /exports/ {
    alias $backend_public_path/static/exports/;
    try_files $uri =404;

    add_header Cache-Control "no-store, no-cache, must-revalidate";
    add_header Pragma "no-cache";
    add_header Expires "0";

    autoindex off;
    access_log off;
    log_not_found off;
}
```

{% hint style="warning" %}
Проверьте фактическое расположение файлов экспорта. Не добавляйте одновременно оба варианта.
{% endhint %}
{% endstep %}
{% endstepper %}

### Настройка Laravel Reverb на Frontend

Если публичный сайт подключается к Reverb через основной домен, добавьте маршруты `/app/` и `/apps/`.

{% stepper %}
{% step %}

#### WebSocket

```nginx
location = /app {
    return 308 /app/;
}

location ^~ /app/ {
    proxy_pass http://iex_reverb;
    proxy_http_version 1.1;

    proxy_set_header Host $backend_domain;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;

    proxy_hide_header X-Powered-By;
    proxy_buffering off;

    proxy_connect_timeout 10s;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}
```

{% endstep %}

{% step %}

#### HTTP API Reverb

```nginx
location = /apps {
    return 308 /apps/;
}

location ^~ /apps/ {
    proxy_pass http://iex_reverb;
    proxy_http_version 1.1;

    proxy_set_header Host $backend_domain;
    proxy_set_header Connection "";

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;

    proxy_hide_header X-Powered-By;

    proxy_connect_timeout 10s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}
```

{% endstep %}
{% endstepper %}

### Настройка статических файлов Angular

Статические файлы Angular передаются в SSR-процесс:

```
location ~* \.(?:avif|bmp|css|eot|gif|ico|jpe?g|js|json|map|mjs|png|svg|ttf|webmanifest|webp|woff2?)$ {
    proxy_pass http://iex_frontend_ssr;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header Connection "";

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;

    proxy_connect_timeout 10s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;

    access_log off;
}
```

Nginx не переопределяет `Cache-Control` для Angular-файлов. Политику кеширования определяет SSR-сервер.

### Настройка Angular SSR

Добавьте общий маршрут:

```nginx
location / {
    proxy_pass http://iex_frontend_ssr;
    proxy_redirect off;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header Connection "";

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;

    proxy_connect_timeout 10s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}
```

Для обычных SSR-запросов не нужны:

```
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
```

WebSocket работает только через `/app/`.

Поэтому для Angular используется:

```
proxy_set_header Connection "";
```

Это позволяет Nginx повторно использовать соединения с SSR через keepalive.

### Настройка языков

Языки не настраиваются в Nginx.

Не добавляйте:

```
map $http_accept_language ...
map $cookie_lang ...
location ~ ^/(ru|en) ...
```

Если на сайте используются языки:

```
ru
en
es
fr
pl
uk
zh
ka
kk
de
```

они должны быть настроены во Frontend.

Nginx только передаёт запрос в Angular SSR:

```
location / {
    proxy_pass http://iex_frontend_ssr;
}
```

Angular SSR самостоятельно определяет язык, маршрут и необходимые редиректы.

### Cloudflare и HTTPS

Для перенаправления HTTP на HTTPS можно использовать:

```nginx
if ($scheme = http) {
    return 308 https://ваш_домен$request_uri;
}
```

Если FastPanel уже создала отдельный блок для порта `80`, используйте отдельный редирект:

```nginx
server {
    listen IP_СЕРВЕРА:80;
    server_name ваш_домен www.ваш_домен;

    return 308 https://ваш_домен$request_uri;
}
```

В этом случае в HTTPS-блоке не должно быть повторного:

```
listen IP_СЕРВЕРА:80;
```

Для Cloudflare используйте:

```
Full
```

или предпочтительно:

```
Full (strict)
```

{% hint style="danger" %}
Не используйте Cloudflare Flexible. Это приведёт к бесконечному циклу перенаправлений между Cloudflare и Nginx.
{% endhint %}

### Что не нужно добавлять

Не добавляйте:

```
BACKEND_ORIGIN_IP
```

Не добавляйте:

```
upstream iex_backend_https
```

Не используйте старый маршрут:

```
/apis
```

Не проксируйте Frontend через:

```
127.0.0.1:81
```

Не добавляйте языковые `map`-блоки.

Не добавляйте глобально:

```
add_header Vary "Accept-Language, Cookie" always;
```

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

```
0.0.0.0
```

Не добавляйте `/api/v3/`, если публичный API не используется.

***

## Полная готовая конфигурация Nginx

Ниже приведён пример полной конфигурации Nginx для основного домена Frontend.

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

* `ваш_домен`;
* `www.ваш_домен`;
* `app.ваш_домен`;
* `имя_пользователя_frontend`;
* `имя_пользователя_backend`;
* `IP_СЕРВЕРА`;
* путь к SSL-сертификату;
* путь к SSL-ключу;
* PHP-FPM socket Backend.

```nginx
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      '';
}

upstream iex_frontend_ssr {
    server 127.0.0.1:4000;
    keepalive 32;
}

upstream iex_backend_php {
    server unix:/var/run/app.ваш_домен.sock;
}

upstream iex_reverb {
    server 127.0.0.1:8080;
    keepalive 32;
}

server {
    server_name ваш_домен www.ваш_домен;

    listen IP_СЕРВЕРА:80;
    listen IP_СЕРВЕРА:443 ssl;
    http2 on;

    # Для Cloudflare должен использоваться режим Full или Full (strict).
    # В режиме Flexible такой редирект вызовет цикл перенаправлений.
    if ($scheme = http) {
        return 308 https://ваш_домен$request_uri;
    }

    server_tokens off;
    tcp_nodelay on;

    proxy_headers_hash_max_size 1024;
    proxy_headers_hash_bucket_size 128;

    ssl_certificate "/var/www/httpd-cert/ваш_сертификат.crt";
    ssl_certificate_key "/var/www/httpd-cert/ваш_сертификат.key";

    charset utf-8;

    gzip on;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types
        text/plain
        text/css
        text/xml
        application/xml
        application/json
        application/javascript
        application/manifest+json
        image/svg+xml
        image/x-icon;
    gzip_comp_level 5;
    gzip_vary on;
    gzip_min_length 256;
    gzip_buffers 16 8k;
    gzip_disable "msie6";

    set $root_path /var/www/имя_пользователя_frontend/data/www/ваш_домен;
    root $root_path;
    
    disable_symlinks if_not_owner from=$root_path;

    client_max_body_size 64m;

    set $backend_domain app.ваш_домен;
    set $backend_public_path /var/www/имя_пользователя_backend/data/www/app.ваш_домен/public;
    set $frontend_public_path /var/www/имя_пользователя_frontend/data/www/ваш_домен/public;

    location ~* "^/(?!(?:3rdpartylicenses\.txt|favicon\.ico|hot|index\.php|ngsw\.json|project_info\.txt|robots\.txt|valuta\.xml|web\.config)$)([A-Za-z0-9][A-Za-z0-9._-]{0,127}\.(?:txt|html|htm|xml|json))$" {
        alias $backend_public_path/site-verification-files/$1;

        types {
            text/plain       txt;
            text/html        html htm;
            application/xml xml;
            application/json json;
        }

        default_type text/plain;
        access_log off;
    }

    location ^~ /ng-custom/ {
        alias $frontend_public_path/ng-custom/;

        expires off;
        add_header Cache-Control "no-store, no-cache, must-revalidate";

        autoindex off;
        access_log off;
    }

    location ^~ /images/ {
        alias $backend_public_path/images/;

        add_header Cache-Control "public, max-age=31536000, immutable";

        autoindex off;
        access_log off;
    }

    location ^~ /storage/ {
        alias $backend_public_path/storage/;

        add_header Cache-Control "public, max-age=31536000, immutable";

        autoindex off;
        access_log off;
    }

    location ^~ /static/ {
        alias $backend_public_path/static/;

        autoindex off;
        access_log off;
    }

    location ^~ /dist/ {
        alias $backend_public_path/dist/;
        expires 30d;

        autoindex off;
        access_log off;
    }

    location ^~ /exports/ {
        alias $backend_public_path/static/exports/;

        # Курсы валют должны перепроверяться клиентом,
        # а не сохраняться надолго.
        expires off;
        add_header Cache-Control "no-store, no-cache, must-revalidate";

        autoindex off;
        access_log off;
    }

    location = /backend-api {
        return 308 /backend-api/;
    }

    location ~ ^/backend-api/(?<backend_api_uri>.*)$ {
        include /etc/nginx/fastcgi_params;

        fastcgi_pass iex_backend_php;
        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $backend_public_path/index.php;
        fastcgi_param DOCUMENT_ROOT $backend_public_path;
        fastcgi_param SCRIPT_NAME /index.php;

        fastcgi_param REQUEST_URI /$backend_api_uri$is_args$args;
        fastcgi_param QUERY_STRING $query_string;

        fastcgi_param HTTP_HOST $backend_domain;
        fastcgi_param SERVER_NAME $backend_domain;
        fastcgi_param SERVER_PORT 443;
        fastcgi_param HTTPS on;

        fastcgi_param HTTP_X_REAL_IP $remote_addr;
        fastcgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for;
        fastcgi_param HTTP_X_FORWARDED_HOST $host;
        fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
        fastcgi_param HTTP_X_FORWARDED_PORT $server_port;

        # Защита от HTTPoxy.
        fastcgi_param HTTP_PROXY "";

        fastcgi_hide_header X-Powered-By;

        fastcgi_buffering off;
        fastcgi_connect_timeout 10s;
        fastcgi_read_timeout 60s;
        fastcgi_send_timeout 10s;
    }

    location = /app {
        return 308 /app/;
    }

    location ^~ /app/ {
        proxy_pass http://iex_reverb;
        proxy_http_version 1.1;

        proxy_set_header Host $backend_domain;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_hide_header X-Powered-By;
        proxy_buffering off;

        proxy_connect_timeout 10s;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }


    location = /apps {
        return 308 /apps/;
    }

    location ^~ /apps/ {
        proxy_pass http://iex_reverb;
        proxy_http_version 1.1;

        proxy_set_header Host $backend_domain;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_hide_header X-Powered-By;
        proxy_buffering off;

        proxy_connect_timeout 10s;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }

    location ~* ^/(assets/|theme/|.*\.(?:js|css|map|ico|txt|xml|json|csv|pdf|webmanifest|woff|woff2|ttf|otf|svg|png|jpg|jpeg|gif|webp|avif))$ {
        proxy_pass http://iex_frontend_ssr;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;

        access_log off;
    }

    location / {
        proxy_pass http://iex_frontend_ssr;
        proxy_redirect off;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_buffering on;
        proxy_buffers 16 64k;
        proxy_buffer_size 128k;

        proxy_connect_timeout 10s;
        proxy_read_timeout 60s;
        proxy_send_timeout 10s;
    }

    include "/etc/nginx/fastpanel2-sites/имя_пользователя_frontend/ваш_домен.includes";
    include /etc/nginx/fastpanel2-includes/*.conf;

    error_log /var/www/имя_пользователя_frontend/data/logs/ваш_домен-frontend.error.log;
    access_log /var/www/имя_пользователя_frontend/data/logs/ваш_домен-frontend.access.log fastpanel;
}
```

{% hint style="info" %}
Не добавляйте `BACKEND_ORIGIN_IP`, `upstream iex_backend_https`, языковые `map`-блоки и старый путь `/apis`. В этой версии Backend API работает через PHP-FPM socket и путь `/backend-api/`.
{% endhint %}

## Коротко

Настройка выполняется отдельно для двух сайтов.

На Backend-домене сохраняется стандартная Laravel-конфигурация FastPanel и добавляются маршруты Laravel Reverb:

```
/app/
/apps/
```

На Frontend-домене настраиваются:

```
Angular SSR
/backend-api/
/images/
/storage/
/dist/
/static/
/exports/
/ng-custom/
/app/
/apps/
```

После настройки публичный сайт работает через Angular SSR на порту `4000`, Laravel API подключается напрямую через PHP-FPM, а события реального времени передаются в Reverb на порту `8080`.

* языки обрабатывает Angular SSR, а не Nginx.


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

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

В результате будут настроены:

* PHP 8.4 для CLI
* ionCube Loader
* расширение uv
* Redis
* Supervisor
* Node.js 24
* PM2
* системные лимиты сервера
* права доступа к файлам
* Laravel Reverb
* Laravel Horizon
* Laravel Pulse
* Laravel Queue Worker

После завершения данного этапа сервер будет полностью готов к запуску Backend и Frontend частей системы.

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

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

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

* установлен Debian 12;
* установлен FastPanel;
* создан основной домен;
* создан технический поддомен Backend;
* установлен PHP 8.4 через FastPanel;
* имеется SSH-доступ к серверу.

Проверьте наличие PHP 8.4:

```shellscript
/opt/php84/bin/php -v
```

Если PHP 8.4 отсутствует, сначала установите его через FastPanel.

{% hint style="danger" %}
Все системные команды в первой части инструкции необходимо выполнять от имени пользователя `root`.

Для перехода в root используйте: `sudo -i` или `su -l root`
{% endhint %}

***

## Что нужно заменить в командах

Перед выполнением команд замените шаблонные значения на свои.

| Значение                    | Что указать                             |
| --------------------------- | --------------------------------------- |
| `имя_пользователя_backend`  | пользователь Backend-сайта в FastPanel  |
| `имя_пользователя_frontend` | пользователь Frontend-сайта в FastPanel |
| `app.ваш_домен`             | технический поддомен Backend            |
| `ваш_домен`                 | основной домен Frontend                 |
| `/var/www/...`              | реальные пути к проектам на сервере     |

Пример:

```
Backend:
пользователь: app_example_com_usr
путь: /var/www/app_example_com_usr/data/www/app.example.com

Frontend:
пользователь: example_com_usr
путь: /var/www/example_com_usr/data/www/example.com
```

## Шаг 1. Установка системных компонентов

Выполните:

```shellscript
if ! command -v sudo >/dev/null 2>&1; then
    apt update -y
    apt install -y sudo
fi

apt update -y
apt upgrade -y

apt install -y \
curl \
ca-certificates \
gnupg \
git \
lsb-release \
openssl \
unzip \
redis-server \
supervisor \
build-essential \
pkg-config \
autoconf \
automake \
libtool \
re2c \
libevent-dev \
libuv1-dev
```

Активируйте службы:

```shellscript
systemctl enable redis-server
systemctl enable supervisor

systemctl start redis-server
systemctl start supervisor
```

Проверка:

```shellscript
systemctl status redis-server --no-pager
systemctl status supervisor --no-pager
```

## Шаг 2. Настройка PHP 8.4 для CLI

FastPanel использует собственную сборку PHP.

Сделаем PHP 8.4 основной версией для терминала:

```shellscript
if [ ! -x /opt/php84/bin/php ]; then
    echo "PHP 8.4 не найден."
    exit 1
fi

update-alternatives \
--install /usr/bin/php php /opt/php84/bin/php 84

update-alternatives \
--set php /opt/php84/bin/php

php -v
```

Результат: **PHP 8.4.x**

## Шаг 3. Установка ionCube Loader

* Loader подключаем первым через файл: `/opt/php84/conf.d/00-ioncube.ini`
* Скачивание: **IPv4 + fallback ZIP**, если tar.gz не скачался.

Выполните:

```shellscript
sudo mkdir -p /usr/local/src
cd /usr/local/src
sudo rm -rf ioncube >/dev/null 2>&1 || true
sudo rm -f ioncube_loaders_lin_x86-64.tar.gz ioncube_loaders_lin_x86-64.zip >/dev/null 2>&1 || true

IONCUBE_TAR_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz"
IONCUBE_ZIP_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.zip"
IONCUBE_DST_DIR="/usr/local/ioncube"
IONCUBE_SO="$IONCUBE_DST_DIR/ioncube_loader_lin_8.4.so"
IONCUBE_INI="/opt/php84/conf.d/00-ioncube.ini"

download_ok=0
curl -4 -fSL "$IONCUBE_TAR_URL" --connect-timeout 10 --max-time 600 --retry 5 --retry-delay 2 \
  -o ioncube_loaders_lin_x86-64.tar.gz && download_ok=1 || download_ok=0

if [ "$download_ok" -eq 1 ] && [ -s ioncube_loaders_lin_x86-64.tar.gz ]; then
  sudo tar -xzf ioncube_loaders_lin_x86-64.tar.gz
else
  curl -4 -fSL "$IONCUBE_ZIP_URL" --connect-timeout 10 --max-time 600 --retry 5 --retry-delay 2 \
    -o ioncube_loaders_lin_x86-64.zip

  if [ ! -s ioncube_loaders_lin_x86-64.zip ]; then
    echo "Ошибка: ionCube zip не скачался или пустой."
    exit 1
  fi

  sudo unzip -o ioncube_loaders_lin_x86-64.zip -d /usr/local/src >/dev/null
fi

if [ ! -f "/usr/local/src/ioncube/ioncube_loader_lin_8.4.so" ]; then
  echo "Ошибка: не найден /usr/local/src/ioncube/ioncube_loader_lin_8.4.so"
  exit 1
fi

sudo mkdir -p "$IONCUBE_DST_DIR"
sudo cp -f "/usr/local/src/ioncube/ioncube_loader_lin_8.4.so" "$IONCUBE_SO"

echo "zend_extension=$IONCUBE_SO" | sudo tee "$IONCUBE_INI" >/dev/null

# Если в php-cli.ini было старое подключение — комментируем
if [ -f /opt/php84/etc/php-cli.ini ]; then
  sudo sed -i 's/^\s*zend_extension\s*=.*ioncube.*$/; &/i' /opt/php84/etc/php-cli.ini || true
  sudo sed -i 's/^\s*zend_extension_ts\s*=.*ioncube.*$/; &/i' /opt/php84/etc/php-cli.ini || true
fi

php -v | grep -i "ionCube" || true
```

Проверка: `php -v`

Должно отображаться: `with the ionCube PHP Loader`

## Шаг 4. Установка расширения uv

* Мы ставим uv не в системный PHP, а в FastPanel PHP 8.4 (/opt/php84).
* Для работы uv требуется расширение FFI (это обязательная зависимость).

  Если FFI не загружен, uv не запустится — будет ошибка инициализации/загрузки расширения из-за отсутствия ffi (вроде “FFI disabled” / “undefined symbol” / “failed to load”).

Выполните:

```shellscript
PHP84_BIN="/opt/php84/bin/php"
PHP84_PECL="/opt/php84/bin/pecl"
PHP84_PHPIZE="/opt/php84/bin/phpize"
PHP84_PHP_CONFIG="/opt/php84/bin/php-config"
UV_INI="/opt/php84/conf.d/20-uv.ini"

if [ ! -x "$PHP84_PECL" ] || [ ! -x "$PHP84_PHPIZE" ] || [ ! -x "$PHP84_PHP_CONFIG" ]; then
  exit 1
fi

sudo apt update -y
sudo apt install -y build-essential pkg-config autoconf automake libtool re2c libuv1-dev

export PHP_PEAR_PHP_BIN="$PHP84_BIN"
export PHP_PEAR_PHPIZE_BIN="$PHP84_PHPIZE"
export PHP_PEAR_PHP_CONFIG_BIN="$PHP84_PHP_CONFIG"
export PHPIZE="$PHP84_PHPIZE"
export PHP_CONFIG="$PHP84_PHP_CONFIG"

"$PHP84_PECL" channel-update pecl.php.net || true

# uv сейчас только beta, ставим конкретно указанную версию
printf "\n" | "$PHP84_PECL" install channel://pecl.php.net/uv-0.3.0

echo "extension=uv.so" > "$UV_INI"
```

## Шаг 5. Настройка лимитов системы

Откройте: `nano /etc/security/limits.conf`

Добавьте:

```shellscript
www-data soft nofile 10000
www-data hard nofile 10000

имя_пользователя_backend soft nofile 10000
имя_пользователя_backend hard nofile 10000

имя_пользователя_frontend soft nofile 10000
имя_пользователя_frontend hard nofile 10000
```

## Шаг 6. Настройка Nginx

Откройте: `nano /etc/nginx/nginx.conf`

Найдите:

```shellscript
events {
    worker_connections 1024;
}
```

Замените:

```shellscript
worker_rlimit_nofile 10000;

events {
    worker_connections 10000;
    multi_accept on;
}
```

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

Проверка: `nginx -t`

Применение: `systemctl restart nginx`

## Шаг 7. Настройка Supervisor

Откройте: `nano /etc/supervisor/supervisord.conf`

После блока: `[supervisord]`

Добавьте:

```shellscript
minfds=10000
```

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

Перезапустите Supervisor: `systemctl restart supervisor`

## Шаг 8. Настройка автоматического запуска Backend-процессов

Для стабильной работы iEXExchanger необходимо настроить автоматический запуск фоновых процессов Laravel.

На данном этапе будет создана конфигурация Supervisor для следующих сервисов:

* Horizon
* Queue Worker
* Pulse Work
* Pulse Check
* Reverb

Создайте файл: `nano setup_supervisor_processes.sh`

Перед вставкой скрипта замените следующие значения на свои:

<table><thead><tr><th width="225.31640625">Параметр</th><th>Описание</th></tr></thead><tbody><tr><td>PROJECT_PATH</td><td>путь к Backend-проекту</td></tr><tr><td>PHP_PATH</td><td>путь к PHP 8.4</td></tr><tr><td>USER</td><td>пользователь Backend-сайта</td></tr><tr><td>DOMAIN</td><td>технический домен Backend</td></tr></tbody></table>

Пример:

```shellscript
PROJECT_PATH=/var/www/app_example_com_usr/data/www/app.example.com
PHP_PATH=/opt/php84/bin/php
USER=app_example_com_usr
DOMAIN=app.example.com
```

Вставьте следующий скрипт:

```shellscript
#!/bin/bash
set -e

PROJECT_PATH="/var/www/имя_пользователя_backend/data/www/app.ваш_домен"
PHP_PATH="/opt/php84/bin/php"
USER="имя_пользователя_backend"
DOMAIN="app.ваш_домен"

SUPERVISOR_CONF_PATH="/etc/supervisor/conf.d/iex.conf"

sudo tee "$SUPERVISOR_CONF_PATH" >/dev/null <<EOF
[program:horizon]
command=$PHP_PATH $PROJECT_PATH/artisan horizon
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-horizon.log
stopwaitsecs=3600

[program:laravel-worker]
command=$PHP_PATH $PROJECT_PATH/artisan queue:work --delay=1 --sleep=1 --timeout=1800 --tries=3 --queue=high,low
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-worker.log
stopwaitsecs=3600

[program:laravel-pulsework]
command=$PHP_PATH $PROJECT_PATH/artisan pulse:work
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-pulse-work.log
stopwaitsecs=3600

[program:laravel-pulsecheck]
command=$PHP_PATH $PROJECT_PATH/artisan pulse:check
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-pulse-check.log
stopwaitsecs=3600

[program:laravel-reverb]
command=$PHP_PATH $PROJECT_PATH/artisan reverb:start --hostname="$DOMAIN"
directory=$PROJECT_PATH
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=$PROJECT_PATH/storage/logs/iex-reverb.log
stopwaitsecs=3600
EOF

sudo supervisorctl reread
sudo supervisorctl update

echo "Конфигурация Supervisor успешно создана."
```

Сделайте файл исполняемым:

```shellscript
chmod +x setup_supervisor_processes.sh
```

Запустите его:

```shellscript
sudo ./setup_supervisor_processes.sh
```

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

```shellscript
sudo supervisorctl status
```

После запуска все процессы должны иметь статус: **RUNNING**

## Шаг 9. Установка Node.js 24

Выполните:

```shellscript
curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
apt install -y nodejs
```

Проверка:

```shellscript
node -v
npm -v
```

Результат: **v24.x.x**

## Шаг 10. Установка PM2

Установка:

```shellscript
npm install -g npm@latest
npm install -g pm2@latest
```

Проверка: `pm2 -v`

## Шаг 11. Настройка PM2

Переключитесь на пользователя Frontend:

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

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

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

Создайте каталог логов:

```shellscript
mkdir -p logs
```

Запуск:

```shellscript
pm2 start ecosystem.config.cjs
pm2 save
```

Проверка:&#x20;

```shellscript
pm2 status
```

Статус: **online**

## Шаг 12. Настройка автозапуска PM2

Вернитесь в root:

```shellscript
exit
```

Выполните:

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

Снова перейдите под пользователя Frontend:

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

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

```shellscript
pm2 save
```

## Шаг 13. Настройка прав доступа

Backend:

```shellscript
chown -R имя_пользователя_backend:имя_пользователя_backend \
/var/www/имя_пользователя_backend/data/www/app.ваш_домен
```

Frontend:

```shellscript
chown -R имя_пользователя_frontend:имя_пользователя_frontend \
/var/www/имя_пользователя_frontend/data/www/ваш_домен
```

Laravel:

```shellscript
chmod -R ug+rwX \
/var/www/имя_пользователя_backend/data/www/app.ваш_домен/storage

chmod -R ug+rwX \
/var/www/имя_пользователя_backend/data/www/app.ваш_домен/bootstrap/cache
```

## Шаг 14. Финальная настройка Laravel

Перейдите под пользователя Backend:

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

Откройте проект:

```shellscript
cd /var/www/имя_пользователя_backend/data/www/app.ваш_домен
```

Выполните:

```shellscript
php artisan product-updates:run
php artisan key:generate
php artisan reverb:install
```

Если команда:

```shellscript
php artisan product-updates:run
```

завершилась ошибкой, выполните её повторно.

## Шаг 15. Создание пароля администратора

После завершения установки необходимо создать пароль для входа в административную панель.

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

* вы находитесь под пользователем Backend-проекта;
* открыта директория Backend-проекта.

Если вы ещё не переключились на пользователя Backend, выполните:

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

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

```shellscript
cd /var/www/имя_пользователя_backend/data/www/app.ваш_домен
```

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

```shellscript
NEW_PASS="$(openssl rand -base64 24 | tr -d '\n' | tr '/+' 'Aa' | cut -c1-16)"
php artisan iex:resetpass --pass="$NEW_PASS"
```

После успешного выполнения команды в терминале будет отображён новый пароль администратора.

```
───────────────────────────────
Почта: user@iexexchanger.com
Новый пароль: A7dK92sLmQpX4zR1
Путь к админке: /iexadmin
Админка: https://app.ваш_домен/iexadmin
───────────────────────────────
```

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

* Supervisor: `supervisorctl status`
* PM2: `pm2 status`
* PHP: `php -v`
* Node.js: `node -v`
* Nginx: `nginx -t`

***

#### <mark style="color:green;">**Установка завершена**</mark>


# Обновление

Подробная инструкция по обновлению скрипта iEXExchanger


# Обновление с 11.3 на 11.4

Эта инструкция описывает полный процесс обновления iEXExchanger с версии 11.3 до версии 11.4.

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

{% hint style="warning" %}
Для версии 11.4 проект должен работать с PostgreSQL 18. Если проект всё ещё использует MySQL или MariaDB, сначала выполните миграцию базы данных и только после этого запускайте Product Updates для версии 11.4.
{% endhint %}

## Проверка базы данных перед обновлением

Начиная с версии 11.3 основной базой данных iEXExchanger является PostgreSQL 18.

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

<table><thead><tr><th width="191.87890625">Текущая база</th><th>Что делать</th><th>Обновление до 11.4</th></tr></thead><tbody><tr><td><strong>PostgreSQL 18</strong></td><td>Дополнительная миграция не требуется</td><td>Можно продолжать обновление</td></tr><tr><td><strong>MySQL / MariaDB</strong></td><td>Сначала выполнить миграцию на PostgreSQL 18</td><td>Product Updates пока не запускать</td></tr></tbody></table>

{% stepper %}
{% step %}

### Если проект уже работает на PostgreSQL 18

Если миграция была выполнена при обновлении до версии 11.3 и проект уже работает с PostgreSQL 18, повторно переносить данные не требуется.

Продолжайте обновление по этой инструкции.
{% endstep %}

{% step %}

### Если проект всё ещё работает на MySQL или MariaDB

Если проект продолжает использовать MySQL или MariaDB, миграция, предусмотренная при переходе на 11.3, не была завершена.

Для переноса используйте инструкцию миграции MySQL/MariaDB на PostgreSQL 18, предусмотренную для обновления до версии 11.3.

{% content-ref url="/pages/SGowonUzPp28JJfZQj0e" %}
[Обновление с 11.2 на 11.3](/ustanovka-i-obnovlenie/obnovlenie/obnovlenie-s-11.2-na-11.3)
{% endcontent-ref %}

{% hint style="danger" %}
Не запускайте `php artisan product-updates:run --to=11.4`, пока миграция на PostgreSQL 18 не завершена и перенесённые данные не прошли проверку.

Не запускайте Product Updates для пустой PostgreSQL-базы. Миграция данных и Product Updates — разные этапы.
{% endhint %}

Исходную MySQL или MariaDB после переноса не удаляйте. Сохраните её для контрольной проверки и возможного возврата до начала записи новых данных в PostgreSQL.
{% endstep %}
{% endstepper %}

***

## Резервное копирование

Перед обновлением обязательно создайте резервную копию файлов Frontend, Backend и используемой базы данных.

Резервная копия потребуется, если во время обновления возникнет ошибка или понадобится вернуть проект в предыдущее состояние.

{% stepper %}
{% step %}

### Резервная копия файлов

В FastPanel откройте файловый менеджер и найдите директории Frontend и Backend вашего проекта.

Создайте архивы текущих файлов и сохраните их вне рабочего каталога проекта. По возможности храните копию также вне самого сервера.

Особенно важно сохранить пользовательские файлы и текущую конфигурацию проекта.
{% endstep %}

{% step %}

### Резервная копия базы данных

Если проект уже работает на PostgreSQL 18, создайте резервную копию текущей PostgreSQL-базы.

Если проект всё ещё использует MySQL или MariaDB и перед обновлением будет выполняться миграция, сохраните исходную базу до начала переноса.

{% hint style="danger" %}
Не начинайте обновление без актуальной резервной копии файлов и базы данных.

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

Если вы не уверены, что резервное копирование выполнено правильно, сначала уточните процедуру у технической поддержки вашего хостинг-провайдера.
{% endstep %}
{% endstepper %}

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/OfLcDFWH4NaDvTwPEkDD" %}
[Как создать резервную копию в FastPanel](/help-center/administrirovanie/obsluzhivanie/kak-sozdat-rezervnuyu-kopiyu-v-fastpanel)
{% endcontent-ref %}

***

## Перевод сайта в режим обслуживания

Перед началом обновления необходимо временно остановить работу обменного пункта.

Для этого в административной панели активируйте режим обслуживания.

Это позволит:

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

После завершения обновления режим обслуживания можно будет отключить.

<figure><img src="/files/ikieHw6BWLMm12gUYYBi" alt="" width="563"><figcaption></figcaption></figure>

## Подготовка файлов к обновлению

Перед загрузкой новой версии необходимо удалить часть файлов текущей установки.

Данная процедура позволяет избежать конфликтов между файлами предыдущего и нового релиза.

{% stepper %}
{% step %}

### Очистка Frontend

Перейдите в директорию основного сайта.

Пример: `ваш_домен`&#x20;

Удалите следующие папки:

```
dist
logs
```

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

**Назначение папок**

<table><thead><tr><th width="170.765625">Папка</th><th>Назначение</th></tr></thead><tbody><tr><td>dist</td><td>Скомпилированная версия Frontend</td></tr><tr><td>logs</td><td>Журналы работы Frontend</td></tr></tbody></table>

После обновления данные директории будут автоматически созданы заново.
{% endstep %}

{% step %}

### Очистка Backend

Перейдите в директорию Backend.

Пример: `app.ваш_домен`&#x20;

Удалите следующие папки:

```
app
bootstrap
config
database
packages
resources
routes
vendor
```

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

{% hint style="info" %}

#### Важно

Перед удалением обязательно убедитесь, что вы находитесь именно в директории Backend.

Удаление файлов в неправильной директории может привести к повреждению проекта.
{% endhint %}
{% endstep %}

{% step %}

### Не удаляйте следующие папки

<mark style="color:red;">**Никогда не удаляйте:**</mark>

```
public
storage
```

В данных директориях хранятся:

* пользовательские изображения;
* загруженные файлы;
* документы;
* экспортированные данные;
* служебные файлы системы;
* пользовательский контент.

<mark style="color:red;">**Удаление этих папок может привести к потере данных.**</mark>
{% endstep %}
{% endstepper %}

{% hint style="danger" %}

### Важно

Не забудьте скачать файлы лицензии.

Они обязательны для полной установки обновления. После загрузки и распаковки архивов обновления необходимо также загрузить файлы лицензии в папку backend.

Без файлов лицензии обновление может быть установлено не полностью или работать некорректно.
{% endhint %}

{% content-ref url="/pages/hSsHgydQTzax5c06kVsd" %}
[Файлы лицензии и релизы](/nachalo-raboty/faily-licenzii-i-relizy)
{% endcontent-ref %}

***

## Загрузка файлов обновления

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

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Каждый архив предназначен для своей части системы.

{% stepper %}
{% step %}

### Архив Frontend

Загрузите: `iexexchanger_frontend_update.zip`&#x20;

в директорию основного сайта: `ваш_домен`
{% endstep %}

{% step %}

### Архив Backend

Загрузите: `iexexchanger_backend_update.zip`&#x20;

в директорию Backend: `app.ваш_домен`
{% endstep %}

{% step %}

### Способы загрузки

Вы можете использовать:

* FastPanel;
* FileZilla;
* WinSCP;
* SFTP;
* SCP.

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

Использование пользователя root не рекомендуется.
{% endstep %}

{% step %}

### Распаковка архивов

После загрузки архивов:

1. Найдите архив в нужной директории.
2. Выполните распаковку.
3. Подтвердите замену существующих файлов, если система запросит подтверждение.

Замена файлов является стандартной частью процесса обновления.
{% endstep %}

{% step %}

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

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

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

После завершения данного этапа можно переходить к установке обновления.
{% endstep %}
{% endstepper %}

## Миграция на PostgreSQL 18

Этот этап выполняется **только для проектов, которые всё ещё работают на MySQL или MariaDB**.

Если проект уже использует PostgreSQL 18 после обновления до версии 11.3, пропустите этот раздел.

Выполните миграцию по инструкции перехода на PostgreSQL 18 для версии 11.3.

{% content-ref url="/pages/SGowonUzPp28JJfZQj0e" %}
[Обновление с 11.2 на 11.3](/ustanovka-i-obnovlenie/obnovlenie/obnovlenie-s-11.2-na-11.3)
{% endcontent-ref %}

Только после этого переходите к Product Updates версии 11.4.

{% hint style="danger" %}
Product Updates не переносит данные из MySQL или MariaDB в PostgreSQL автоматически.

Не запускайте обновление 11.4 для пустой PostgreSQL-базы в расчёте на автоматическую миграцию.
{% endhint %}

## Применение обновления

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

Если вы ранее не работали с SSH, воспользуйтесь отдельной инструкцией по подключению к серверу.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

{% stepper %}
{% step %}

### Переход в директорию Backend

Подключитесь к серверу и выполните команду:

```
cd www/app.ваш_домен
```

или

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

Используйте фактический путь вашего проекта.
{% endstep %}

{% step %}

### Выполнение команд обновления

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

**Установка обновления**

```
php artisan product-updates:run --to=11.4
```

Применяет все изменения новой версии системы.

Выполняет обновление файловых источников курсов.
{% endstep %}

{% step %}

### Проверка Product Updates и PostgreSQL

После успешного выполнения проверьте состояние последних обновлений:

```
php artisan product-updates:status --limit=5
```

Проверьте подключение Laravel к PostgreSQL:

```
php artisan db:show --database=pgsql
```

Команды должны завершиться без ошибок подключения к базе данных.
{% endstep %}

{% step %}

### Если команда завершилась с ошибкой

Ошибка может быть связана с:

* незавершённой миграцией на PostgreSQL;
* неправильными правами на файлы проекта;
* недостатком свободного места;
* отсутствием PHP-модулей `pdo_pgsql` или `pgsql`;
* недоступностью PostgreSQL;
* параллельно работающим процессом обновления.

В этом случае:

1. Сохраните полный текст ошибки.
2. Проверьте результат миграции и команды `verify`.
3. Устраните найденную причину.
4. Повторно выполните предварительную проверку.
5. После успешной проверки снова запустите обновление до 11.4.
   {% endstep %}
   {% endstepper %}

## Завершение обновления

После успешного выполнения всех команд рекомендуется выполнить финальные действия.

{% stepper %}
{% step %}

### Удаление архивов обновления

Удалите ранее загруженные архивы:

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Это позволит избежать случайного использования устаревших файлов в будущем.
{% endstep %}

{% step %}

### Перезагрузка сервера

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

Через SSH: `reboot`

или воспользуйтесь инструментами вашей панели управления.
{% endstep %}
{% endstepper %}

## Проверка и обновление конфигурации Nginx

Перед финальной проверкой сайта обязательно изучите актуальную инструкцию по настройке Frontend Nginx и внесите необходимые изменения в конфигурацию.

В версии 11.4 изменилась схема работы Nginx, поэтому старая конфигурация может работать некорректно.

Перейдите по ссылке на актуальную инструкцию:

{% content-ref url="/pages/E9WKesM7XwCwE0IsKTAh" %}
[Настройка Nginx](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-nginx)
{% endcontent-ref %}

Внимательно проверьте конфигурацию и приведите её к актуальной версии.

Особое внимание уделите:

* настройке проксирования Frontend на Angular SSR;
* отсутствию старых языковых редиректов в Nginx.

После внесения изменений сохраните конфигурацию, проверьте её корректность и перезапустите Nginx.

Только после этого переходите к проверке работы сайта.

## Если сайт не открывается после обновления

Наиболее распространённая причина — не был автоматически запущен Frontend через PM2 после перезагрузки сервера.

Проверьте состояние процессов:&#x20;

```
pm2 list
```

Если процесс отсутствует или находится в состоянии ошибки, воспользуйтесь инструкцией:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/0yytVCNPTqBInGY7hcgi" %}
[Как переустановить PM2?](/help-center/upravlenie-serverom/pm2/kak-pereustanovit-pm2)
{% endcontent-ref %}

## Перезагрузка сервера

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

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

{% stepper %}
{% step %}

### Через SSH

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Авторизуйтесь на сервере под пользователем root и выполните команду:

```bash
reboot
```

{% endstep %}

{% step %}

### Через FastPanel

Перейдите в раздел **«Настройки» → «Основное»** и нажмите **«Перезагрузить сервер»**.

После завершения перезагрузки дождитесь запуска всех сервисов и только затем переходите к проверке работоспособности сайта.
{% endstep %}
{% endstepper %}

## Возврат обменного пункта в работу

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

После проверки:

1. Отключите режим обслуживания.
2. Если перед миграцией или обновлением отдельно останавливались очереди, планировщики или другие процессы, верните их в работу.
3. Откройте клиентский сайт.
4. Проверьте возможность создания новой заявки.

Обновление можно считать завершённым, если Frontend и Backend доступны, приложение подключается к PostgreSQL, необходимые серверные процессы работают, а обменный пункт снова принимает новые заявки.

Если проект был переведён на PostgreSQL 18 ещё при обновлении до версии 11.3, повторная миграция при переходе на 11.4 не выполняется. Миграционный этап нужен только проектам, которые перед обновлением всё ещё используют MySQL или MariaDB.


# Обновление с 11.2 на 11.3

Данная инструкция описывает полный процесс обновления платформы iEXExchanger с версии 11.2 до версии 11.3.

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

{% hint style="danger" %}

### Важное изменение базы данных

В версии 11.3 основная база iEXExchanger переводится с MySQL на PostgreSQL 18. Это обязательная часть обновления.

После загрузки файлов Backend 11.3 сначала выполните миграцию базы и отдельную проверку перенесённых данных. Не запускайте Product Updates для пустой PostgreSQL-базы до успешного завершения миграции и команды `verify`.

Не удаляйте исходную MySQL-базу после переноса. Она потребуется для контрольной проверки и возможного возврата проекта до начала записи новых данных в PostgreSQL.
{% endhint %}

{% content-ref url="/pages/nTV8YubEHpIQWlwePofG" %}
[Подключение PostgreSQL](/server-i-dannye/rabota-s-postgresql/podklyuchenie-postgresql)
{% endcontent-ref %}

{% content-ref url="/pages/ikFROc848cbeBrh2d2Lw" %}
[Миграция с MySQL на PostgreSQL](/server-i-dannye/rabota-s-postgresql/migraciya-s-mysql-na-postgresql)
{% endcontent-ref %}

***

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/OfLcDFWH4NaDvTwPEkDD" %}
[Как создать резервную копию в FastPanel](/help-center/administrirovanie/obsluzhivanie/kak-sozdat-rezervnuyu-kopiyu-v-fastpanel)
{% endcontent-ref %}

{% hint style="warning" %}
Резервная копия, созданная через FastPanel, не отменяет резервное копирование, предусмотренное инструкцией миграции. Перед переносом базы выполните все проверки и действия из документа «Миграция с MySQL на PostgreSQL».
{% endhint %}

***

{% hint style="info" %}

## Важно

В данной версии изменена схема работы Nginx. После установки обновления необходимо внести изменения в конфигурацию Nginx согласно актуальной документации.
{% endhint %}

{% content-ref url="/pages/E9WKesM7XwCwE0IsKTAh" %}
[Настройка Nginx](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-nginx)
{% endcontent-ref %}

## Подготовка PostgreSQL 18

PostgreSQL 18 необходимо установить и подключить до остановки обменного пункта, чтобы сократить время обслуживания.

{% content-ref url="/pages/nTV8YubEHpIQWlwePofG" %}
[Подключение PostgreSQL](/server-i-dannye/rabota-s-postgresql/podklyuchenie-postgresql)
{% endcontent-ref %}

В результате должны быть подготовлены:

* установленный и работающий PostgreSQL 18;
* сервер PostgreSQL со статусом **«Доступен»** в FastPanel;
* модули `pdo_pgsql` и `pgsql` для PHP 8.4;
* пустая основная PostgreSQL-база и отдельный пользователь;
* пустая база Laravel Pulse и пользователь `pulse_pg`, если Pulse используется.

{% content-ref url="/pages/3RKaGEU975nGFcsuyLQ0" %}
[Настройка Backend](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-backend)
{% endcontent-ref %}

{% hint style="danger" %}
PostgreSQL-базы должны оставаться пустыми до запуска `iEX DB Migrator`.

Не импортируйте в них SQL-дампы, не запускайте Product Updates.
{% endhint %}

## Перевод сайта в режим обслуживания

Перед началом обновления необходимо временно остановить работу обменного пункта.

Для этого в административной панели активируйте режим обслуживания.

Это позволит:

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

После завершения обновления режим обслуживания можно будет отключить.

<figure><img src="/files/ikieHw6BWLMm12gUYYBi" alt="" width="563"><figcaption></figcaption></figure>

## Подготовка файлов к обновлению

Перед загрузкой новой версии необходимо удалить часть файлов текущей установки.

Данная процедура позволяет избежать конфликтов между файлами предыдущего и нового релиза.

{% stepper %}
{% step %}

### Очистка Frontend

Перейдите в директорию основного сайта.

Пример: `ваш_домен`&#x20;

Удалите следующие папки:

```
dist
logs
```

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

**Назначение папок**

<table><thead><tr><th width="170.765625">Папка</th><th>Назначение</th></tr></thead><tbody><tr><td>dist</td><td>Скомпилированная версия Frontend</td></tr><tr><td>logs</td><td>Журналы работы Frontend</td></tr></tbody></table>

После обновления данные директории будут автоматически созданы заново.
{% endstep %}

{% step %}

### Очистка Backend

Перейдите в директорию Backend.

Пример: `app.ваш_домен`&#x20;

Удалите следующие папки:

```
app
bootstrap
config
database
packages
resources
routes
vendor
```

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

{% hint style="info" %}

#### Важно

Перед удалением обязательно убедитесь, что вы находитесь именно в директории Backend.

Удаление файлов в неправильной директории может привести к повреждению проекта.
{% endhint %}
{% endstep %}

{% step %}

### Не удаляйте следующие папки

<mark style="color:red;">**Никогда не удаляйте:**</mark>

```
public
storage
```

В данных директориях хранятся:

* пользовательские изображения;
* загруженные файлы;
* документы;
* экспортированные данные;
* служебные файлы системы;
* пользовательский контент.

<mark style="color:red;">**Удаление этих папок может привести к потере данных.**</mark>
{% endstep %}
{% endstepper %}

{% hint style="danger" %}

### Важно

Не забудьте скачать файлы лицензии.

Они обязательны для полной установки обновления. После загрузки и распаковки архивов обновления необходимо также загрузить файлы лицензии в папку backend.

Без файлов лицензии обновление может быть установлено не полностью или работать некорректно.
{% endhint %}

{% content-ref url="/pages/hSsHgydQTzax5c06kVsd" %}
[Файлы лицензии и релизы](/nachalo-raboty/faily-licenzii-i-relizy)
{% endcontent-ref %}

***

## Загрузка файлов обновления

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

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Каждый архив предназначен для своей части системы.

{% stepper %}
{% step %}

### Архив Frontend

Загрузите: `iexexchanger_frontend_update.zip`&#x20;

в директорию основного сайта: `ваш_домен`
{% endstep %}

{% step %}

### Архив Backend

Загрузите: `iexexchanger_backend_update.zip`&#x20;

в директорию Backend: `app.ваш_домен`
{% endstep %}

{% step %}

### Способы загрузки

Вы можете использовать:

* FastPanel;
* FileZilla;
* WinSCP;
* SFTP;
* SCP.

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

Использование пользователя root не рекомендуется.
{% endstep %}

{% step %}

### Распаковка архивов

После загрузки архивов:

1. Найдите архив в нужной директории.
2. Выполните распаковку.
3. Подтвердите замену существующих файлов, если система запросит подтверждение.

Замена файлов является стандартной частью процесса обновления.
{% endstep %}

{% step %}

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

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

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

После завершения данного этапа можно переходить к установке обновления.
{% endstep %}
{% endstepper %}

## Миграция с MySQL на PostgreSQL

После загрузки Backend 11.3 выполните перенос действующей базы MySQL в подготовленную пустую базу PostgreSQL 18.

Используйте отдельную инструкцию:

{% content-ref url="/pages/ikFROc848cbeBrh2d2Lw" %}
[Миграция с MySQL на PostgreSQL](/server-i-dannye/rabota-s-postgresql/migraciya-s-mysql-na-postgresql)
{% endcontent-ref %}

Инструкция включает:

* проверку PostgreSQL и PHP-модулей;
* настройку `iEX DB Migrator`;
* проверку конфигурации и плана переноса;
* создание дополнительной резервной копии;
* остановку процессов, записывающих данные;
* перенос основной базы и Laravel Pulse;
* сравнение структуры и SHA-256 digest данных;
* автоматическое переключение файла `.env`;
* независимую проверку результата командой `verify`.

Выполните инструкцию до успешного завершения раздела **«Независимая точная проверка»** включительно. Когда документ перейдёт к этапу **«Обновление продукта после переноса»**, вернитесь к текущей инструкции и выполните команды для версии 11.3 из следующего раздела.

{% hint style="danger" %}
Не продолжайте обновление, если миграция или отдельная команда `verify` завершилась с ошибкой.

Не изменяйте подключение в `.env` вручную, не удаляйте исходную MySQL-базу и не возвращайте пользовательский трафик. Сначала устраните причину ошибки и повторите проверку по инструкции миграции.
{% endhint %}

## Применение обновления

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

Если вы ранее не работали с SSH, воспользуйтесь отдельной инструкцией по подключению к серверу.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

{% stepper %}
{% step %}

### Переход в директорию Backend

Подключитесь к серверу и выполните команду:

```
cd www/app.ваш_домен
```

или

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

Используйте фактический путь вашего проекта.
{% endstep %}

{% step %}

### Выполнение команд обновления

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

**Установка обновления**

```
php artisan product-updates:run --to=11.3.0.1
```

Применяет все изменения новой версии системы.

Выполняет обновление файловых источников курсов.
{% endstep %}

{% step %}

### Проверка Product Updates и PostgreSQL

После успешного выполнения проверьте состояние последних обновлений:

```
php artisan product-updates:status --limit=5
```

Проверьте подключение Laravel к PostgreSQL:

```
php artisan db:show --database=pgsql
```

Команды должны завершиться без ошибок подключения к базе данных.
{% endstep %}

{% step %}

### Если команда завершилась с ошибкой

Ошибка может быть связана с:

* незавершённой миграцией на PostgreSQL;
* неправильными правами на файлы проекта;
* недостатком свободного места;
* отсутствием PHP-модулей `pdo_pgsql` или `pgsql`;
* недоступностью PostgreSQL;
* параллельно работающим процессом обновления.

В этом случае:

1. Сохраните полный текст ошибки.
2. Проверьте результат миграции и команды `verify`.
3. Устраните найденную причину.
4. Повторно выполните предварительную проверку.
5. После успешной проверки снова запустите обновление до 11.3.
   {% endstep %}
   {% endstepper %}

## Завершение обновления

После успешного выполнения всех команд рекомендуется выполнить финальные действия.

{% stepper %}
{% step %}

### Удаление архивов обновления

Удалите ранее загруженные архивы:

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Это позволит избежать случайного использования устаревших файлов в будущем.
{% endstep %}

{% step %}

### Перезагрузка сервера

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

Через SSH: `reboot`

или воспользуйтесь инструментами вашей панели управления.
{% endstep %}
{% endstepper %}

## Проверка конфигурации PM2

После обновления также рекомендуется проверить файл `ecosystem.config.cjs`, расположенный в директории основного сайта **ваш\_сайт**.

{% content-ref url="/pages/F0heLK3hsvZjgOgUdPsB" %}
[Настройка Frontend](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-frontend)
{% endcontent-ref %}

В версии 11.2 необходимо использовать актуальную конфигурацию PM2. Если в файле указаны другие параметры (например, `cluster` или `instances: 'max'`), замените их на рекомендуемую конфигурацию.

Файл `ecosystem.config.cjs` должен выглядеть следующим образом:

```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,
        },
    ],
};
```

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/7o3axTZ091nAi4NWN8jN" %}
[Настройка и работа PM2 для Frontend](/help-center/upravlenie-serverom/pm2/nastroika-i-rabota-pm2-dlya-frontend)
{% endcontent-ref %}

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

## Проверка и обновление конфигурации Nginx

Перед финальной проверкой сайта обязательно изучите актуальную инструкцию по настройке Frontend Nginx и внесите необходимые изменения в конфигурацию.

В версии 11.1.8 изменилась схема работы Nginx, поэтому старая конфигурация может работать некорректно.

Перейдите по ссылке на актуальную инструкцию:

{% content-ref url="/pages/E9WKesM7XwCwE0IsKTAh" %}
[Настройка Nginx](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-nginx)
{% endcontent-ref %}

Внимательно проверьте конфигурацию и приведите её к актуальной версии.

Особое внимание уделите:

* настройке проксирования Frontend на Angular SSR;
* отсутствию старых языковых редиректов в Nginx.

После внесения изменений сохраните конфигурацию, проверьте её корректность и перезапустите Nginx.

Только после этого переходите к проверке работы сайта.

## Если сайт не открывается после обновления

Наиболее распространённая причина — не был автоматически запущен Frontend через PM2 после перезагрузки сервера.

Проверьте состояние процессов:&#x20;

```
pm2 list
```

Если процесс отсутствует или находится в состоянии ошибки, воспользуйтесь инструкцией:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/0yytVCNPTqBInGY7hcgi" %}
[Как переустановить PM2?](/help-center/upravlenie-serverom/pm2/kak-pereustanovit-pm2)
{% endcontent-ref %}

## Обновление успешно завершено

Поздравляем!

Система успешно обновлена до версии iEXExchanger 11.2.

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

## Завершение обновления

После успешной проверки:

1. Отключите режим обслуживания.
2. Верните в работу очереди, планировщики и остальные процессы, остановленные перед миграцией.
3. Убедитесь, что обменный пункт принимает новые заявки.
4. Сохраните резервные копии и исходную MySQL-базу до подтверждения стабильной работы PostgreSQL.

Система обновлена с версии 11.2 до версии 11.3 и работает с PostgreSQL 18.

## Перезагрузка сервера

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

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

{% stepper %}
{% step %}

### Через SSH

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Авторизуйтесь на сервере под пользователем root и выполните команду:

```bash
reboot
```

{% endstep %}

{% step %}

### Через FastPanel

Перейдите в раздел **«Настройки» → «Основное»** и нажмите **«Перезагрузить сервер»**.

После завершения перезагрузки дождитесь запуска всех сервисов и только затем переходите к проверке работоспособности сайта.
{% endstep %}
{% endstepper %}


# Обновление с 11.1.8 до 11.2

Данная инструкция описывает полный процесс обновления платформы iEXExchanger до версии 11.2.

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

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/OfLcDFWH4NaDvTwPEkDD" %}
[Как создать резервную копию в FastPanel](/help-center/administrirovanie/obsluzhivanie/kak-sozdat-rezervnuyu-kopiyu-v-fastpanel)
{% endcontent-ref %}

***

{% hint style="info" %}

## Важно

В данной версии изменена схема работы Nginx. После установки обновления необходимо внести изменения в конфигурацию Nginx согласно актуальной документации.
{% endhint %}

## Перевод сайта в режим обслуживания

Перед началом обновления необходимо временно остановить работу обменного пункта.

Для этого в административной панели активируйте режим обслуживания.

Это позволит:

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

После завершения обновления режим обслуживания можно будет отключить.

<figure><img src="/files/ikieHw6BWLMm12gUYYBi" alt="" width="563"><figcaption></figcaption></figure>

## Подготовка файлов к обновлению

Перед загрузкой новой версии необходимо удалить часть файлов текущей установки.

Данная процедура позволяет избежать конфликтов между файлами предыдущего и нового релиза.

{% stepper %}
{% step %}

### Очистка Frontend

Перейдите в директорию основного сайта.

Пример: `ваш_домен`&#x20;

Удалите следующие папки:

```
dist
logs
```

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

**Назначение папок**

<table><thead><tr><th width="170.765625">Папка</th><th>Назначение</th></tr></thead><tbody><tr><td>dist</td><td>Скомпилированная версия Frontend</td></tr><tr><td>logs</td><td>Журналы работы Frontend</td></tr></tbody></table>

После обновления данные директории будут автоматически созданы заново.
{% endstep %}

{% step %}

### Очистка Backend

Перейдите в директорию Backend.

Пример: `app.ваш_домен`&#x20;

Удалите следующие папки:

```
app
bootstrap
config
database
packages
resources
routes
vendor
```

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

{% hint style="info" %}

#### Важно

Перед удалением обязательно убедитесь, что вы находитесь именно в директории Backend.

Удаление файлов в неправильной директории может привести к повреждению проекта.
{% endhint %}
{% endstep %}

{% step %}

### Не удаляйте следующие папки

<mark style="color:red;">**Никогда не удаляйте:**</mark>

```
public
storage
```

В данных директориях хранятся:

* пользовательские изображения;
* загруженные файлы;
* документы;
* экспортированные данные;
* служебные файлы системы;
* пользовательский контент.

<mark style="color:red;">**Удаление этих папок может привести к потере данных.**</mark>
{% endstep %}
{% endstepper %}

{% hint style="danger" %}

### Важно

Не забудьте скачать файлы лицензии.

Они обязательны для полной установки обновления. После загрузки и распаковки архивов обновления необходимо также загрузить файлы лицензии в папку backend.

Без файлов лицензии обновление может быть установлено не полностью или работать некорректно.
{% endhint %}

{% content-ref url="/pages/hSsHgydQTzax5c06kVsd" %}
[Файлы лицензии и релизы](/nachalo-raboty/faily-licenzii-i-relizy)
{% endcontent-ref %}

***

## Загрузка файлов обновления

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

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Каждый архив предназначен для своей части системы.

{% stepper %}
{% step %}

### Архив Frontend

Загрузите: `iexexchanger_frontend_update.zip`&#x20;

в директорию основного сайта: `ваш_домен`
{% endstep %}

{% step %}

### Архив Backend

Загрузите: `iexexchanger_backend_update.zip`&#x20;

в директорию Backend: `app.ваш_домен`
{% endstep %}

{% step %}

### Способы загрузки

Вы можете использовать:

* FastPanel;
* FileZilla;
* WinSCP;
* SFTP;
* SCP.

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

Использование пользователя root не рекомендуется.
{% endstep %}

{% step %}

### Распаковка архивов

После загрузки архивов:

1. Найдите архив в нужной директории.
2. Выполните распаковку.
3. Подтвердите замену существующих файлов, если система запросит подтверждение.

Замена файлов является стандартной частью процесса обновления.
{% endstep %}

{% step %}

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

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

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

После завершения данного этапа можно переходить к установке обновления.
{% endstep %}
{% endstepper %}

## Применение обновления

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

Если вы ранее не работали с SSH, воспользуйтесь отдельной инструкцией по подключению к серверу.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

{% stepper %}
{% step %}

### Переход в директорию Backend

Подключитесь к серверу и выполните команду:

```
cd www/app.ваш_домен
```

или

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

Используйте фактический путь вашего проекта.
{% endstep %}

{% step %}

### Выполнение команд обновления

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

**Установка обновления**

```
php artisan product-updates:run --to=11.2
```

Применяет все изменения новой версии системы.

Выполняет обновление файловых источников курсов.
{% endstep %}

{% step %}

### Если команда завершилась с ошибкой

В некоторых случаях ошибка может быть связана с:

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

Рекомендуется:

1. Ознакомиться с текстом ошибки.
2. Устранить найденную проблему.
3. Повторно выполнить команду.

Если ошибка сохраняется, обратитесь в техническую поддержку и приложите полный текст ошибки.
{% endstep %}
{% endstepper %}

## Завершение обновления

После успешного выполнения всех команд рекомендуется выполнить финальные действия.

{% stepper %}
{% step %}

### Удаление архивов обновления

Удалите ранее загруженные архивы:

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Это позволит избежать случайного использования устаревших файлов в будущем.
{% endstep %}

{% step %}

### Перезагрузка сервера

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

Через SSH: `reboot`

или воспользуйтесь инструментами вашей панели управления.
{% endstep %}
{% endstepper %}

## Проверка конфигурации PM2

После обновления также рекомендуется проверить файл `ecosystem.config.cjs`, расположенный в директории основного сайта **ваш\_сайт**.

{% content-ref url="/pages/F0heLK3hsvZjgOgUdPsB" %}
[Настройка Frontend](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-frontend)
{% endcontent-ref %}

В версии 11.2 необходимо использовать актуальную конфигурацию PM2. Если в файле указаны другие параметры (например, `cluster` или `instances: 'max'`), замените их на рекомендуемую конфигурацию.

Файл `ecosystem.config.cjs` должен выглядеть следующим образом:

```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,
        },
    ],
};
```

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/7o3axTZ091nAi4NWN8jN" %}
[Настройка и работа PM2 для Frontend](/help-center/upravlenie-serverom/pm2/nastroika-i-rabota-pm2-dlya-frontend)
{% endcontent-ref %}

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

## Проверка и обновление конфигурации Nginx

Перед финальной проверкой сайта обязательно изучите актуальную инструкцию по настройке Frontend Nginx и внесите необходимые изменения в конфигурацию.

В версии 11.1.8 изменилась схема работы Nginx, поэтому старая конфигурация может работать некорректно.

Перейдите по ссылке на актуальную инструкцию:

{% content-ref url="/pages/E9WKesM7XwCwE0IsKTAh" %}
[Настройка Nginx](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-nginx)
{% endcontent-ref %}

Внимательно проверьте конфигурацию и приведите её к актуальной версии.

Особое внимание уделите:

* настройке проксирования Frontend на Angular SSR;
* отсутствию старых языковых редиректов в Nginx.

После внесения изменений сохраните конфигурацию, проверьте её корректность и перезапустите Nginx.

Только после этого переходите к проверке работы сайта.

## Если сайт не открывается после обновления

Наиболее распространённая причина — не был автоматически запущен Frontend через PM2 после перезагрузки сервера.

Проверьте состояние процессов:&#x20;

```
pm2 list
```

Если процесс отсутствует или находится в состоянии ошибки, воспользуйтесь инструкцией:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/0yytVCNPTqBInGY7hcgi" %}
[Как переустановить PM2?](/help-center/upravlenie-serverom/pm2/kak-pereustanovit-pm2)
{% endcontent-ref %}

## Обновление успешно завершено

Поздравляем!

Система успешно обновлена до версии iEXExchanger 11.2.

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

## Перезагрузка сервера

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

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

{% stepper %}
{% step %}

### Через SSH

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Авторизуйтесь на сервере под пользователем root и выполните команду:

```bash
reboot
```

{% endstep %}

{% step %}

### Через FastPanel

Перейдите в раздел **«Настройки» → «Основное»** и нажмите **«Перезагрузить сервер»**.

После завершения перезагрузки дождитесь запуска всех сервисов и только затем переходите к проверке работоспособности сайта.
{% endstep %}
{% endstepper %}


# Архивные версия


# Версия 11.1.x


# Обновление c 11.0.7 до 11.1

{% hint style="danger" %}

## Внимание!!!

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

**Крайне не рекомендуем выполнять обновление без предварительного резервного копирования файлов и базы данных.** Сначала создайте backup, и только после этого переходите к обновлению.
{% endhint %}

<a href="https://iexexchanger.com/news/relizy/iexexchanger-111-novyi-interfeis-obnovlennaia-analitika-i-usilenie-platformy" class="button primary">История изменений 11.1</a>

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

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

Перед обновлением системы до версии **11.1** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

{% stepper %}
{% step %}

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* dist
* logs

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

{% hint style="info" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}
{% endstep %}

{% step %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="danger" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

<figure><img src="/files/K3CF9mlFjVc5C9Ms6DNv" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

{% code overflow="wrap" lineNumbers="true" %}

```shellscript
php artisan product-updates:run
php artisan analytics:rebuild --recent=90
php artisan rates:run-target files
```

{% endcode %}

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>

{% hint style="warning" %}

## Что делать, если сайт не запускается после перезагрузки

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

Чаще всего это происходит потому, что после перезагрузки сервера автоматически не запустился PM2 — программа, которая поддерживает работу сайта.

1. Перейдите по ссылке ниже.
2. Следуйте шагам, чтобы вручную запустить сайт.

Ссылка: [**\[Переустановке PM2\]**](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endhint %}

***

## Рекомендуемые ссылки

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

{% content-ref url="/pages/IaKPMZcX0KFQ4HshbuKr" %}
[Broken mention](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endcontent-ref %}


# Обновление с 11.1 до 11.1.4

{% hint style="danger" %}

## Внимание!!!

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

**Крайне не рекомендуем выполнять обновление без предварительного резервного копирования файлов и базы данных.** Сначала создайте backup, и только после этого переходите к обновлению.
{% endhint %}

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

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

Перед обновлением системы до версии **11.1.5** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

{% stepper %}
{% step %}

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* dist
* logs

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

{% hint style="info" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}
{% endstep %}

{% step %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="danger" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

<figure><img src="/files/K3CF9mlFjVc5C9Ms6DNv" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

<details>

<summary>Конфигурация NGINX</summary>

Проверьте конфигурацию nginx для основного домена

```
map $http_accept_language $accept_language {
    "~*ru" ru;
    "~*en" en;
    default ru;
}

map $cookie_lang $selected_lang {
    "~^(ru|en)$" $cookie_lang;
    default $accept_language;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' '';
}

upstream iex_frontend_ssr {
    server 127.0.0.1:4000;
    keepalive 32;
}

upstream iex_backend_https {
    server ip_адрес_сервера:443;
    keepalive 32;
}

server {
    server_name ваш_домен;
    
    set $root_path /var/www/имя_пользователя/data/www/ваш_домен;
    root $root_path;
    disable_symlinks if_not_owner from=$root_path;

    add_header Vary "Accept-Language, Cookie" always;
    client_max_body_size 64m;

    set $backend_domain app.ваш_домен;
    set $backend_cookie_domain .ваш_домен;
    set $backend_public_path /var/www/имя_пользователя/data/www/app.ваш_домен/public;

    location = / {
        return 302 /$selected_lang/$is_args$args;
    }

    location ~ ^/(ru|en)$ {
        add_header Vary "Accept-Language, Cookie" always;
        add_header Set-Cookie "lang=$1; Path=/; Max-Age=31536000; SameSite=Lax" always;
        return 302 /$1/$is_args$args;
    }

    location ~ ^/(ru|en)/ {
        add_header Vary "Accept-Language, Cookie" always;
        add_header Set-Cookie "lang=$1; Path=/; Max-Age=31536000; SameSite=Lax" always;

        proxy_pass http://iex_frontend_ssr;
        proxy_redirect off;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_buffering on;
        proxy_buffers 16 64k;
        proxy_buffer_size 128k;
        proxy_read_timeout 60s;
        proxy_connect_timeout 10s;
        proxy_send_timeout 10s;
    }

    location ~* ^/(assets/|theme/|.*\.(?:js|css|map|ico|txt|xml|json|csv|pdf|webmanifest|woff|woff2|ttf|otf))$ {
        proxy_pass http://iex_frontend_ssr;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;

        expires 1y;
        add_header Cache-Control "public, max-age=31536000, immutable" always;
        access_log off;
    }

    location = /backend-api {
        return 308 /backend-api/;
    }

    location ^~ /backend-api/ {
        proxy_pass https://iex_backend_https/;
        proxy_ssl_server_name on;
        proxy_ssl_name $backend_domain;
        proxy_http_version 1.1;

        proxy_set_header Host $backend_domain;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_cookie_domain $backend_domain $backend_cookie_domain;

        proxy_buffering off;
        proxy_read_timeout 60s;
        proxy_connect_timeout 10s;
        proxy_send_timeout 10s;
    }

    location ^~ /images/ {
        alias $backend_public_path/images/;
        expires 30d;
        add_header Cache-Control "public, max-age=2592000, immutable" always;
        autoindex off;
        access_log off;
    }

    location ^~ /storage/ {
        alias $backend_public_path/storage/;
        expires 30d;
        add_header Cache-Control "public, max-age=2592000, immutable" always;
        autoindex off;
        access_log off;
    }

    location ^~ /static/ {
        alias $backend_public_path/static/;
        autoindex off;
        access_log off;
    }

    location ^~ /dist/ {
        alias $backend_public_path/dist/;
        expires 30d;
        add_header Cache-Control "public, max-age=2592000, immutable" always;
        autoindex off;
        access_log off;
    }

    location ^~ /exports/ {
        alias $backend_public_path/static/exports/;
        autoindex off;
        access_log off;
    }

    location ^~ /app/ {
        proxy_pass https://iex_backend_https;
        proxy_ssl_server_name on;
        proxy_ssl_name $backend_domain;
        proxy_http_version 1.1;

        proxy_set_header Host $backend_domain;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }

    location ^~ /apps/ {
        proxy_pass https://iex_backend_https;
        proxy_ssl_server_name on;
        proxy_ssl_name $backend_domain;
        proxy_http_version 1.1;

        proxy_set_header Host $backend_domain;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }

    location / {
        return 302 /$selected_lang$uri$is_args$args;
    }
}
```

</details>

<details>

<summary>.env файл для основного домена</summary>

```
NODE_ENV=production
PORT=4000
HOST=127.0.0.1
PM2=true
SUPPORTED_LANGUAGES=ru,en
DEFAULT_LANGUAGE=ru
ALLOWED_HOSTS=ваш_домен
API_URL=https://app.ваш_домен
CSS_VERSION=1
CUSTOM_THEME=custom-theme
CUSTOM_THEME_URL=/static/theme/custom-theme.css
```

</details>

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

{% code overflow="wrap" lineNumbers="true" %}

```shellscript
php artisan product-updates:release-check 11.1.4
php artisan product-updates:verify-release --to=11.1.4
php artisan product-updates:run --to=11.1.4
php artisan analytics:rebuild --recent=90
php artisan rates:run-target files
```

{% endcode %}

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>

{% hint style="warning" %}

## Что делать, если сайт не запускается после перезагрузки

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

Чаще всего это происходит потому, что после перезагрузки сервера автоматически не запустился PM2 — программа, которая поддерживает работу сайта.

1. Перейдите по ссылке ниже.
2. Следуйте шагам, чтобы вручную запустить сайт.

Ссылка: [**\[Переустановке PM2\]**](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endhint %}

***

## Рекомендуемые ссылки

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

{% content-ref url="/pages/IaKPMZcX0KFQ4HshbuKr" %}
[Broken mention](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endcontent-ref %}


# Обновление с 11.1.4 до 11.1.5

Данная инструкция описывает полный процесс обновления платформы iEXExchanger до версии 11.1.5.

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

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/OfLcDFWH4NaDvTwPEkDD" %}
[Как создать резервную копию в FastPanel](/help-center/administrirovanie/obsluzhivanie/kak-sozdat-rezervnuyu-kopiyu-v-fastpanel)
{% endcontent-ref %}

***

## Перевод сайта в режим обслуживания

Перед началом обновления необходимо временно остановить работу обменного пункта.

Для этого в административной панели активируйте режим обслуживания.

Это позволит:

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

После завершения обновления режим обслуживания можно будет отключить.

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

## Подготовка файлов к обновлению

Перед загрузкой новой версии необходимо удалить часть файлов текущей установки.

Данная процедура позволяет избежать конфликтов между файлами предыдущего и нового релиза.

{% stepper %}
{% step %}

### Очистка Frontend

Перейдите в директорию основного сайта.

Пример: `ваш_домен`&#x20;

Удалите следующие папки:

```
dist
logs
```

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

**Назначение папок**

| Папка | Назначение                       |
| ----- | -------------------------------- |
| dist  | Скомпилированная версия Frontend |
| logs  | Журналы работы Frontend          |

После обновления данные директории будут автоматически созданы заново.
{% endstep %}

{% step %}

### Очистка Backend

Перейдите в директорию Backend.

Пример: `app.ваш_домен`&#x20;

Удалите следующие папки:

```
app
bootstrap
config
database
packages
resources
routes
vendor
```

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

{% hint style="info" %}

#### Важно

Перед удалением обязательно убедитесь, что вы находитесь именно в директории Backend.

Удаление файлов в неправильной директории может привести к повреждению проекта.
{% endhint %}
{% endstep %}

{% step %}

### Не удаляйте следующие папки

Никогда не удаляйте:

```
public
storage
```

В данных директориях хранятся:

* пользовательские изображения;
* загруженные файлы;
* документы;
* экспортированные данные;
* служебные файлы системы;
* пользовательский контент.

Удаление этих папок может привести к потере данных.
{% endstep %}
{% endstepper %}

## Загрузка файлов обновления

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

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Каждый архив предназначен для своей части системы.

{% stepper %}
{% step %}

### Архив Frontend

Загрузите: `iexexchanger_frontend_update.zip`&#x20;

в директорию основного сайта: `ваш_домен`
{% endstep %}

{% step %}

### Архив Backend

Загрузите: `iexexchanger_backend_update.zip`&#x20;

в директорию Backend: `app.ваш_домен`
{% endstep %}

{% step %}

### Способы загрузки

Вы можете использовать:

* FastPanel;
* FileZilla;
* WinSCP;
* SFTP;
* SCP.

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

Использование пользователя root не рекомендуется.
{% endstep %}

{% step %}

### Распаковка архивов

После загрузки архивов:

1. Найдите архив в нужной директории.
2. Выполните распаковку.
3. Подтвердите замену существующих файлов, если система запросит подтверждение.

Замена файлов является стандартной частью процесса обновления.
{% endstep %}

{% step %}

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

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

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

После завершения данного этапа можно переходить к установке обновления.
{% endstep %}
{% endstepper %}

## Применение обновления

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

Если вы ранее не работали с SSH, воспользуйтесь отдельной инструкцией по подключению к серверу.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

{% stepper %}
{% step %}

### Переход в директорию Backend

Подключитесь к серверу и выполните команду:

```
cd /var/www/USER/data/www/app.ваш_домен
```

Используйте фактический путь вашего проекта.
{% endstep %}

{% step %}

### Выполнение команд обновления

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

**Проверка релиза**

```
php artisan product-updates:release-check 11.1.5
```

**Проверка пакета обновления**

```
php artisan product-updates:verify-release --to=11.1.5
```

**Установка обновления**

```
php artisan product-updates:run --to=11.1.5
```

Применяет все изменения новой версии системы.

**Перестроение аналитики**

```
php artisan analytics:rebuild --recent=90
```

**Обновление файловых источников курсов**

```
php artisan rates:run-target files
```

Выполняет обновление файловых источников курсов.
{% endstep %}

{% step %}

### Если команда завершилась с ошибкой

В некоторых случаях ошибка может быть связана с:

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

Рекомендуется:

1. Ознакомиться с текстом ошибки.
2. Устранить найденную проблему.
3. Повторно выполнить команду.

Если ошибка сохраняется, обратитесь в техническую поддержку и приложите полный текст ошибки.
{% endstep %}
{% endstepper %}

## Завершение обновления

После успешного выполнения всех команд рекомендуется выполнить финальные действия.

{% stepper %}
{% step %}

### Удаление архивов обновления

Удалите ранее загруженные архивы:

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Это позволит избежать случайного использования устаревших файлов в будущем.
{% endstep %}

{% step %}

### Перезагрузка сервера

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

Через SSH: `reboot`

или воспользуйтесь инструментами вашей панели управления.
{% endstep %}
{% endstepper %}

## Если сайт не открывается после обновления

Наиболее распространённая причина — не был автоматически запущен Frontend через PM2 после перезагрузки сервера.

Проверьте состояние процессов:&#x20;

```
pm2 list
```

Если процесс отсутствует или находится в состоянии ошибки, воспользуйтесь инструкцией:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/0yytVCNPTqBInGY7hcgi" %}
[Как переустановить PM2?](/help-center/upravlenie-serverom/pm2/kak-pereustanovit-pm2)
{% endcontent-ref %}

## Обновление успешно завершено

Поздравляем!

Система успешно обновлена до версии iEXExchanger 11.1.5.

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


# Обновление с 11.1.5 до 11.1.6

Данная инструкция описывает полный процесс обновления платформы iEXExchanger до версии 11.1.6.

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

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/OfLcDFWH4NaDvTwPEkDD" %}
[Как создать резервную копию в FastPanel](/help-center/administrirovanie/obsluzhivanie/kak-sozdat-rezervnuyu-kopiyu-v-fastpanel)
{% endcontent-ref %}

***

## Перевод сайта в режим обслуживания

Перед началом обновления необходимо временно остановить работу обменного пункта.

Для этого в административной панели активируйте режим обслуживания.

Это позволит:

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

После завершения обновления режим обслуживания можно будет отключить.

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

## Подготовка файлов к обновлению

Перед загрузкой новой версии необходимо удалить часть файлов текущей установки.

Данная процедура позволяет избежать конфликтов между файлами предыдущего и нового релиза.

{% stepper %}
{% step %}

### Очистка Frontend

Перейдите в директорию основного сайта.

Пример: `ваш_домен`&#x20;

Удалите следующие папки:

```
dist
logs
```

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

**Назначение папок**

| Папка | Назначение                       |
| ----- | -------------------------------- |
| dist  | Скомпилированная версия Frontend |
| logs  | Журналы работы Frontend          |

После обновления данные директории будут автоматически созданы заново.
{% endstep %}

{% step %}

### Очистка Backend

Перейдите в директорию Backend.

Пример: `app.ваш_домен`&#x20;

Удалите следующие папки:

```
app
bootstrap
config
database
packages
resources
routes
vendor
```

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

{% hint style="info" %}

#### Важно

Перед удалением обязательно убедитесь, что вы находитесь именно в директории Backend.

Удаление файлов в неправильной директории может привести к повреждению проекта.
{% endhint %}
{% endstep %}

{% step %}

### Не удаляйте следующие папки

Никогда не удаляйте:

```
public
storage
```

В данных директориях хранятся:

* пользовательские изображения;
* загруженные файлы;
* документы;
* экспортированные данные;
* служебные файлы системы;
* пользовательский контент.

Удаление этих папок может привести к потере данных.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}

### Важно:&#x20;

Не забудьте скачать файлы лицензии.

Они обязательны для полной установки обновления. После загрузки и распаковки архивов обновления необходимо также загрузить файлы лицензии в папку backend.

Без файлов лицензии обновление может быть установлено не полностью или работать некорректно.
{% endhint %}

{% content-ref url="/pages/hSsHgydQTzax5c06kVsd" %}
[Файлы лицензии и релизы](/nachalo-raboty/faily-licenzii-i-relizy)
{% endcontent-ref %}

## Загрузка файлов обновления

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

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Каждый архив предназначен для своей части системы.

{% stepper %}
{% step %}

### Архив Frontend

Загрузите: `iexexchanger_frontend_update.zip`&#x20;

в директорию основного сайта: `ваш_домен`
{% endstep %}

{% step %}

### Архив Backend

Загрузите: `iexexchanger_backend_update.zip`&#x20;

в директорию Backend: `app.ваш_домен`
{% endstep %}

{% step %}

### Способы загрузки

Вы можете использовать:

* FastPanel;
* FileZilla;
* WinSCP;
* SFTP;
* SCP.

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

Использование пользователя root не рекомендуется.
{% endstep %}

{% step %}

### Распаковка архивов

После загрузки архивов:

1. Найдите архив в нужной директории.
2. Выполните распаковку.
3. Подтвердите замену существующих файлов, если система запросит подтверждение.

Замена файлов является стандартной частью процесса обновления.
{% endstep %}

{% step %}

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

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

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

После завершения данного этапа можно переходить к установке обновления.
{% endstep %}
{% endstepper %}

## Применение обновления

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

Если вы ранее не работали с SSH, воспользуйтесь отдельной инструкцией по подключению к серверу.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

{% stepper %}
{% step %}

### Переход в директорию Backend

Подключитесь к серверу и выполните команду:

```
cd /var/www/USER/data/www/app.ваш_домен
```

Используйте фактический путь вашего проекта.
{% endstep %}

{% step %}

### Выполнение команд обновления

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

**Установка обновления**

```
php artisan product-updates:run --to=11.1.6
```

Применяет все изменения новой версии системы.

Выполняет обновление файловых источников курсов.
{% endstep %}

{% step %}

### Если команда завершилась с ошибкой

В некоторых случаях ошибка может быть связана с:

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

Рекомендуется:

1. Ознакомиться с текстом ошибки.
2. Устранить найденную проблему.
3. Повторно выполнить команду.

Если ошибка сохраняется, обратитесь в техническую поддержку и приложите полный текст ошибки.
{% endstep %}
{% endstepper %}

## Завершение обновления

После успешного выполнения всех команд рекомендуется выполнить финальные действия.

{% stepper %}
{% step %}

### Удаление архивов обновления

Удалите ранее загруженные архивы:

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Это позволит избежать случайного использования устаревших файлов в будущем.
{% endstep %}

{% step %}

### Перезагрузка сервера

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

Через SSH: `reboot`

или воспользуйтесь инструментами вашей панели управления.
{% endstep %}
{% endstepper %}

## Если сайт не открывается после обновления

Наиболее распространённая причина — не был автоматически запущен Frontend через PM2 после перезагрузки сервера.

Проверьте состояние процессов:&#x20;

```
pm2 list
```

Если процесс отсутствует или находится в состоянии ошибки, воспользуйтесь инструкцией:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/0yytVCNPTqBInGY7hcgi" %}
[Как переустановить PM2?](/help-center/upravlenie-serverom/pm2/kak-pereustanovit-pm2)
{% endcontent-ref %}

## Обновление успешно завершено

Поздравляем!

Система успешно обновлена до версии iEXExchanger 11.1.6.

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


# Обновление с 11.1.6 до 11.1.8

Данная инструкция описывает полный процесс обновления платформы iEXExchanger до версии 11.1.8.

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

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/OfLcDFWH4NaDvTwPEkDD" %}
[Как создать резервную копию в FastPanel](/help-center/administrirovanie/obsluzhivanie/kak-sozdat-rezervnuyu-kopiyu-v-fastpanel)
{% endcontent-ref %}

***

{% hint style="info" %}

## Важно

В данной версии изменена схема работы Nginx. После установки обновления необходимо внести изменения в конфигурацию Nginx согласно актуальной документации.
{% endhint %}

## Перевод сайта в режим обслуживания

Перед началом обновления необходимо временно остановить работу обменного пункта.

Для этого в административной панели активируйте режим обслуживания.

Это позволит:

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

После завершения обновления режим обслуживания можно будет отключить.

<figure><img src="/files/ikieHw6BWLMm12gUYYBi" alt="" width="563"><figcaption></figcaption></figure>

## Подготовка файлов к обновлению

Перед загрузкой новой версии необходимо удалить часть файлов текущей установки.

Данная процедура позволяет избежать конфликтов между файлами предыдущего и нового релиза.

{% stepper %}
{% step %}

### Очистка Frontend

Перейдите в директорию основного сайта.

Пример: `ваш_домен`&#x20;

Удалите следующие папки:

```
dist
logs
```

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

**Назначение папок**

<table><thead><tr><th width="170.765625">Папка</th><th>Назначение</th></tr></thead><tbody><tr><td>dist</td><td>Скомпилированная версия Frontend</td></tr><tr><td>logs</td><td>Журналы работы Frontend</td></tr></tbody></table>

После обновления данные директории будут автоматически созданы заново.
{% endstep %}

{% step %}

### Очистка Backend

Перейдите в директорию Backend.

Пример: `app.ваш_домен`&#x20;

Удалите следующие папки:

```
app
bootstrap
config
database
packages
resources
routes
vendor
```

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

{% hint style="info" %}

#### Важно

Перед удалением обязательно убедитесь, что вы находитесь именно в директории Backend.

Удаление файлов в неправильной директории может привести к повреждению проекта.
{% endhint %}
{% endstep %}

{% step %}

### Не удаляйте следующие папки

<mark style="color:red;">**Никогда не удаляйте:**</mark>

```
public
storage
```

В данных директориях хранятся:

* пользовательские изображения;
* загруженные файлы;
* документы;
* экспортированные данные;
* служебные файлы системы;
* пользовательский контент.

<mark style="color:red;">**Удаление этих папок может привести к потере данных.**</mark>
{% endstep %}
{% endstepper %}

{% hint style="danger" %}

### Важно

Не забудьте скачать файлы лицензии.

Они обязательны для полной установки обновления. После загрузки и распаковки архивов обновления необходимо также загрузить файлы лицензии в папку backend.

Без файлов лицензии обновление может быть установлено не полностью или работать некорректно.
{% endhint %}

{% content-ref url="/pages/hSsHgydQTzax5c06kVsd" %}
[Файлы лицензии и релизы](/nachalo-raboty/faily-licenzii-i-relizy)
{% endcontent-ref %}

***

## Загрузка файлов обновления

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

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Каждый архив предназначен для своей части системы.

{% stepper %}
{% step %}

### Архив Frontend

Загрузите: `iexexchanger_frontend_update.zip`&#x20;

в директорию основного сайта: `ваш_домен`
{% endstep %}

{% step %}

### Архив Backend

Загрузите: `iexexchanger_backend_update.zip`&#x20;

в директорию Backend: `app.ваш_домен`
{% endstep %}

{% step %}

### Способы загрузки

Вы можете использовать:

* FastPanel;
* FileZilla;
* WinSCP;
* SFTP;
* SCP.

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

Использование пользователя root не рекомендуется.
{% endstep %}

{% step %}

### Распаковка архивов

После загрузки архивов:

1. Найдите архив в нужной директории.
2. Выполните распаковку.
3. Подтвердите замену существующих файлов, если система запросит подтверждение.

Замена файлов является стандартной частью процесса обновления.
{% endstep %}

{% step %}

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

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

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

После завершения данного этапа можно переходить к установке обновления.
{% endstep %}
{% endstepper %}

## Применение обновления

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

Если вы ранее не работали с SSH, воспользуйтесь отдельной инструкцией по подключению к серверу.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

{% stepper %}
{% step %}

### Переход в директорию Backend

Подключитесь к серверу и выполните команду:

```
cd www/app.ваш_домен
```

или

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

Используйте фактический путь вашего проекта.
{% endstep %}

{% step %}

### Выполнение команд обновления

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

**Установка обновления**

```
php artisan product-updates:run --to=11.1.8
```

Применяет все изменения новой версии системы.

Выполняет обновление файловых источников курсов.
{% endstep %}

{% step %}

### Если команда завершилась с ошибкой

В некоторых случаях ошибка может быть связана с:

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

Рекомендуется:

1. Ознакомиться с текстом ошибки.
2. Устранить найденную проблему.
3. Повторно выполнить команду.

Если ошибка сохраняется, обратитесь в техническую поддержку и приложите полный текст ошибки.
{% endstep %}
{% endstepper %}

## Завершение обновления

После успешного выполнения всех команд рекомендуется выполнить финальные действия.

{% stepper %}
{% step %}

### Удаление архивов обновления

Удалите ранее загруженные архивы:

```
iexexchanger_frontend_update.zip
iexexchanger_backend_update.zip
```

Это позволит избежать случайного использования устаревших файлов в будущем.
{% endstep %}

{% step %}

### Перезагрузка сервера

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

Через SSH: `reboot`

или воспользуйтесь инструментами вашей панели управления.
{% endstep %}
{% endstepper %}

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

Перед проверкой конфигурации PM2 откройте файл `.env`, расположенный в директории Frontend основного домена (например, `ваш_сайт`), и убедитесь, что параметры имеют актуальные значения.

Проверьте параметр `ALLOWED_HOSTS`. Он должен содержать основной домен сайта и домен Backend:

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

Проверьте параметр `SUPPORTED_LANGUAGES`. Он должен содержать список всех поддерживаемых языков:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/Yep95n9UPE2CNtlKuOdV" %}
[Настройка языков](/help-center/administrirovanie/nastroika-yazykov)
{% endcontent-ref %}

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

Проверьте параметр `DEFAULT_LANGUAGE`. Он должен содержать язык, используемый по умолчанию:

```dotenv
DEFAULT_LANGUAGE=ru
```

Если какие-либо значения отличаются, приведите их к указанному виду, сохраните файл `.env` и только после этого переходите к проверке конфигурации PM2.

## Проверка конфигурации PM2

После обновления также рекомендуется проверить файл `ecosystem.config.cjs`, расположенный в директории основного сайта **ваш\_сайт**.

{% content-ref url="/pages/F0heLK3hsvZjgOgUdPsB" %}
[Настройка Frontend](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-frontend)
{% endcontent-ref %}

В версии 11.1.8 необходимо использовать актуальную конфигурацию PM2. Если в файле указаны другие параметры (например, `cluster` или `instances: 'max'`), замените их на рекомендуемую конфигурацию.

Файл `ecosystem.config.cjs` должен выглядеть следующим образом:

```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,
        },
    ],
};
```

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

## Проверка и обновление конфигурации Nginx

Перед финальной проверкой сайта обязательно изучите актуальную инструкцию по настройке Frontend Nginx и внесите необходимые изменения в конфигурацию.

В версии 11.1.8 изменилась схема работы Nginx, поэтому старая конфигурация может работать некорректно.

Перейдите по ссылке на актуальную инструкцию:

{% content-ref url="/pages/E9WKesM7XwCwE0IsKTAh" %}
[Настройка Nginx](/ustanovka-i-obnovlenie/ustanovka/nastroika-fastpanel/nastroika-nginx)
{% endcontent-ref %}

Внимательно проверьте конфигурацию и приведите её к актуальной версии.

Особое внимание уделите:

* настройке проксирования Frontend на Angular SSR;
* отсутствию старых языковых редиректов в Nginx.

После внесения изменений сохраните конфигурацию, проверьте её корректность и перезапустите Nginx.

Только после этого переходите к проверке работы сайта.

## Если сайт не открывается после обновления

Наиболее распространённая причина — не был автоматически запущен Frontend через PM2 после перезагрузки сервера.

Проверьте состояние процессов:&#x20;

```
pm2 list
```

Если процесс отсутствует или находится в состоянии ошибки, воспользуйтесь инструкцией:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/0yytVCNPTqBInGY7hcgi" %}
[Как переустановить PM2?](/help-center/upravlenie-serverom/pm2/kak-pereustanovit-pm2)
{% endcontent-ref %}

## Обновление успешно завершено

Поздравляем!

Система успешно обновлена до версии iEXExchanger 11.1.8.

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

## Перезагрузка сервера

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

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

{% stepper %}
{% step %}

### Через SSH

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Авторизуйтесь на сервере под пользователем root и выполните команду:

```bash
reboot
```

{% endstep %}

{% step %}

### Через FastPanel

Перейдите в раздел **«Настройки» → «Основное»** и нажмите **«Перезагрузить сервер»**.

После завершения перезагрузки дождитесь запуска всех сервисов и только затем переходите к проверке работоспособности сайта.
{% endstep %}
{% endstepper %}


# Версия 11.0.x


# Обновление c 11.0.6 до 11.0.7

{% hint style="danger" %}

## Внимание!!!

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

**Крайне не рекомендуем выполнять обновление без предварительного резервного копирования файлов и базы данных.** Сначала создайте backup, и только после этого переходите к обновлению.
{% endhint %}

{% content-ref url="/spaces/AOF6pPvOr3VNgXQWBmy1/pages/1HFU2WWpgvGwtl6RDJAx" %}
[Broken mention](broken://spaces/AOF6pPvOr3VNgXQWBmy1/pages/1HFU2WWpgvGwtl6RDJAx)
{% endcontent-ref %}

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

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

Перед обновлением системы до версии **11.0.7** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

{% stepper %}
{% step %}

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* dist
* logs

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

{% hint style="info" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}
{% endstep %}

{% step %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="danger" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

<figure><img src="/files/K3CF9mlFjVc5C9Ms6DNv" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

{% code overflow="wrap" lineNumbers="true" %}

```shellscript
php artisan product:apply-update
php artisan discounts:install-default-program
php artisan discounts:initialize-users
```

{% endcode %}

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>

{% hint style="warning" %}

## Что делать, если сайт не запускается после перезагрузки

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

Чаще всего это происходит потому, что после перезагрузки сервера автоматически не запустился PM2 — программа, которая поддерживает работу сайта.

1. Перейдите по ссылке ниже.
2. Следуйте шагам, чтобы вручную запустить сайт.

Ссылка: [**\[Переустановке PM2\]**](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endhint %}

***

## Рекомендуемые ссылки

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

{% content-ref url="/pages/IaKPMZcX0KFQ4HshbuKr" %}
[Broken mention](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endcontent-ref %}


# Обновление до 11.0.6

{% hint style="danger" %}

## Внимание!!!

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

**Крайне не рекомендуем выполнять обновление без предварительного резервного копирования файлов и базы данных.** Сначала создайте backup, и только после этого переходите к обновлению.
{% endhint %}

{% content-ref url="/spaces/AOF6pPvOr3VNgXQWBmy1/pages/PMyx71jtt5G95T62qBEP" %}
[Broken mention](broken://spaces/AOF6pPvOr3VNgXQWBmy1/pages/PMyx71jtt5G95T62qBEP)
{% endcontent-ref %}

{% hint style="warning" %}

#### Резервное копирование перед обновлением

**Перед обновлением системы обязательно создайте резервную копию файлов сайта и базы данных.** Не пропускайте этот шаг: резервная копия поможет **избежать потери данных** и позволит быстро восстановить сайт, если в процессе обновления возникнут ошибки, сбои или другие непредвиденные ситуации.

Сначала сохраните **файлы сайта**. Для этого войдите в панель **FastPanel**, откройте **файловый менеджер**, найдите папку с вашим сайтом, создайте архив в формате ZIP и скачайте его на свой компьютер. Затем обязательно выполните резервное копирование базы данных: перейдите в раздел **«Базы данных»**, выберите нужную базу и воспользуйтесь функцией **экспорта**, чтобы получить SQL-файл. Сохраните его в надёжном месте вместе с архивом сайта.

<br>

**Перед началом обновления убедитесь, что обе резервные копии успешно созданы и сохранены.** Только после этого переходите к дальнейшим действиям. Если вы не уверены, что выполняете резервное копирование правильно, или столкнулись со сложностями при работе с FastPanel, рекомендуется обратиться в **техническую поддержку вашего хостинга**. Специалисты помогут выполнить резервное копирование корректно и подскажут подходящий порядок действий именно для вашего сервера.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

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

Перед обновлением системы до версии **11.0.6** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

{% stepper %}
{% step %}

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* dist
* logs

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

{% hint style="info" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}
{% endstep %}

{% step %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="danger" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

<figure><img src="/files/K3CF9mlFjVc5C9Ms6DNv" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

{% code overflow="wrap" lineNumbers="true" %}

```shellscript
php artisan product:apply-update
php artisan user-balance:migrate-legacy
php artisan rates:history-rebuild-candles
php artisan rates:run-target files
```

{% endcode %}

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>

{% hint style="warning" %}

## Что делать, если сайт не запускается после перезагрузки

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

Чаще всего это происходит потому, что после перезагрузки сервера автоматически не запустился PM2 — программа, которая поддерживает работу сайта.

1. Перейдите по ссылке ниже.
2. Следуйте шагам, чтобы вручную запустить сайт.

Ссылка: [**\[Переустановке PM2\]**](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endhint %}

***

## Рекомендуемые ссылки

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

{% content-ref url="/pages/IaKPMZcX0KFQ4HshbuKr" %}
[Broken mention](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endcontent-ref %}


# Обновление до 11.0.5

<a href="https://iexexchanger.com/news/updates/iexexchanger-1105-uskorenie-kursov-novaia-logika-rascetov-i-rassirenie-vozmoznostei-sistemy" class="button primary" data-icon="head-side-speak">Изменении в версии 10.0.5</a>

{% hint style="danger" %}

#### Резервное копирование перед обновлением

Перед тем как приступать к обновлению системы, настоятельно рекомендуем выполнить резервное копирование (backup) файлов вашего сайта и базы данных. Это обязательный этап, который поможет избежать потери данных и обеспечить возможность восстановления сайта в случае любых непредвиденных обстоятельств во время обновления.

#### Как создать резервную копию с помощью FastPanel

1. **Создание резервной копии файлов сайта:**
   * Войдите в панель управления FastPanel.
   * Перейдите в раздел «Файловый менеджер».
   * Выделите папку с файлами вашего сайта и создайте архив (zip).
   * Скачайте созданный архив на свой компьютер.
2. **Создание резервной копии базы данных:**
   * В панели FastPanel перейдите в раздел «Базы данных».
   * Выберите нужную базу данных.
   * Нажмите на опцию экспорта (резервного копирования), чтобы получить файл SQL.
   * Сохраните скачанный файл SQL на ваш компьютер.

#### Что делать, если возникают сложности

Если вы не уверены, как правильно выполнить резервное копирование через панель FastPanel или столкнулись с трудностями, рекомендуем обратиться в службу технической поддержки вашего хостинга. Специалисты помогут вам разобраться и дадут необходимые рекомендации по процедуре создания резервных копий именно на вашем сервере.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

<figure><img src="/files/qocHcaTWkH820z8EwrL1" alt="" width="563"><figcaption></figcaption></figure>

Перед обновлением системы до версии **11.0.5** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

{% stepper %}
{% step %}

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* dist
* logs

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

{% hint style="info" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}
{% endstep %}

{% step %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="danger" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

<figure><img src="/files/K3CF9mlFjVc5C9Ms6DNv" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan product:apply-update
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>

{% hint style="warning" %}

## Что делать, если сайт не запускается после перезагрузки

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

Чаще всего это происходит потому, что после перезагрузки сервера автоматически не запустился PM2 — программа, которая поддерживает работу сайта.

#### В этом случае:

1. Перейдите по ссылке ниже.
2. Следуйте шагам, чтобы вручную запустить сайт.

Ссылка: [**\[Переустановке PM2\]**](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endhint %}

***

## Рекомендуемые ссылки

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

{% content-ref url="/pages/IaKPMZcX0KFQ4HshbuKr" %}
[Broken mention](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endcontent-ref %}


# Переход на 11.0.0 с 10.x

{% hint style="danger" %}

### Важное обновление до версии iEXExchanger 11.0

Обновление до версии iEXExchanger 11.0 является крупным мажорным переходом и включает существенные изменения в архитектуре системы, логике работы модулей и конфигурации проекта.

Версия 11.0 работает исключительно на **PHP 8.4** и использует полностью новую систему мерчантов и новую систему настроек, которые не совместимы с предыдущей структурой **версии 10.x.**

Обратите внимание, что в версии 11.0 временно отсутствуют некоторые мерчанты, включая: WhiteBIT, PayScrow, SuperMoney и Merchant001. Если вы используете указанные мерчанты в рабочем проекте, обновление на данную версию не рекомендуется.

<mark style="color:red;">Перед обновлением настоятельно рекомендуется внимательно ознакомиться с изменениями, проверить совместимость серверного окружения и выполнить обновление сначала на тестовом сервере.</mark>
{% endhint %}

{% content-ref url="/spaces/AOF6pPvOr3VNgXQWBmy1/pages/B7SDHK8ZATHRNd8gAa1p" %}
[Broken mention](broken://spaces/AOF6pPvOr3VNgXQWBmy1/pages/B7SDHK8ZATHRNd8gAa1p)
{% endcontent-ref %}

{% hint style="danger" %}

#### Резервное копирование перед обновлением

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

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

#### Резервное копирование файлов сайта (FastPanel)

1. Войдите в панель управления FastPanel.
2. Перейдите в раздел «Файловый менеджер».
3. Выделите папку с файлами сайта и создайте архив (ZIP).
4. Скачайте созданный архив на свой компьютер и убедитесь, что файл корректно сохранён.

#### Резервное копирование базы данных (FastPanel)

1. В панели FastPanel откройте раздел «Базы данных».
2. Выберите используемую базу данных проекта.
3. Выполните экспорт (резервное копирование) базы данных.
4. Сохраните полученный файл SQL на локальном компьютере.

#### Если возникают сложности

Если вы не уверены в правильности выполнения резервного копирования или сталкиваетесь с трудностями при работе с FastPanel, рекомендуется обратиться в службу технической поддержки вашего хостинг-провайдера. Специалисты помогут корректно создать резервные копии с учётом особенностей вашего серверного окружения.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

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

Перед обновлением системы до версии **11.0** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

{% hint style="danger" %}

## Важно:&#x20;

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

{% stepper %}
{% step %}

### Проверьте, что FastPanel PHP 8.4 установлен

В FastPanel должен быть установлен PHP 8.4 и доступен путь: `/opt/php84/bin/php`&#x20;

Проверка: `/opt/php84/bin/php -v`&#x20;

*Если команда не найдена — сначала установите **PHP 8.4 в FastPanel.***
{% endstep %}

{% step %}

### Сделать PHP 8.4 (FastPanel) основным для CLI

В FastPanel PHP 8.4 находится по пути: `/opt/php84/bin/php`

Сделаем так, чтобы команда php в терминале использовала именно PHP 8.4.

**Команды**

```shellscript
if [ ! -x /opt/php84/bin/php ]; then
  echo "Ошибка: не найден /opt/php84/bin/php. Установите PHP 8.4 в FastPanel."
  exit 1
fi

sudo update-alternatives --install /usr/bin/php php /opt/php84/bin/php 84 >/dev/null 2>&1 || true
sudo update-alternatives --set php /opt/php84/bin/php >/dev/null 2>&1 || true

php -v | head -n 1
```

{% endstep %}

{% step %}

### Установка ionCube Loader 15

* Loader подключаем первым через файл: `/opt/php84/conf.d/00-ioncube.ini`
* Скачивание: **IPv4 + fallback ZIP**, если tar.gz не скачался.

**Команды**

```shellscript
sudo mkdir -p /usr/local/src
cd /usr/local/src
sudo rm -rf ioncube >/dev/null 2>&1 || true
sudo rm -f ioncube_loaders_lin_x86-64.tar.gz ioncube_loaders_lin_x86-64.zip >/dev/null 2>&1 || true

IONCUBE_TAR_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz"
IONCUBE_ZIP_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.zip"
IONCUBE_DST_DIR="/usr/local/ioncube"
IONCUBE_SO="$IONCUBE_DST_DIR/ioncube_loader_lin_8.4.so"
IONCUBE_INI="/opt/php84/conf.d/00-ioncube.ini"

download_ok=0
curl -4 -fSL "$IONCUBE_TAR_URL" --connect-timeout 10 --max-time 600 --retry 5 --retry-delay 2 \
  -o ioncube_loaders_lin_x86-64.tar.gz && download_ok=1 || download_ok=0

if [ "$download_ok" -eq 1 ] && [ -s ioncube_loaders_lin_x86-64.tar.gz ]; then
  sudo tar -xzf ioncube_loaders_lin_x86-64.tar.gz
else
  curl -4 -fSL "$IONCUBE_ZIP_URL" --connect-timeout 10 --max-time 600 --retry 5 --retry-delay 2 \
    -o ioncube_loaders_lin_x86-64.zip

  if [ ! -s ioncube_loaders_lin_x86-64.zip ]; then
    echo "Ошибка: ionCube zip не скачался или пустой."
    exit 1
  fi

  sudo unzip -o ioncube_loaders_lin_x86-64.zip -d /usr/local/src >/dev/null
fi

if [ ! -f "/usr/local/src/ioncube/ioncube_loader_lin_8.4.so" ]; then
  echo "Ошибка: не найден /usr/local/src/ioncube/ioncube_loader_lin_8.4.so"
  exit 1
fi

sudo mkdir -p "$IONCUBE_DST_DIR"
sudo cp -f "/usr/local/src/ioncube/ioncube_loader_lin_8.4.so" "$IONCUBE_SO"

echo "zend_extension=$IONCUBE_SO" | sudo tee "$IONCUBE_INI" >/dev/null

# Если в php-cli.ini было старое подключение — комментируем
if [ -f /opt/php84/etc/php-cli.ini ]; then
  sudo sed -i 's/^\s*zend_extension\s*=.*ioncube.*$/; &/i' /opt/php84/etc/php-cli.ini || true
  sudo sed -i 's/^\s*zend_extension_ts\s*=.*ioncube.*$/; &/i' /opt/php84/etc/php-cli.ini || true
fi

php -v | grep -i "ionCube" || true
```

{% endstep %}
{% endstepper %}

***

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* **dist**
* **logs**

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

{% hint style="warning" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="warning" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

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

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan language:export
php artisan product:apply-update
php artisan dynamic-config:migrate-from-json
php artisan language:import
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>

{% hint style="warning" %}

## Что делать, если сайт не запускается после перезагрузки

Если после перезагрузки сервера сайт не открывается и страница полностью не загружается, это означает, что основной сервис сайта не был запущен. Чаще всего такая ситуация возникает из-за того, что после перезагрузки сервера автоматически не запустился PM2 — процесс-менеджер, отвечающий за работу сайта.

В этом случае необходимо вручную запустить сервис, следуя инструкции по настройке и запуску PM2. Подробные шаги по восстановлению работы сайта приведены в соответствующем руководстве.

Ссылка: [Инструкция по переустановке PM2](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endhint %}

***

## Рекомендуемые ссылки

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

{% content-ref url="/pages/IaKPMZcX0KFQ4HshbuKr" %}
[Broken mention](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endcontent-ref %}


# Версия 10.x


# Обновление до 10.3

{% hint style="danger" %}

### Важное обновление до версии  iEXExchanger 10.3

Уважаемые пользователи!

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

**Важное изменение: новая система расчёта прибыли**

В версии 10.3 полностью внедрена новая улучшенная система расчёта прибыли.

Старая система была удалена и не сохраняет статистику, так как её структура полностью переработана.

\
**Перед обновлением обязательно ознакомьтесь с изменениями**

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

{% content-ref url="/spaces/AOF6pPvOr3VNgXQWBmy1/pages/jRXA0wmcHZDvzsg52wTJ" %}
[Broken mention](broken://spaces/AOF6pPvOr3VNgXQWBmy1/pages/jRXA0wmcHZDvzsg52wTJ)
{% endcontent-ref %}

{% hint style="danger" %}

#### Резервное копирование перед обновлением

Перед тем как приступать к обновлению системы, настоятельно рекомендуем выполнить резервное копирование (backup) файлов вашего сайта и базы данных. Это обязательный этап, который поможет избежать потери данных и обеспечить возможность восстановления сайта в случае любых непредвиденных обстоятельств во время обновления.

#### Как создать резервную копию с помощью FastPanel

1. **Создание резервной копии файлов сайта:**
   * Войдите в панель управления FastPanel.
   * Перейдите в раздел «Файловый менеджер».
   * Выделите папку с файлами вашего сайта и создайте архив (zip).
   * Скачайте созданный архив на свой компьютер.
2. **Создание резервной копии базы данных:**
   * В панели FastPanel перейдите в раздел «Базы данных».
   * Выберите нужную базу данных.
   * Нажмите на опцию экспорта (резервного копирования), чтобы получить файл SQL.
   * Сохраните скачанный файл SQL на ваш компьютер.

#### Что делать, если возникают сложности

Если вы не уверены, как правильно выполнить резервное копирование через панель FastPanel или столкнулись с трудностями, рекомендуем обратиться в службу технической поддержки вашего хостинга. Специалисты помогут вам разобраться и дадут необходимые рекомендации по процедуре создания резервных копий именно на вашем сервере.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

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

Перед обновлением системы до версии **10.3** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* **dist**
* **logs**

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

{% hint style="warning" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="danger" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

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

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan product:apply-update
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>

{% hint style="warning" %}

## Что делать, если сайт не запускается после перезагрузки

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

Чаще всего это происходит потому, что после перезагрузки сервера автоматически не запустился PM2 — программа, которая поддерживает работу сайта.

#### В этом случае:

1. Перейдите по ссылке ниже.
2. Следуйте шагам, чтобы вручную запустить сайт.

Ссылка: **\[Инструкция по переустановке PM2]**
{% endhint %}

***

## Рекомендуемые ссылки

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

{% content-ref url="/pages/IaKPMZcX0KFQ4HshbuKr" %}
[Broken mention](broken://pages/IaKPMZcX0KFQ4HshbuKr)
{% endcontent-ref %}


# Обновление до 10.0.7/8

{% content-ref url="/spaces/AOF6pPvOr3VNgXQWBmy1/pages/S8ThvtybnhFHVdOKDKDm" %}
[Broken mention](broken://spaces/AOF6pPvOr3VNgXQWBmy1/pages/S8ThvtybnhFHVdOKDKDm)
{% endcontent-ref %}

{% content-ref url="/spaces/AOF6pPvOr3VNgXQWBmy1/pages/49fnZa1QmbkWGsv276AX" %}
[Broken mention](broken://spaces/AOF6pPvOr3VNgXQWBmy1/pages/49fnZa1QmbkWGsv276AX)
{% endcontent-ref %}

{% content-ref url="/spaces/AOF6pPvOr3VNgXQWBmy1/pages/VOV8d4lsx80pxneJbfQP" %}
[Broken mention](broken://spaces/AOF6pPvOr3VNgXQWBmy1/pages/VOV8d4lsx80pxneJbfQP)
{% endcontent-ref %}

{% hint style="danger" %}

#### Резервное копирование перед обновлением

Перед тем как приступать к обновлению системы, настоятельно рекомендуем выполнить резервное копирование (backup) файлов вашего сайта и базы данных. Это обязательный этап, который поможет избежать потери данных и обеспечить возможность восстановления сайта в случае любых непредвиденных обстоятельств во время обновления.

#### Как создать резервную копию с помощью FastPanel

1. **Создание резервной копии файлов сайта:**
   * Войдите в панель управления FastPanel.
   * Перейдите в раздел «Файловый менеджер».
   * Выделите папку с файлами вашего сайта и создайте архив (zip).
   * Скачайте созданный архив на свой компьютер.
2. **Создание резервной копии базы данных:**
   * В панели FastPanel перейдите в раздел «Базы данных».
   * Выберите нужную базу данных.
   * Нажмите на опцию экспорта (резервного копирования), чтобы получить файл SQL.
   * Сохраните скачанный файл SQL на ваш компьютер.

#### Что делать, если возникают сложности

Если вы не уверены, как правильно выполнить резервное копирование через панель FastPanel или столкнулись с трудностями, рекомендуем обратиться в службу технической поддержки вашего хостинга. Специалисты помогут вам разобраться и дадут необходимые рекомендации по процедуре создания резервных копий именно на вашем сервере.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Подготовка к обновлению

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

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

Перед обновлением системы до версии **10.0.8** рекомендуется удалить стандартный набор папок из директории поддомена вашего приложения (например, **app.ваш\_домен**).

### Frontend (основной домен, например, ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке основного сайта**</mark>**,** чтобы случайно не удалить файлы поддомена.

Удалите следующие папки из директории основного домена:

* dist
* logs

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

{% hint style="warning" %}

## Важно!

В панели управления FastPanel убедитесь, что вы находитесь именно в папке основного домена (test.ru), чтобы не затронуть другие сайты или поддомены.
{% endhint %}

### Backend (поддомен, например, app.ваш\_домен):

<mark style="color:red;">**Обязательно убедитесь, что вы находитесь в папке поддомена**</mark>**,** чтобы случайно не удалить файлы основной версии сайта.

Стандартный список папок, которые необходимо удалить:

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="danger" %}

## Важно!

**Не удаляйте папки public и storage —** в них хранятся важные пользовательские данные, медиафайлы, логи и пользовательские загрузки. Удаление этих папок может привести к потере данных, необходимых для работы приложения.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

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

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

{% stepper %}
{% step %}

### Авторизация на сервере

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

{% step %}

### Куда загружать архивы

Архивы обновления уже имеют понятные названия:

* iexexchanger\_<mark style="color:green;">**backend**</mark>\_update — для папки поддомена вашего сайта (например, app.ваш\_домен)
* iexexchanger\_<mark style="color:green;">**frontend**</mark>\_update — для корневой папки основного сайта (например, ваш\_домен)

| Архив обновления | Куда загружать?                | Пример пути        |
| ---------------- | ------------------------------ | ------------------ |
| **backend**      | Папка поддомена                | `www/app.test.com` |
| **frontend**     | Корневая папка основного сайта | `www/test.com`     |

**Внимание!** Проверьте, что находитесь именно в нужной папке, чтобы не затронуть лишние данные на сервере.
{% endstep %}

{% step %}

### Как загрузить архивы

Выберите удобный для вас способ:

* Файловый менеджер в панели управления хостингом (например, FastPanel)
* FTP-клиент (например, FileZilla)

Загрузите соответствующий архив в нужную папку — как указано выше.
{% endstep %}

{% step %}

### Распаковка архивов

* Найдите загруженный архив в выбранной папке.
* Распакуйте архив прямо в эту папку.
* Если система спросит, нужно ли заменить существующие файлы — подтверждайте замену.

<mark style="color:red;">**Это нормально:**</mark> обновление заменяет устаревшие файлы на новые.
{% endstep %}

{% step %}

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

* Проверьте, что новые файлы появились на сервере.
* Откройте сайт в браузере и убедитесь, что он работает корректно.
* При необходимости очистите кэш сайта и браузера.
  {% endstep %}
  {% endstepper %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

{% hint style="info" %}

## Важные рекомендации

* Никогда не удаляйте папки **public** и **storage**!

  В них хранятся все пользовательские данные, медиафайлы, документы.

  Удаление этих папок приведёт к потере важной информации!
* Работайте только в папке нужного домена или поддомена.

  Не перепутайте основной сайт и поддомен, чтобы не нарушить работу сайта.
  {% endhint %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan product:apply-update
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>


# Обновление до 10.0.6

{% hint style="info" %}
Для ознакомления с полным списком изменений в версии iEXExchanger 10.0.6, [перейдите по ссылке](https://iexexchanger.com/news/updates/vysla-novaia-versiia-iexexchanger-1005)
{% endhint %}

{% hint style="danger" %}

#### Резервное копирование перед обновлением

Перед тем как приступать к обновлению системы, настоятельно рекомендуем выполнить резервное копирование (backup) файлов вашего сайта и базы данных. Это обязательный этап, который поможет избежать потери данных и обеспечить возможность восстановления сайта в случае любых непредвиденных обстоятельств во время обновления.

#### Как создать резервную копию с помощью FastPanel

1. **Создание резервной копии файлов сайта:**
   * Войдите в панель управления FastPanel.
   * Перейдите в раздел «Файловый менеджер».
   * Выделите папку с файлами вашего сайта и создайте архив (zip).
   * Скачайте созданный архив на свой компьютер.
2. **Создание резервной копии базы данных:**
   * В панели FastPanel перейдите в раздел «Базы данных».
   * Выберите нужную базу данных.
   * Нажмите на опцию экспорта (резервного копирования), чтобы получить файл SQL.
   * Сохраните скачанный файл SQL на ваш компьютер.

#### Что делать, если возникают сложности

Если вы не уверены, как правильно выполнить резервное копирование через панель FastPanel или столкнулись с трудностями, рекомендуем обратиться в службу технической поддержки вашего хостинга. Специалисты помогут вам разобраться и дадут необходимые рекомендации по процедуре создания резервных копий именно на вашем сервере.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

## Подготовка к обновлению

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

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

Перед обновлением до версии **10.0.6**, на сервере необходимо удалить следующие папки из директории поддомена вашего приложения (app.<mark style="color:red;">ваш\_домен</mark>):

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="info" %}

## Важно

Убедитесь, что вы находитесь именно в папке поддомена (app.<mark style="color:red;">ваш\_домен</mark>), чтобы случайно не удалить файлы основной версии сайта.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

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

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

#### Шаг 1. Авторизуйтесь на сервере

Загружайте файлы только от имени специального пользователя вашего сайта (<mark style="color:red;">НЕ используйте пользователя root</mark>).

#### Шаг 2. Выберите папку для загрузки

* **Для backend (поддомен):** архив обновления загружайте в папку поддомена (например, app.ваш\_домен).
* **Для frontend (основной домен)**: архив обновления загружайте в папку основного сайта (ваш\_домен).

#### Примеры:

| Архив обновления | Куда загружать?                       | Пример пути        |
| ---------------- | ------------------------------------- | ------------------ |
| **backend**      | Папка поддомена вашего сайта          | `www/app.test.com` |
| **frontend**     | Корневая папка вашего основного сайта | `www/test.com`     |

#### Шаг 3. Способы загрузки файлов

Выберите удобный для вас способ:

* Встроенный файловый менеджер панели управления
* FTP-клиент (например, FileZilla)

#### Шаг 4. Распаковка архивов

После загрузки архивов:

* Распакуйте архивы прямо в тех папках, куда они были загружены.
* При распаковке подтвердите замену существующих файлов.

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

Обязательно убедитесь, что файлы успешно заменены и доступны на сервере.

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan product:apply-update
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>


# Обновление до 10.0.5

{% hint style="info" %}
Для ознакомления с полным списком изменений в версии iEXExchanger 10.0.5, [перейдите по ссылке](https://iexexchanger.com/news/updates/vysla-novaia-versiia-iexexchanger-1005)
{% endhint %}

{% hint style="danger" %}

#### Резервное копирование перед обновлением

Перед тем как приступать к обновлению системы, настоятельно рекомендуем выполнить резервное копирование (backup) файлов вашего сайта и базы данных. Это обязательный этап, который поможет избежать потери данных и обеспечить возможность восстановления сайта в случае любых непредвиденных обстоятельств во время обновления.

#### Как создать резервную копию с помощью FastPanel

1. **Создание резервной копии файлов сайта:**
   * Войдите в панель управления FastPanel.
   * Перейдите в раздел «Файловый менеджер».
   * Выделите папку с файлами вашего сайта и создайте архив (zip).
   * Скачайте созданный архив на свой компьютер.
2. **Создание резервной копии базы данных:**
   * В панели FastPanel перейдите в раздел «Базы данных».
   * Выберите нужную базу данных.
   * Нажмите на опцию экспорта (резервного копирования), чтобы получить файл SQL.
   * Сохраните скачанный файл SQL на ваш компьютер.

#### Что делать, если возникают сложности

Если вы не уверены, как правильно выполнить резервное копирование через панель FastPanel или столкнулись с трудностями, рекомендуем обратиться в службу технической поддержки вашего хостинга. Специалисты помогут вам разобраться и дадут необходимые рекомендации по процедуре создания резервных копий именно на вашем сервере.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

## Подготовка к обновлению

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

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

Перед обновлением до версии **10.0.4**, на сервере необходимо удалить следующие папки из директории поддомена вашего приложения (app.<mark style="color:red;">ваш\_домен</mark>):

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="info" %}

## Важно

Убедитесь, что вы находитесь именно в папке поддомена (app.<mark style="color:red;">ваш\_домен</mark>), чтобы случайно не удалить файлы основной версии сайта.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

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

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

#### Шаг 1. Авторизуйтесь на сервере

Загружайте файлы только от имени специального пользователя вашего сайта (<mark style="color:red;">НЕ используйте пользователя root</mark>).

#### Шаг 2. Выберите папку для загрузки

* **Для backend (поддомен):** архив обновления загружайте в папку поддомена (например, app.ваш\_домен).
* **Для frontend (основной домен)**: архив обновления загружайте в папку основного сайта (ваш\_домен).

#### Примеры:

| Архив обновления | Куда загружать?                       | Пример пути             |
| ---------------- | ------------------------------------- | ----------------------- |
| **backend**      | Папка поддомена вашего сайта          | `/var/www/app.test.com` |
| **frontend**     | Корневая папка вашего основного сайта | `/var/www/test.com`     |

#### Шаг 3. Способы загрузки файлов

Выберите удобный для вас способ:

* Встроенный файловый менеджер панели управления
* FTP-клиент (например, FileZilla)

#### Шаг 4. Распаковка архивов

После загрузки архивов:

* Распакуйте архивы прямо в тех папках, куда они были загружены.
* При распаковке подтвердите замену существующих файлов.

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

Обязательно убедитесь, что файлы успешно заменены и доступны на сервере.

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan product:apply-update
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>


# Обновление до 10.0.3/4

{% hint style="info" %}
Для ознакомления с полным списком изменений в версиях

* iEXExchanger 10.0.3, [перейдите по ссылке](https://docs.iexexchanger.com/releases/izmeneniya-v-10.0.3)
* iEXExchanger 10.0.4, [перейдите по ссылке](https://docs.iexexchanger.com/releases/izmeneniya-v-10.0.4)
  {% endhint %}

Поддержка Telegram Mini App

{% content-ref url="/spaces/LTlg7o2JZCIoPVvMc1rY/pages/ZvXTG6vShiqJP3Tw4GVX" %}
[Обновление 1.0](/telegram-app/istoriya-versii/obnovlenie-1.0)
{% endcontent-ref %}

{% hint style="danger" %}

#### Резервное копирование перед обновлением

Перед тем как приступать к обновлению системы, настоятельно рекомендуем выполнить резервное копирование (backup) файлов вашего сайта и базы данных. Это обязательный этап, который поможет избежать потери данных и обеспечить возможность восстановления сайта в случае любых непредвиденных обстоятельств во время обновления.

#### Как создать резервную копию с помощью FastPanel

1. **Создание резервной копии файлов сайта:**
   * Войдите в панель управления FastPanel.
   * Перейдите в раздел «Файловый менеджер».
   * Выделите папку с файлами вашего сайта и создайте архив (zip).
   * Скачайте созданный архив на свой компьютер.
2. **Создание резервной копии базы данных:**
   * В панели FastPanel перейдите в раздел «Базы данных».
   * Выберите нужную базу данных.
   * Нажмите на опцию экспорта (резервного копирования), чтобы получить файл SQL.
   * Сохраните скачанный файл SQL на ваш компьютер.

#### Что делать, если возникают сложности

Если вы не уверены, как правильно выполнить резервное копирование через панель FastPanel или столкнулись с трудностями, рекомендуем обратиться в службу технической поддержки вашего хостинга. Специалисты помогут вам разобраться и дадут необходимые рекомендации по процедуре создания резервных копий именно на вашем сервере.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

## Подготовка к обновлению

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

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

Перед обновлением до версии **10.0.3**, на сервере необходимо удалить следующие папки из директории поддомена вашего приложения (app.<mark style="color:red;">ваш\_домен</mark>):

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="info" %}

## Важно

Убедитесь, что вы находитесь именно в папке поддомена (app.<mark style="color:red;">ваш\_домен</mark>), чтобы случайно не удалить файлы основной версии сайта.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

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

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

#### Шаг 1. Авторизуйтесь на сервере

Загружайте файлы только от имени специального пользователя вашего сайта (<mark style="color:red;">НЕ используйте пользователя root</mark>).

#### Шаг 2. Выберите папку для загрузки

* **Для backend (поддомен):** архив обновления загружайте в папку поддомена (например, app.ваш\_домен).
* **Для frontend (основной домен)**: архив обновления загружайте в папку основного сайта (ваш\_домен).

#### Примеры:

| Архив обновления | Куда загружать?                       | Пример пути             |
| ---------------- | ------------------------------------- | ----------------------- |
| **backend**      | Папка поддомена вашего сайта          | `/var/www/app.test.com` |
| **frontend**     | Корневая папка вашего основного сайта | `/var/www/test.com`     |

#### Шаг 3. Способы загрузки файлов

Выберите удобный для вас способ:

* Встроенный файловый менеджер панели управления
* FTP-клиент (например, FileZilla)

#### Шаг 4. Распаковка архивов

После загрузки архивов:

* Распакуйте архивы прямо в тех папках, куда они были загружены.
* При распаковке подтвердите замену существующих файлов.

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

Обязательно убедитесь, что файлы успешно заменены и доступны на сервере.

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan product:apply-update
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>


# Обновление до 10.0.2

{% hint style="info" %}
Для ознакомления с полным списком изменений в версии iEXExchanger 10.0.2, [перейдите по ссылке](https://docs.iexexchanger.com/releases/versiya-10.x/izmeneniya-v-10.0.1-2)
{% endhint %}

{% hint style="danger" %}

#### Резервное копирование перед обновлением

Перед тем как приступать к обновлению системы, настоятельно рекомендуем выполнить резервное копирование (backup) файлов вашего сайта и базы данных. Это обязательный этап, который поможет избежать потери данных и обеспечить возможность восстановления сайта в случае любых непредвиденных обстоятельств во время обновления.

#### Как создать резервную копию с помощью FastPanel

1. **Создание резервной копии файлов сайта:**
   * Войдите в панель управления FastPanel.
   * Перейдите в раздел «Файловый менеджер».
   * Выделите папку с файлами вашего сайта и создайте архив (zip).
   * Скачайте созданный архив на свой компьютер.
2. **Создание резервной копии базы данных:**
   * В панели FastPanel перейдите в раздел «Базы данных».
   * Выберите нужную базу данных.
   * Нажмите на опцию экспорта (резервного копирования), чтобы получить файл SQL.
   * Сохраните скачанный файл SQL на ваш компьютер.

#### Что делать, если возникают сложности

Если вы не уверены, как правильно выполнить резервное копирование через панель FastPanel или столкнулись с трудностями, рекомендуем обратиться в службу технической поддержки вашего хостинга. Специалисты помогут вам разобраться и дадут необходимые рекомендации по процедуре создания резервных копий именно на вашем сервере.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

## Подготовка к обновлению

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

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

Перед обновлением до версии **10.0.2**, на сервере необходимо удалить следующие папки из директории поддомена вашего приложения (app.<mark style="color:red;">ваш\_домен</mark>):

* app
* bootstrap
* config
* database
* packages
* resources
* routes
* vendor

{% hint style="info" %}

## Важно

Убедитесь, что вы находитесь именно в папке поддомена (app.<mark style="color:red;">ваш\_домен</mark>), чтобы случайно не удалить файлы основной версии сайта.
{% endhint %}

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

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

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

{% content-ref url="/pages/hRveboCMLdgEj5kJTNoq" %}
[Broken mention](broken://pages/hRveboCMLdgEj5kJTNoq)
{% endcontent-ref %}

***

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

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

#### Шаг 1. Авторизуйтесь на сервере

Загружайте файлы только от имени специального пользователя вашего сайта (<mark style="color:red;">НЕ используйте пользователя root</mark>).

#### Шаг 2. Выберите папку для загрузки

* **Для backend (поддомен):** архив обновления загружайте в папку поддомена (например, app.ваш\_домен).
* **Для frontend (основной домен)**: архив обновления загружайте в папку основного сайта (ваш\_домен).

#### Примеры:

| Архив обновления | Куда загружать?                       | Пример пути             |
| ---------------- | ------------------------------------- | ----------------------- |
| **backend**      | Папка поддомена вашего сайта          | `/var/www/app.test.com` |
| **frontend**     | Корневая папка вашего основного сайта | `/var/www/test.com`     |

#### Шаг 3. Способы загрузки файлов

Выберите удобный для вас способ:

* Встроенный файловый менеджер панели управления
* FTP-клиент (например, FileZilla)

#### Шаг 4. Распаковка архивов

После загрузки архивов:

* Распакуйте архивы прямо в тех папках, куда они были загружены.
* При распаковке подтвердите замену существующих файлов.

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

Обязательно убедитесь, что файлы успешно заменены и доступны на сервере.

{% content-ref url="/pages/Qs1hiwajeXhU7MQo0zB9" %}
[Broken mention](broken://pages/Qs1hiwajeXhU7MQo0zB9)
{% endcontent-ref %}

***

## Завершение обновления системы

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

#### Шаг 1. Подключитесь к серверу через терминал (SSH)

Если вы не знаете, как это сделать, воспользуйтесь подсказкой:

<mark style="color:red;">Важно: подключайтесь от</mark> <mark style="color:red;"></mark><mark style="color:red;">**имени обычного пользователя**</mark><mark style="color:red;">, а не</mark> <mark style="color:red;"></mark><mark style="color:red;">**root**</mark><mark style="color:red;">.</mark>

{% content-ref url="/pages/vnxh4CdTILQ5G7Sfyf0d" %}
[Broken mention](broken://pages/vnxh4CdTILQ5G7Sfyf0d)
{% endcontent-ref %}

#### Шаг 2. Перейдите в папку поддомена на сервере

Введите команду (замените путь на актуальный путь до вашего сайта и поддомена):

```bash
cd www/app.ваш_домен
```

#### Шаг 3. Выполните команду для применения обновления

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

```
php artisan product:apply-update
```

{% hint style="warning" %}
**Важно:** если при выполнении этой команды вы увидели любые предупреждения, ошибки или сообщения об отказе доступа (например, проблемы с правами на файлы или ошибки зависимостей), выполните команду повторно.\
\
Повторный запуск поможет устранить временные конфликты или неполные изменения, которые могли возникнуть при первом запуске. Если после повторного запуска ошибки сохраняются, обратитесь за технической поддержкой.
{% endhint %}

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

{% hint style="danger" %}

#### ВАЖНОЕ ДЕЙСТВИЕ ПОСЛЕ ОБНОВЛЕНИЯ

После завершения обновления:

1. Удалите из корневой папки сайта все ранее загруженные ZIP-архивы обновлений.

   Это предотвратит случайное повторное применение устаревших файлов.
2. Перезагрузите сервер, чтобы изменения полностью вступили в силу
   {% endhint %}

<mark style="color:green;">**Обновление успешно завершено!**</mark>


# Переход на 10.0.0 (с 9.x)

{% hint style="warning" %}

## Важное системное обновление: требуется переустановка

Если у вас установлена версия **9.2.2,** при переходе на новую версию потребуется **полная переустановка** обменника. Это связано с **масштабными изменениями** в структуре и логике работы системы.

**Основные изменения:**

* Новый модуль парсинга курсов
* Обновлённый калькулятор с переработанной логикой
* Повышенная производительность и устойчивость
* Изменения в конфигурации и требованиях к серверу
* Разделение проекта на две части:
* **Основной домен —** только для клиентской части (обмен)
* **Поддомен —** для админ-панели и API

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

**Что необходимо сделать:**

1. Выполнить переустановку обменника
2. Настроить основной домен и поддомен по новой структуре
3. После установки — проверить работу интерфейса и функциональности

<mark style="color:red;">**❗ Важно: поведение системы после обновления может отличаться от прежней версии — это связано с внутренними архитектурными изменениями.**</mark>

Внизу страницы вы найдёте инструкцию по созданию резервной копии сайта и базы данных перед обновлением.

Мы настоятельно рекомендуем выполнить резервное копирование перед началом любых действий.<br>

***Если потребуется помощь —** обратитесь в техническую поддержку. Мы подскажем, как правильно перейти на новую версию.*
{% endhint %}

{% hint style="danger" %}

## Резервное копирование перед обновлением

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

**Что нужно сохранить:**

* Все файлы сайта (включая публичную часть, конфигурации, .env и другие важные директории)
* Базу данных MySQL, связанную с сайтом

**Как сделать резервную копию:**

**🔹 Через FastPanel:**

* В разделе **«Файловый менеджер»** скачайте директорию сайта
* В разделе **«Базы данных»** выберите нужную базу и выполните экспорт в формате .sql

**🔹 Через FTP и phpMyAdmin:**

* Скачайте все файлы сайта через FTP (например, FileZilla)
* В phpMyAdmin выберите базу данных → вкладка «Экспорт»

\
*Либо **обратитесь в техническую поддержку** — они могут создать резервную копию за вас.*

**💡 Рекомендация:** храните резервные копии локально (на компьютере или в облаке) — это поможет быстро восстановить сайт в случае непредвиденных ошибок.
{% endhint %}

{% content-ref url="/spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO" %}
[Broken mention](broken://spaces/BKBngbC2uqpFyMskVn39/pages/4P0gTZJnutJcTi7U9FdO)
{% endcontent-ref %}

***

## Ознакомьтесь со списком изменений новой версии

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

#### Почему важно ознакомиться со списком изменений?

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

{% hint style="warning" %}

## Внимание

Если вы начнёте обновление, не ознакомившись с изменениями, это может привести к неожиданным результатам или дополнительным сложностям в работе после установки новой версии.
{% endhint %}

{% content-ref url="/pages/60mSj15UXeVxnuNiz5n3" %}
[Broken mention](broken://pages/60mSj15UXeVxnuNiz5n3)
{% endcontent-ref %}

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

***

## Проверьте готовность к обновлению

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

Пожалуйста, внимательно проверьте каждый пункт ниже, чтобы гарантировать, что процесс переустановки пройдёт гладко и без ошибок. Если какой-либо из пунктов вызывает сомнение или вопросы — рекомендуем обратиться в техническую поддержку перед началом установки.

### Шаг 1: Подготовка и переход на новый сервис

Новая версия **iEXExchanger** построена на принципиально новой архитектуре. Это означает, что текущий обменник версии **9.2.2** будет полностью заменён.

**Проверьте, что:**

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

**Итого:** вы полностью готовы перейти на новый сервис обменника.

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

### Шаг 2: Подготовка поддомена и DNS-записей

В новой версии сайт будет разделён на две логические части для повышения безопасности, скорости и удобства управления.

* **Основной домен (ваш\_домен)** — клиентская часть обменника.
* **Поддомен (app.ваш\_домен)** — административная панель и API.

На текущем этапе вам нужно убедиться, что:

* Поддомен (**app.**<mark style="color:red;">**ваш\_домен**</mark>) уже добавлен в DNS через Cloudflare.
* DNS-записи для поддомена и основного домена корректно настроены и указывают на ваш сервер.

**Итого:** DNS полностью настроен, и поддомен готов к дальнейшему использованию.

### Шаг 3: Проверка резервных копий

Обязательно убедитесь, что у вас созданы резервные копии:

* Резервная копия файлов сайта сохранена.
* Резервная копия базы данных MySQL сохранена.
* Вы проверили, что резервные копии доступны и корректны.

**Итого:** резервные копии созданы и надёжно сохранены.

{% hint style="warning" %}
Подробная инструкция по созданию резервных копий находится выше на этой странице.
{% endhint %}

### Шаг 4: Ознакомление с инструкцией по установке

Перед началом установки убедитесь, что вы изучили инструкцию на следующем шаге:

* Вы прочитали инструкцию по установке новой версии.
* Сервер соответствует указанным системным требованиям.
* Доступы к серверу и панели управления подготовлены.

Если у вас есть вопросы по установке — обратитесь в техническую поддержку.

**Итого:** вы знаете и понимаете процесс установки новой версии.

### Шаг 5: Настройки .env

Проверьте ваш .env файл

```
API_URL=https://app.ваш_домен

CORS_ALLOWED_ORIGINS=https://ваш_домен,https://app.ваш_домен
FRONTEND_URL=https://ваш_домен
CORS_SUPPORTS_CREDENTIALS=true

SESSION_DRIVER=database
SESSION_DOMAIN=.ваш_домен
SANCTUM_STATEFUL_DOMAINS=https://app.ваш_домен
SESSION_SECURE_COOKIE=false

REDIS_CLIENT=phpredis
```

### Шаг 6: Восстановить проект из backup на новом сервере

После создания нового сервера:

1. Загрузите архив backup на сервер и распакуйте его в поддомене.
2. После распаковки удалите все папки и файлы, кроме папок **public** и **storage**.
3. Затем загрузите новую версию проекта и разместите её рядом с оставшимися папками **public** и **storage**.
4. После этого восстановите базу данных из файла резервной копии — обычно это файл с названием вроде backup.sql. Его нужно импортировать в новую базу данных через панель управления сервером (например, phpMyAdmin).

### Финальный шаг: Начало установки

Теперь вы полностью готовы перейти к установке новой версии обменника:

{% content-ref url="/pages/9Gj8u2DM0tadJlJ3aL7F" %}
[Broken mention](broken://pages/9Gj8u2DM0tadJlJ3aL7F)
{% endcontent-ref %}

{% hint style="danger" %}

## Внимание

Если после завершения установки ваша конфигурация не загрузилась, перенесите файл `/storage/iex-config.json` в папку **`/storage/app`** на сервере.
{% endhint %}

## Нужна помощь?

Если возникли сложности или вопросы по любому из шагов, свяжитесь с технической поддержкой. Мы поможем вам пройти установку максимально комфортно и безопасно.


# Работа с PostgreSQL


# Подключение PostgreSQL

Эта инструкция описывает установку PostgreSQL 18 на сервер с Debian 12, подключение сервера базы данных к FASTPANEL, включение поддержки PostgreSQL в PHP 8.4 и создание отдельных баз для iEXExchanger.

Инструкция подходит для двух сценариев:

* первоначальная установка iEXExchanger на новый сервер;
* подготовка PostgreSQL перед переносом существующего проекта.

В обоих случаях PostgreSQL устанавливается и подключается одинаково. Первоначальная установка системы и перенос данных выполняются по отдельным инструкциям.

{% prompt description="Промпт для выполнения настройки" icon="bolt" %}

```markdown
Подготовь и подключи PostgreSQL 18 к iEXExchanger на сервере с Debian 12, FASTPANEL и PHP 8.4.

Твоя задача ограничивается установкой PostgreSQL, его подключением к FASTPANEL, включением PHP-драйверов, созданием баз и проверкой соединения.

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

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

1. Изучи текущее состояние сервера.
2. Найди Backend-проект iEXExchanger и его корневую директорию с файлом artisan.
3. Определи пользователя Backend-сайта в FASTPANEL.
4. Проверь наличие установщика:

scripts/install-postgresql18-fastpanel.sh

5. Проверь версию Debian, PHP и уже установленные кластеры PostgreSQL.
6. Если на сервере уже работает PostgreSQL, не изменяй и не удаляй существующие кластеры без отдельного разрешения.
7. Не выводи пароли и токены в итоговом отчёте.

Путь к Backend обычно выглядит так:

/var/www/ВЛАДЕЛЕЦ_САЙТА/data/www/app.ВАШ_ДОМЕН

Требования к установке

- PostgreSQL 18 необходимо установить через скрипт:

bash scripts/install-postgresql18-fastpanel.sh

- Запускай скрипт из корневой директории Backend.
- PostgreSQL должен принимать подключения только через:

127.0.0.1
::1

- Не открывай порт 5432 в публичном firewall.
- Используй фактический порт, который определит установщик.
- Не устанавливай PostgreSQL 17 через раздел «Приложения» FASTPANEL.
- Не назначай PostgreSQL сервером баз данных по умолчанию.
- Не используй Linux-пароль root как пароль PostgreSQL.

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

psql --version
pg_dump --version
pg_lsclusters
systemctl is-active postgresql@18-main
pg_isready -h 127.0.0.1 -p 5432

Проверь прослушиваемые адреса:

ss -ltnp | grep -E ':(5432|5433|5434|5435)\b'

Нормально, если PostgreSQL слушает только:

127.0.0.1
::1

Если PostgreSQL слушает 0.0.0.0 или публичный IP, остановись и исправь конфигурацию до продолжения.

FASTPANEL

Установщик создаёт административную роль fastuser и сохраняет реквизиты в файле:

/root/postgresql18-installer/fastpanel-postgresql18.credentials

Используй эту роль только для подключения PostgreSQL к FASTPANEL.

Параметры сервера:

Имя: PostgreSQL 18 local
Использовать сервер по умолчанию: Нет
Тип сервера: PostgreSQL
Тип подключения: Локальное
Имя пользователя: fastuser
Пароль: из защищённого файла установщика
Хост: автоматически
Порт: автоматически

Не используй fastuser в конфигурации iEXExchanger.

Если у тебя нет доступа к интерфейсу FASTPANEL, не создавай обходную конфигурацию. Подготовь точные значения для формы и сообщи, какой шаг должен выполнить владелец через панель.

PHP 8.4

Проверь и включи для PHP 8.4 модули:

pdo_pgsql
pgsql

Проверь:

/opt/php84/bin/php --ri pdo_pgsql
/opt/php84/bin/php --ri pgsql
/opt/php84/sbin/php-fpm -t
systemctl is-active fp2-php84-fpm

Убедись, что Backend-сайт использует PHP 8.4.

Основная база

Создай через FASTPANEL отдельную PostgreSQL-базу для Backend.

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

Пример для app.example.com:

Database: app_example_com_pg
Username: app_example_com_pg
Encoding: utf8
Server: PostgreSQL 18 local
Owner: владелец Backend-сайта в FASTPANEL
Password: отдельный случайный пароль

Используй в имени только:

- строчные латинские буквы;
- цифры;
- символ подчёркивания.

Не используй дефисы, пробелы, кириллицу и специальные символы.

Laravel Pulse

Если проект использует Laravel Pulse, создай отдельную базу:

Database: pulse_pg
Username: pulse_pg
Encoding: utf8
Server: PostgreSQL 18 local
Owner: тот же владелец Backend-сайта
Password: отдельный случайный пароль

Пароль pulse_pg не должен совпадать с паролем основной базы.

Проверка подключения

Проверь подключение к основной базе через psql:

psql \
  --host=127.0.0.1 \
  --port=5432 \
  --username=ИМЯ_ПОЛЬЗОВАТЕЛЯ \
  --dbname=ИМЯ_БАЗЫ

Выполни:

SELECT
    current_database(),
    current_user,
    current_setting('server_version'),
    current_setting('server_encoding');

Если используется Pulse, выполни такую же проверку для pulse_pg.

Сразу после создания проверь отсутствие таблиц командой:

\dt

Для новой базы ожидается:

Did not find any relations.

Запрещённые действия

Не выполняй:

php artisan migrate
php artisan product-updates:run

Не выполняй также:

- миграцию из MySQL;
- импорт SQL;
- ручное создание таблиц;
- перенос данных;
- удаление существующих баз;
- изменение рабочего DB_CONNECTION;
- переключение рабочего .env;
- подключение сторонних приложений к новым базам;
- открытие PostgreSQL в интернет.

Эта задача заканчивается после создания баз и успешной проверки соединения.

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

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

Итоговый отчёт

После завершения сообщи:

1. установленную версию PostgreSQL;
2. имя и статус кластера;
3. фактический порт;
4. адреса, на которых PostgreSQL принимает соединения;
5. состояние pdo_pgsql и pgsql;
6. статус PostgreSQL в FASTPANEL;
7. имя основной базы и пользователя;
8. создана ли база pulse_pg;
9. успешно ли выполнено подключение через psql;
10. отсутствуют ли таблицы в новых базах;
11. какие действия должен выполнить владелец вручную.

Не показывай пароли в отчёте. Вместо них укажи:

Пароль создан и сохранён в защищённом месте.
```

{% endprompt %}

### Что будет настроено

После выполнения инструкции:

* PostgreSQL 18 будет установлен на сервер;
* будет создан локальный кластер `18/main`;
* PostgreSQL будет принимать только локальные подключения;
* FASTPANEL получит административную роль `fastuser`;
* PostgreSQL появится в списке серверов баз данных FASTPANEL;
* в PHP 8.4 будут включены модули `pdo_pgsql` и `pgsql`;
* для Backend будет создана отдельная база;
* для Laravel Pulse при необходимости будет создана база `pulse_pg`;
* для каждой базы будет создан отдельный пользователь;
* подключение будет проверено через `psql`.

PostgreSQL поддерживает Debian 12 Bookworm через официальный PGDG-репозиторий, из которого можно установить пакет `postgresql-18`. [Официальная инструкция PostgreSQL для Debian](https://www.postgresql.org/download/linux/debian/)

На момент подготовки документа в разделе приложений FASTPANEL доступны версии PostgreSQL до 17. Поэтому PostgreSQL 18 устанавливается отдельным скриптом, после чего подключается к панели как локальный сервер баз данных. [Список приложений FASTPANEL](https://kb.fastpanel.direct/applications/)

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

Убедитесь, что выполнены следующие условия:

* используется Debian 12 Bookworm;
* FASTPANEL установлена и работает;
* PHP 8.4 установлен через FASTPANEL;
* Backend iEXExchanger загружен на сервер;
* у вас есть доступ к серверу по SSH;
* доступен пользователь `root`;
* сервер может подключаться к `apt.postgresql.org`;
* в папке `scripts` Backend-проекта находится установщик PostgreSQL.

Файл установщика:

```
scripts/install-postgresql18-fastpanel.sh
```

### Важные ограничения

При настройке соблюдайте следующие правила:

* не устанавливайте PostgreSQL 17 через раздел «Приложения»;
* не открывайте порт PostgreSQL в публичном firewall;
* не используйте пароль Linux-пользователя `root` в настройках PostgreSQL;
* не используйте административную роль `fastuser` в iEXExchanger;
* не назначайте PostgreSQL сервером баз данных по умолчанию в FASTPANEL;
* используйте отдельного пользователя для каждой базы;
* храните пароли баз данных в защищённом месте.

***

## Подключение к серверу

Подключитесь к серверу от имени пользователя `root`:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```bash
ssh root@SERVER_IP
```

Вместо `SERVER_IP` укажите IP-адрес сервера.

## Переход в Backend-проект

Перейдите в корневую директорию Backend, где находится файл `artisan`.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

Пример:

```bash
cd /var/www/ВЛАДЕЛЕЦ_САЙТА/data/www/app.ВАШ_ДОМЕН
```

Например:

```bash
cd /var/www/example_com_usr/data/www/app.example.com
```

Проверьте наличие установщика:

```bash
ls -la scripts/install-postgresql18-fastpanel.sh
```

Если файл отображается, можно продолжать установку.

При необходимости установите право на выполнение:

```bash
chmod 0755 scripts/install-postgresql18-fastpanel.sh
```

## Установка PostgreSQL 18

Находясь в корневой директории Backend, запустите:

```bash
bash scripts/install-postgresql18-fastpanel.sh
```

Скрипт автоматически:

* проверит версию операционной системы;
* проверит запуск от `root`;
* проверит состояние `apt` и `dpkg`;
* подключит официальный PGDG-репозиторий;
* установит `postgresql-18`;
* установит `postgresql-client-18`;
* создаст или обнаружит кластер `18/main`;
* настроит кодировку `UTF8`;
* включит контрольные суммы данных;
* настроит SCRAM-аутентификацию;
* ограничит подключения адресами `127.0.0.1` и `::1`;
* создаст административную роль `fastuser`;
* сгенерирует пароль для `fastuser`;
* проверит основные возможности PostgreSQL;
* удалит созданную для проверки тестовую базу;
* сохранит реквизиты в защищённый файл;
* выведет параметры подключения для FASTPANEL.

При стандартной установке PostgreSQL будет работать со следующими параметрами:

```
Host: 127.0.0.1
Port: 5432
Database: postgres
```

Если на сервере уже работает другой кластер PostgreSQL, порт может отличаться. Используйте значение, которое покажет установщик.

## Результат выполнения установщика

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

```
============================================================
POSTGRESQL 18 ГОТОВ
============================================================
Версия:              18.x
Кластер:             18/main
Host:                127.0.0.1
Port:                5432
Database:            postgres
Username:            fastuser
Password:            СГЕНЕРИРОВАННЫЙ_ПАРОЛЬ
Файл реквизитов:     /root/postgresql18-installer/fastpanel-postgresql18.credentials
============================================================

Поля FASTPANEL:
  Имя:               PostgreSQL 18 local
  По умолчанию:      не включать
  Тип сервера:       PostgreSQL
  Подключение:       Локальное
  Имя пользователя:  fastuser
  Пароль:            СГЕНЕРИРОВАННЫЙ_ПАРОЛЬ
  Хост/порт в форме: оставить автоматическими
```

Реквизиты сохраняются в файле:

```
/root/postgresql18-installer/fastpanel-postgresql18.credentials
```

Посмотреть содержимое можно только от пользователя `root`:

```bash
cat /root/postgresql18-installer/fastpanel-postgresql18.credentials
```

Ожидаемый формат:

```
name=PostgreSQL 18 local
type=PostgreSQL
connection=Local
host=127.0.0.1
port=5432
database=postgres
username=fastuser
password=СГЕНЕРИРОВАННЫЙ_ПАРОЛЬ
```

Файл защищён следующими правами:

```
Владелец: root
Группа: root
Права: 0600
```

Не копируйте его:

* в директорию сайта;
* в публичную папку;
* в Git-репозиторий;
* в общедоступное облачное хранилище;
* в переписку с сотрудниками.

## Проверка PostgreSQL

Проверьте установленную версию:

```bash
psql --version
```

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

```bash
pg_dump --version
```

Проверьте состояние кластеров:

```bash
pg_lsclusters
```

Проверьте системную службу:

```bash
systemctl is-active postgresql@18-main
```

Проверьте готовность принимать подключения:

```bash
pg_isready -h 127.0.0.1 -p 5432
```

Ожидаемый результат:

```
18/main    5432    online
127.0.0.1:5432 - accepting connections
```

Если установщик показал другой порт, используйте его вместо `5432`.

## Проверка сетевой доступности

PostgreSQL должен принимать подключения только внутри сервера.

Выполните:

```bash
ss -ltnp | grep -E ':(5432|5433|5434|5435)\b'
```

Нормальный результат содержит локальные адреса:

```
127.0.0.1:5432
[::1]:5432
```

Если отображается:

```
0.0.0.0:5432
```

или публичный IP сервера, не продолжайте настройку. Сначала закройте внешний доступ.

**Важно.** Для локального размещения iEXExchanger порт PostgreSQL не нужно открывать в интернете.

## Повторная проверка установщиком

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

```bash
bash scripts/install-postgresql18-fastpanel.sh --check
```

Команда проверяет:

* версию PostgreSQL;
* кластер;
* локальное подключение;
* административную роль;
* доступность необходимых компонентов;
* PHP-модули, если они уже включены.

Обычная проверка не меняет пароль `fastuser`.

## Смена пароля fastuser

Для принудительной смены пароля выполните:

```bash
bash scripts/install-postgresql18-fastpanel.sh --rotate-password
```

После смены обязательно обновите пароль в настройках сервера баз данных FASTPANEL.

Если в FASTPANEL останется старый пароль, сервер получит статус «Недоступен».

***

## Включение PostgreSQL в PHP 8.4

Для подключения iEXExchanger к PostgreSQL необходимо включить соответствующие PHP-модули.

FASTPANEL позволяет управлять модулями отдельно для каждой установленной версии PHP. [Настройка PHP и модулей в FASTPANEL](https://kb.fastpanel.direct/php/settings/)

{% stepper %}
{% step %}

### Где находятся модули

В FASTPANEL откройте: **«Управление» — «PHP»**

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

Затем:

1. выберите PHP 8.4;
2. откройте управление модулями;
3. найдите `pdo_pgsql`;
4. найдите `pgsql`;
5. включите оба модуля;
6. сохраните изменения.

Убедитесь, что Backend-сайт также использует PHP 8.4.
{% endstep %}

{% step %}

### Для чего нужны модули

<table><thead><tr><th width="192.640625">Модуль</th><th>Для чего используется</th></tr></thead><tbody><tr><td><code>pdo_pgsql</code></td><td>Подключение Laravel к PostgreSQL через PDO</td></tr><tr><td><code>pgsql</code></td><td>Нативные функции PostgreSQL в PHP</td></tr></tbody></table>

Для Laravel основным является `pdo_pgsql`, но рекомендуется включить оба модуля.
{% endstep %}

{% step %}

###

### Проверка PHP-модулей

Выполните:

```bash
/opt/php84/bin/php -r 'echo json_encode([
    "pdo_pgsql" => extension_loaded("pdo_pgsql"),
    "pgsql" => extension_loaded("pgsql"),
    "pdo_drivers" => PDO::getAvailableDrivers(),
]), PHP_EOL;'
```

Ожидаемый результат:

```json
{"pdo_pgsql":true,"pgsql":true,"pdo_drivers":["sqlite","mysql","pgsql"]}
```

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

```
pgsql
```

Дополнительная проверка:

```bash
/opt/php84/bin/php --ri pdo_pgsql
```

```bash
/opt/php84/bin/php --ri pgsql
```

```bash
/opt/php84/sbin/php-fpm -t
```

```bash
systemctl is-active fp2-php84-fpm
```

Ожидаемый статус:

```
active
```

Если установщик сообщил:

```
В PHP 8.4 не включены pdo_pgsql и/или pgsql
```

PostgreSQL мог быть установлен правильно. Включите модули через FASTPANEL и снова выполните:

```bash
bash scripts/install-postgresql18-fastpanel.sh --check
```

{% endstep %}
{% endstepper %}

***

## Добавление PostgreSQL 18 в FASTPANEL

FASTPANEL умеет управлять локальными и внешними серверами баз данных. После подключения PostgreSQL можно выбирать при создании новых баз. [Управление серверами баз данных FASTPANEL](https://kb.fastpanel.direct/databases/database-servers-management/)

### Где находится раздел

В FASTPANEL откройте: **«Управление» — «Базы данных»**

Затем откройте: **«Серверы баз данных»**

<figure><img src="/files/8j1jzVwZtBjAfkXQrnuo" alt=""><figcaption></figcaption></figure>

Нажмите: **«Добавить сервер»**

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

Страница может иметь следующий адрес:

```
https://SERVER_IP:8888/databases/servers
```

### Заполнение формы

Укажите:

| Поле                             | Значение                        |
| -------------------------------- | ------------------------------- |
| Имя                              | `PostgreSQL 18 local`           |
| Использовать сервер по умолчанию | Нет                             |
| Тип сервера                      | `PostgreSQL`                    |
| Тип подключения                  | `Локальное`                     |
| Имя пользователя                 | `fastuser`                      |
| Пароль                           | Пароль из файла реквизитов      |
| Хост                             | Оставить автоматическим         |
| Порт                             | Оставить `0` или автоматическим |

Нажмите **«Сохранить»**.

{% hint style="info" %}

### Почему сервер не нужно выбирать по умолчанию

PostgreSQL 18 подключается как отдельный сервер баз данных для конкретных проектов.

Используйте значение:

```
Использовать сервер по умолчанию: Нет
```

При создании базы выбирайте `PostgreSQL 18 local` вручную.
{% endhint %}

## Проверка сервера в FASTPANEL

Вернитесь в раздел: **«Управление» — «Базы данных»**

Откройте: **«Серверы баз данных»**

<figure><img src="/files/8qH8ugy7jsJqrfKpl1mn" alt=""><figcaption></figcaption></figure>

У добавленной записи должно отображаться:

```
PostgreSQL 18 local
Статус: Доступен
```

Не создавайте базы, пока сервер не получил статус «Доступен».

### Проверка через CLI

Выполните:

```bash
mogwai databases servers list
```

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

```
TYPE: postgresql
LOCAL: true
USERNAME: fastuser
AVAIL: true
```

FASTPANEL поддерживает просмотр серверов и синхронизацию списка баз через `mogwai`. [Команды управления базами FASTPANEL](https://kb.fastpanel.direct/cli/databases/)

При необходимости выполните:

```bash
mogwai databases sync
```

## Какие пользователи используются

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

<table><thead><tr><th width="245.86328125">Учётная запись</th><th>Назначение</th></tr></thead><tbody><tr><td><code>fastuser</code></td><td>Административная роль PostgreSQL для FASTPANEL</td></tr><tr><td><code>example_com_usr</code></td><td>Владелец Backend-сайта в FASTPANEL и Linux</td></tr><tr><td><code>app_example_com_pg</code></td><td>Пользователь основной базы iEXExchanger</td></tr><tr><td><code>pulse_pg</code></td><td>Пользователь базы Laravel Pulse</td></tr></tbody></table>

{% stepper %}
{% step %}

### fastuser

Роль используется FASTPANEL для:

* создания баз;
* создания пользователей;
* управления PostgreSQL через панель.

Не используйте `fastuser` как пользователя iEXExchanger.
{% endstep %}

{% step %}

### Владелец сайта

Поле «Владелец» в FASTPANEL относится к пользователю панели и Linux.

Пример:

```
example_com_usr
```

Это не логин PostgreSQL.
{% endstep %}

{% step %}

### Пользователь основной базы

Для основной базы создаётся отдельный пользователь.

Пример:

```
app_example_com_pg
```

{% endstep %}

{% step %}

### Пользователь Pulse

Для базы Laravel Pulse используется отдельный пользователь:

```
pulse_pg
```

{% endstep %}
{% endstepper %}

***

## Создание основной базы

FASTPANEL позволяет создать базу, назначить владельца, связать её с сайтом и выбрать сервер. [Создание базы данных в FASTPANEL](https://kb.fastpanel.direct/databases/create-database/)

### Где находится раздел

В FASTPANEL откройте: **«Сайты»**

Выберите Backend-сайт:

```
app.ваш_домен
```

Откройте раздел:**«Базы данных»**

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

Нажмите:**«Новая база данных»**

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

### Заполнение формы

Пример для сайта `app.example.com`:

| Поле             | Значение                                           |
| ---------------- | -------------------------------------------------- |
| Имя              | `app_example_com_pg`                               |
| Кодировка        | `utf8`                                             |
| Владелец         | Владелец Backend-сайта, например `example_com_usr` |
| Сервер           | `PostgreSQL 18 local`                              |
| Пользователь     | Создать нового пользователя                        |
| Логин            | `app_example_com_pg`                               |
| Пароль           | Отдельный надёжный пароль                          |
| Повторите пароль | Тот же пароль                                      |

<figure><img src="/files/3a51CXTRm8AbrCepsG3H" alt="" width="563"><figcaption></figcaption></figure>

Нажмите **«Сохранить»**.

### Требования к имени

Используйте:

* строчные латинские буквы;
* цифры;
* символ `_`.

Пример:

```
app_example_com_pg
```

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

* пробелы;
* дефисы;
* кириллицу;
* специальные символы.

### Кодировка

В FASTPANEL выберите:

```
utf8
```

В PostgreSQL она отображается как:

```
UTF8
```

MySQL-кодировка:

```
utf8mb4
```

для PostgreSQL не используется.

### Пароль пользователя

Создайте отдельный случайный пароль.

Он не должен совпадать с паролями:

* `root`;
* FASTPANEL;
* `fastuser`;
* владельца сайта;
* административной панели iEXExchanger.

Сохраните пароль в защищённом менеджере.

## Создание базы Laravel Pulse

Если проект использует Laravel Pulse, создайте отдельную базу.

В карточке Backend-сайта снова нажмите: **«Новая база данных»**

Заполните форму:

| Поле             | Значение                    |
| ---------------- | --------------------------- |
| Имя              | `pulse_pg`                  |
| Кодировка        | `utf8`                      |
| Владелец         | Владелец Backend-сайта      |
| Сервер           | `PostgreSQL 18 local`       |
| Пользователь     | Создать нового пользователя |
| Логин            | `pulse_pg`                  |
| Пароль           | Отдельный надёжный пароль   |
| Повторите пароль | Тот же пароль               |

Для основной базы и Pulse используйте разные пароли.

После создания должны существовать:

```
Основная база:
Database: app_example_com_pg
Username: app_example_com_pg
```

```
Pulse:
Database: pulse_pg
Username: pulse_pg
```

Если Laravel Pulse не используется, базу `pulse_pg` создавать не нужно.

***

## Проверка основной базы

Подключитесь через `psql`:

```bash
psql \
  --host=127.0.0.1 \
  --port=5432 \
  --username=app_example_com_pg \
  --dbname=app_example_com_pg
```

Введите пароль пользователя базы.

После подключения выполните:

```sql
SELECT
    current_database(),
    current_user,
    current_setting('server_version'),
    current_setting('server_encoding');
```

Ожидаемый результат:

```
current_database | app_example_com_pg
current_user     | app_example_com_pg
server_version   | 18.x
server_encoding  | UTF8
```

Для выхода выполните:

```
\q
```

## Проверка базы Pulse

Подключитесь:

```bash
psql \
  --host=127.0.0.1 \
  --port=5432 \
  --username=pulse_pg \
  --dbname=pulse_pg
```

После подключения выполните:

```sql
SELECT
    current_database(),
    current_user,
    current_setting('server_version'),
    current_setting('server_encoding');
```

Ожидается:

```
current_database | pulse_pg
current_user     | pulse_pg
server_version   | 18.x
server_encoding  | UTF8
```

Для выхода:

```
\q
```

## Проверка новых баз

Сразу после создания базы не содержат таблиц.

Для основной базы выполните:

```bash
psql \
  --host=127.0.0.1 \
  --port=5432 \
  --username=app_example_com_pg \
  --dbname=app_example_com_pg \
  --command="\dt"
```

Ожидаемый результат:

```
Did not find any relations.
```

Для Pulse:

```bash
psql \
  --host=127.0.0.1 \
  --port=5432 \
  --username=pulse_pg \
  --dbname=pulse_pg \
  --command="\dt"
```

Ожидается:

```
Did not find any relations.
```

Это подтверждает, что базы успешно созданы и готовы к следующему этапу установки или переноса.

## Параметры подключения основной базы

Сохраните следующие данные:

```
Driver: pgsql
Host: 127.0.0.1
Port: 5432
Database: app_example_com_pg
Username: app_example_com_pg
Password: ПАРОЛЬ_ОСНОВНОЙ_БАЗЫ
SSL mode: disable
```

Для новой установки эти данные используются при настройке Backend.

При переносе существующего проекта они потребуются на отдельном этапе миграции.

Пример параметров:

```dotenv
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=app_example_com_pg
DB_USERNAME=app_example_com_pg
DB_PASSWORD="ПАРОЛЬ_ОСНОВНОЙ_БАЗЫ"
DB_SSLMODE=disable
```

Не применяйте этот блок к работающему проекту до перехода на PostgreSQL.

## Параметры подключения Pulse

```
Driver: pgsql
Host: 127.0.0.1
Port: 5432
Database: pulse_pg
Username: pulse_pg
Password: ПАРОЛЬ_БАЗЫ_PULSE
SSL mode: disable
```

Пример:

```dotenv
PULSE_DB_CONNECTION=pgsql-pulse
PULSE_DB_HOST=127.0.0.1
PULSE_DB_PORT=5432
PULSE_DB_DATABASE=pulse_pg
PULSE_DB_USERNAME=pulse_pg
PULSE_DB_PASSWORD="ПАРОЛЬ_БАЗЫ_PULSE"
PULSE_DB_SSLMODE=disable
```

Параметры применяются на соответствующем этапе установки или переноса проекта.

## Что делать дальше

После успешного подключения выберите подходящую инструкцию:

* для нового проекта — продолжите первоначальную установку iEXExchanger;
* для существующего проекта — перейдите к отдельной инструкции по переносу базы данных.

Эта статья завершается проверкой подключения. Создание структуры таблиц и перенос данных выполняются на следующем этапе.

***

## Частые ошибки

<details>

<summary>FASTPANEL не подключается к PostgreSQL</summary>

Проверьте:

1. В форме используется пользователь `fastuser`.
2. Введён пароль из файла:

```
/root/postgresql18-installer/fastpanel-postgresql18.credentials
```

3. Выбран тип сервера PostgreSQL.
4. Выбрано локальное подключение.
5. Хост и порт оставлены автоматическими.
6. PostgreSQL работает:

```bash
pg_isready -h 127.0.0.1 -p 5432
```

7. Установщик успешно проходит проверку:

```bash
bash scripts/install-postgresql18-fastpanel.sh --check
```

Если пароль `fastuser` изменён, внесите новое значение в FASTPANEL.

</details>

<details>

<summary>Сервер имеет статус «Недоступен»</summary>

Проверьте:

```bash
systemctl is-active postgresql@18-main
```

```bash
pg_isready -h 127.0.0.1 -p 5432
```

```bash
mogwai databases servers list
```

Также проверьте пароль `fastuser` и фактический порт кластера.

</details>

<details>

<summary>PHP показывает could not find driver</summary>

Причина — модуль `pdo_pgsql` не включён в PHP 8.4.

Проверьте:

```bash
/opt/php84/bin/php --ri pdo_pgsql
```

```bash
/opt/php84/bin/php --ri pgsql
```

Убедитесь, что Backend-сайт назначен на PHP 8.4.

</details>

<details>

<summary>Пользователь уже существует</summary>

Удаление базы не всегда удаляет PostgreSQL-пользователя.

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

Не выполняйте `DROP ROLE` вручную, пока не проверите принадлежность объектов.

</details>

<details>

<summary>Не удаётся подключиться через psql</summary>

Проверьте:

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

Имя базы и имя пользователя могут совпадать, но являются разными объектами PostgreSQL.

</details>

<details>

<summary>База не отображается в FASTPANEL</summary>

Выполните синхронизацию:

```bash
mogwai databases sync
```

Затем обновите страницу панели.

### Установщик не найден

Убедитесь, что вы находитесь в корневой директории Backend:

```bash
pwd
```

Проверьте файл:

```bash
ls -la scripts/install-postgresql18-fastpanel.sh
```

Если файл отсутствует, повторно загрузите полный архив Backend или добавьте установщик в папку `scripts`.

</details>

***

## Проверка результата

После выполнения инструкции должно быть подтверждено:

1. PostgreSQL 18 установлен.
2. Кластер `18/main` работает.
3. PostgreSQL принимает локальные подключения.
4. Публичный доступ к порту отсутствует.
5. PHP 8.4 видит драйвер `pgsql`.
6. FASTPANEL показывает PostgreSQL как доступный сервер.
7. Создана основная база.
8. Для основной базы создан отдельный пользователь.
9. При необходимости создана база `pulse_pg`.
10. Для Pulse создан пользователь `pulse_pg`.
11. Подключение к базам через `psql` работает.
12. Реквизиты сохранены для следующего этапа.

## Контрольный список

* [ ] PostgreSQL 18 установлен.
* [ ] Кластер `18/main` имеет статус `online`.
* [ ] PostgreSQL доступен на `127.0.0.1`.
* [ ] Публичный порт PostgreSQL закрыт.
* [ ] Создана роль `fastuser`.
* [ ] Реквизиты `fastuser` сохранены в защищённом файле.
* [ ] В PHP 8.4 включены `pdo_pgsql` и `pgsql`.
* [ ] Backend-сайт использует PHP 8.4.
* [ ] В FASTPANEL добавлен сервер `PostgreSQL 18 local`.
* [ ] Сервер имеет статус «Доступен».
* [ ] PostgreSQL не выбран сервером по умолчанию.
* [ ] Создана отдельная основная база.
* [ ] Для основной базы создан отдельный пользователь.
* [ ] При необходимости создана база `pulse_pg`.
* [ ] Для Pulse создан пользователь `pulse_pg`.
* [ ] Использована кодировка `UTF8`.
* [ ] Подключение к основной базе проверено.
* [ ] Подключение к Pulse проверено.
* [ ] Реквизиты сохранены для установки или переноса.

## Коротко

PostgreSQL 18 устанавливается из официального PGDG-репозитория и подключается к FASTPANEL как отдельный локальный сервер баз данных.

FASTPANEL использует административную роль `fastuser`. Для iEXExchanger создаётся отдельная основная база и пользователь, а для Laravel Pulse — база и пользователь `pulse_pg`.

После проверки подключения новые проекты могут продолжить стандартную установку iEXExchanger. Для существующих проектов следующим этапом выполняется перенос базы данных по отдельной инструкции.


# Миграция с MySQL на PostgreSQL

Эта инструкция описывает перенос действующего проекта iEXExchanger с MySQL на PostgreSQL 18 с помощью встроенного инструмента `iEX DB Migrator`.

Мигратор создаёт структуру PostgreSQL, переносит данные, проверяет результат и переключает подключение проекта только после успешного завершения основных проверок. При необходимости отдельно переносится база Laravel Pulse.

Для обычной миграции используется пустая PostgreSQL-база, заранее созданная в FASTPANEL. В конфигурации необходимо указать:

```json
"schema_mode": "empty"
```

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

Перед началом выполните инструкцию

{% content-ref url="/pages/nTV8YubEHpIQWlwePofG" %}
[Подключение PostgreSQL](/server-i-dannye/rabota-s-postgresql/podklyuchenie-postgresql)
{% endcontent-ref %}

В FASTPANEL должны быть созданы пустые PostgreSQL-базы и отдельные пользователи для основной базы и Laravel Pulse.

{% hint style="danger" %}

## Внимание

Не удаляйте исходную MySQL-базу после переноса.

Она понадобится для контрольной проверки и возможного возврата проекта до начала записи новых данных в PostgreSQL.
{% endhint %}

## Как проходит миграция

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

## Что переносит мигратор

`iEX DB Migrator` переносит:

* основную базу iEXExchanger;
* отдельную базу Laravel Pulse;
* таблицы и колонки;
* все строки выбранных таблиц;
* первичные ключи;
* уникальные ограничения;
* обычные и составные индексы;
* внешние ключи;
* `CHECK`-ограничения;
* identity и serial sequences;
* generated columns;
* аналоги `ON UPDATE CURRENT_TIMESTAMP`;
* значения JSON с преобразованием в `jsonb`;
* числовые, строковые, временные и логические значения.

Перед переносом проверяются:

* версии MySQL и PostgreSQL;
* кодировки баз;
* права пользователей;
* структура таблиц;
* определения колонок;
* индексы и ограничения;
* unsigned-значения;
* zero-date;
* значения `TIME`;
* JSON;
* generated columns;
* числовые диапазоны;
* количество строк.

После переноса мигратор сравнивает структуру и вычисляет SHA-256 digest данных выбранных таблиц.

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

***

## Промпт для выполнения миграции

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

{% prompt description="Промпт для безопасной миграции" %}

```markdown
Выполни безопасную миграцию действующего проекта iEXExchanger с MySQL на PostgreSQL 18 через встроенный инструмент:

tools/db-migrator/iex-db-migrator

Работай только в пределах Backend-проекта и не показывай пароли в консоли или итоговом отчёте.

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

1. Найди корневую директорию Laravel с файлами artisan и .env.
2. Определи владельца Backend-сайта в FASTPANEL.
3. Проверь, что PostgreSQL 18 установлен и работает.
4. Проверь, что PostgreSQL добавлен в FASTPANEL и имеет статус «Доступен».
5. Проверь, что для основной базы и Laravel Pulse созданы отдельные пустые PostgreSQL-базы.
6. Проверь наличие:
   - tools/db-migrator/iex-db-migrator;
   - tools/db-migrator/migration.example.json;
   - tools/db-backup/iex-db-backup.
7. Проверь наличие свободного места для переноса и резервной копии.

Обязательный режим схемы

Для обычной клиентской миграции используй только:

"schema_mode": "empty"

Также укажи этот режим в команде запуска:

--schema-mode empty

Не используй schema_mode=auto или schema_mode=existing, если пользователь отдельно не запросил расширенный технический сценарий.

Обязательные политики

"exact": true
"maintenance": false
"switch_env": true
"workers": 3
"schema_mode": "empty"
"allow_non_empty": false
"allow_target_reset": false

Границы безопасности

- MySQL используется как источник данных.
- Не выполняй DROP DATABASE для MySQL.
- Не запускай reset-target без отдельного явного разрешения.
- Не устанавливай allow_target_reset=true для обычной миграции.
- Не отключай exact mode.
- Не запускай второй экземпляр мигратора параллельно.
- Не переключай Laravel .env вручную.
- Не запускай php artisan migrate до завершения точной проверки.
- Не запускай Product Updates до завершения отдельной команды verify.
- Не выдавай RELOAD или FLUSH_TABLES обычному пользователю приложения.
- Для локального MySQL запускай мигратор от пользователя root, чтобы мигратор мог использовать /root/.my.cnf.
- Не используй fastuser как target.username. fastuser нужен только для управления PostgreSQL через FASTPANEL.

Подготовка конфигурации

Создай приватный файл:

tools/db-migrator/db-migrator.json

на основе:

tools/db-migrator/migration.example.json

Установи права:

chmod 600 tools/db-migrator/db-migrator.json

В source укажи действующие реквизиты MySQL.

В target укажи реквизиты пустых PostgreSQL-баз, созданных в FASTPANEL.

Для основной базы используй отдельного PostgreSQL-пользователя.

Для Laravel Pulse база и пользователь должны называться:

pulse_pg

Если Pulse не используется, отключи профиль:

"enabled": false

Проверки до переноса

Выполни:

./tools/db-migrator/iex-db-migrator config-check --profile all

./tools/db-migrator/iex-db-migrator target-check --profile all

./tools/db-migrator/iex-db-migrator plan --profile all

Все три команды должны завершиться успешно.

Резервная копия

До переключения .env создай резервную копию исходной MySQL:

./tools/db-backup/iex-db-backup export \
  --profile all \
  --tag before-mysql-to-postgresql

Проверь SQL-файлы и manifest. Сообщи пользователю, что резервную копию нужно скачать с сервера и сохранить во внешнем защищённом хранилище.

Окно обслуживания

Перед запуском run:

1. Запрети создание новых заявок.
2. Останови внешний write-трафик.
3. Останови очереди и планировщики, записывающие данные.
4. Останови процессы записи курсов, логов и метрик.
5. Убедись, что Product Updates и Laravel migrations не запущены.
6. Убедись, что другой экземпляр мигратора не работает.

Финальный перенос

Запусти от пользователя root из корня Backend:

./tools/db-migrator/iex-db-migrator run \
  --profile all \
  --schema-mode empty \
  --yes

Не прерывай процесс без необходимости.

После успешного run и до запуска приложения выполни:

./tools/db-migrator/iex-db-migrator verify --profile all

Только после успешного verify продолжай работу.

Product Updates

Переключись на владельца Backend-сайта.

Сначала выполни:

php artisan product-updates:run --dry-run -v

Если проверка успешна:

php artisan product-updates:run

Не используй --force вслепую и не создавай отсутствующие таблицы или колонки вручную.

После обновления проверь:

php artisan db:show --database=pgsql
php artisan product-updates:status --limit=5
php artisan migrate:status

Перезапусти очереди, Laravel Scheduler, Reverb, Horizon, PM2 и другие долгоживущие процессы, если они используются в проекте.

Проверь:

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

Итоговый отчёт

Укажи:

1. версию мигратора;
2. обработанные профили;
3. имена source и target без паролей;
4. количество перенесённых таблиц и строк;
5. результат SHA-256-проверки;
6. результат отдельной команды verify;
7. путь к persistent log;
8. путь к резервной копии .env;
9. результат переключения DB_CONNECTION;
10. результат Product Updates;
11. результат проверки приложения;
12. перечень оставшихся ручных действий.

Никогда не показывай пароли в итоговом отчёте.
```

{% endprompt %}

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

Проверьте:

* PostgreSQL имеет версию `18.x`;
* PostgreSQL работает и доступен на локальном порту;
* PHP 8.4 видит модули `pdo_pgsql` и `pgsql`;
* PostgreSQL добавлен в FASTPANEL;
* PostgreSQL-сервер имеет статус «Доступен»;
* создана пустая основная PostgreSQL-база;
* создан отдельный пользователь основной базы;
* при необходимости создана пустая база Laravel Pulse;
* база и пользователь Pulse называются `pulse_pg`;
* PostgreSQL-базы используют кодировку `UTF8`;
* исходная MySQL доступна;
* в Backend-проекте присутствуют `.env` и `artisan`;
* на сервере достаточно свободного места;
* подготовлено окно обслуживания.

{% hint style="info" %}
До переноса не запускайте Laravel migrations и Product Updates для пустых PostgreSQL-баз.

Иначе базы перестанут быть пустыми и не пройдут проверку режима `empty`.
{% endhint %}

## Файлы системы

| Файл                                       | Назначение                                    |
| ------------------------------------------ | --------------------------------------------- |
| `tools/db-migrator/iex-db-migrator`        | Основная команда переноса                     |
| `tools/db-migrator/migration.example.json` | Пример конфигурации                           |
| `tools/db-migrator/db-migrator.json`       | Приватная конфигурация переноса               |
| `storage/logs/db-migrator/`                | Постоянные логи мигратора                     |
| `tools/db-backup/iex-db-backup`            | Инструмент резервного копирования             |
| `tools/db-backup/db-backup.json`           | Приватная конфигурация резервного копирования |
| `storage/logs/db-backup/`                  | Логи резервного копирования                   |
| `tools/db-auditor/iex-db-auditor`          | Аудит PostgreSQL после обновления             |

{% hint style="warning" %}
Импорт и экспорт SQL выполняются через `iex-db-backup`.

Не используйте мигратор как инструмент обычного импорта, экспорта или резервного копирования.
{% endhint %}

## Какие пользователи используются

Во время переноса задействованы разные учётные записи.

<table><thead><tr><th width="348.7421875">Пользователь</th><th>Назначение</th></tr></thead><tbody><tr><td><code>root</code></td><td>Пользователь операционной системы, от которого запускается мигратор</td></tr><tr><td>Пользователь MySQL приложения</td><td>Чтение исходной базы</td></tr><tr><td>Пользователь MySQL lock</td><td>Получение глобальной блокировки записи, если недоступен <code>/root/.my.cnf</code></td></tr><tr><td><code>fastuser</code></td><td>Управление PostgreSQL через FASTPANEL</td></tr><tr><td>Пользователь PostgreSQL приложения</td><td>Подключение к новой основной базе</td></tr><tr><td><code>pulse_pg</code></td><td>Подключение к новой базе Laravel Pulse</td></tr><tr><td>Владелец сайта</td><td>Запуск Laravel-команд и процессов проекта</td></tr></tbody></table>

Пример:

```
Администратор PostgreSQL в FASTPANEL:
fastuser

Владелец Backend-сайта:
example_com_usr

Основная PostgreSQL-база:
app_example_com_pg

Пользователь основной базы:
app_example_com_pg

PostgreSQL-база Laravel Pulse:
pulse_pg

Пользователь Laravel Pulse:
pulse_pg
```

{% hint style="warning" %}
Не указывайте `fastuser` в `target.username`.

Для приложения используется пользователь, созданный вместе с соответствующей базой в FASTPANEL.
{% endhint %}

## Основной режим схемы — `empty`

Для клиентской миграции используется:

```json
"schema_mode": "empty"
```

Этот режим предназначен для пустых PostgreSQL-баз, заранее созданных в FASTPANEL.

При запуске мигратор:

1. подключается через пользователя из `target.username`;
2. проверяет версию PostgreSQL;
3. проверяет кодировку `UTF8`;
4. проверяет права на создание объектов;
5. проверяет отсутствие пользовательских таблиц;
6. создаёт структуру PostgreSQL;
7. переносит данные;
8. создаёт индексы, ключи и ограничения;
9. настраивает sequences;
10. выполняет точную проверку.

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

{% hint style="danger" %}
Не используйте `schema_mode=existing` для пустой базы FASTPANEL.

Режим `existing` ожидает, что необходимые таблицы уже созданы. Для стандартной миграции используйте только `empty`.
{% endhint %}

***

## Подготовка конфигурации

{% stepper %}
{% step %}

### Подключитесь к серверу

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```bash
ssh root@SERVER_IP
```

Мигратор запускается от пользователя `root`, чтобы точный режим мог получить MySQL read-lock через защищённый файл `/root/.my.cnf`.
{% endstep %}

{% step %}

### Перейдите в Backend-проект

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

Пример:

```bash
cd /var/www/example_com_usr/data/www/app.example.com
```

Проверьте текущую директорию и обязательные файлы:

```bash
pwd
test -f artisan && echo "artisan найден"
test -f .env && echo ".env найден"
```

{% endstep %}

{% step %}

### Проверьте файлы мигратора

```bash
ls -la tools/db-migrator/
```

Должны присутствовать:

```
iex-db-migrator
migration.example.json
```

Проверьте версию:

```bash
./tools/db-migrator/iex-db-migrator plan --version
```

Устанавливать Go на клиентский сервер не требуется. Launcher выбирает бинарный файл, соответствующий архитектуре сервера.
{% endstep %}

{% step %}

### Создайте рабочую конфигурацию

Если файл ещё не существует:

```bash
cp tools/db-migrator/migration.example.json \
  tools/db-migrator/db-migrator.json
```

Установите защищённые права:

```bash
chmod 600 tools/db-migrator/db-migrator.json
```

Откройте файл:

```bash
nano tools/db-migrator/db-migrator.json
```

{% hint style="danger" %}
Если `db-migrator.json` уже существует, не перезаписывайте его командой `cp`.

Сначала сохраните защищённую копию и проверьте текущие настройки.
{% endhint %}
{% endstep %}
{% endstepper %}

## Пример `db-migrator.json`

```json
{
  "version": 1,
  "policy": {
    "exact": true,
    "maintenance": false,
    "switch_env": true,
    "workers": 3,
    "schema_mode": "empty",
    "allow_non_empty": false,
    "allow_target_reset": false
  },
  "profiles": {
    "main": {
      "enabled": true,
      "source": {
        "driver": "mysql",
        "host": "127.0.0.1",
        "port": 3306,
        "database": "old_app_mysql",
        "username": "old_app_mysql",
        "password": "ПАРОЛЬ_MYSQL",
        "socket": "",
        "tls": "false",
        "table_prefix": ""
      },
      "target": {
        "driver": "pgsql",
        "host": "127.0.0.1",
        "port": 5432,
        "database": "app_example_com_pg",
        "username": "app_example_com_pg",
        "password": "ПАРОЛЬ_POSTGRESQL",
        "sslmode": "disable",
        "table_prefix": ""
      },
      "include": [],
      "exclude": []
    },
    "pulse": {
      "enabled": true,
      "optional": true,
      "source": {
        "driver": "mysql",
        "host": "127.0.0.1",
        "port": 3306,
        "database": "old_pulse_mysql",
        "username": "old_pulse_mysql",
        "password": "ПАРОЛЬ_MYSQL_PULSE",
        "socket": "",
        "tls": "false",
        "table_prefix": ""
      },
      "target": {
        "driver": "pgsql",
        "host": "127.0.0.1",
        "port": 5432,
        "database": "pulse_pg",
        "username": "pulse_pg",
        "password": "ПАРОЛЬ_POSTGRESQL_PULSE",
        "sslmode": "disable",
        "table_prefix": ""
      },
      "include": [],
      "exclude": []
    }
  }
}
```

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

```bash
chmod 600 tools/db-migrator/db-migrator.json
```

### Откуда брать реквизиты

<table><thead><tr><th width="285.5234375">Поле</th><th>Где взять значение</th></tr></thead><tbody><tr><td><code>main.source.database</code></td><td>Текущее <code>DB_DATABASE</code> из <code>.env</code></td></tr><tr><td><code>main.source.username</code></td><td>Текущее <code>DB_USERNAME</code></td></tr><tr><td><code>main.source.password</code></td><td>Текущее <code>DB_PASSWORD</code></td></tr><tr><td><code>main.target.database</code></td><td>Основная PostgreSQL-база из FASTPANEL</td></tr><tr><td><code>main.target.username</code></td><td>Пользователь основной PostgreSQL-базы</td></tr><tr><td><code>main.target.password</code></td><td>Пароль пользователя PostgreSQL</td></tr><tr><td><code>pulse.source.database</code></td><td>Текущее <code>PULSE_DB_DATABASE</code></td></tr><tr><td><code>pulse.source.username</code></td><td>Текущее <code>PULSE_DB_USERNAME</code></td></tr><tr><td><code>pulse.source.password</code></td><td>Текущее <code>PULSE_DB_PASSWORD</code></td></tr><tr><td><code>pulse.target.database</code></td><td><code>pulse_pg</code></td></tr><tr><td><code>pulse.target.username</code></td><td><code>pulse_pg</code></td></tr><tr><td><code>pulse.target.password</code></td><td>Пароль пользователя <code>pulse_pg</code></td></tr></tbody></table>

Посмотреть основные параметры `.env` без вывода паролей:

```bash
grep -E '^(DB_CONNECTION|DB_HOST|DB_PORT|DB_DATABASE|DB_USERNAME|PULSE_DB_CONNECTION|PULSE_DB_HOST|PULSE_DB_PORT|PULSE_DB_DATABASE|PULSE_DB_USERNAME)=' .env
```

{% hint style="warning" %}
Не меняйте рабочий `.env` вручную.

При `switch_env=true` мигратор самостоятельно переключит подключение после успешного переноса и проверки.
{% endhint %}

***

## Если Laravel Pulse не используется

Отключите профиль:

```json
"pulse": {
  "enabled": false
}
```

После этого команда с параметром `--profile all` обработает только основную базу.

Если Pulse настроен не у всех проектов, профиль можно оставить необязательным:

```json
"enabled": true,
"optional": true
```

При отсутствии доступной базы мигратор должен явно вывести:

```
PROFILE pulse SKIPPED
```

Отдельный запуск с параметром `--profile pulse` при недоступной базе завершится ошибкой.

## Политики миграции

Для стандартной клиентской миграции используйте следующие значения:

<table><thead><tr><th width="217.2265625">Параметр</th><th width="108.04296875">Значение</th><th>Назначение</th></tr></thead><tbody><tr><td><code>exact</code></td><td><code>true</code></td><td>Включает точную проверку и MySQL read-lock</td></tr><tr><td><code>maintenance</code></td><td><code>false</code></td><td>Мигратор не управляет Laravel maintenance mode</td></tr><tr><td><code>switch_env</code></td><td><code>true</code></td><td>Переключает <code>.env</code> после успешного переноса</td></tr><tr><td><code>workers</code></td><td><code>3</code></td><td>Количество параллельно обрабатываемых таблиц</td></tr><tr><td><code>schema_mode</code></td><td><code>empty</code></td><td>Заполняет пустые PostgreSQL-базы</td></tr><tr><td><code>allow_non_empty</code></td><td><code>false</code></td><td>Запрещает перенос в непустую базу</td></tr><tr><td><code>allow_target_reset</code></td><td><code>false</code></td><td>Запрещает удаление PostgreSQL target</td></tr></tbody></table>

{% hint style="info" %}
Значение `maintenance=false` не означает, что миграцию можно выполнять без остановки записи.

Оно означает только то, что мигратор не выполняет команды `php artisan down` и `php artisan up`. Остановить пользовательские и фоновые процессы записи нужно отдельно.
{% endhint %}

## Как работает точная блокировка MySQL

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

```sql
FLUSH TABLES WITH READ LOCK
```

Пока блокировка активна, MySQL не принимает:

* `INSERT`;
* `UPDATE`;
* `DELETE`;
* изменение структуры таблиц;
* другие DDL-операции.

Чтение данных продолжает работать.

Блокировка удерживается до завершения переноса, проверки PostgreSQL, обработки Pulse и переключения `.env`.

{% stepper %}
{% step %}

### Подключение через `/root/.my.cnf`

При запуске от пользователя `root` мигратор проверяет:

```
/root/.my.cnf
```

Файл должен:

* принадлежать пользователю `root`;
* иметь права `0600` или строже;
* не быть символической ссылкой;
* содержать секцию `[client]` или `[mysql]`.

Мигратор читает из файла только имя пользователя и пароль. Пароль не выводится в консоль и постоянный лог.
{% endstep %}

{% step %}

### Если `/root/.my.cnf` недоступен

В секцию `source` можно добавить отдельное подключение:

```json
"lock": {
  "driver": "mysql",
  "username": "mysql_lock_user",
  "password": "ПАРОЛЬ_MYSQL_LOCK_USER"
}
```

Такой учётной записи требуется глобальное право:

```
FLUSH_TABLES
```

или:

```
RELOAD
```

{% hint style="danger" %}
Не выдавайте глобальные права `FLUSH_TABLES` или `RELOAD` обычному пользователю приложения.

Не отключайте `exact=true`, чтобы обойти ошибку доступа.
{% endhint %}
{% endstep %}
{% endstepper %}

***

## Проверка конфигурации

Выполните:

```bash
./tools/db-migrator/iex-db-migrator \
  config-check \
  --profile all
```

Команда не подключается к базам и не изменяет данные.

Она проверяет:

* формат JSON;
* обязательные поля;
* драйверы;
* настройки профилей;
* политики безопасности;
* неизвестные параметры.

Исправьте все найденные ошибки до продолжения.

## Проверка PostgreSQL-баз

Выполните:

```bash
./tools/db-migrator/iex-db-migrator \
  target-check \
  --profile all
```

Команда не блокирует MySQL и не переносит данные.

Она проверяет:

* PostgreSQL имеет версию `18.x`;
* кодировка базы равна `UTF8`;
* база существует;
* имя пользователя и пароль подходят;
* пользователь имеет право подключения;
* пользователь может создавать объекты;
* база доступна для записи;
* база не содержит пользовательских таблиц;
* база не содержит следов предыдущего переноса.

{% hint style="success" %}
`target-check` должен завершиться успешно для всех обязательных профилей.
{% endhint %}

## Проверка плана

Выполните от пользователя `root`:

```bash
./tools/db-migrator/iex-db-migrator \
  plan \
  --profile all
```

Команда не получает глобальную блокировку и не записывает данные.

Она проверяет:

* соединение с MySQL;
* учётную запись для read-lock;
* наличие требуемых прав;
* версию и кодировку MySQL;
* таблицы и колонки;
* индексы и внешние ключи;
* generated columns;
* значения JSON;
* zero-date;
* числовые диапазоны;
* количество строк;
* объём данных;
* режим схемы;
* число workers;
* параметры будущего `.env`.

Перед переносом должны успешно завершиться:

```bash
./tools/db-migrator/iex-db-migrator config-check --profile all
./tools/db-migrator/iex-db-migrator target-check --profile all
./tools/db-migrator/iex-db-migrator plan --profile all
```

***

## Создание резервной копии MySQL

Резервная копия создаётся до запуска мигратора, пока `.env` указывает на MySQL.

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

```
Миграция:
tools/db-migrator/db-migrator.json

Резервное копирование:
tools/db-backup/db-backup.json
```

Если `db-backup.json` ещё не существует:

```bash
cp tools/db-backup/db-backup.example.json \
  tools/db-backup/db-backup.json

chmod 600 tools/db-backup/db-backup.json
```

Проверьте конфигурацию:

```bash
./tools/db-backup/iex-db-backup \
  config-check \
  --profile all
```

Создайте резервную копию:

```bash
./tools/db-backup/iex-db-backup \
  export \
  --profile all \
  --tag before-mysql-to-postgresql
```

По умолчанию файлы сохраняются в каталоге:

```
storage/app/backups/database/<UTC>/
```

Для каждого SQL-файла создаётся файл:

```
.manifest.json
```

Manifest содержит:

* профиль;
* метку запуска;
* тип базы данных;
* размер файла;
* контрольную сумму SHA-256;
* количество таблиц;
* индексы и ключи;
* количество строк.

После создания резервной копии:

1. Проверьте наличие SQL-файлов и manifest.
2. Скачайте файлы с сервера.
3. Сохраните их во внешнем защищённом хранилище.
4. Не оставляйте единственную копию на сервере с проектом.

***

## Подготовка окна обслуживания

Перед запуском `run`:

* запретите создание новых заявок;
* остановите внешний трафик, который может записывать данные;
* временно остановите очереди;
* остановите процессы записи курсов, логов и метрик;
* не запускайте Product Updates;
* не запускайте Laravel migrations;
* убедитесь, что второй экземпляр мигратора не работает;
* предупредите сотрудников о технических работах.

{% hint style="warning" %}
Процессы, продолжающие запись в MySQL, будут ждать снятия read-lock и могут завершиться по тайм-ауту.

Сайт должен оставаться закрытым для записи до успешного завершения отдельной команды `verify`.
{% endhint %}

## Запуск миграции

Находясь в корне Backend-проекта и работая от пользователя `root`, выполните:

```bash
./tools/db-migrator/iex-db-migrator run \
  --profile all \
  --schema-mode empty \
  --yes
```

Параметр `--schema-mode empty` явно подтверждает, что перенос выполняется в пустые базы, созданные в FASTPANEL.

Во время запуска мигратор:

1. повторно проверяет конфигурацию;
2. получает MySQL read-lock;
3. проверяет значения источника;
4. проверяет пустоту PostgreSQL-баз;
5. создаёт PostgreSQL DDL;
6. проверяет DDL внутри транзакции с `ROLLBACK`;
7. создаёт таблицы;
8. переносит строки;
9. создаёт первичные и уникальные ключи;
10. создаёт индексы;
11. создаёт внешние ключи;
12. создаёт `CHECK`-ограничения;
13. настраивает identity и sequences;
14. создаёт необходимые триггеры;
15. выполняет `ANALYZE`;
16. проверяет структуру;
17. сравнивает количество строк;
18. вычисляет SHA-256 digest;
19. обрабатывает профиль Pulse;
20. переключает `.env`;
21. удаляет Laravel config cache;
22. снимает MySQL read-lock.

{% hint style="danger" %}
Не закрывайте SSH-сессию и не запускайте второй экземпляр команды.

Для длительного переноса используйте терминал с возможностью сохранить серверную сессию.
{% endhint %}

{% stepper %}
{% step %}

### Отображение прогресса

Пример:

```
progress source validation  42.11% | tables 184/437 | table=file_parser_source_pairs | rows=31647 | elapsed=2s
progress copy               76.20% | tables 333/437 | table=reserve_closures | elapsed=14s
progress target verify     100.00% | tables 437/437 | table=orders | elapsed=29s
```

{% endstep %}

{% step %}

### Постоянный лог

Каждый запуск создаёт приватный лог:

```
storage/logs/db-migrator/<UTC>-<command>-<profile>.log
```

Посмотреть последние логи:

```bash
ls -lt storage/logs/db-migrator/
```

Пароли в постоянный лог не записываются.
{% endstep %}
{% endstepper %}

## Как понять, что перенос завершился успешно

Успешный результат должен подтверждать:

* профиль `main` завершён успешно;
* профиль `pulse` завершён или явно пропущен;
* все выбранные таблицы обработаны;
* все строки перенесены;
* структура PostgreSQL совпала с ожидаемой;
* количество строк совпало;
* SHA-256 digest совпал;
* `.env` переключён;
* Laravel config cache удалён;
* MySQL read-lock снят;
* команда завершилась кодом `0`.

Если в результате присутствует:

```
PROFILE main FAILED
```

или:

```
ERROR
```

миграция не считается завершённой.

***

## Автоматическое переключение `.env`

При настройке:

```json
"switch_env": true
```

мигратор записывает для основной базы:

```dotenv
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=app_example_com_pg
DB_USERNAME=app_example_com_pg
DB_PASSWORD="ПАРОЛЬ_POSTGRESQL"
DB_SSLMODE=disable
```

Для Laravel Pulse:

```dotenv
PULSE_DB_CONNECTION=pgsql-pulse
PULSE_DB_HOST=127.0.0.1
PULSE_DB_PORT=5432
PULSE_DB_DATABASE=pulse_pg
PULSE_DB_USERNAME=pulse_pg
PULSE_DB_PASSWORD="ПАРОЛЬ_POSTGRESQL_PULSE"
PULSE_DB_SSLMODE=disable
```

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

```
.env.mysql-to-pg.<UTC>.bak
```

Проверить подключение без вывода паролей:

```bash
grep -E '^(DB_CONNECTION|DB_HOST|DB_PORT|DB_DATABASE|DB_USERNAME|DB_SSLMODE|PULSE_DB_CONNECTION|PULSE_DB_HOST|PULSE_DB_PORT|PULSE_DB_DATABASE|PULSE_DB_USERNAME|PULSE_DB_SSLMODE)=' .env
```

{% hint style="warning" %}
Не включайте сайт сразу после `run`.

Сначала выполните независимую команду `verify`.
{% endhint %}

## Независимая точная проверка

До запуска приложения, Product Updates и Laravel migrations выполните от пользователя `root`:

```bash
./tools/db-migrator/iex-db-migrator \
  verify \
  --profile all
```

Команда:

* повторно получает MySQL read-lock;
* заново читает исходную MySQL;
* заново читает PostgreSQL;
* сравнивает структуру;
* сравнивает ограничения;
* сравнивает sequences;
* сравнивает количество строк;
* заново вычисляет SHA-256 digest.

{% hint style="danger" %}
Между `run` и `verify` приложение не должно записывать данные в PostgreSQL.

Новые сессии, заявки, данные Pulse сделают базы закономерно различающимися.
{% endhint %}

Команда `verify` должна выполняться до Product Updates.

После Product Updates структура PostgreSQL может измениться. Для последующих проверок используется `iEX DB Auditor`.

## Обновление продукта после переноса

После успешного `verify` переключитесь на владельца Backend-сайта.

Пример:

```bash
su - example_com_usr
cd ~/www/app.example.com
```

{% hint style="warning" %}
Laravel-команды запускайте от владельца сайта, а не от `root`.

Иначе в проекте могут появиться файлы с неправильным владельцем.
{% endhint %}

Сначала проверьте план:

```bash
php artisan product-updates:run --dry-run -v
```

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

```bash
php artisan product-updates:run
```

Для строгой проверки можно использовать:

```bash
php artisan product-updates:run --strict
```

{% hint style="danger" %}
Если Product Updates или doctor сообщает об ошибке, не используйте `--force` вслепую.

Не создавайте отсутствующие таблицы или колонки вручную. Сначала изучите ошибку и постоянный лог мигратора.
{% endhint %}

Диагностика:

```bash
php artisan product-updates:doctor \
  --strict \
  --full \
  --support
```

Последние запуски:

```bash
php artisan product-updates:status --limit=5
```

## Проверка подключения и процессов

Проверьте PostgreSQL-подключение:

```bash
php artisan db:show --database=pgsql
```

Проверьте migrations:

```bash
php artisan migrate:status
```

Проверьте Product Updates:

```bash
php artisan product-updates:status --limit=5
```

При необходимости очистите runtime cache:

```bash
php artisan optimize:clear
```

Перезапустите очереди:

```bash
php artisan queue:restart
```

Если проект использует Horizon, Reverb, PM2 или systemd-службы, перезапустите их установленным для сервера способом.

Долгоживущие процессы необходимо перезапустить, потому что они могли сохранить старое MySQL-подключение в памяти.

***

## Функциональная проверка

Перед возвратом клиентского трафика проверьте:

* открытие административной панели;
* авторизацию администратора;
* список пользователей;
* валюты;
* резервы;
* направления обмена;
* платёжные системы;
* мерчанты;
* существующие заявки;
* создание тестовой заявки;
* изменение статуса тестовой заявки;
* поиск и сортировку;
* задания очередей;
* CRON;
* Laravel Pulse;
* Reverb;
* отправку уведомлений;
* логи приложения.

Отдельно проверьте функции, поведение которых может зависеть от конкретной базы данных:

* сортировку строк;
* полнотекстовый поиск;
* фильтры;
* JSON-поля;
* даты и время;
* generated values;
* автоматические временные метки.

Сортировка строк и полнотекстовый поиск в MySQL и PostgreSQL могут работать по-разному даже при точном переносе значений.

## Аудит PostgreSQL

После Product Updates строгий `verify` с MySQL больше не используется, потому что структура PostgreSQL могла измениться.

Выполните проверку конфигурации аудитора:

```bash
./tools/db-auditor/iex-db-auditor \
  config-check \
  --profile all
```

Запустите аудит:

```bash
./tools/db-auditor/iex-db-auditor \
  audit \
  --profile all \
  --strict
```

Аудитор проверяет:

* таблицы;
* первичные ключи;
* внешние ключи;
* индексы;
* sequences;
* triggers;
* статистику;
* блокировки;
* длительные транзакции;
* невалидные ограничения;
* неготовые индексы.

Аудитор работает в режиме чтения и не изменяет базу.

***

## Резервная копия PostgreSQL

После Product Updates и функциональной проверки создайте резервную копию PostgreSQL:

```bash
./tools/db-backup/iex-db-backup \
  export \
  --profile all \
  --tag after-mysql-to-postgresql
```

После переключения `.env` профили `main` и `pulse` будут использовать PostgreSQL.

Скачайте SQL-файлы и manifest с сервера и сохраните их во внешнем защищённом хранилище.

## Возврат клиентского трафика

Возвращайте трафик только после того, как подтверждено:

* `run` завершился успешно;
* отдельный `verify` завершился успешно;
* `.env` указывает на PostgreSQL;
* Product Updates завершился успешно;
* PostgreSQL-аудит не обнаружил критических ошибок;
* очереди и долгоживущие процессы перезапущены;
* основные функции приложения проверены;
* резервная копия PostgreSQL создана.

После этого:

1. Разрешите создание заявок.
2. Запустите очереди и остальные процессы.
3. Создайте контрольную заявку.
4. Проверьте её обработку.
5. Наблюдайте за логами приложения.

## Возврат подключения на MySQL

Перед переключением мигратор создаёт файл:

```
.env.mysql-to-pg.<UTC>.bak
```

Посмотрите доступные копии:

```bash
ls -la .env.mysql-to-pg.*.bak
```

Для восстановления используйте точные пути:

```bash
./tools/db-migrator/iex-db-migrator rollback-env \
  --env /var/www/example_com_usr/data/www/app.example.com/.env \
  --backup /var/www/example_com_usr/data/www/app.example.com/.env.mysql-to-pg.20260719T120000Z.bak
```

Команда:

* атомарно восстанавливает `.env`;
* удаляет Laravel config cache;
* не удаляет PostgreSQL;
* не изменяет MySQL;
* не запускает PHP или Artisan.

После восстановления перезапустите очереди и другие долгоживущие процессы.

{% hint style="danger" %}
Безопасный возврат на MySQL возможен только до появления новых рабочих записей в PostgreSQL.

Если после переключения пользователи создавали заявки или изменяли данные, старая MySQL больше не содержит актуальное состояние проекта. Простое восстановление `.env` может привести к потере новых изменений.
{% endhint %}

***

## Дополнительные режимы для технических специалистов

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

```
schema_mode=empty
```

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

<table><thead><tr><th width="149.46484375">Режим</th><th>Назначение</th></tr></thead><tbody><tr><td><code>empty</code></td><td>Заполнить пустую базу, заранее созданную в FASTPANEL</td></tr><tr><td><code>auto</code></td><td>Автоматически создать роль, промежуточную базу и финальную базу</td></tr><tr><td><code>existing</code></td><td>Использовать полностью подготовленную заранее структуру PostgreSQL</td></tr></tbody></table>

{% stepper %}
{% step %}

### Режим `auto`

Режим может использоваться, когда мигратор должен самостоятельно создать PostgreSQL-роль и базы.

```json
"schema_mode": "auto"
```

Он требует административных прав PostgreSQL и не является стандартным вариантом для баз, созданных через FASTPANEL.

Не используйте этот режим только ради автоматизации обычного клиентского переноса.
{% endstep %}

{% step %}

### Режим `existing`

Режим предназначен для базы, в которой необходимая PostgreSQL-структура уже полностью создана:

```json
"schema_mode": "existing"
```

Мигратор проверяет существующую структуру перед переносом данных.

{% hint style="danger" %}
Режим `existing` нельзя использовать для пустой базы.

Если PostgreSQL-база создана в FASTPANEL и не содержит таблиц, используйте `schema_mode=empty`.
{% endhint %}
{% endstep %}

{% step %}

### Временное изменение режима

Режим можно передать через команду:

```bash
--schema-mode empty
```

```bash
--schema-mode auto
```

```bash
--schema-mode existing
```

Параметр командной строки должен соответствовать реальному состоянию целевой базы.
{% endstep %}
{% endstepper %}

***

## Тестовая репетиция

Для репетиции создайте отдельные пустые PostgreSQL-базы.

Укажите тестовые имена в `target`:

```json
"database": "app_example_com_migration_test"
```

Запустите перенос без переключения `.env`:

```bash
./tools/db-migrator/iex-db-migrator run \
  --profile all \
  --schema-mode empty \
  --yes \
  --no-switch
```

Параметр `--no-switch`:

* переносит структуру;
* переносит данные;
* выполняет проверку;
* не изменяет `.env`;
* не переключает приложение.

{% hint style="warning" %}
Не используйте финальные рабочие PostgreSQL-базы для тестового запуска.

Для репетиции создаются отдельные пустые базы и отдельные пользователи.
{% endhint %}

## Сброс целевой PostgreSQL-базы

Команда `reset-target` не используется при обычной клиентской миграции.

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

```json
"allow_target_reset": true
```

После этого команда:

```bash
./tools/db-migrator/iex-db-migrator reset-target \
  --profile main \
  --yes
```

удалит выбранную PostgreSQL-базу целиком.

Команда не удаляет исходную MySQL и не удаляет PostgreSQL-роль.

{% hint style="danger" %}
Перед выполнением несколько раз проверьте `target.database`.

Для базы, созданной через FASTPANEL, после `reset-target` потребуется заново создать базу в панели.
{% endhint %}

После выполнения верните безопасное значение:

```json
"allow_target_reset": false
```

## Команды мигратора

<table><thead><tr><th width="192.94921875">Команда</th><th width="217.734375">Изменяет данные</th><th>Назначение</th></tr></thead><tbody><tr><td><code>config-check</code></td><td>Нет</td><td>Проверить приватную JSON-конфигурацию</td></tr><tr><td><code>target-check</code></td><td>Нет</td><td>Проверить PostgreSQL, кодировку, права и пустоту</td></tr><tr><td><code>plan</code></td><td>Нет</td><td>Проверить источник и построить план</td></tr><tr><td><code>schema</code></td><td>Только указанный файл</td><td>Сформировать PostgreSQL DDL</td></tr><tr><td><code>run</code></td><td>Да</td><td>Выполнить перенос и при необходимости переключить <code>.env</code></td></tr><tr><td><code>verify</code></td><td>Нет</td><td>Повторно сравнить MySQL и PostgreSQL</td></tr><tr><td><code>reset-target</code></td><td>Да</td><td>Удалить выбранную PostgreSQL-базу</td></tr><tr><td><code>rollback-env</code></td><td>Да</td><td>Восстановить <code>.env</code> из резервной копии</td></tr></tbody></table>

## Параметры мигратора

<table><thead><tr><th width="232.80859375">Параметр</th><th>Назначение</th></tr></thead><tbody><tr><td><code>--profile main</code></td><td>Обработать только основную базу</td></tr><tr><td><code>--profile pulse</code></td><td>Обработать только Laravel Pulse</td></tr><tr><td><code>--profile all</code></td><td>Обработать основную базу и Pulse</td></tr><tr><td><code>--config &#x3C;path></code></td><td>Указать путь к JSON-конфигурации</td></tr><tr><td><code>--env &#x3C;path></code></td><td>Указать путь к Laravel <code>.env</code></td></tr><tr><td><code>--workers &#x3C;n></code></td><td>Временно изменить количество workers</td></tr><tr><td><code>--no-switch</code></td><td>Не переключать <code>.env</code></td></tr><tr><td><code>--schema-mode empty</code></td><td>Использовать пустую PostgreSQL-базу</td></tr><tr><td><code>--schema-mode auto</code></td><td>Автоматически создать базу</td></tr><tr><td><code>--schema-mode existing</code></td><td>Использовать заранее подготовленную схему</td></tr><tr><td><code>--schema-out &#x3C;path></code></td><td>Указать путь для команды <code>schema</code></td></tr><tr><td><code>--backup &#x3C;path></code></td><td>Указать резервную копию <code>.env</code> для возврата</td></tr><tr><td><code>--yes</code></td><td>Подтвердить команду, изменяющую данные</td></tr><tr><td><code>--version</code></td><td>Показать версию</td></tr></tbody></table>

## Частые ошибки

Проверьте пользователя, от которого запущен мигратор:

```bash
whoami
```

Ожидаемый результат:

```
root
```

Проверьте файл:

```bash
ls -la /root/.my.cnf
```

Если файл отсутствует, настройте отдельное подключение `source.lock`.

Не выдавайте глобальные права обычному пользователю приложения и не отключайте `exact`.

Проверьте в секции `target`:

* имя базы;
* имя пользователя;
* пароль;
* порт;
* `sslmode`.

Используйте пользователя, созданного вместе с PostgreSQL-базой в FASTPANEL.

Не используйте `fastuser` как пользователя приложения.

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

```bash
psql \
  --host=127.0.0.1 \
  --port=5432 \
  --username=app_example_com_pg \
  --dbname=app_example_com_pg
```

PostgreSQL-база уже использовалась мигратором и не считается чистой.

Для рабочего переноса создайте новую пустую базу через FASTPANEL. Не удаляйте служебные таблицы вручную, если не уверены в происхождении объектов.

Для пустой базы выбран режим:

```
existing
```

Используйте:

```json
"schema_mode": "empty"
```

И запустите:

```bash
--schema-mode empty
```

До переноса в ней были созданы таблицы.

Не выполняйте для пустой целевой базы:

```bash
php artisan migrate
php artisan product-updates:run
```

Не загружайте SQL-схему вручную. Создайте новую пустую PostgreSQL-базу через FASTPANEL.

Удаление базы не всегда удаляет PostgreSQL-роль.

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

Не выполняйте `DROP ROLE` без проверки зависимостей.

Отключите профиль:

```json
"pulse": {
  "enabled": false
}
```

Не оставляйте включённый профиль с вымышленными реквизитами.

Мигратор принимает PostgreSQL `18.x`.

Проверьте установленную версию и выполните инструкцию подключения PostgreSQL 18.

Точная команда `verify` должна выполняться до Product Updates.

Если Product Updates уже изменил структуру PostgreSQL, используйте аудитор:

```bash
./tools/db-auditor/iex-db-auditor audit \
  --profile all \
  --strict
```

Не создавайте объект вручную.

Проверьте:

1. завершился ли `run` без ошибок;
2. завершился ли `verify`;
3. присутствовал ли объект в исходной MySQL;
4. не запускалось ли приложение между `run` и `verify`;
5. какую ошибку показывает doctor.

Диагностика:

```bash
php artisan product-updates:doctor \
  --strict \
  --full \
  --support
```

Посмотрите последний постоянный лог:

```bash
ls -lt storage/logs/db-migrator/
```

Не удаляйте PostgreSQL-базу без проверки состояния переноса.

Если база была опубликована, сначала изучите лог и выполните `verify`.

Выполните:

```bash
chmod 600 tools/db-migrator/db-migrator.json
```

Файл:

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

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

```bash
chmod 0755 tools/db-migrator/iex-db-migrator
chmod 0755 tools/db-migrator/iex-db-migrator-linux-amd64
chmod 0755 tools/db-migrator/iex-db-migrator-linux-arm64
```

Проверьте архитектуру:

```bash
uname -m
```

Launcher должен выбрать соответствующий бинарный файл.

***

## Короткая последовательность команд

Работа выполняется от пользователя `root` из корня Backend:

```bash
chmod 600 tools/db-migrator/db-migrator.json

./tools/db-migrator/iex-db-migrator \
  config-check \
  --profile all

./tools/db-migrator/iex-db-migrator \
  target-check \
  --profile all

./tools/db-migrator/iex-db-migrator \
  plan \
  --profile all

./tools/db-backup/iex-db-backup \
  export \
  --profile all \
  --tag before-mysql-to-postgresql

./tools/db-migrator/iex-db-migrator \
  run \
  --profile all \
  --schema-mode empty \
  --yes

./tools/db-migrator/iex-db-migrator \
  verify \
  --profile all
```

После успешного `verify` переключитесь на владельца сайта:

```bash
su - example_com_usr
cd ~/www/app.example.com
```

Выполните:

```bash
php artisan product-updates:run --dry-run -v
php artisan product-updates:run
php artisan db:show --database=pgsql
php artisan product-updates:status --limit=5
php artisan queue:restart
```

***

## Контрольный список

{% stepper %}
{% step %}

### До переноса

* [ ] PostgreSQL 18 установлен.
* [ ] PostgreSQL доступен только локально.
* [ ] В PHP 8.4 включены `pdo_pgsql` и `pgsql`.
* [ ] PostgreSQL добавлен в FASTPANEL.
* [ ] PostgreSQL имеет статус «Доступен».
* [ ] Создана пустая основная PostgreSQL-база.
* [ ] Создан отдельный пользователь основной базы.
* [ ] При необходимости создана пустая база `pulse_pg`.
* [ ] Пользователь Pulse называется `pulse_pg`.
* [ ] PostgreSQL-базы используют кодировку `UTF8`.
* [ ] `db-migrator.json` заполнен.
* [ ] Для файла установлены права `0600`.
* [ ] Указано `exact=true`.
* [ ] Указано `schema_mode=empty`.
* [ ] Указано `allow_non_empty=false`.
* [ ] Указано `allow_target_reset=false`.
* [ ] `config-check` завершился успешно.
* [ ] `target-check` завершился успешно.
* [ ] `plan` завершился успешно.
* [ ] Резервная копия MySQL создана.
* [ ] Резервная копия скачана с сервера.
* [ ] Подготовлено окно обслуживания.
  {% endstep %}

{% step %}

### После переноса

* [ ] `run` завершился кодом `0`.
* [ ] Профиль `main` перенесён.
* [ ] Pulse перенесён или явно пропущен.
* [ ] Количество строк совпало.
* [ ] SHA-256 digest совпал.
* [ ] `.env` переключён на PostgreSQL.
* [ ] Создан `.env.mysql-to-pg.<UTC>.bak`.
* [ ] Отдельный `verify` завершился успешно.
* [ ] Product Updates dry-run завершился успешно.
* [ ] Product Updates применён.
* [ ] PostgreSQL-аудит выполнен.
* [ ] Очереди и процессы перезапущены.
* [ ] Административная панель проверена.
* [ ] Тестовая заявка создана.
* [ ] Логи проверены.
* [ ] Резервная копия PostgreSQL создана.
* [ ] Клиентский трафик включён.
  {% endstep %}
  {% endstepper %}

***

## Коротко

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

```
schema_mode=empty
```

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

```bash
./tools/db-migrator/iex-db-migrator config-check --profile all
./tools/db-migrator/iex-db-migrator target-check --profile all
./tools/db-migrator/iex-db-migrator plan --profile all
```

Основная команда:

```bash
./tools/db-migrator/iex-db-migrator run \
  --profile all \
  --schema-mode empty \
  --yes
```

После неё до запуска приложения выполняется:

```bash
./tools/db-migrator/iex-db-migrator verify --profile all
```

Режимы `auto` и `existing` используются только в нестандартных технических сценариях. Для обычного клиента и пустых баз FASTPANEL они не требуются.


# Планировщик задач

Настройка заданий cron на сервере

Планировщик задач CRON позволяет автоматически выполнять системные задачи iEXExchanger без участия администратора.

С помощью CRON система регулярно запускает Laravel Scheduler, который отвечает за выполнение внутренних процессов обменного пункта:

* обновление курсов валют;
* обработку платёжных операций;
* выполнение фоновых задач модулей;
* работу очередей;
* отправку уведомлений;
* очистку временных файлов и логов;
* выполнение автоматических действий по расписанию.

Для корректной работы iEXExchanger настройка CRON является обязательной.

***

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

Перед выполнением данной инструкции убедитесь, что:

* Backend уже установлен и настроен;
* файл .env заполнен корректно;
* PHP 8.4 установлен через FastPanel;
* вы знаете путь к Backend-проекту;
* у вас есть доступ к панели управления FastPanel.

{% hint style="warning" %}

#### Важно

CRON-задачи должны запускаться только от имени пользователя сайта, который был автоматически создан FastPanel.

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

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

{% hint style="info" %}

#### Важно

Для проектов iEXExchanger необходимо использовать PHP FastPanel:  `/opt/php84/bin/php`

Не используйте системный PHP: `/usr/bin/php` или `php`

Это может привести к запуску проекта на неправильной версии PHP.
{% endhint %}

***

{% stepper %}
{% step %}

### Откройте сайт в FastPanel

Авторизуйтесь в панели управления FastPanel.

Перейдите в раздел **«Сайты»**.

В списке сайтов выберите технический поддомен: **app.**<mark style="color:red;">**ваш\_домен**</mark>

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

Именно для Backend-проекта необходимо создавать задачу CRON.
{% endstep %}

{% step %}

### Откройте раздел «Планировщик»

В меню управления сайтом откройте раздел **«Планировщик».**

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

После открытия раздела отобразится список существующих задач CRON.
{% endstep %}

{% step %}

### Создайте новую задачу

В правом верхнем углу нажмите кнопку **«Новая задача».**

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

Откроется форма создания новой CRON-задачи.
{% endstep %}

{% step %}

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

В поле **«Задание»** укажите следующую команду:

<figure><img src="/files/FbF0xBp7LGF5YaNBcJoX" alt="" width="563"><figcaption></figcaption></figure>

```
/opt/php84/bin/php путь_к_проекту/artisan schedule:run >/dev/null 2>&1
```

{% hint style="warning" %}

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

* Между `/opt/php84/bin/php` и путём к проекту обязательно должен быть пробел.
* Путь к проекту должен быть полным и точным, как в FastPanel.
* Используется именно PHP 8.4 FastPanel, а не <mark style="color:red;">**/usr/bin/php**</mark>.
  {% endhint %}
  {% endstep %}

{% step %}

### Настройте расписание

В поле **«Время запуска»** выберите значение **«Свое».**

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

После этого заполните поля следующим образом:

| Параметр    | Значение |
| ----------- | -------- |
| Минута      | \*       |
| Час         | \*       |
| День        | \*       |
| Месяц       | \*       |
| День недели | \*       |

Такая конфигурация запускает Laravel Scheduler каждую минуту.

Именно такой вариант рекомендуется разработчиками Laravel и используется по умолчанию в iEXExchanger.
{% endstep %}

{% step %}

### Сохраните задачу

После заполнения всех параметров нажмите кнопку «Сохранить».

После сохранения задача появится в списке активных CRON-задач.

С этого момента Laravel Scheduler начнёт автоматически выполнять все системные задачи проекта.
{% endstep %}
{% endstepper %}

***

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

После настройки рекомендуется убедиться, что планировщик работает корректно.

Подключитесь к серверу через SSH под пользователем сайта.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Перейдите в директорию Backend-проекта:

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

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

```
/opt/php84/bin/php artisan schedule:list
```


# Создание резервной копии

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

Для создания резервных копий PostgreSQL в iEXExchanger используется инструмент `iEX DB Backup`. Он экспортирует основную базу приложения, базу Laravel Pulse и дополнительные базы PostgreSQL.

Каждая новая резервная копия проверяется перед сохранением и получает manifest с контрольной суммой SHA-256. Это позволяет убедиться, что файл не повреждён и относится к нужному профилю.

## Где находится инструмент

Основная команда:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```
tools/db-backup/iex-db-backup
```

Пример конфигурации:

```
tools/db-backup/db-backup.example.json
```

Рабочая конфигурация:

```
tools/db-backup/db-backup.json
```

Стандартный каталог резервных копий:

```
storage/app/backups/database/
```

Логи:

```
storage/logs/db-backup/
```

Все команды рекомендуется выполнять из корня Backend-проекта.

Для FASTPANEL путь обычно выглядит так:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

```
/var/www/SITE_OWNER/data/www/app.example.com
```

## Для чего нужен iEX DB Backup

Через инструмент можно:

* создать резервную копию основной базы приложения;
* отдельно сохранить базу Laravel Pulse;
* подключить дополнительные базы PostgreSQL;
* создать сжатый `.sql.gz`;
* получить обычный `.sql`;
* добавить метку к имени файла;
* сохранить копию в стандартный или отдельный каталог;
* проверить SQL-файл без подключения к рабочей базе;
* сверить SQL-файл с manifest;
* проверить контрольную сумму SHA-256;
* выполнить контрольное восстановление в пустую базу;
* настроить автоматическое копирование через CRON.

Инструмент не выполняет:

* изменение Laravel `.env`;
* Product Updates;
* Laravel migrations;
* очистку рабочей базы;
* включение режима обслуживания;
* удаление старых копий;
* перезапись существующих backup-файлов.

{% hint style="danger" %}
`iEX DB Backup` сохраняет только базу данных.

Файлы Backend и Frontend, `.env`, изображения, пользовательские загрузки и содержимое каталога `storage` необходимо резервировать отдельно.
{% endhint %}

## Как работает резервное копирование

После запуска инструмент:

1. загружает конфигурацию;
2. получает реквизиты выбранного профиля;
3. проверяет подключение к PostgreSQL;
4. запускает `pg_dump`;
5. создаёт временный SQL-файл;
6. проверяет содержимое SQL;
7. вычисляет SHA-256;
8. создаёт manifest;
9. публикует готовую резервную копию.

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

Если проверка не пройдена, файл не считается готовой резервной копией.

Существующие файлы не перезаписываются.

## Что создаётся

Для каждого профиля создаются два файла:

| Файл                         | Назначение                               |
| ---------------------------- | ---------------------------------------- |
| `<имя>.sql.gz`               | Сжатая SQL-копия PostgreSQL              |
| `<имя>.sql.gz.manifest.json` | Manifest с информацией о резервной копии |

По умолчанию файлы сохраняются в отдельный UTC-каталог:

```
storage/app/backups/database/YYYYMMDDTHHMMSSZ/
```

Пример:

```
storage/app/backups/database/20260719T030000Z/
├── main-postgresql-app_example_com_pg-before-update.sql.gz
├── main-postgresql-app_example_com_pg-before-update.sql.gz.manifest.json
├── pulse-postgresql-pulse_pg-before-update.sql.gz
└── pulse-postgresql-pulse_pg-before-update.sql.gz.manifest.json
```

Каталог создаётся с правами:

```
0700
```

SQL-файлы и manifest создаются с правами:

```
0600
```

Manifest содержит:

* имя профиля;
* название профиля;
* метку запуска;
* тип базы данных;
* тип сжатия;
* размер файла;
* SHA-256;
* количество таблиц;
* количество индексов;
* первичные ключи;
* уникальные ограничения;
* внешние ключи;
* количество строк.

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

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

* PostgreSQL 18 установлен и работает;
* Backend iEXExchanger подключён к PostgreSQL;
* вы знаете пользователя Backend-сайта;
* в корне проекта находятся `.env` и `artisan`;
* каталог `tools/db-backup/` присутствует;
* в `.env` указаны рабочие реквизиты PostgreSQL;
* на сервере установлен `pg_dump`;
* на диске достаточно свободного места.

Go на сервер устанавливать не требуется. Launcher автоматически выбирает бинарный файл для архитектуры сервера.

Поддерживаются:

* Linux amd64;
* Linux arm64;
* macOS arm64.

Проверьте версию инструмента:

```bash
./tools/db-backup/iex-db-backup --version
```

Проверьте `pg_dump`:

```bash
pg_dump --version
```

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

```
pg_dump 18
```

Проверка точного файла:

```bash
/usr/lib/postgresql/18/bin/pg_dump --version
```

Инструкция по установке PostgreSQL 18:

{% content-ref url="/pages/nTV8YubEHpIQWlwePofG" %}
[Подключение PostgreSQL](/server-i-dannye/rabota-s-postgresql/podklyuchenie-postgresql)
{% endcontent-ref %}

{% hint style="warning" %}
Запускайте `iEX DB Backup` от пользователя Backend-сайта, а не от `root`.

Так резервные копии, временные файлы и логи получат правильного владельца.
{% endhint %}

***

## Какие базы сохраняются

Для каждой базы используется отдельный профиль.

{% stepper %}
{% step %}

### Основная база приложения

Профиль `main` сохраняет основную базу iEXExchanger:

```json
"main": {
  "enabled": true,
  "optional": false,
  "label": "Основная база приложения",
  "env": "main"
}
```

Реквизиты берутся из стандартных параметров Laravel:

```dotenv
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=app_example_com_pg
DB_USERNAME=app_example_com_pg
DB_PASSWORD=CHANGE_ME
DB_SSLMODE=disable
```

{% endstep %}

{% step %}

### База Laravel Pulse

Профиль `pulse` сохраняет базу Laravel Pulse:

```json
"pulse": {
  "enabled": true,
  "optional": true,
  "label": "База Laravel Pulse",
  "env": "pulse"
}
```

Реквизиты берутся из:

```dotenv
PULSE_DB_CONNECTION=pgsql-pulse
PULSE_DB_HOST=127.0.0.1
PULSE_DB_PORT=5432
PULSE_DB_DATABASE=pulse_pg
PULSE_DB_USERNAME=pulse_pg
PULSE_DB_PASSWORD=CHANGE_ME
PULSE_DB_SSLMODE=disable
```

Параметр:

```json
"optional": true
```

позволяет пропустить недоступный Pulse при выполнении общей команды:

```bash
./tools/db-backup/iex-db-backup export \
  --profile all
```

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

Если отдельно запустить:

```bash
./tools/db-backup/iex-db-backup export \
  --profile pulse
```

при недоступной базе Pulse команда завершится ошибкой.
{% endstep %}
{% endstepper %}

### Если Laravel Pulse не используется

Отключите профиль:

```json
"pulse": {
  "enabled": false,
  "optional": true,
  "label": "База Laravel Pulse",
  "env": "pulse"
}
```

После этого команда с `--profile all` обработает только остальные включённые профили.

***

## Пошаговое создание резервной копии

{% stepper %}
{% step %}

### Перейдите в Backend-проект

Для FASTPANEL:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

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

Пример:

```bash
cd /var/www/example_usr/data/www/app.example.com
```

Проверьте текущий каталог:

```bash
pwd
```

Проверьте обязательные файлы:

```bash
ls -la artisan .env tools/db-backup
```

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

```bash
ls -la tools/db-backup/iex-db-backup*
```

Если право на запуск потерялось после загрузки или распаковки архива:

```bash
chmod 755 tools/db-backup/iex-db-backup*
```

{% endstep %}

{% step %}

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

Если `db-backup.json` ещё не существует:

```bash
cp tools/db-backup/db-backup.example.json \
  tools/db-backup/db-backup.json
```

Установите приватные права:

```bash
chmod 600 tools/db-backup/db-backup.json
```

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

```json
{
  "version": 1,
  "profiles": {
    "main": {
      "enabled": true,
      "optional": false,
      "label": "Основная база приложения",
      "env": "main"
    },
    "pulse": {
      "enabled": true,
      "optional": true,
      "label": "База Laravel Pulse",
      "env": "pulse"
    }
  }
}
```

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

```bash
ls -la tools/db-backup/db-backup.json
```

Ожидаемый результат:

```
-rw-------
```

{% hint style="danger" %}
`db-backup.json` может содержать пароли.

Не добавляйте его в Git, не размещайте в публичном каталоге и не используйте символическую ссылку.
{% endhint %}

Если конфигурация уже существует, не перезаписывайте её. Сначала проверьте текущие профили и сохраните защищённую копию.
{% endstep %}

{% step %}

### Проверьте конфигурацию

Выполните:

```bash
./tools/db-backup/iex-db-backup config-check \
  --profile all
```

Команда проверит:

* структуру `db-backup.json`;
* права конфигурационного файла;
* параметры из `.env`;
* подключения к PostgreSQL;
* доступность профилей;
* количество найденных объектов.

Успешный результат заканчивается сообщением:

```
All selected profiles completed successfully.
```

`config-check` не создаёт резервную копию и не изменяет данные.
{% endstep %}

{% step %}

### Создайте резервную копию

Для основной базы и Laravel Pulse:

```bash
./tools/db-backup/iex-db-backup export \
  --profile all \
  --tag before-update
```

Только для основной базы:

```bash
./tools/db-backup/iex-db-backup export \
  --profile main \
  --tag manual
```

Только для Laravel Pulse:

```bash
./tools/db-backup/iex-db-backup export \
  --profile pulse \
  --tag manual
```

Для всех выбранных профилей используется один UTC-каталог и одна метка запуска.
{% endstep %}

{% step %}

### Проверьте результат

После успешного экспорта должно появиться:

```
All selected profiles completed successfully.
```

Проверьте код завершения:

```bash
echo $?
```

Успешный код:

```
0
```

Возьмите фактический путь к созданному файлу из результата команды и выполните:

```bash
./tools/db-backup/iex-db-backup inspect \
  --file storage/app/backups/database/<UTC>/<BACKUP>.sql.gz \
  --require-manifest
```

Пример:

```bash
./tools/db-backup/iex-db-backup inspect \
  --file storage/app/backups/database/20260719T030000Z/main-postgresql-app_example_com_pg-before-update.sql.gz \
  --require-manifest
```

При необходимости укажите ожидаемый профиль:

```bash
./tools/db-backup/iex-db-backup inspect \
  --profile main \
  --file /secure/backups/main-postgresql-app_example_com_pg-before-update.sql.gz \
  --require-manifest
```

{% endstep %}

{% step %}

### Сохраните копию вне сервера

Для каждого профиля сохраните оба файла:

```
*.sql.gz
*.sql.gz.manifest.json
```

Подходящие места хранения:

* отдельный backup-сервер;
* защищённое объектное хранилище;
* локальный защищённый компьютер;
* другой физический диск.

{% hint style="warning" %}
Не храните единственную резервную копию на сервере с проектом.

При повреждении диска или потере доступа к серверу копия может быть утрачена вместе с рабочей базой.
{% endhint %}
{% endstep %}
{% endstepper %}

***

## Проверка резервной копии

Команда `inspect` не подключается к рабочей базе и ничего в ней не изменяет.

Она проверяет:

* файл является обычным файлом;
* файл не является символической ссылкой;
* gzip-поток не повреждён;
* SQL относится к PostgreSQL;
* размер файла;
* SHA-256;
* соответствие manifest;
* имя файла;
* профиль;
* количество таблиц;
* индексы;
* первичные ключи;
* уникальные ограничения;
* внешние ключи;
* команды `COPY`;
* количество строк;
* отсутствие запрещённых управляющих SQL-команд.

Пример успешного результата:

```
SQL artifact valid: ...
Manifest: profile=main, label="Основная база приложения"
Engine=postgresql, compression=gzip, bytes=...
Inventory: tables=..., indexes=..., PK=..., UNIQUE=..., FK=..., rows=...
```

Наличие `.sql.gz` ещё не подтверждает успешное создание копии.

Должны выполняться все условия:

* экспорт завершился кодом `0`;
* показано `All selected profiles completed successfully`;
* рядом создан manifest;
* `inspect` завершился успешно.

## Хранение SQL и manifest

SQL и manifest необходимо хранить вместе:

```
main.sql.gz
main.sql.gz.manifest.json
```

Не переименовывайте только один файл.

Неправильно:

```
backup.sql.gz
main.sql.gz.manifest.json
```

Manifest содержит исходное имя SQL-файла. Если переименовать только один файл, проверка завершится ошибкой.

Оба файла можно переместить в другой каталог, сохранив их имена.

### Проверка старого SQL без manifest

Старый доверенный SQL-файл можно проверить без manifest:

```bash
./tools/db-backup/iex-db-backup inspect \
  --file database/legacy_dump.sql
```

В результате будет показано:

```
Manifest: absent
```

Для такого файла нельзя использовать:

```
--require-manifest
```

Для новых резервных копий всегда сохраняйте manifest.

## Метки резервных копий

Параметр `--tag` добавляет понятную метку в имя SQL-файла и manifest:

```bash
./tools/db-backup/iex-db-backup export \
  --profile all \
  --tag before-product-update
```

Примеры:

```
before-product-update
before-migration
before-release-11.3.0
manual
scheduled
incident-copy
```

Допускаются:

* латинские буквы;
* цифры;
* точка;
* дефис;
* подчёркивание.

Максимальная длина — 64 байта.

Используйте латиницу без пробелов, двоеточий и слешей.

## Форматы резервных копий

{% stepper %}
{% step %}

### Сжатая резервная копия

По умолчанию используется gzip:

```bash
./tools/db-backup/iex-db-backup export \
  --profile main \
  --compression gzip \
  --tag manual
```

Результат:

```
*.sql.gz
*.sql.gz.manifest.json
```

Для большинства проектов рекомендуется использовать этот формат.
{% endstep %}

{% step %}

### Обычный SQL-файл

Чтобы получить несжатый `.sql`:

```bash
./tools/db-backup/iex-db-backup export \
  --profile main \
  --compression none \
  --tag manual \
  --output storage/app/backups/manual/main.sql
```

При `--compression gzip` имя должно заканчиваться на `.gz`.

При `--compression none` окончание `.gz` использовать нельзя.

{% hint style="danger" %}
Не сохраняйте рабочую базу с клиентскими данными в каталоге `database/` и не добавляйте её в Git.

Каталог `database/` можно использовать только для очищенного установочного snapshot.
{% endhint %}
{% endstep %}
{% endstepper %}

***

## Выбор каталога

{% stepper %}
{% step %}

### Стандартный каталог

Если `--output` не указан, файлы сохраняются в:

```
storage/app/backups/database/<UTC>/
```

Для большинства проектов рекомендуется использовать стандартный каталог.
{% endstep %}

{% step %}

### Отдельный каталог

Чтобы сохранить копии в другом каталоге:

```bash
./tools/db-backup/iex-db-backup export \
  --profile all \
  --tag before-update \
  --output /secure/backups/iexexchanger/
```

При `--profile all` значение `--output` всегда считается каталогом.

Каталог должен:

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

Создайте каталог:

```bash
mkdir -p /secure/backups/iexexchanger
```

Установите права:

```bash
chmod 700 /secure/backups/iexexchanger
```

Убедитесь, что пользователь Backend-сайта может записывать в этот каталог.
{% endstep %}

{% step %}

### Точное имя файла

Точное имя можно указать только для одного профиля:

```bash
./tools/db-backup/iex-db-backup export \
  --profile main \
  --tag before-update \
  --output storage/app/backups/manual/main-before-update.sql.gz
```

Чтобы указать каталог для одного профиля, завершите путь символом `/`:

```bash
./tools/db-backup/iex-db-backup export \
  --profile main \
  --output storage/app/backups/manual/
```

Если файл уже существует, команда остановится:

```
refusing to overwrite existing backup
```

{% endstep %}
{% endstepper %}

***

## Прямое подключение к PostgreSQL

Если Laravel подключается через pooler, а `pg_dump` должен обращаться напрямую к PostgreSQL, добавьте в `.env`:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

```dotenv
DB_DIRECT_HOST=127.0.0.1
DB_DIRECT_PORT=5432
DB_DIRECT_DATABASE=app_example_com_pg
DB_DIRECT_USERNAME=app_example_com_pg
DB_DIRECT_PASSWORD=CHANGE_ME
DB_DIRECT_SSLMODE=disable
```

Если параметры `DB_DIRECT_*` заполнены, инструмент использует их для экспорта основной базы.

Рабочее подключение Laravel при этом не изменяется.

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

Автоматический запуск настраивается через CRON пользователя Backend-сайта.

{% content-ref url="/pages/VQTz35uLnAox2blCwlqe" %}
[Планировщик задач](/server-i-dannye/planirovshik-zadach)
{% endcontent-ref %}

Подготовьте каталог логов:

```bash
mkdir -p storage/logs/db-backup
```

```bash
chmod 700 storage/logs/db-backup
```

Откройте планировщик:

```bash
crontab -e
```

Для PostgreSQL 18 укажите путь к `pg_dump`:

```cron
IEX_DB_TOOL_PG_DUMP=/usr/lib/postgresql/18/bin/pg_dump
```

Пример ежедневного запуска в 03:15:

```cron
15 3 * * * cd /var/www/имя_пользователя_backend/data/www/app.example.com && umask 077 && /usr/bin/flock -n storage/framework/iex-db-backup.lock ./tools/db-backup/iex-db-backup export --profile all --tag scheduled >> storage/logs/db-backup/cron.log 2>&1
```

`flock` запрещает запуск второго процесса, если предыдущий ещё работает.

Для каждого запуска создаётся новый UTC-каталог. Существующие файлы не перезаписываются.

{% hint style="warning" %}
`iEX DB Backup` не удаляет старые копии автоматически.

Следите за свободным местом и настройте собственную политику хранения.
{% endhint %}

## Где находятся логи

Логи сохраняются в:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

```
storage/logs/db-backup/
```

Пример:

```
storage/logs/db-backup/20260719T030000.000000000Z-export-all.log
```

Лог содержит:

* выполненную команду;
* выбранные профили;
* путь к конфигурации;
* путь к `.env`;
* путь к результату;
* прогресс;
* размер файла;
* SHA-256;
* итоговый статус.

Пароли в лог не записываются.

Каталог логов должен иметь права:

```
0700
```

Установите их при необходимости:

```bash
chmod 700 storage/logs/db-backup
```

Логи создаются с правами:

```
0600
```

## Контрольное восстановление

Команда `inspect` проверяет SQL и manifest, но наиболее надёжная проверка — восстановление в отдельную пустую базу.

{% hint style="danger" %}
Не проверяйте восстановление на рабочей базе.

Создайте отдельную пустую базу, которая не используется приложением.
{% endhint %}

Создайте в FASTPANEL пустую PostgreSQL-базу:

```
app_example_com_restore_test
```

Добавьте в `db-backup.json` профиль:

```json
"restore_test": {
  "enabled": true,
  "optional": false,
  "label": "Тестовое восстановление основной базы",
  "connection": {
    "driver": "pgsql",
    "host": "127.0.0.1",
    "port": 5432,
    "database": "app_example_com_restore_test",
    "username": "app_example_com_restore_test",
    "password": "CHANGE_ME",
    "socket": "",
    "tls": "",
    "sslmode": "disable",
    "admin": null
  }
}
```

Проверьте подключение:

```bash
./tools/db-backup/iex-db-backup config-check \
  --profile restore_test
```

Выполните восстановление:

```bash
./tools/db-backup/iex-db-backup import \
  --profile restore_test \
  --from-profile main \
  --expect-tag before-update \
  --file /secure/backups/main-postgresql-app_example_com_pg-before-update.sql.gz \
  --require-manifest \
  --yes
```

Параметры:

<table><thead><tr><th width="374">Параметр</th><th>Назначение</th></tr></thead><tbody><tr><td><code>--profile restore_test</code></td><td>Пустая тестовая база</td></tr><tr><td><code>--from-profile main</code></td><td>Ожидаемый профиль исходной копии</td></tr><tr><td><code>--expect-tag before-update</code></td><td>Ожидаемая метка</td></tr><tr><td><code>--file</code></td><td>Путь к SQL-файлу</td></tr><tr><td><code>--require-manifest</code></td><td>Обязательная проверка manifest</td></tr><tr><td><code>--yes</code></td><td>Подтверждение восстановления</td></tr></tbody></table>

Если база содержит пользовательские объекты, команда остановится:

```
refusing to import into non-empty PostgreSQL backup profile
```

Инструмент не очищает базу автоматически.

## Дополнительные базы PostgreSQL

Для дополнительной базы создайте отдельный профиль:

```json
"archive_pg": {
  "enabled": true,
  "optional": false,
  "label": "Архивная PostgreSQL-база",
  "connection": {
    "driver": "pgsql",
    "host": "127.0.0.1",
    "port": 5432,
    "database": "archive_database",
    "username": "archive_user",
    "password": "CHANGE_ME",
    "socket": "",
    "tls": "",
    "sslmode": "disable",
    "admin": null
  }
}
```

Каждый профиль должен использовать только один источник реквизитов:

* `"env": "main"`;
* `"env": "pulse"`;
* `"connection": {...}`.

Одновременно указывать `env` и `connection` нельзя.

***

## Запуск из другого каталога

Если команда запускается не из корня Backend, передайте абсолютные пути:

```bash
/var/www/имя_пользователя_backend/data/www/app.example.com/tools/db-backup/iex-db-backup export \
  --env /var/www/имя_пользователя_backend/data/www/app.example.com/.env \
  --config /var/www/имя_пользователя_backend/data/www/app.example.com/tools/db-backup/db-backup.json \
  --profile all \
  --tag manual
```

Для команды `inspect` Laravel-проект не требуется:

```bash
/absolute/path/iex-db-backup inspect \
  --file /secure/backups/main.sql.gz \
  --require-manifest
```

## Хранение резервных копий

Пример базовой политики:

| Тип копии          | Срок хранения                       |
| ------------------ | ----------------------------------- |
| Ежедневная         | 7–14 последних копий                |
| Еженедельная       | 4–8 последних копий                 |
| Перед обновлением  | До подтверждения стабильной работы  |
| Внешняя копия      | Минимум одна актуальная проверенная |
| Критическая версия | По внутренней политике проекта      |

Не удаляйте предыдущую копию, пока:

* новая копия не завершилась успешно;
* рядом не создан manifest;
* не выполнен `inspect`;
* файлы не сохранены вне основного сервера.

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

## Частые вопросы

<details>

<summary>Нужно ли останавливать сайт?</summary>

Нет. `pg_dump` создаёт транзакционно согласованный снимок PostgreSQL. Приложение может продолжать работу во время экспорта.

</details>

<details>

<summary>Можно ли запускать инструмент от root?</summary>

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

</details>

<details>

<summary>Что делать, если Laravel Pulse не используется?</summary>

Отключите профиль:

```json
"pulse": {
  "enabled": false
}
```

</details>

<details>

<summary>Достаточно ли наличия файла .sql.gz?</summary>

Нет. Рядом должен находиться manifest, экспорт должен завершиться кодом `0`, а `inspect` — без ошибок.

</details>

<details>

<summary>Можно ли переименовать резервную копию?</summary>

SQL и manifest связаны именем файла. Не переименовывайте только один из них.

</details>

<details>

<summary>Можно ли хранить копию только на сервере?</summary>

Не рекомендуется. Минимум одна актуальная проверенная копия должна находиться вне основного сервера.

</details>

<details>

<summary>Можно ли проверить восстановление на рабочей базе?</summary>

Нет. Для проверки создайте отдельную пустую базу PostgreSQL.

</details>

<details>

<summary>Нужно ли создавать копию Laravel Pulse?</summary>

Если Pulse используется, рекомендуется сохранять его вместе с основной базой через:

```bash
--profile all
```

Если данные Pulse не нужны для восстановления проекта, профиль можно отключить.

</details>

<details>

<summary>Можно ли создать копию без сжатия?</summary>

Да. Используйте:

```bash
--compression none
```

Для обычного хранения рекомендуется gzip.

</details>

## Частые ошибки

<details>

<summary>Конфигурация требует права 0600</summary>

Сообщение:

```
require 0600 or stricter
```

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

Исправьте права:

```bash
chmod 600 tools/db-backup/db-backup.json
```

Также проверьте, что файл не является символической ссылкой.

</details>

<details>

<summary>Не найден Laravel-проект</summary>

Сообщение:

```
could not locate Laravel project
```

Перейдите в корень Backend:

```bash
cd /var/www/SITE_OWNER/data/www/app.example.com
```

Либо передайте точные пути через `--env` и `--config`.

</details>

<details>

<summary>Профиль отключён или не существует</summary>

Сообщение:

```
profile ... is not defined or is disabled
```

Проверьте имя профиля и настройку:

</details>

<details>

<summary>Laravel Pulse недоступен</summary>

Сообщение:

```
profile pulse is unavailable
```

Проверьте:

```dotenv
PULSE_DB_CONNECTION=
PULSE_DB_HOST=
PULSE_DB_PORT=
PULSE_DB_DATABASE=
PULSE_DB_USERNAME=
PULSE_DB_PASSWORD=
```

Если Pulse не используется, отключите профиль.

</details>

<details>

<summary>Не найден pg_dump</summary>

Сообщение:

```
required native tool "pg_dump" was not found
```

Для PostgreSQL 18 выполните:

```bash
IEX_DB_TOOL_PG_DUMP=/usr/lib/postgresql/18/bin/pg_dump \
  ./tools/db-backup/iex-db-backup export \
  --profile main \
  --tag manual
```

Для CRON укажите:

```cron
IEX_DB_TOOL_PG_DUMP=/usr/lib/postgresql/18/bin/pg_dump
```

</details>

<details>

<summary>Версия pg_dump не соответствует PostgreSQL</summary>

Сообщение:

```
server version mismatch
```

Проверьте версию:

```bash
/usr/lib/postgresql/18/bin/pg_dump --version
```

Используйте бинарный файл PostgreSQL 18:

```bash
IEX_DB_TOOL_PG_DUMP=/usr/lib/postgresql/18/bin/pg_dump
```

</details>

<details>

<summary>Резервная копия уже существует</summary>

Сообщение:

```
refusing to overwrite existing backup
```

Используйте другую метку:

```bash
./tools/db-backup/iex-db-backup export \
  --profile main \
  --tag manual-2
```

Не удаляйте старую копию до успешного создания и проверки новой.

</details>

<details>

<summary>Manifest не соответствует SQL</summary>

Сообщение:

```
backup manifest does not match SQL artifact
```

Возможные причины:

* SQL и manifest относятся к разным запускам;
* один из файлов повреждён;
* переименован только один файл;
* SQL был изменён после экспорта.

Используйте исходную пару файлов.

</details>

<details>

<summary>Неправильные права каталога логов</summary>

Сообщение:

```
backup log directory ... require 0700
```

Исправьте права:

```bash
chmod 700 storage/logs/db-backup
```

</details>

<details>

<summary>Недостаточно свободного места</summary>

Проверьте диск:

```bash
df -h
```

Проверьте размер резервных копий:

```bash
du -sh storage/app/backups/database
```

При необходимости сохраните копию на другом диске:

```bash
./tools/db-backup/iex-db-backup export \
  --profile all \
  --tag manual \
  --output /secure/backups/iexexchanger/
```

</details>

***

## Доступные команды

<table><thead><tr><th width="212.0234375">Команда</th><th>Назначение</th></tr></thead><tbody><tr><td><code>config-check</code></td><td>Проверить конфигурацию и подключения</td></tr><tr><td><code>export</code></td><td>Создать резервную копию</td></tr><tr><td><code>backup</code></td><td>Синоним <code>export</code></td></tr><tr><td><code>inspect</code></td><td>Проверить SQL и manifest</td></tr><tr><td><code>import</code></td><td>Восстановить резервную копию</td></tr><tr><td><code>restore</code></td><td>Синоним <code>import</code></td></tr></tbody></table>

## Доступные параметры

<table><thead><tr><th width="204.59375">Команда</th><th>Параметры</th></tr></thead><tbody><tr><td><code>config-check</code></td><td><code>--profile</code>, <code>--env</code>, <code>--config</code>, <code>--version</code></td></tr><tr><td><code>export</code> / <code>backup</code></td><td><code>--profile</code>, <code>--env</code>, <code>--config</code>, <code>--output</code>, <code>--compression</code>, <code>--tag</code>, <code>--version</code></td></tr><tr><td><code>inspect</code></td><td><code>--file</code>, <code>--profile</code>, <code>--require-manifest</code>, <code>--version</code></td></tr><tr><td><code>import</code> / <code>restore</code></td><td><code>--profile</code>, <code>--from-profile</code>, <code>--expect-tag</code>, <code>--file</code>, <code>--require-manifest</code>, <code>--yes</code>, <code>--version</code></td></tr></tbody></table>

Параметры одной операции нельзя передавать другой.

Например, `--file` нельзя использовать с командой `export`.

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

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

* использовать профили `main` и `pulse`;
* получать реквизиты из Laravel `.env`;
* использовать `pg_dump` версии 18;
* создавать копии в формате `.sql.gz`;
* добавлять понятные метки через `--tag`;
* проверять каждый SQL-файл через `inspect`;
* хранить SQL и manifest вместе;
* сохранять минимум одну копию вне сервера;
* настроить ежедневный запуск через CRON;
* периодически проверять восстановление;
* контролировать свободное место на диске.

Перед Product Updates используйте метку:

```
before-product-update
```

***

## Коротко

`iEX DB Backup` создаёт резервные копии основной базы PostgreSQL, Laravel Pulse и дополнительных баз.

Стандартный порядок:

1. перейдите в Backend-проект;
2. создайте `db-backup.json`;
3. выполните `config-check`;
4. запустите `export`;
5. проверьте каждый файл через `inspect`;
6. сохраните SQL и manifest вне сервера.

Основные команды:

```bash
./tools/db-backup/iex-db-backup config-check --profile all
```

```bash
./tools/db-backup/iex-db-backup export \
  --profile all \
  --tag before-update
```

```bash
./tools/db-backup/iex-db-backup inspect \
  --file <ПУТЬ_К_BACKUP.sql.gz> \
  --require-manifest
```

Резервная копия считается готовой только после успешного `inspect` и сохранения файлов за пределами основного сервера.


# Производительность

Данная инструкция содержит рекомендации по настройке PHP 8.4 и PostgreSQL 18 для повышения производительности iEXExchanger.

Настройки предназначены для проектов, работающих на FastPanel. Готовые профили позволяют подобрать значения по мощности сервера без ручного расчёта каждого параметра.

{% hint style="warning" %}
Не выбирайте профиль выше фактических характеристик сервера. Завышенные значения могут привести к нехватке оперативной памяти и нестабильной работе PHP-FPM или PostgreSQL.
{% endhint %}

## Где находятся настройки

{% stepper %}
{% step %}

### Настройки PHP

Откройте FastPanel: **«Управление» — «PHP»**

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

Выберите используемую версию:

```
PHP 8.4
```

Затем откройте настройки переменных PHP.

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

Параметры также можно изменить отдельно для Backend-сайта. Для этого откройте карточку:

```
app.ВАШ_ДОМЕН
```

Перейдите в раздел **«Настройки PHP»**.
{% endstep %}

{% step %}

### Настройки PostgreSQL

Откройте FastPanel: **«Настройки» — «Базы данных»**

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

Затем перейдите в **«Серверы баз данных»**.

Выберите локальный сервер:

```
PostgreSQL 18 local
```

Нажмите **«Настроить переменные»**.

Изменение переменных через FastPanel доступно только для локального сервера PostgreSQL. Для внешнего сервера параметры настраиваются непосредственно на сервере базы данных.
{% endstep %}
{% endstepper %}

***

## Как выбрать профиль

| Профиль                         | Характеристики сервера   |
| ------------------------------- | ------------------------ |
| Минимальный                     | 2 vCPU, 4 ГБ ОЗУ         |
| Рекомендуемый                   | 4 vCPU, 8 ГБ ОЗУ         |
| Высокая производительность      | 8 vCPU, 16 ГБ ОЗУ        |
| Максимальная производительность | от 16 vCPU, от 32 ГБ ОЗУ |

Если сервер имеет промежуточный объём памяти, используйте ближайший меньший профиль.

Например, для сервера с 12 ГБ ОЗУ сначала используйте профиль на 8 ГБ. После проверки работы отдельные параметры можно увеличить.

## Профиль «Минимальный»

Подходит для:

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

{% stepper %}
{% step %}

### Сервер

```
2 vCPU
4 ГБ ОЗУ
40 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

Сервер с 4 ГБ ОЗУ рекомендуется использовать только для тестирования или небольшой нагрузки.
{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=512M

post_max_size=220M
upload_max_filesize=200M

max_execution_time=60
max_input_time=60

max_input_vars=10000

realpath_cache_size=4096K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '512MB'
effective_cache_size = '1536MB'

work_mem = '4MB'
maintenance_work_mem = '128MB'
autovacuum_work_mem = '64MB'

max_connections = 50

min_wal_size = '512MB'
max_wal_size = '2GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

## Профиль «Рекомендуемый»

Подходит большинству проектов iEXExchanger.

Профиль обеспечивает нормальный запас ресурсов для PHP, PostgreSQL и операционной системы без чрезмерного потребления памяти.

{% stepper %}
{% step %}

### Сервер

```
4 vCPU
8 ГБ ОЗУ
80 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=768M

post_max_size=220M
upload_max_filesize=200M

max_execution_time=120
max_input_time=120

max_input_vars=20000

realpath_cache_size=8192K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=50000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '1GB'
effective_cache_size = '3GB'

work_mem = '4MB'
maintenance_work_mem = '256MB'
autovacuum_work_mem = '128MB'

max_connections = 75

min_wal_size = '1GB'
max_wal_size = '4GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

## Профиль «Высокая производительность»

Подходит для:

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

{% stepper %}
{% step %}

### Сервер

```
8 vCPU
16 ГБ ОЗУ
160 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=1024M

post_max_size=520M
upload_max_filesize=500M

max_execution_time=180
max_input_time=180

max_input_vars=30000

realpath_cache_size=16384K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```
shared_buffers = '3GB'
effective_cache_size = '8GB'

work_mem = '8MB'
maintenance_work_mem = '512MB'
autovacuum_work_mem = '256MB'

max_connections = 100

min_wal_size = '1GB'
max_wal_size = '8GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

## Профиль «Максимальная производительность»

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

Используйте этот профиль только на сервере с достаточным количеством оперативной памяти, производительным процессором и Enterprise NVMe.

{% stepper %}
{% step %}

### Сервер

```
16+ vCPU
32+ ГБ ОЗУ
Enterprise NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=1536M

post_max_size=1050M
upload_max_filesize=1000M

max_execution_time=300
max_input_time=300

max_input_vars=50000

realpath_cache_size=32768K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '6GB'
effective_cache_size = '18GB'

work_mem = '16MB'
maintenance_work_mem = '1GB'
autovacuum_work_mem = '512MB'

max_connections = 150

min_wal_size = '2GB'
max_wal_size = '12GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

***

## Что означают настройки PHP

### memory\_limit

Ограничивает максимальную память одного PHP-скрипта.

Пример:

```ini
memory_limit=768M
```

Параметр не ускоряет PHP напрямую. Он разрешает выполнять операции, которым требуется больше памяти.

Не используйте на рабочем сервере:

```ini
memory_limit=-1
```

PHP должен иметь ограничение памяти.

### post\_max\_size

Ограничивает общий размер POST-запроса.

Значение должно быть больше `upload_max_filesize`.

Пример:

```ini
post_max_size=220M
upload_max_filesize=200M
```

### upload\_max\_filesize

Ограничивает размер одного загружаемого файла.

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

### max\_execution\_time

Ограничивает время выполнения одного веб-запроса.

Пример:

```ini
max_execution_time=120
```

Увеличение параметра не делает запрос быстрее. Оно только разрешает ему выполняться дольше.

### max\_input\_vars

Определяет максимальное количество переменных, которые PHP может принять из формы.

Для административной панели рекомендуется значение от:

```
10000
```

до:

```
50000
```

в зависимости от выбранного профиля.

### realpath\_cache\_size

Хранит результаты определения путей к PHP-файлам.

iEXExchanger использует большое количество PHP-классов, поэтому realpath-кеш уменьшает количество повторных обращений к файловой системе.

### opcache.memory\_consumption

Определяет объём оперативной памяти для хранения скомпилированного PHP-кода.

Пример:

```ini
opcache.memory_consumption=256
```

Память OPcache не нужно увеличивать вместе с `memory_limit`. Если весь PHP-код помещается в кеш, дальнейшее увеличение не даст заметного ускорения.

### opcache.max\_accelerated\_files

Определяет максимальное количество PHP-файлов, которые могут находиться в OPcache.

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

```ini
opcache.max_accelerated_files=50000
```

Для крупного проекта:

```ini
opcache.max_accelerated_files=100000
```

## Режимы OPcache

{% stepper %}
{% step %}

### Безопасный режим

Во всех основных профилях используется:

```ini
opcache.validate_timestamps=1
opcache.revalidate_freq=2
```

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

Этот режим рекомендуется большинству клиентов.
{% endstep %}

{% step %}

### Максимальная производительность

Если после каждого обновления гарантированно перезапускается PHP-FPM, можно использовать:

```ini
opcache.validate_timestamps=0
opcache.revalidate_freq=0
```

PHP перестанет проверять изменения файлов при обработке запросов.

{% hint style="warning" %}
При отключённой проверке файлов после каждого обновления обязательно перезапускайте PHP-FPM. Иначе сервер может продолжить выполнять предыдущую версию PHP-кода.
{% endhint %}
{% endstep %}

{% step %}

### JIT

Для обычной работы iEXExchanger рекомендуется оставить JIT выключенным:

```ini
opcache.jit=off
opcache.jit_buffer_size=0
```

Включение JIT не гарантирует ускорение Laravel-приложения и дополнительно использует оперативную память.
{% endstep %}
{% endstepper %}

## Что означают настройки PostgreSQL

### shared\_buffers

Определяет объём памяти собственного кеша PostgreSQL.

Пример:

```conf
shared_buffers = '1GB'
```

Чем больше данных находится в кеше, тем реже PostgreSQL обращается к диску.

Передавать PostgreSQL большую часть оперативной памяти не нужно. База также использует файловый кеш операционной системы.

### effective\_cache\_size

Сообщает планировщику PostgreSQL, какой объём кеша предположительно доступен.

Пример:

```conf
effective_cache_size = '3GB'
```

Параметр не резервирует указанный объём памяти. Он влияет только на выбор плана выполнения запросов.

### work\_mem

Ограничивает память одной операции сортировки или хеширования.

Пример:

```conf
work_mem = '8MB'
```

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

Не устанавливайте глобально:

```conf
work_mem = '128MB'
```

без предварительного расчёта.

### maintenance\_work\_mem

Используется при:

* создании индексов;
* выполнении `VACUUM`;
* добавлении внешних ключей;
* обслуживании таблиц.

Пример:

```conf
maintenance_work_mem = '512MB'
```

### autovacuum\_work\_mem

Ограничивает память одного процесса autovacuum.

Пример:

```conf
autovacuum_work_mem = '256MB'
```

Если одновременно работают несколько процессов autovacuum, каждый из них может использовать память отдельно.

### max\_connections

Ограничивает количество одновременных подключений к PostgreSQL.

Пример:

```conf
max_connections = 100
```

Большое значение не ускоряет базу. Каждое подключение использует оперативную память, поэтому лимит должен соответствовать мощности сервера.

### min\_wal\_size и max\_wal\_size

Определяют объём журнала WAL, который PostgreSQL хранит и использует между контрольными точками.

Пример:

```conf
min_wal_size = '1GB'
max_wal_size = '4GB'
```

Увеличение `max_wal_size` помогает распределить дисковую нагрузку, но требует свободного места на диске.

### checkpoint\_completion\_target

Значение:

```conf
checkpoint_completion_target = 0.9
```

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

### wal\_compression

Значение:

```conf
wal_compression = on
```

уменьшает объём части данных, записываемых в WAL. Это снижает дисковую нагрузку, но немного увеличивает использование процессора.

## Обязательные параметры PostgreSQL

Следующие параметры должны оставаться включёнными:

```conf
fsync = on
full_page_writes = on
synchronous_commit = on
autovacuum = on
```

Не отключайте их ради дополнительной скорости.

{% hint style="danger" %}
Отключение `fsync`, `full_page_writes` или `synchronous_commit` может привести к потере подтверждённых данных после сбоя сервера.
{% endhint %}

## Нужно ли переводить значения в байты

PostgreSQL принимает значения с единицами измерения:

```
512MB
1GB
8GB
```

Используйте значения в том виде, в котором они указаны в профилях.

Переводить их в байты не требуется.

## Если FastPanel не позволяет сохранить переменные

Если при сохранении появляется ошибка прав, служебной роли FastPanel нужно разрешить изменение выбранных параметров.

Подключитесь к серверу по SSH и выполните:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```bash
sudo -u postgres psql -X -d postgres <<'SQL'
GRANT pg_read_all_settings TO fastuser;

GRANT ALTER SYSTEM ON PARAMETER
    shared_buffers,
    effective_cache_size,
    work_mem,
    maintenance_work_mem,
    autovacuum_work_mem,
    max_connections,
    min_wal_size,
    max_wal_size,
    checkpoint_completion_target,
    wal_compression,
    autovacuum
TO fastuser;

GRANT EXECUTE
ON FUNCTION pg_catalog.pg_reload_conf()
TO fastuser;
SQL
```

Роль `fastuser` используется только для подключения FastPanel к PostgreSQL.

{% hint style="warning" %}
Не назначайте `fastuser` суперпользователем и не используйте эту роль для подключения iEXExchanger к базе данных.
{% endhint %}

## Как применить настройки PHP

После изменения параметров нажмите **«Сохранить»**.

Затем откройте: **«Настройки» — «Сервисы»**

Найдите PHP-FPM 8.4 и выполните перезапуск.

После этого новые параметры начнут использоваться сайтом.

## Как применить настройки PostgreSQL

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

```bash
sudo -u postgres psql -X -d postgres -c "
SELECT
    name,
    setting,
    pending_restart
FROM pg_settings
WHERE pending_restart = true
ORDER BY name;
"
```

Параметры `shared_buffers` и `max_connections` требуют полного перезапуска PostgreSQL.

Выполните:

```bash
pg_ctlcluster 18 main restart
```

Проверьте доступность:

```bash
pg_isready -h 127.0.0.1 -p 5432
```

Ожидаемый результат:

```
127.0.0.1:5432 - accepting connections
```

## Проверка настроек PHP

Проверьте основные значения:

```bash
/opt/php84/bin/php -i | grep -E \
'memory_limit|post_max_size|upload_max_filesize|max_execution_time|realpath_cache|opcache.memory_consumption'
```

Если параметры настроены отдельно для Backend-сайта, значения PHP-FPM могут отличаться от настроек PHP в командной строке.

## Проверка настроек PostgreSQL

Выполните:

```bash
sudo -u postgres psql -X -d postgres -P pager=off -c "
SELECT
    name,
    setting,
    unit,
    source,
    pending_restart
FROM pg_settings
WHERE name IN (
    'shared_buffers',
    'effective_cache_size',
    'work_mem',
    'maintenance_work_mem',
    'autovacuum_work_mem',
    'max_connections',
    'min_wal_size',
    'max_wal_size',
    'checkpoint_completion_target',
    'wal_compression',
    'autovacuum'
)
ORDER BY name;
"
```

После перезапуска в поле `pending_restart` должно отображаться:

```
false
```

## Частые ошибки

<details>

<summary>Сайт показывает 502 после изменения PHP</summary>

**Почему возникает**

PHP-FPM не запустился или указано недопустимое значение.

**Что проверить**

Откройте:

**«Настройки» — «Сервисы»**

Проверьте состояние PHP-FPM 8.4.

**Как исправить**

Верните предыдущее значение и повторно запустите PHP-FPM.

</details>

<details>

<summary>PHP не принимает большой файл</summary>

**Почему возникает**

`post_max_size` меньше `upload_max_filesize`.

**Как исправить**

Например, для файла до 200 МБ используйте:

```ini
post_max_size=220M
upload_max_filesize=200M
```

</details>

<details>

<summary>Изменения PHP не применились</summary>

**Почему возникает**

Не был перезапущен PHP-FPM или изменения внесены для другой версии PHP.

**Как исправить**

Проверьте, что Backend использует PHP 8.4, и перезапустите PHP-FPM 8.4.

</details>

<details>

<summary>Изменения кода не отображаются</summary>

**Почему возникает**

Отключена проверка изменений файлов:

```ini
opcache.validate_timestamps=0
```

**Как исправить**

Перезапустите PHP-FPM.

</details>

<details>

<summary>Настройка PostgreSQL сохранилась, но не применилась</summary>

**Почему возникает**

Параметр требует перезапуска PostgreSQL.

**Как исправить**

Выполните:

```bash
pg_ctlcluster 18 main restart
```

</details>

<details>

<summary>PostgreSQL не запускается</summary>

**Почему возникает**

Указано недопустимое значение или выбран слишком высокий профиль.

**Что проверить**

```bash
systemctl status postgresql@18-main --no-pager
```

Проверьте журнал:

```bash
journalctl -u postgresql@18-main -n 100 --no-pager
```

**Как исправить**

Верните значения предыдущего профиля и повторно запустите PostgreSQL.

</details>

<details>

<summary>Серверу не хватает оперативной памяти</summary>

**Почему возникает**

Выбран профиль выше характеристик сервера или завышены `work_mem`, `shared_buffers` и `max_connections`.

**Что проверить**

```bash
free -h
```

**Как исправить**

Перейдите на предыдущий профиль. В первую очередь уменьшите `work_mem`, `shared_buffers` и `max_connections`.

</details>

## Частые вопросы

<details>

<summary>Какой профиль выбрать для сервера с 12 ГБ ОЗУ?</summary>

Сначала используйте профиль **«Рекомендуемый»** для 8 ГБ.

После проверки можно изменить PostgreSQL:

```conf
shared_buffers = '2GB'
effective_cache_size = '6GB'

work_mem = '8MB'
maintenance_work_mem = '512MB'
autovacuum_work_mem = '256MB'

max_connections = 100

min_wal_size = '1GB'
max_wal_size = '6GB'
```

</details>

<details>

<summary>Чем больше memory_limit, тем быстрее работает PHP?</summary>

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

</details>

<details>

<summary>Нужно ли устанавливать upload_max_filesize равным 1 ГБ?</summary>

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

</details>

<details>

<summary>Можно ли установить max_connections равным 1000?</summary>

Технически можно, но это не ускорит PostgreSQL. Большое количество подключений увеличивает потребление памяти и может снизить производительность.

</details>

<details>

<summary>Можно ли использовать максимальный профиль на сервере с 16 ГБ?</summary>

Нет. Используйте профиль **«Высокая производительность»**.

</details>

<details>

<summary>Нужно ли включать JIT?</summary>

Для обычной работы iEXExchanger рекомендуется оставить JIT выключенным:

```ini
opcache.jit=off
opcache.jit_buffer_size=0
```

</details>

<details>

<summary>Нужно ли отключать autovacuum?</summary>

Нет. Autovacuum необходим для очистки устаревших версий строк и обновления статистики PostgreSQL.

</details>

<details>

<summary></summary>

</details>

***

## Рекомендуемый профиль для большинства клиентов

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

{% stepper %}
{% step %}

### Сервер

```
4 vCPU
8 ГБ ОЗУ
80 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=768M

post_max_size=220M
upload_max_filesize=200M

max_execution_time=120
max_input_time=120

max_input_vars=20000

realpath_cache_size=8192K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=50000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '1GB'
effective_cache_size = '3GB'

work_mem = '4MB'
maintenance_work_mem = '256MB'
autovacuum_work_mem = '128MB'

max_connections = 75

min_wal_size = '1GB'
max_wal_size = '4GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

Этот профиль обеспечивает сбалансированную работу PHP и PostgreSQL без чрезмерного потребления оперативной памяти.

## Коротко

Выберите профиль по фактическому объёму ОЗУ сервера.

Настройки PHP отвечают за допустимую память, загрузку файлов, время выполнения и кеширование PHP-кода. Настройки PostgreSQL управляют памятью базы, подключениями и журналом WAL.

После сохранения параметров перезапустите PHP-FPM и PostgreSQL. Не устанавливайте максимальный профиль на слабом сервере и не отключайте параметры надёжности PostgreSQL.


# Технологический стек

iEXExchanger — программная платформа для создания и управления сервисом электронного обмена валют.

Система объединяет серверную часть, административную панель, публичный сайт, базу данных, кеш, очереди, файловое хранилище и инфраструктуру для запуска фоновых процессов.

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

## Архитектура системы

iEXExchanger состоит из трёх основных компонентов:

<table><thead><tr><th width="293.91015625">Компонент</th><th>Назначение</th></tr></thead><tbody><tr><td><strong>Backend</strong></td><td>Выполняет бизнес-логику, расчёты, обработку заявок и работу с данными</td></tr><tr><td><strong>Административная панель</strong></td><td>Используется владельцем проекта, администраторами и операторами</td></tr><tr><td><strong>Публичный сайт</strong></td><td>Предоставляет клиентам интерфейс обменного сервиса</td></tr></tbody></table>

## Как работает система

Основная логика работы iEXExchanger выглядит следующим образом:

1. Клиент открывает публичный сайт.
2. Публичный сайт получает данные направлений, валют и курсов через API.
3. Клиент выбирает направление и создаёт заявку.
4. Backend проверяет введённые данные и настройки направления.
5. Система рассчитывает суммы, комиссии, курсы и лимиты.
6. Информация о заявке сохраняется в PostgreSQL.
7. Фоновые действия передаются в очередь Redis.
8. Laravel Horizon обрабатывает уведомления, webhooks, файлы и другие задачи.
9. Laravel Reverb передаёт обновления в реальном времени.
10. Администратор или оператор обрабатывает заявку через административную панель.

Такое разделение позволяет выполнять тяжёлые операции в фоне и не задерживать работу сайта.

## Языки программирования

В iEXExchanger используется несколько языков программирования. Каждый из них отвечает за определённую часть системы.

<table><thead><tr><th width="218.5859375">Язык</th><th>Назначение</th></tr></thead><tbody><tr><td><strong>PHP</strong></td><td>Backend, API, бизнес-логика и фоновые задачи</td></tr><tr><td><strong>TypeScript</strong></td><td>Административная панель и публичный сайт</td></tr><tr><td><strong>HTML и Blade</strong></td><td>Шаблоны страниц, писем и системных сообщений</td></tr><tr><td><strong>CSS и SCSS</strong></td><td>Стилизация интерфейсов и темы оформления</td></tr><tr><td><strong>SQL</strong></td><td>Работа со структурой и данными PostgreSQL</td></tr><tr><td><strong>Shell</strong></td><td>Установка, развёртывание и серверные скрипты</td></tr><tr><td><strong>Go</strong></td><td>Служебные инструменты для работы с базами данных</td></tr></tbody></table>

## Backend

Backend — центральная часть iEXExchanger.

Он отвечает за бизнес-логику системы и обработку всех основных операций.

{% stepper %}
{% step %}

### PHP 8.4

PHP 8.4 используется как основной серверный язык.

На PHP реализованы:

* API;
* бизнес-логика;
* административные действия;
* фоновые задачи;
* работа с базой данных;
* обработка интеграций;
* команды обслуживания системы.
  {% endstep %}

{% step %}

### Laravel 13

Laravel 13 используется как основной backend-фреймворк.

Он предоставляет базовые механизмы для:

* маршрутизации API;
* проверки входящих данных;
* авторизации;
* работы с базой данных;
* выполнения очередей;
* планирования задач;
* отправки уведомлений;
* кеширования;
* логирования;
* обработки файлов.
  {% endstep %}
  {% endstepper %}

iEXExchanger использует Laravel как основу, но бизнес-логика обменного сервиса реализуется внутри самой платформы.

## Административная панель

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

{% stepper %}
{% step %}

### Vue 3

Vue 3 используется как основной frontend-фреймворк административной панели.
{% endstep %}

{% step %}

### TypeScript

TypeScript используется как основной язык разработки административной панели.
{% endstep %}

{% step %}

### Vite

Vite используется для разработки и сборки административной панели.
{% endstep %}

{% step %}

### Tailwind CSS

Tailwind CSS используется для оформления административной панели.
{% endstep %}
{% endstepper %}

## Публичный сайт

Публичный сайт — клиентская часть обменного сервиса.

{% stepper %}
{% step %}

### Angular 22

Angular 22 используется как основной frontend-фреймворк публичного сайта.
{% endstep %}

{% step %}

### TypeScript

TypeScript используется как основной язык разработки публичного сайта.
{% endstep %}

{% step %}

### Angular SSR

Angular SSR используется для серверного рендеринга страниц.

При обычной клиентской загрузке браузер сначала получает JavaScript, после чего строит страницу.

При SSR сервер заранее формирует HTML и отправляет его браузеру.
{% endstep %}

{% step %}

### Node.js

Node.js используется как среда выполнения Angular SSR.

Он принимает запросы к публичному сайту, запускает серверный рендеринг и возвращает готовый HTML.

Node.js работает как отдельный процесс на сервере.
{% endstep %}

{% step %}

### Fastify

Fastify используется как сервер для Angular SSR.
{% endstep %}

{% step %}

### Tailwind CSS и SCSS

Tailwind CSS и SCSS используются для оформления публичного сайта.
{% endstep %}

{% step %}

### iEX UI

iEX UI — собственная библиотека компонентов iEXExchanger.

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

Собственная библиотека помогает сохранять единый внешний вид и поведение интерфейса.
{% endstep %}
{% endstepper %}

## Базы данных и хранение

iEXExchanger использует несколько типов хранилищ.

Каждое из них решает отдельную задачу.

<table><thead><tr><th width="258.7109375">Хранилище</th><th>Назначение</th></tr></thead><tbody><tr><td><strong>PostgreSQL</strong></td><td>Основные постоянные данные</td></tr><tr><td><strong>Redis</strong></td><td>Быстрые временные данные, кеш и очереди</td></tr></tbody></table>

## PostgreSQL

PostgreSQL 18 используется как основная реляционная база данных.

PostgreSQL используется для данных, которые должны сохраняться после перезапуска сервера и оставаться доступными длительное время.

## Redis

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

Redis не заменяет PostgreSQL. Он используется как быстрое вспомогательное хранилище.

## Серверная инфраструктура

Для запуска iEXExchanger используется несколько серверных компонентов.

| Компонент      | Назначение                                                |
| -------------- | --------------------------------------------------------- |
| **Nginx**      | Принимает HTTP-запросы и направляет их нужному приложению |
| **PHP-FPM**    | Выполняет PHP-код Backend                                 |
| **Node.js**    | Запускает Angular SSR                                     |
| **PM2**        | Управляет процессом публичного сайта                      |
| **Supervisor** | Управляет фоновыми Backend-процессами                     |
| **Docker**     | Позволяет запускать компоненты в контейнерах              |
| **FASTPANEL**  | Используется для управления сервером                      |
| **Debian 12**  | Основная серверная операционная система                   |

## Nginx

Nginx используется как веб-сервер и reverse proxy.

Он принимает входящие запросы и определяет, куда их передать.

## PHP-FPM

PHP-FPM выполняет PHP-код Backend.

Он принимает запрос от Nginx, запускает Laravel и возвращает результат.

## Node.js

Node.js используется для запуска публичного сайта в режиме Angular SSR.

Он работает как отдельный серверный процесс и формирует HTML страниц.

## PM2

PM2 используется для управления процессом Angular SSR.

Он позволяет:

* запускать приложение;
* автоматически перезапускать его при ошибке;
* запускать процесс после перезагрузки сервера;
* смотреть статус;
* просматривать логи;
* перезапускать приложение после обновления.

## Supervisor

Supervisor используется для управления долгоживущими Backend-процессами.

Через него могут запускаться:

* Laravel Horizon;
* обработчики очередей;
* Laravel Reverb;
* Laravel Pulse Worker;
* отдельные служебные процессы.

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

## Docker

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

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

Например:

```
Контейнер Backend
Контейнер PostgreSQL
Контейнер Redis
Контейнер Nginx
Контейнер Frontend
```

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

## FASTPANEL

FASTPANEL используется для управления сервером через веб-интерфейс.

## Debian 12

Debian 12 используется как основная серверная операционная система.

## Инструменты разработки

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

<table><thead><tr><th width="193.6484375">Инструмент</th><th>Назначение</th></tr></thead><tbody><tr><td><strong>Vite</strong></td><td>Сборка административной панели</td></tr><tr><td><strong>PHPUnit</strong></td><td>Тестирование Backend</td></tr><tr><td><strong>Vitest</strong></td><td>Тестирование frontend-компонентов</td></tr><tr><td><strong>PHPStan</strong></td><td>Статический анализ PHP</td></tr><tr><td><strong>ESLint</strong></td><td>Проверка TypeScript и Vue</td></tr></tbody></table>

## PHPUnit

PHPUnit используется для автоматического тестирования Backend.

## Vitest

Vitest используется для тестирования frontend-кода.

## PHPStan

PHPStan выполняет статический анализ PHP-кода.

## ESLint

ESLint используется для проверки TypeScript, JavaScript и Vue-кода.

Он помогает поддерживать единые правила и находить потенциальные ошибки.


# Разработка модулей


# Парсер курсов

Плагин курсов — это внешний модуль iEXExchanger, который добавляет в систему новый источник курсов.

После установки через раздел «Установка плагинов» такой модуль может создать группу в системе «Курсы из источников», загрузить валютные пары и использоваться в направлениях обмена как обычный источник курса.

Этот документ предназначен для разработчиков и описывает создание плагина курсов: структуру файлов, файл `iex-plugin.json`, PHP-класс парсера, настройки, секреты, пары, health-check, миграции и сборку ZIP-архива.

## Общий принцип работы

Плагин не изменяет ядро iEXExchanger и не устанавливается в папку `packages`.

Он поставляется как отдельный ZIP-архив, проходит проверку через админку и сохраняется в системе внешних плагинов.

Общая схема работы:

1. Разработчик создаёт папку плагина.
2. Внутри добавляет файл `iex-plugin.json`.
3. Создаёт PHP-класс парсера.
4. PHP-класс получает курсы из API, файла или другого источника.
5. Плагин упаковывается в ZIP.
6. Администратор загружает ZIP через «Утилиты» — «Установка плагинов».
7. Система проверяет пакет.
8. После установки создаётся источник курсов.
9. Пары курсов импортируются в раздел источников.
10. Оператор включает нужные пары и использует их в направлениях обмена.

## Основной стандарт плагина

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

```
parser-rate
```

Основная возможность плагина:

```
rates.source
```

Стандарт совместимости:

```
iex.parser-rate.v1
```

Рекомендуемый runtime:

```
php
```

Runtime `js` сохранён только для совместимости со старыми parser-rate модулями. Для новых плагинов рекомендуется использовать PHP.

***

## Быстрый старт

Для создания шаблона плагина используйте команду:

```bash
php artisan iex:plugin-make test-rates --type=parser-rate --runtime=php --title="Test Rates"
```

После выполнения будет создана папка:

```
storage/app/iex-plugin-templates/test-rates/
```

Структура шаблона:

```
test-rates/
├── iex-plugin.json
├── README.md
└── src/
    └── Parser.php
```

Чтобы сразу собрать ZIP-архив, используйте:

```bash
php artisan iex:plugin-make test-rates --type=parser-rate --runtime=php --title="Test Rates" --zip --force
```

Если нужно, чтобы плагин при установке попробовал получить пары из источника:

```bash
php artisan iex:plugin-make test-rates --type=parser-rate --runtime=php --title="Test Rates" --discover-on-install --zip --force
```

***

## Структура плагина

Минимальная структура PHP-плагина курсов:

```
test-rates/
├── iex-plugin.json
└── src/
    └── Parser.php
```

Расширенная структура:

```
test-rates/
├── iex-plugin.json
├── icon.png
├── README.md
└── src/
    └── Parser.php
```

### Иконка плагина

Иконку можно добавить в корень плагина.

Поддерживаемые имена:

```
icon.svg
icon.png
icon.webp
icon.jpg
icon.jpeg
```

Для SVG система выполняет дополнительную проверку безопасности. Нельзя использовать скрипты, активные события и внешние ссылки внутри SVG.

### Примеры

{% file src="/files/ONnVNHUSJuFxhFn5Snxx" %}

{% file src="/files/BfDmYXeKPNVHX1FuKPTk" %}

***

## Файл iex-plugin.json

`iex-plugin.json` — главный файл описания плагина.

Через него система понимает:

* какой это тип плагина;
* как он называется;
* какая у него версия;
* какой runtime используется;
* с какими версиями iEXExchanger он совместим;
* какие настройки нужно показать в админке;
* какие секреты нужно запросить;
* какие пары курсов можно создать;
* какой PHP-класс нужно запустить.

## Полный пример iex-plugin.json

```json
{
  "type": "parser-rate",
  "runtime": "php",
  "standard": "iex.parser-rate.v1",
  "name": "example-rates",
  "title": "Example Rates",
  "description": "Источник курсов Example API.",
  "version": "1.0.0",
  "activeByDefault": false,
  "compatibility": {
    "core_min": "11.1.8",
    "core_max": null,
    "php": "^8.2|^8.3|^8.4",
    "extensions": ["json", "curl"]
  },
  "modules": [
    {
      "capability": "rates.source",
      "type": "parser-rate",
      "title": "Example Rates",
      "description": "Источник курсов Example API.",
      "standard": "iex.parser-rate.v1",
      "settings": [
        {
          "key": "api_key",
          "label": "API key",
          "type": "secret",
          "required": true
        }
      ],
      "config_schema": [
        {
          "key": "base_url",
          "label": "Base URL",
          "type": "url",
          "required": true,
          "default": "https://api.example.com"
        },
        {
          "key": "timeout",
          "label": "Timeout",
          "type": "integer",
          "required": false,
          "default": 10
        }
      ],
      "migrations": [],
      "health": {}
    }
  ],
  "rateParser": {
    "discoverOnInstall": true,
    "pairs": [
      {
        "from": "USD",
        "to": "RUB",
        "amount": "91.25",
        "number_format": 10,
        "status": false
      }
    ]
  }
}
```

***

## Основные поля iex-plugin.json

{% stepper %}
{% step %}

### type

Тип плагина.

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

```json
"type": "parser-rate"
```

{% endstep %}

{% step %}

### runtime

Среда выполнения плагина.

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

```json
"runtime": "php"
```

{% endstep %}

{% step %}

### standard

Стандарт совместимости.

Для парсера курсов:

```json
"standard": "iex.parser-rate.v1"
```

{% endstep %}

{% step %}

### name

Системное имя плагина.

```json
"name": "example-rates"
```

Требования:

* только латиница;
* можно использовать цифры;
* можно использовать `-` и `_`;
* нельзя использовать пробелы;
* нельзя использовать кириллицу;
* нельзя использовать `/`, `\`, `..`.

`name` используется как системный slug плагина и alias источника курсов.
{% endstep %}

{% step %}

### title

Название плагина в админке.

```json
"title": "Example Rates"
```

{% endstep %}

{% step %}

### description

Краткое описание плагина.

```json
"description": "Источник курсов Example API."
```

{% endstep %}

{% step %}

### version

Версия плагина.

```json
"version": "1.0.0"
```

{% endstep %}

{% step %}

### activeByDefault

Определяет, будет ли плагин активен сразу после установки.

```json
"activeByDefault": false
```

Рекомендуется оставлять `false`, чтобы администратор сначала проверил настройки и health-check.
{% endstep %}
{% endstepper %}

***

## Совместимость

Блок `compatibility` помогает системе заранее понять, подходит ли плагин для текущей версии продукта.

```json
"compatibility": {
  "core_min": "11.1.8",
  "core_max": null,
  "php": "^8.2|^8.3|^8.4",
  "extensions": ["json", "curl"]
}
```

<table><thead><tr><th width="227.7109375">Поле</th><th>Назначение</th></tr></thead><tbody><tr><td><code>core_min</code></td><td>Минимальная версия iEXExchanger</td></tr><tr><td><code>core_max</code></td><td>Максимальная версия iEXExchanger</td></tr><tr><td><code>php</code></td><td>Поддерживаемые версии PHP</td></tr><tr><td><code>extensions</code></td><td>Обязательные PHP-расширения</td></tr></tbody></table>

Если верхнее ограничение по версии продукта не требуется, используйте:

```json
"core_max": null
```

## entry и class

`entry` и `class` можно не указывать, если используется стандартная структура.

Для PHP-плагина курсов система по умолчанию ожидает файл:

```
src/Parser.php
```

И класс:

```
iEXPlugins\ExampleRates\Parser
```

Например, если указано:

```json
"name": "example-rates"
```

ожидаемый PHP-класс:

```php
namespace iEXPlugins\ExampleRates;

final class Parser
```

### Когда entry и class нужно указывать

Если файл или класс называются нестандартно, укажите их явно:

```json
"entry": "src/CustomParser.php",
"class": "iEXPlugins\\ExampleRates\\CustomParser"
```

Тогда в PHP-файле должен быть такой класс:

```php
namespace iEXPlugins\ExampleRates;

final class CustomParser
```

## Блок modules

`modules` описывает возможности плагина.

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

```
rates.source
```

Пример:

```json
"modules": [
  {
    "capability": "rates.source",
    "type": "parser-rate",
    "title": "Example Rates",
    "description": "Источник курсов Example API.",
    "standard": "iex.parser-rate.v1",
    "settings": [],
    "config_schema": [],
    "migrations": [],
    "health": {}
  }
]
```

Если `modules` не указан, система для `parser-rate` может создать `rates.source` по умолчанию. Но для новых плагинов лучше указывать `modules` явно, чтобы структура была понятной и предсказуемой.

## PHP-класс Parser.php

Основной файл плагина:

```
src/Parser.php
```

Минимальный пример:

```php
<?php

declare(strict_types=1);

namespace iEXPlugins\ExampleRates;

use iEXPackages\PluginManager\Contracts\RateParserPluginInterface;
use iEXPackages\PluginManager\DTO\RateParserContext;

final class Parser implements RateParserPluginInterface
{
    public function rates(RateParserContext $context): iterable
    {
        return [
            [
                'from' => 'USD',
                'to' => 'RUB',
                'buy' => '91.25',
            ],
            [
                'from' => 'EUR',
                'to' => 'RUB',
                'buy' => '98.10',
            ],
        ];
    }
}
```

Класс должен реализовать интерфейс:

```php
RateParserPluginInterface
```

И содержать метод:

```php
public function rates(RateParserContext $context): iterable
```

Если класс не реализует интерфейс, система не сможет запустить плагин.

## Формат возвращаемого курса

Основной формат курса:

```php
[
    'from' => 'USD',
    'to' => 'RUB',
    'buy' => '91.25',
]
```

Можно дополнительно вернуть `sell`:

```php
[
    'from' => 'USD',
    'to' => 'RUB',
    'buy' => '91.25',
    'sell' => '91.80',
]
```

Значения курсов лучше возвращать строками, чтобы не терять точность на float.

### Поддерживаемые alias-поля

Рекомендуемый формат:

```
from / to / buy / sell
```

Система также понимает alias-ключи:

<table><thead><tr><th width="211.83984375">Основное поле</th><th>Alias</th></tr></thead><tbody><tr><td><code>from</code></td><td><code>base</code>, <code>currency_from</code>, <code>code_in</code></td></tr><tr><td><code>to</code></td><td><code>quote</code>, <code>currency_to</code>, <code>code_out</code></td></tr><tr><td><code>buy</code></td><td><code>rate</code>, <code>default</code>, <code>value</code>, <code>bid</code></td></tr><tr><td><code>sell</code></td><td><code>ask</code></td></tr></tbody></table>

Пример:

```php
[
    'base' => 'USD',
    'quote' => 'RUB',
    'rate' => '91.25',
]
```

***

## Пример парсера с HTTP API

```php
<?php

declare(strict_types=1);

namespace iEXPlugins\ExampleRates;

use Illuminate\Support\Facades\Http;
use iEXPackages\PluginManager\Contracts\RateParserPluginInterface;
use iEXPackages\PluginManager\DTO\RateParserContext;

final class Parser implements RateParserPluginInterface
{
    public function rates(RateParserContext $context): iterable
    {
        $config = $context->config['rates.source'] ?? [];

        $baseUrl = rtrim((string) ($config['base_url'] ?? 'https://api.example.com'), '/');
        $timeout = (int) ($config['timeout'] ?? 10);

        $secret = $context->plugin
            ->secrets()
            ->where('capability', 'rates.source')
            ->where('key', 'api_key')
            ->where('is_active', true)
            ->first();

        $apiKey = $secret?->encrypted_value;

        $request = Http::timeout($timeout)->acceptJson();

        if ($apiKey) {
            $request = $request->withToken($apiKey);
        }

        $payload = $request
            ->get($baseUrl . '/rates')
            ->throw()
            ->json();

        foreach ((array) data_get($payload, 'data', []) as $row) {
            $from = trim((string) ($row['base'] ?? ''));
            $to = trim((string) ($row['quote'] ?? ''));
            $buy = trim((string) ($row['buy'] ?? $row['rate'] ?? ''));

            if ($from === '' || $to === '' || $buy === '') {
                continue;
            }

            yield [
                'from' => $from,
                'to' => $to,
                'buy' => $buy,
                'sell' => isset($row['sell']) ? (string) $row['sell'] : null,
            ];
        }
    }
}
```

***

## RateParserContext

В метод `rates()` передаётся объект:

```php
RateParserContext $context
```

Он содержит данные текущего запуска.

<table><thead><tr><th width="260.83984375">Поле</th><th>Что содержит</th></tr></thead><tbody><tr><td><code>$context->plugin</code></td><td>Модель установленного плагина</td></tr><tr><td><code>$context->manifest</code></td><td>Manifest текущего плагина</td></tr><tr><td><code>$context->options</code></td><td>Опции конкретного запуска</td></tr><tr><td><code>$context->extra</code></td><td>Дополнительные данные</td></tr><tr><td><code>$context->config</code></td><td>Обычные настройки из <code>config_schema</code></td></tr><tr><td><code>$context->pluginPath()</code></td><td>Путь к файлу внутри установленного плагина</td></tr></tbody></table>

Пример проверки health-check:

```php
$isHealthCheck = (bool) ($context->options['health_check'] ?? false);
```

Пример пути к файлу внутри плагина:

```php
$path = $context->pluginPath('data/rates.json');
```

***

## Настройки плагина

Обычные настройки описываются в `config_schema`.

Они подходят для значений, которые не являются секретными:

* базовый URL API;
* таймаут;
* режим рынка;
* страна;
* валюта;
* флаг включения функции.

Пример:

```json
"config_schema": [
  {
    "key": "base_url",
    "label": "Base URL",
    "type": "url",
    "required": true,
    "default": "https://api.example.com"
  },
  {
    "key": "timeout",
    "label": "Timeout",
    "type": "integer",
    "required": false,
    "default": 10
  },
  {
    "key": "market",
    "label": "Market",
    "type": "select",
    "default": "spot",
    "options": [
      { "value": "spot", "label": "Spot" },
      { "value": "futures", "label": "Futures" }
    ]
  }
]
```

Использование в PHP:

```php
$config = $context->config['rates.source'] ?? [];

$baseUrl = $config['base_url'] ?? 'https://api.example.com';
$timeout = (int) ($config['timeout'] ?? 10);
$market = $config['market'] ?? 'spot';
```

Поддерживаемые типы настроек:

```
text
textarea
url
email
integer
number
boolean
select
json
```

## Секреты плагина

Секретные поля описываются в `settings`.

Пример:

```json
"settings": [
  {
    "key": "api_key",
    "label": "API key",
    "type": "secret",
    "required": true
  }
]
```

В `iex-plugin.json` хранится только схема секретов. Значения секретов в ZIP не хранятся.

Значения секретов:

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

Получение секрета в PHP:

```php
$secret = $context->plugin
    ->secrets()
    ->where('capability', 'rates.source')
    ->where('key', 'api_key')
    ->where('is_active', true)
    ->first();

$apiKey = $secret?->encrypted_value;
```

`encrypted_value` возвращается уже расшифрованным через Laravel encrypted cast. Дополнительно расшифровывать значение вручную не нужно.

Использование секрета в запросе:

```php
$response = Http::withToken($apiKey)
    ->timeout(10)
    ->get('https://api.example.com/rates')
    ->throw()
    ->json();
```

## Блок rateParser

`rateParser` управляет поведением курсового плагина.

```json
"rateParser": {
  "discoverOnInstall": true,
  "pairs": []
}
```

### discoverOnInstall

Если значение `true`, система может запустить плагин при проверке или установке и получить пары из runtime-ответа.

```json
"discoverOnInstall": true
```

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

```json
"discoverOnInstall": false
```

В админке оператор всё равно может выбрать режим установки:

* «По настройке плагина»;
* «Проверить и загрузить пары»;
* «Не загружать при установке».

***

## Пары курсов

Есть два способа передать пары курсов системе.

<table><thead><tr><th width="275.3828125">Способ</th><th>Когда использовать</th></tr></thead><tbody><tr><td><code>rateParser.pairs</code></td><td>Если пары известны заранее</td></tr><tr><td><code>discoverOnInstall</code> + <code>rates()</code></td><td>Если пары нужно получить из API</td></tr></tbody></table>

### pairs

`rateParser.pairs` нужен для первичного создания строк в источниках курсов.

Пример:

```json
"rateParser": {
  "discoverOnInstall": false,
  "pairs": [
    {
      "from": "USD",
      "to": "RUB",
      "amount": "91.25",
      "number_format": 10,
      "status": false
    },
    {
      "from": "EUR",
      "to": "RUB",
      "amount": "98.10",
      "number_format": 10,
      "status": false
    }
  ]
}
```

Поля пары:

<table><thead><tr><th width="205.68359375">Поле</th><th>Назначение</th></tr></thead><tbody><tr><td><code>from</code></td><td>Исходная валюта</td></tr><tr><td><code>to</code></td><td>Целевая валюта</td></tr><tr><td><code>amount</code></td><td>Первичное значение курса</td></tr><tr><td><code>type</code></td><td>Тип пары, по умолчанию <code>0</code></td></tr><tr><td><code>type_price</code></td><td>Дополнительный тип цены, например <code>buy</code> или <code>sell</code></td></tr><tr><td><code>number_format</code></td><td>Количество знаков форматирования, от <code>0</code> до <code>18</code></td></tr><tr><td><code>status</code></td><td>Активность пары</td></tr></tbody></table>

Рекомендуется добавлять новые пары выключенными:

```json
"status": false
```

Так оператор сможет проверить их перед включением.

## Runtime-курсы и pairs

Важно различать `pairs` и `rates()`.

`rateParser.pairs` описывает пары, которые можно создать при установке.

Метод `rates()` возвращает актуальные значения курсов при проверке, health-check и обновлении.

Правильная схема:

```
rateParser.pairs
└── создаёт список пар

rates()
└── возвращает актуальные значения курсов
```

## Health-check

Health-check запускается из админки кнопкой «Проверить состояние».

Для `rates.source` система вызывает метод `rates()` и проверяет, что плагин вернул хотя бы один курс.

В manifest лучше указывать:

```json
"health": {}
```

Пример обработки health-check:

```php
public function rates(RateParserContext $context): iterable
{
    $isHealthCheck = (bool) ($context->options['health_check'] ?? false);

    if ($isHealthCheck) {
        return [
            ['from' => 'USD', 'to' => 'RUB', 'buy' => '91.25'],
        ];
    }

    return [
        ['from' => 'USD', 'to' => 'RUB', 'buy' => '91.25'],
        ['from' => 'EUR', 'to' => 'RUB', 'buy' => '98.10'],
    ];
}
```

## Миграции плагина

Если плагину нужны свои таблицы, можно добавить миграции.

Описание миграции в manifest:

```json
"migrations": [
  "database/migrations/2026_01_01_000000_create_example_rates_cache.php"
]
```

Пример файла миграции:

```php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class {
    public function up(): void
    {
        Schema::create('example_rates_cache', static function (Blueprint $table): void {
            $table->id();
            $table->string('symbol')->index();
            $table->decimal('bid', 32, 16);
            $table->decimal('ask', 32, 16)->nullable();
            $table->timestamps();
        });
    }
};
```

Миграции регистрируются при установке, но запускаются отдельно из админки.

## JS runtime

Runtime `js` поддерживается только для совместимости со старыми parser-rate модулями.

Минимальный пример:

```js
module.exports = class Parser {
  async updateRate() {
    return [
      { from: 'USD', to: 'RUB', buy: '91.25' },
      { from: 'EUR', to: 'RUB', buy: '98.10' }
    ];
  }
};
```

Для новых плагинов используйте PHP runtime.

***

## Сборка ZIP

{% stepper %}
{% step %}

### Через команду

```bash
php artisan iex:plugin-make example-rates --type=parser-rate --runtime=php --title="Example Rates" --zip --force
```

{% endstep %}

{% step %}

### Вручную

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

```bash
cd storage/app/iex-plugin-templates/example-rates
```

Соберите архив:

```bash
zip -r ../example-rates.zip .
```

В архиве должна быть структура:

```
iex-plugin.json
src/Parser.php
```

Допустимо также:

```
example-rates/iex-plugin.json
example-rates/src/Parser.php
```

Система умеет определить одну корневую папку.

Не добавляйте в архив:

* `.env`;
* `.git`;
* `node_modules`;
* `vendor`;
* логи;
* временные файлы;
* личные ключи;
* пароли;
* дампы базы данных.
  {% endstep %}
  {% endstepper %}

***

## Проверка плагина в админке

После сборки ZIP проверьте его через панель управления.

{% content-ref url="/spaces/YuqSN6CIJoIeh8EPb0uE/pages/gafsPx8xZymoPUFsodha" %}
[Установка плагинов](/guide/sait/ustanovka-plaginov)
{% endcontent-ref %}

1. Откройте **«Утилиты» — «Установка плагинов».**
2. Нажмите **«Установить».**
3. Выберите тип **«Курсы».**
4. Загрузите ZIP-архив.
5. Нажмите **«Проверить пакет».**
6. Проверьте результат предпросмотра.
7. Если отображается «Пакет можно установить», нажмите «Установить».
8. Если у плагина есть секреты или настройки, заполните их.
9. Нажмите «Проверить состояние».
10. Откройте раздел источников курсов и убедитесь, что группа плагина создана.

## Проверка через консоль

После установки можно проверить совместимость установленных плагинов:

```bash
php artisan iex:plugins-check
```

Для JSON-вывода:

```bash
php artisan iex:plugins-check --json
```

***

## Частые ошибки

<details>

<summary>Не найден основной файл</summary>

Проверьте, что файл существует:

```
src/Parser.php
```

Если файл называется иначе, укажите `entry` явно.

</details>

<details>

<summary>Класс не найден</summary>

Для:

```json
"name": "example-rates"
```

по умолчанию ожидается:

```php
namespace iEXPlugins\ExampleRates;

final class Parser
```

Если namespace или имя класса другие, укажите `class` явно.

</details>

<details>

<summary>Класс не реализует интерфейс</summary>

Класс должен реализовать:

```php
RateParserPluginInterface
```

</details>

<details>

<summary>Метод rates ничего не вернул</summary>

Метод `rates()` должен вернуть хотя бы один корректный курс с полями:

```
from
to
buy
```

</details>

<details>

<summary>Пары не появились в источниках</summary>

Проверьте:

* включён ли `discoverOnInstall`;
* какой режим выбран при установке;
* вернул ли runtime пары;
* запущена ли очередь задач;
* нет ли ошибок импорта на странице установки плагинов.

</details>

<details>

<summary>Ошибка совместимости</summary>

Проверьте:

* `core_min`;
* `core_max`;
* `php`;
* `extensions`.

</details>

***

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

Для новых плагинов используйте PHP runtime.

Не храните значения API-ключей в `iex-plugin.json`.

В `settings` описывайте только поля секретов.

В `config_schema` описывайте обычные настройки.

`entry` и `class` можно не указывать, если используется стандартная структура.

`modules` лучше указывать явно, даже если система умеет создать `rates.source` по умолчанию.

Для `health` используйте объект:

```json
"health": {}
```

Курсы возвращайте строками.

Новые пары после импорта должны проверяться оператором вручную.

Перед передачей клиенту всегда проверяйте ZIP через «Установка плагинов».

***

## Коротко

Плагин курсов добавляет в iEXExchanger новый внешний источник курсов.

Основной тип плагина:

```
parser-rate
```

Основная возможность:

```
rates.source
```

Рекомендуемый runtime:

```
php
```

Минимальная структура плагина:

```
iex-plugin.json
src/Parser.php
```

Главный метод парсера:

```php
public function rates(RateParserContext $context): iterable
```

Пары можно описать заранее через `rateParser.pairs` или получить автоматически через `discoverOnInstall`.

Секреты описываются в `settings`, обычные настройки — в `config_schema`.

Готовый плагин нужно собрать в ZIP и проверить через «Утилиты» — «Установка плагинов».


# Введение

Добро пожаловать в документацию iEXExchanger.

iEXExchanger — это программная платформа для запуска и управления онлайн-обменником. Система объединяет публичный сайт обмена, административную панель, обработку заявок, курсы валют, резервы, направления обмена, мерчантов, автовыплаты, уведомления, пользователей, партнёрскую программу, модули автоматизации и инструменты технического контроля.

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

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Безопасность</strong></td><td>Защита доступа к админ-панели.</td><td><a href="/files/YdlI4cILbiBLIA37nXSX">/files/YdlI4cILbiBLIA37nXSX</a></td><td><a href="/pages/Bv2PHTFbPTnao0YW2Kq3">/pages/Bv2PHTFbPTnao0YW2Kq3</a></td></tr><tr><td><strong>Файлы подтверждений</strong></td><td>Настройка файлов для подтверждения операций.</td><td><a href="/files/S29rKMzgTw39BUbWQ3kL">/files/S29rKMzgTw39BUbWQ3kL</a></td><td><a href="/pages/p1Gm5iDWlX7fh95MUVut">/pages/p1Gm5iDWlX7fh95MUVut</a></td></tr><tr><td><strong>Работа с заявками</strong></td><td>Просмотр и обработка заявок клиентов.</td><td><a href="/files/7G0fR5IVHTg9ypAnNJP0">/files/7G0fR5IVHTg9ypAnNJP0</a></td><td><a href="/pages/Q4gk6oLEyQvA9czDN7iS">/pages/Q4gk6oLEyQvA9czDN7iS</a></td></tr><tr><td><strong>Гибкий выбор комиссий</strong></td><td>Настройте варианты комиссий иприоритетной обработки заявок</td><td><a href="/files/eilWYdIyLwopPYBP83sQ">/files/eilWYdIyLwopPYBP83sQ</a></td><td><a href="/pages/pcxn36VGkmfNzoOeXONx">/pages/pcxn36VGkmfNzoOeXONx</a></td></tr><tr><td><strong>Реквизиты по запросу</strong></td><td>Выдавайте реквизиты клиентам вручную.</td><td><a href="/files/S0VnFs0OCmiCqSW4n0v8">/files/S0VnFs0OCmiCqSW4n0v8</a></td><td><a href="/pages/DJETI2fstUXgKpYX9f28">/pages/DJETI2fstUXgKpYX9f28</a></td></tr><tr><td><strong>Выплаты партнёрам</strong></td><td>Настройте расчёт выплат партнёрам.</td><td><a href="/files/rINku1yt2F7pwLYQz1Pc">/files/rINku1yt2F7pwLYQz1Pc</a></td><td><a href="/pages/TIY3c859sG8UHEvTh39d">/pages/TIY3c859sG8UHEvTh39d</a></td></tr></tbody></table>

### Для чего нужен iEXExchanger

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

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

С помощью iEXExchanger можно:

* создать публичный сайт обменного пункта;
* настроить валюты, платёжные системы и направления обмена;
* управлять курсами, резервами, лимитами и комиссиями;
* принимать и обрабатывать заявки клиентов;
* подключать мерчантов для автоматического приёма оплат;
* настраивать автовыплаты;
* работать с AML-сервисами и проверками;
* управлять пользователями, операторами и группами доступа;
* настраивать партнёрскую программу, скидки и бонусы;
* подключать уведомления по e-mail, Telegram и другим каналам;
* управлять контентом, баннерами, отзывами, страницами и меню;
* контролировать логи, очереди, мониторинг и техническое состояние проекта.

## Из каких частей состоит система

iEXExchanger состоит из нескольких основных частей.

{% stepper %}
{% step %}

### Основной сайт

Основной сайт доступен клиентам по вашему публичному домену:

```
https://ваш_домен
```

На нём клиент выбирает направление обмена, вводит данные, создаёт заявку, получает инструкцию к оплате и отслеживает статус операции.
{% endstep %}

{% step %}

### Панель управления

Панель управления используется владельцем, администраторами, операторами и менеджерами.

Обычно она находится на техническом поддомене:

```
https://app.ваш_домен
```

Через панель управления выполняется настройка всей системы: валют, направлений, курсов, заявок, пользователей, мерчантов, выплат, уведомлений, модулей и безопасности.
{% endstep %}

{% step %}

### Backend

Backend отвечает за работу бизнес-логики системы: заявки, пользователи, настройки, интеграции, уведомления, очереди, API, мерчанты, автовыплаты и фоновые процессы.
{% endstep %}

{% step %}

### Frontend

Frontend отвечает за клиентскую часть обменника: главную страницу, форму обмена, страницу заявки, личный кабинет клиента, внешний вид сайта и пользовательский интерфейс.
{% endstep %}

{% step %}

### Серверная часть

Для стабильной работы системы используются серверные компоненты: Nginx, PHP, база данных, Redis, Supervisor, PM2, Laravel Horizon, Laravel Pulse, CRON и другие службы.
{% endstep %}
{% endstepper %}

## С чего начать

Если вы только начинаете работу с iEXExchanger, рекомендуется идти по порядку.

{% stepper %}
{% step %}

### Если вы устанавливаете систему впервые

Начните с подготовки сервера и домена:

1. Изучите системные требования.
2. Подготовьте сервер.
3. Настройте DNS домена.
4. Настройте основной домен и технический поддомен.
5. Установите backend.
6. Установите frontend.
7. Настройте Nginx.
8. Подключите SSL-сертификат.
9. Активируйте лицензию.
10. Настройте CRON, очереди и фоновые процессы.
11. Создайте резервную копию после успешной установки.
    {% endstep %}

{% step %}

### Если система уже установлена

Начните с базовой настройки обменника:

1. Настройте основные параметры проекта.
2. Добавьте коды валют и платёжные системы.
3. Создайте валюты.
4. Настройте курсы.
5. Настройте резервы.
6. Создайте направления обмена.
7. Настройте комиссии, лимиты и инструкции.
8. Подключите мерчанты и автовыплаты, если они нужны.
9. Настройте уведомления.
10. Проверьте создание тестовой заявки.
    {% endstep %}

{% step %}

### Если вы оператор или менеджер

Начните с разделов, которые нужны для ежедневной работы:

1. Вход в панель управления.
2. Google Authenticator и безопасность входа.
3. Список заявок.
4. Карточка заявки.
5. Статусы заявок.
6. Комментарии и история заявки.
7. Проверка оплаты.
8. Выполнение или отклонение заявки.
9. Работа с пользователями.
10. Журнал событий.
    {% endstep %}

{% step %}

### Если вы владелец проекта

В первую очередь изучите:

* безопасность панели управления;
* группы пользователей и права доступа;
* настройки заявок;
* курсы и резервы;
* направления обмена;
* мерчанты и автовыплаты;
* партнёрскую программу;
* скидки и бонусы;
* аналитику;
* резервные копии;
* Laravel Horizon и Laravel Pulse;
* обновление продукта.
  {% endstep %}
  {% endstepper %}

## Важные рекомендации

Перед изменением важных настроек делайте резервную копию.

Особенно это важно перед:

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

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

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

## Как пользоваться документацией

Если вы знаете название нужного раздела, используйте левое меню.

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

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

При поиске лучше вводить не общие слова, а конкретный запрос.

<button type="button" class="button primary" data-action="ask" data-icon="gitbook-assistant">Ask a question…</button>

Примеры:

```
Как настроить SMTP
Как включить автовыплату
Где настроить резерв
Как изменить курс
Как создать администратора
Почему не приходит письмо
Как подключить Google Analytic
```

## Итог

iEXExchanger объединяет все основные инструменты для запуска и управления обменным сервисом: от установки на сервер и настройки доменов до обработки заявок, автоматизации оплат, управления курсами, резервами, пользователями и аналитикой.

Используйте эту документацию как рабочее руководство: начинайте с базовой настройки, переходите к модулям и автоматизации постепенно, проверяйте изменения на тестовых заявках и обязательно сохраняйте резервные копии перед важными действиями.

Источник, который я сверил: текущая страница [docs.iexexchanger.com/guide](https://docs.iexexchanger.com/guide).


# Поиск по админке

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

Поиск нужен для быстрой навигации. Вместо того чтобы открывать несколько разделов вручную, менеджер может ввести ID, email, код валюты, номер заявки, название мерчанта, alias, реквизит или другой известный параметр и сразу перейти к нужной странице.

## Где находится поиск

Поле поиска находится в верхней части панели управления.

В поле отображается подсказка:

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

Поиск по админке

Открыть поиск можно двумя способами:

1. Нажать на поле поиска в верхней панели.
2. Использовать горячую клавишу:
   * `Ctrl + K` — Windows / Linux;
   * `⌘ + K` — macOS.

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

## Как пользоваться поиском

1. Откройте панель управления.
2. Нажмите на поле **«Поиск по админке».**
3. Введите минимум 2 символа.
4. Дождитесь появления результатов.
5. Нажмите на нужный результат.

Если найден подходящий результат первым в списке, можно нажать `Enter`, чтобы открыть его.

***

## Что можно искать

Глобальный поиск ищет по основным рабочим разделам админки.

Можно искать:

* разделы панели управления;
* заявки;
* пользователей;
* валюты;
* направления обмена;
* группы направлений;
* платёжные системы;
* группы валют;
* поля валют;
* метки валют;
* фильтры валют;
* мерчанты;
* автовыплаты;
* gateway-логи;
* источники курсов;
* курсы из файла;
* группы файлов курсов;
* курсы по формуле;
* курсы конкурентов;
* BestChange-направления;
* KYC-сервисы;
* KYC-заявки;
* KYC-логи;
* AML-сервисы;
* прокси;
* чёрный список;
* промокоды;
* бонусные кампании;
* партнёрские программы;
* реферальные ссылки;
* резервы;
* реквизиты;
* верификации карт;
* Telegram-уведомления;
* расписания работы;
* согласия и чекбоксы;
* страницы сайта;
* группы страниц;
* контакты;
* группы контактов;
* новости;
* категории новостей;
* FAQ;
* категории FAQ;
* меню сайта;
* группы меню;
* отзывы;
* ссылки на отзывы;
* социальные отзывы.

## По каким данным выполняется поиск

Поиск работает не только по названию. В зависимости от раздела система ищет по разным данным.

Примеры:

* Валюты — техническое название, код валюты, XML-код, код сети.
* Направления — ID направления, техническое название, URL, SEO-название, валюты направления.
* Заявки — ID, публичный номер заявки, email, телефон, tracking ID, платёжный адрес, реквизиты получения.
* Пользователи — имя, email, телефон, username, IP-адрес.
* Мерчанты — название, alias, имя файла, инструкция, комментарий.
* Автовыплаты — название, alias, имя файла, направление, комментарий.
* Источники курсов — название, код, входная валюта, выходная валюта, тип цены.
* Формулы — название, формула, коэффициенты.
* BestChange — название, источник, входная валюта, выходная валюта, код, режим курса.
* Страницы и новости — заголовок, slug, текст, описание.
* Контакты — название, значение, ссылка.
* Прокси — host и тип прокси.
* Промокоды — название, код, тип скидки.
* Реквизиты — название, номер счёта, комментарии.
* Верификации карт — hash ID, email, имя, номер карты, IP, язык.

## Область поиска

Справа внутри поля есть переключатель области поиска. Он ограничивает выдачу и помогает быстрее найти нужный тип данных.

Доступные области:

* Все — поиск по всем доступным разделам.
* Разделы — поиск только по пунктам меню админки.
* Заявки — поиск по заявкам.
* Пользователи — поиск по пользователям.
* Валюты — поиск по валютам.
* Направления — поиск по направлениям обмена.
* Мерчанты — поиск по мерчантам и автовыплатам.
* Курсы — поиск по источникам, файлам, формулам, конкурентам и BestChange.
* BestChange — поиск только по BestChange-направлениям.
* Проблемы — показывает результаты, у которых есть активные предупреждения.

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

## Быстрые префиксы поиска

В поиске можно использовать специальные префиксы. Они сразу ограничивают поиск нужным типом данных.

Формат:

```
префикс: запрос
```

Примеры:

```
u: client@mail.com
```

Найти пользователя по email.

```
o: 12543
```

Найти заявку по ID.

```
d: USDT
```

Найти направления, где используется USDT.

```
m: binance
```

Найти мерчант по названию или alias.

```
bc: btc
```

Найти BestChange-направления по BTC.

```
c: usdt
```

Найти валюту USDT.

```
rates: usd
```

Найти элементы, связанные с курсами.

Основные префиксы:

* `u:` — пользователи;
* `o:` — заявки;
* `d:` — направления;
* `m:` — мерчанты;
* `bc:` — BestChange;
* `c:` — валюты;
* `rate:` или `rates:` — курсы;
* `ap:` — автовыплаты;
* `kyc:` — KYC;
* `aml:` — AML;
* `proxy:` — прокси;
* `promo:` — промокоды;
* `bonus:` — бонусы;
* `ref:` — партнёрские и реферальные данные;
* `reserve:` — резервы;
* `req:` — реквизиты;
* `blacklist:` — чёрный список;
* `verify:` — верификации;
* `telegram:` или `tg:` — Telegram-уведомления;
* `log:` — логи.

## Умные фильтры

Поиск умеет распознавать обычные фразы и открывать раздел уже с готовым фильтром.

Примеры:

```
отключенные валюты
```

Система предложит открыть список валют с фильтром по отключённым валютам.

```
активные мерчанты
```

Система предложит открыть список мерчантов с фильтром активных записей.

```
пользователь test@mail.com
```

Система предложит открыть список пользователей с фильтром по email.

```
заявка 12345
```

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

Умные фильтры работают для часто используемых разделов: заявки, пользователи, валюты, мерчанты, автовыплаты, gateway-логи, KYC, AML, прокси, промокоды, бонусы, резервы, реквизиты, чёрный список, верификация карт и Telegram-уведомления.

## Поиск по разделам меню

Если выбрать область «Разделы», поиск будет искать только пункты меню панели управления.

Это удобно, когда менеджер не помнит, где находится нужная страница.

Например, можно ввести:

```
прокси
```

Система предложит раздел прокси-менеджера.

Или:

```
резервы
```

Система предложит перейти в раздел резервов.

## История поиска

Система сохраняет последние запросы менеджера.

Особенности истории:

* история сохраняется отдельно для каждого менеджера;
* хранится до 5 последних уникальных запросов;
* если повторить старый запрос, он поднимается вверх;
* отдельный запрос можно удалить;
* всю историю можно очистить кнопкой «Очистить».

История отображается, когда поиск открыт, но запрос ещё не введён.

## Активные проблемы

Когда поиск открыт и запрос ещё не введён, система может показывать блок «Активные проблемы».

Этот блок помогает быстро увидеть элементы, которые требуют внимания.

В активные проблемы могут попадать:

* неработающие или нестабильные мерчанты;
* ошибки платёжных шлюзов;
* неработающие или временно отключённые прокси;
* низкие или нулевые резервы;
* курсы, которые давно не обновлялись;
* ошибки BestChange-парсера;
* проблемные или зависшие заявки;
* KYC-заявки, которые долго ожидают обработки или были недавно отклонены.

Уровни важности:

* Критично — требует быстрого внимания.
* Важно — проблему желательно проверить.
* Инфо — информационный сигнал.

В блоке можно переключать фильтр важности: Все, Критично, Важно.

***

## Как открываются результаты

Результаты группируются по разделам.

В карточке результата обычно отображается:

* название найденной записи;
* тип результата: валюта, заявка, мерчант, пользователь и т.д.;
* краткое описание;
* метка проблемы, если у записи есть активное предупреждение.

При нажатии на результат система открывает соответствующую страницу или карточку.

Например:

* заявка открывается в карточке заявки;
* пользователь открывается в карточке пользователя;
* валюта открывается в настройках валюты;
* направление открывается в настройках направления;
* раздел меню открывается на нужной странице админки.

***

## Права доступа

Поиск учитывает права текущего менеджера.

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

Например:

* нет доступа к мерчантам — поиск не покажет мерчанты;
* нет доступа к пользователям — поиск не покажет карточки пользователей;
* нет доступа к KYC — поиск не покажет KYC-заявки и KYC-логи.

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

***

## Почему ничего не найдено

Если поиск ничего не нашёл, возможные причины:

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

Что сделать:

1. Проверьте правильность написания.
2. Уберите префикс, если он был указан.
3. Переключите область поиска на «Все».
4. Попробуйте искать по другому параметру: ID, email, коду валюты, названию или alias.
5. Если запись точно существует, но поиск её не показывает, обратитесь к администратору системы.

## Если поиск временно недоступен

Если отображается сообщение «Поиск временно недоступен», система не смогла получить результаты.

Возможные причины:

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

Попробуйте обновить страницу и выполнить поиск снова. Если ошибка повторяется, обратитесь к техническому специалисту.

***

## Обслуживание поиска

Обычному менеджеру ничего дополнительно настраивать не нужно.

Система автоматически обновляет поисковые данные при изменении записей. Например, если изменилась валюта, пользователь, направление или мерчант, данные должны обновиться в поиске автоматически.

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

Для технического администратора: если после обновления системы поиск не находит существующие записи, можно пересобрать индекс поиска на сервере:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```bash
php artisan admin-search:reindex
```

Для обновления активных проблем:

```bash
php artisan admin-search:refresh-anomalies
```

Обычным пользователям админки эти команды запускать не нужно.

## Практические примеры

Найти заявку по номеру:

```
o: 12345
```

Найти пользователя по email:

```
u: client@mail.com
```

Найти валюту USDT:

```
c: usdt
```

Найти направления с BTC:

```
d: btc
```

Найти мерчант по alias:

```
m: binance
```

Найти BestChange-направления:

```
bc: usdt
```

Найти прокси:

```
proxy: 192.168
```

Найти промокод:

```
promo: SALE10
```

Найти реквизит:

```
req: 1234
```

***

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

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

Лучше всего искать по точным значениям:

* ID заявки;
* публичный номер заявки;
* email клиента;
* код валюты;
* alias мерчанта;
* название направления;
* код промокода;
* host прокси;
* номер карты или hash ID верификации.

Если точный параметр неизвестен, начните с общего поиска, а затем ограничьте область через переключатель справа в поле поиска.

***

## Коротко

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

Откройте поиск через верхнее поле или горячую клавишу:

```
Ctrl + K / ⌘ + K
```

Введите ID, email, код валюты, номер заявки, alias или название — и система покажет доступные результаты с учётом ваших прав.


# Центр безопасности


# Операционная безопасность (OPSEC)

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

Даже правильно настроенный iEXExchanger не защищает от ситуации, когда злоумышленник получил доступ к электронной почте владельца, Cloudflare, регистратору домена, Telegram, GitHub, серверу или платёжной системе.

Поэтому безопасность обменного пункта необходимо рассматривать целиком.

К критически важным системам относятся:

* iEXExchanger и административная панель;
* сервер;
* электронная почта;
* Telegram;
* домен и DNS;
* Cloudflare;
* GitHub;
* платёжные системы;
* криптовалютные кошельки;
* устройства владельца и сотрудников;
* резервные копии.

Рекомендации этой страницы основаны на подходах NIST Cybersecurity Framework 2.0, ISO/IEC 27001 и CIS Controls v8.1. NIST CSF 2.0 рассматривает безопасность как непрерывный процесс из шести основных функций: Govern, Identify, Protect, Detect, Respond и Recover.

## Основной принцип

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

Используйте несколько уровней защиты:

* индивидуальные учётные записи;
* минимально необходимые права;
* MFA;
* ограничение доступа по IP там, где это возможно;
* отдельные административные учётные записи;
* контроль активных сессий;
* журналирование;
* резервное копирование;
* регулярное обновление программного обеспечения;
* отдельные способы восстановления доступа.

CIS Controls отдельно выделяет управление учётными записями и управление правами доступа: доступ необходимо выдавать, изменять и отзывать в соответствии с реальной необходимостью пользователя.

## Минимальная защита перед запуском

До начала работы production-проекта рекомендуется проверить как минимум следующие пункты:

* включена 2FA для административной панели iEXExchanger;
* включена MFA для электронной почты;
* защищён аккаунт регистратора домена;
* защищён Cloudflare;
* защищён GitHub;
* включена Two-Step Verification в Telegram;
* сервер использует SSH-ключи;
* PostgreSQL и Redis не доступны напрямую из интернета;
* сотрудники используют отдельные учётные записи;
* права сотрудников ограничены их задачами;
* настроены резервные копии;
* резервная копия хранится отдельно от production-сервера;
* настроен контроль входов и активных сессий;
* программное обеспечение сервера и рабочих устройств регулярно обновляется.

## Управление доступом

### Индивидуальные учётные записи

Каждый сотрудник должен использовать собственную учётную запись.

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

Индивидуальные учётные записи позволяют:

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

Это особенно важно для административной панели, сервера, Cloudflare, GitHub и других систем с возможностью изменения критических настроек.

### Минимальные права

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

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

В iEXExchanger для разграничения доступа используются группы прав пользователей. Полный доступ не рекомендуется выдавать обычным операторам и сотрудникам, которым он не требуется.

### Отдельные административные аккаунты

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

Для обычных операций используйте учётную запись с ограниченными правами, а административную — только когда действительно требуется изменение критических настроек.

### Временный доступ

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

Не передавайте подрядчику собственный основной аккаунт.

Создайте отдельную учётную запись, предоставьте необходимые права и удалите её после завершения работ.

Если использовались временные SSH-ключи, API-токены или другие ключи доступа, после завершения работ их также необходимо удалить.

## Пароли

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

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

* административной панели;
* электронной почты;
* сервера;
* Cloudflare;
* GitHub;
* регистратора домена;
* Telegram;
* платёжных систем.

Для хранения паролей рекомендуется использовать менеджер паролей.

Современные рекомендации NIST делают основной акцент на длине и уникальности пароля, а не на обязательном использовании определённого количества заглавных букв, цифр и специальных символов. NIST рекомендует использовать пароль не короче 15 символов, если пароль создаётся пользователем, а также рекомендует менеджеры паролей.

Для административных аккаунтов iEXExchanger рекомендуется использовать длинные уникальные пароли, которые не применяются ни в одном другом сервисе.

Не храните пароли:

* в обычных текстовых файлах;
* в заметках без защиты;
* в Telegram;
* в переписке;
* в GitHub;
* внутри файлов проекта;
* в общих документах сотрудников.

## Многофакторная аутентификация

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

Включайте MFA для:

* административной панели iEXExchanger;
* электронной почты;
* Cloudflare;
* GitHub;
* регистратора домена;
* платёжных систем;
* других сервисов, связанных с управлением проектом.

CISA рекомендует использовать MFA и, где это возможно, переходить на устойчивые к фишингу способы аутентификации, например FIDO/WebAuthn.

При наличии выбора предпочтение можно отдавать:

* passkey;
* аппаратному ключу безопасности;
* приложению-аутентификатору.

SMS лучше не использовать как единственный дополнительный фактор, если сервис поддерживает более надёжный способ.

### Резервные коды

После включения MFA сервис может предоставить recovery-коды или backup-коды.

Сохраните их отдельно от основного рабочего устройства.

Не храните единственную копию recovery-кодов:

* на production-сервере;
* в рабочем Telegram;
* рядом с основным паролем в открытом виде;
* в том же аккаунте, который этими кодами восстанавливается.

Cloudflare, например, предоставляет отдельные backup-коды для восстановления доступа при потере основного устройства или ключа.

## Встроенная защита iEXExchanger

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

### Двухфакторная аутентификация

Для доступа к административной панели можно использовать двухфакторную аутентификацию через Google Authenticator.

После её включения для входа требуется не только логин и пароль, но и одноразовый код.

2FA рекомендуется включить для всех пользователей, имеющих административный доступ.

### Ограничение доступа по IP

iEXExchanger позволяет ограничивать авторизацию в административной панели списком разрешённых IP-адресов.

Такую защиту рекомендуется использовать для владельцев и ключевых администраторов со статическими или контролируемыми IP-адресами.

Перед включением убедитесь, что у вас останется рабочий способ доступа к панели.

### Адрес административной панели

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

Уникальный адрес не заменяет пароль, 2FA и контроль доступа, но уменьшает количество автоматических обращений к стандартному административному URL.

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

### CSP

В iEXExchanger предусмотрена поддержка Content Security Policy. CSP используется как дополнительный уровень защиты браузера от загрузки и выполнения нежелательного контента.

Используйте актуальную настройку CSP, предусмотренную документацией установленной версии iEXExchanger.

### Обновления

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

Не оставляйте production-проект на устаревшей версии без причины. Официальная документация iEXExchanger также рекомендует своевременно устанавливать новые версии как часть общей защиты проекта.

## Безопасность сервера

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

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

### SSH

Для административного доступа используйте SSH-ключи.

После проверки входа по ключу рекомендуется отключить парольную SSH-аутентификацию, если используемая инфраструктура позволяет работать без неё.

Для каждого администратора используйте отдельный ключ.

Не передавайте один приватный SSH-ключ нескольким сотрудникам.

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

По возможности используйте отдельного системного пользователя с `sudo` вместо постоянной ежедневной работы непосредственно под `root`.

Изменение стандартного SSH-порта можно использовать для уменьшения количества автоматических попыток подключения, но оно не заменяет SSH-ключи, firewall и правильное управление доступом.

### Firewall

Открывайте во внешний интернет только те порты и сервисы, которые действительно используются.

PostgreSQL и Redis не должны быть публично доступны, если для конкретной архитектуры это отдельно не требуется.

Внешний доступ к административным и системным сервисам лучше ограничивать по IP, VPN или другим средствам контроля.

### Обновления системы

Регулярно устанавливайте исправления безопасности операционной системы и серверного программного обеспечения.

Для production-сервера обновления лучше выполнять контролируемо: предварительно создайте резервную копию, проверьте изменения и только затем обновляйте критические компоненты.

### Fail2Ban

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

Он не заменяет SSH-ключи, ограничение доступа и firewall.

### Production и тестирование

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

Для разработки и экспериментов лучше использовать отдельное окружение.

## Секреты и конфигурация

К секретным данным относятся:

* пароли;
* API-ключи;
* приватные ключи;
* SSH-ключи;
* токены;
* ключи платёжных систем;
* seed-фразы;
* recovery-коды;
* конфигурационные значения с доступом к инфраструктуре.

Не отправляйте такие данные в Telegram, обычных чатах или задачах подрядчикам без необходимости.

Не добавляйте `.env`, приватные ключи и production-секреты в Git-репозитории.

Если секрет случайно стал доступен постороннему лицу или попал в публичный репозиторий, не ограничивайтесь удалением файла — считайте секрет скомпрометированным и замените его.

## Домен и DNS

Домен является критической частью инфраструктуры.

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

Для аккаунта регистратора:

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

Registrar Lock предназначен для защиты от несанкционированного переноса домена. Для особо критичных доменов некоторые регистраторы также предоставляют Registry Lock.

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

## Cloudflare

Cloudflare находится между пользователем и сервером, поэтому доступ к аккаунту Cloudflare необходимо защищать так же тщательно, как доступ к серверу.

### Защита аккаунта

Включите 2FA.

Если доступна аппаратная security key или другой более устойчивый способ аутентификации, используйте его для ключевых административных аккаунтов. Cloudflare поддерживает TOTP и аппаратные ключи безопасности для 2FA.

Сохраните backup-коды в защищённом месте.

### Защита origin-сервера

Если сайт работает через Cloudflare, недостаточно просто включить проксирование DNS.

По возможности ограничьте прямой доступ к origin-серверу. Cloudflare рекомендует различные варианты защиты origin, включая Cloudflare Tunnel, Authenticated Origin Pulls и ограничение входящего трафика адресами Cloudflare.

Не публикуйте реальный IP production-сервера без необходимости.

### WAF и Rate Limiting

Используйте WAF и Rate Limiting для чувствительных точек приложения, где это требуется.

Rate Limiting может ограничивать количество запросов к определённым URL и используется, например, для защиты авторизации и API от автоматизированного злоупотребления.

Правила должны соответствовать реальному трафику проекта. Слишком жёсткие ограничения могут блокировать обычных клиентов.

### DDoS

Cloudflare можно использовать как внешний уровень защиты от DDoS-атак. В документации iEXExchanger также предусмотрены отдельные инструкции по подключению и работе с Cloudflare.

Режим Under Attack используйте при необходимости, а не как постоянную замену нормальной настройки WAF и Rate Limiting.

## Электронная почта

Электронная почта часто используется для восстановления других аккаунтов, поэтому её компрометация может привести к потере доступа сразу к нескольким системам.

Для административной почты:

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

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

### SPF, DKIM и DMARC

Если с домена обменного пункта отправляется электронная почта, настройте SPF, DKIM и DMARC.

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

## Фишинг и социальная инженерия

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

Особенно внимательно относитесь к сообщениям с просьбой:

* срочно предоставить доступ к серверу;
* отправить резервную копию;
* передать API-ключ;
* передать recovery-код;
* изменить реквизиты;
* установить программу;
* открыть архив;
* выполнить неизвестную команду;
* авторизоваться по присланной ссылке.

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

Не используйте номер телефона, Telegram-аккаунт, электронную почту или ссылку, которые были присланы внутри самого подозрительного сообщения, как единственный способ проверки его подлинности.

## Telegram

Для рабочего Telegram включите **Two-Step Verification**.

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

Рекомендуется:

* установить пароль Two-Step Verification;
* указать защищённую recovery-почту;
* установить локальный код блокировки приложения;
* периодически проверять список устройств;
* завершать незнакомые сессии.

Никогда не передавайте другим лицам:

* код входа Telegram;
* пароль Two-Step Verification;
* recovery-коды других сервисов;
* seed-фразы;
* приватные ключи;
* SSH-ключи.

Telegram не должен использоваться как постоянное хранилище секретов проекта.

## GitHub

Если GitHub используется для хранения или обновления проекта, компрометация аккаунта может дать злоумышленнику доступ к исходному коду, процессу развёртывания или связанным секретам.

### Защита аккаунта

Включите 2FA.

GitHub также поддерживает passkeys, которые могут использоваться для безопасной авторизации и удовлетворять требованиям пароля и 2FA.

Сохраните методы восстановления доступа отдельно.

### Доступ к репозиториям

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

После завершения работы сотрудника или подрядчика удалите его доступ.

Периодически проверяйте Deploy Keys.

### API-токены

При необходимости использовать Personal Access Token выдавайте ему только необходимые разрешения и ограничивайте срок действия.

GitHub рекомендует по возможности использовать fine-grained personal access tokens и предоставлять минимальные необходимые разрешения.

### Секреты в репозитории

Не храните в GitHub:

* `.env` production;
* приватные SSH-ключи;
* ключи платёжных систем;
* seed-фразы;
* пароли баз данных;
* production API-токены.

Если используемый тариф и тип репозитория поддерживают Secret Scanning и Push Protection, включите их. Push Protection предназначен для обнаружения и блокирования попыток отправить поддерживаемые секреты в репозиторий.

## Платёжные системы

Аккаунты платёжных систем имеют непосредственный доступ к средствам, поэтому для них необходимо использовать максимально доступную защиту.

По возможности включайте:

* MFA;
* подтверждение операций;
* ограничение входа по IP;
* уведомления о входах;
* уведомления о выводах;
* список разрешённых адресов вывода;
* отдельные аккаунты для сотрудников с ограниченными правами.

Официальная документация iEXExchanger также рекомендует включать доступные механизмы подтверждения и ограничения доступа для подключаемых платёжных систем.

Не передавайте сотрудникам ключи платёжных систем, если их работа не требует прямого доступа к ним.

## Криптовалютные кошельки

Не храните все средства проекта в кошельке, который постоянно подключён к автоматическим операциям.

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

Seed-фразы и приватные ключи:

* не храните в GitHub;
* не отправляйте в Telegram;
* не храните в обычной электронной почте;
* не размещайте в текстовых файлах на сервере без необходимости;
* не передавайте подрядчикам.

Seed-фраза не должна входить в обычную резервную копию сайта вместе с файлами приложения и базой данных.

Для неё требуется отдельный защищённый способ хранения.

## Автоматические выплаты

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

Если используются автовыплаты:

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

В iEXExchanger предусмотрена дополнительная защита кодом безопасности для сценариев автоматических выплат.

## Рабочие устройства

Компрометация компьютера администратора может сделать бессмысленной защиту остальных систем.

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

Для устройств владельца и администраторов рекомендуется:

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

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

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

## Работа с подрядчиками

Перед предоставлением доступа подрядчику определите, что именно ему требуется.

Не выдавайте полный доступ «на всякий случай».

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

1. Создайте отдельную учётную запись.
2. Выдайте только необходимые права.
3. Если возможно, ограничьте доступ по IP.
4. Добавьте отдельный SSH-ключ вместо передачи собственного.
5. Определите срок действия доступа.
6. Зафиксируйте, к каким системам подрядчик получил доступ.

### После завершения работ

1. Отключите созданную учётную запись.
2. Удалите SSH-ключ подрядчика.
3. Отзовите временные API-токены.
4. Удалите доступ к GitHub.
5. Удалите доступ к Cloudflare и другим сервисам.
6. Проверьте журналы действий.
7. Если подрядчику были известны общие секреты, замените их.

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

## Резервное копирование

Резервная копия должна позволять восстановить проект после ошибки, повреждения сервера, удаления данных или инцидента безопасности.

Рекомендуется использовать принцип 3-2-1:

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

Такой подход используется и в рекомендациях CISA по резервному копированию.

Для iEXExchanger резервному копированию в первую очередь подлежат:

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

Recovery-коды MFA можно хранить отдельно как часть аварийного комплекта доступа, но не следует помещать их вместе с обычным backup сайта.

Seed-фразы и приватные ключи кошельков также должны храниться отдельно.

### Проверка резервных копий

Наличие backup-файла ещё не означает, что проект можно восстановить.

Периодически проверяйте:

* создаются ли новые копии;
* доступны ли они;
* не повреждены ли архивы;
* можно ли восстановить базу данных;
* есть ли отдельная копия вне production-сервера.

CIS Control 11 отдельно рассматривает возможность восстановления данных до доверенного состояния после инцидента.

## Что проверять регулярно

Не требуется каждый день вручную открывать десятки сервисов, если для них настроены уведомления.

Важнее настроить оповещения о критических событиях и регулярно проводить контроль.

### Постоянно

Следите за уведомлениями о:

* новых входах;
* изменении пароля;
* отключении MFA;
* добавлении нового устройства;
* изменении DNS;
* изменении настроек домена;
* создании новых API-токенов;
* подозрительных финансовых операциях.

### Еженедельно

Проверяйте:

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

### Ежемесячно

Проверяйте:

* список сотрудников с доступом;
* аккаунты бывших сотрудников и подрядчиков;
* SSH-ключи;
* GitHub Deploy Keys;
* API-токены;
* Cloudflare;
* резервные копии;
* свободное место и состояние сервера.

### Периодически

Проводите полную проверку того, сможете ли вы восстановить управление проектом при потере:

* основного телефона;
* рабочего компьютера;
* доступа к электронной почте;
* Cloudflare;
* сервера.

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

## Реагирование на инцидент

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

Сначала ограничьте возможный ущерб.

### Ограничение доступа

В зависимости от характера инцидента:

1. Переведите обменный пункт в режим обслуживания, если существует риск некорректных финансовых операций.
2. Приостановите автоматические выплаты, если существует риск доступа к платёжным системам.
3. Завершите подозрительные активные сессии.
4. Отзовите неизвестные или скомпрометированные токены.
5. Ограничьте административный доступ.
6. Сохраните журналы и другую информацию об инциденте.

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

### Смена доступов

Если есть вероятность компрометации рабочего компьютера, не меняйте критические пароли с этого же устройства.

Используйте заведомо доверенное устройство.

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

1. электронную почту;
2. менеджер паролей;
3. регистратора домена;
4. Cloudflare;
5. сервер;
6. GitHub;
7. административную панель;
8. платёжные системы.

Затем:

* смените скомпрометированные пароли;
* отзовите активные сессии;
* замените SSH-ключи;
* замените API-токены;
* замените другие секреты, которые могли быть получены злоумышленником.

### Проверка сервера

При подозрении на компрометацию сервера проверьте:

* новые системные учётные записи;
* SSH-ключи;
* `authorized_keys`;
* запущенные процессы;
* задания cron;
* системные службы;
* изменённые файлы проекта;
* неизвестные приложения;
* сетевые подключения;
* журналы входов.

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

### Проверка внешних сервисов

Проверьте:

* Cloudflare;
* DNS;
* регистратора;
* GitHub;
* электронную почту;
* Telegram;
* платёжные кабинеты;
* кошельки.

Обращайте внимание на новые устройства, неизвестные ключи, изменённые настройки, правила переадресации почты и созданные токены.

### Возврат проекта в работу

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

* источник инцидента устранён;
* критические доступы заменены;
* неизвестные сессии отключены;
* сервер проверен или восстановлен;
* DNS и Cloudflare находятся под вашим контролем;
* платёжные системы проверены;
* работа Frontend и Backend проверена;
* резервные копии доступны.

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

## Контрольный список владельца

Перед запуском production-проекта убедитесь, что:

* для административной панели iEXExchanger включена 2FA;
* административный доступ ограничен по IP там, где это возможно;
* используется собственный адрес административной панели;
* сотрудникам выданы только необходимые права;
* у каждого сотрудника отдельная учётная запись;
* для критических сервисов используются уникальные пароли;
* используется менеджер паролей;
* включена MFA для электронной почты;
* включена MFA для регистратора домена;
* включена MFA для Cloudflare;
* включена 2FA или passkey для GitHub;
* включена Two-Step Verification в Telegram;
* сохранены recovery-коды;
* SSH работает через индивидуальные ключи;
* лишние серверные порты закрыты;
* PostgreSQL и Redis не открыты в интернет;
* production-секреты отсутствуют в GitHub;
* доступы бывших сотрудников и подрядчиков удалены;
* настроены резервные копии;
* существует копия вне production-сервера;
* восстановление из резервной копии проверялось;
* рабочие устройства защищены и обновляются;
* известен порядок действий при компрометации.

Безопасность обменного пункта зависит не от одной настройки, а от всей цепочки: устройства владельца, учётных записей, сервера, домена, Cloudflare, iEXExchanger, платёжных систем и резервных копий. Компрометация любого критического элемента должна быть ограничена другими уровнями защиты.


# Настройка главного администратора

Главный администратор — это зарегистрированный пользователь, которому назначена защищённая группа **«Главные администраторы»**. Участники этой группы получают все права панели управления, включая разрешения, добавленные после обновления iEXExchanger.

Главную учётную запись следует использовать для управления безопасностью, сотрудниками, платёжной инфраструктурой, интеграциями и другими критичными функциями. Для ежедневной обработки заявок владельцу рекомендуется создать отдельный аккаунт с ограниченными правами.

{% hint style="danger" %}
Не передавайте учётную запись главного администратора разработчику, установщику, оператору, бухгалтеру, технической поддержке или другому подрядчику.

Пароль, коды подтверждения, персональные ссылки и резервные данные должны находиться только у владельца проекта.
{% endhint %}

## Как устроен доступ главного администратора

Главный администратор не является отдельным системным пользователем. Сначала владелец регистрируется на клиентском сайте как обычный пользователь, после чего действующий главный администратор назначает ему группу **«Главные администраторы»**.

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

Система также не позволяет исключить из группы последнего главного администратора. Назначение и отключение пользователей сохраняются в **«Истории прав»**.

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

Система разрешает назначить нескольких главных администраторов. Однако каждый дополнительный участник получает полный и неограниченный доступ. Если в группе становится больше трёх пользователей, **«Проверка безопасности админки»** показывает предупреждение.

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

## Рекомендуемая схема учётных записей

Основной аккаунт владельца с группой **«Главные администраторы»** используйте только для критичных действий:

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

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

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

Если используется подтверждение несколькими администраторами, создайте отдельную ограниченную учётную запись для согласования критичных операций. Такой пользователь не должен самостоятельно изменять мерчанты, реквизиты, безопасность или состав главных администраторов.

## Что подготовить перед назначением

До начала настройки подготовьте личный E-mail владельца, отдельный профиль браузера, менеджер паролей и приложение Google Authenticator либо другое совместимое приложение.

Если планируется ограничение входа по IP, заранее подготовьте постоянный внешний IP-адрес или защищённый VPN со стабильным выходным адресом.

Проверьте отправку системных писем и подготовьте сценарий восстановления доступа на случай потери пароля или устройства с Google 2FA.

Почтовый аккаунт владельца должен принадлежать только ему, использовать отдельный пароль и собственную двухфакторную защиту. Не используйте общую корпоративную почту, к которой имеют доступ сотрудники или подрядчики.

## Регистрация аккаунта владельца

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

Используйте личный E-mail, уникальный пароль и устройство, находящееся под контролем владельца.

Если аккаунт уже существует, убедитесь, что это полноценный зарегистрированный пользователь. Гостевая запись, созданная при оформлении заявки без регистрации, не отображается среди кандидатов для назначения группы.

## Проверка пользователя

В панели управления откройте: **«Пользователи» — «Список пользователей»**

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

Найдите владельца по ID, имени или E-mail и откройте его карточку.

На вкладке **«Основное»** проверьте:

* имя пользователя;
* E-mail;
* подтверждение почтового адреса;
* отсутствие блокировки;
* принадлежность аккаунта владельцу.

Если данные были изменены, нажмите **«Сохранить»**.

Затем перейдите во вкладку **«Доступ и безопасность»** и убедитесь, что **«Статус аккаунта»** включён.

Группа **«Главные администраторы»** не отменяет ограничения самого пользователя. Вход останется недоступным, если аккаунт отключён, заблокирован или не проходит персональное либо глобальное ограничение по IP.

## Назначение группы «Главные администраторы»

В панели управления откройте: **«Пользователи» — «Список групп пользователей»**

Найдите системную группу **«Главные администраторы»**. Не создавайте новую группу с похожим названием.

У строки группы нажмите действие с иконкой добавления пользователя. При наведении отображается подсказка **«Выдача пользователям»**.

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

В поле **«Найти пользователя»** укажите ID, имя или E-mail владельца. Выберите его в блоке **«Найденные пользователи»** и нажмите **«Выдать»**.

<figure><img src="/files/GF81LoJ0uR4F70zfkiMW" alt="" width="563"><figcaption></figcaption></figure>

В окне **«Выдать группу пользователю»** оставьте поле **«В группе до»** пустым.

Укажите причину назначения, например:

```
Владелец проекта, постоянный полный доступ.
```

Нажмите **«Подтвердить выдачу»**.

{% hint style="warning" %}
Группа **«Главные администраторы»** назначается только бессрочно.

Если заполнить поле **«В группе до»**, система отклонит выдачу группы.
{% endhint %}

После назначения пользователь должен появиться в блоке **«Пользователи в группе»** со сроком **«Пока не отключат»**.

Закройте окно и убедитесь, что количество участников в строке группы увеличилось.

Затем откройте **«История прав»**. В ней должны отображаться пользователь, администратор, выполнивший назначение, дата, бессрочный режим и указанная причина.

Назначайте главную группу по одному пользователю и проверяйте каждую операцию отдельно.

## Кто может назначить главную группу

Обычно назначение выполняет действующий главный администратор.

Для работы с защищённой группой используются права:

* **«Просмотр групп пользователей»**;
* **«Выдача групп пользователям»**;
* **«Выдача главной группы администраторов»**;
* **«Создание и изменение групп»**;
* **«Изменение главной группы администраторов»**.

Администратор не может выдать другому пользователю права, которых нет у него самого.

Если группа отображается, но действие **«Выдача пользователям»** недоступно, проверьте права текущего администратора.

## Первый вход владельца

Не отключайте прежнего главного администратора до полной проверки нового аккаунта.

Откройте панель управления в отдельном профиле браузера или в приватном окне.

Если в этом браузере уже выполнен вход на клиентском сайте, сначала завершите клиентскую сессию или используйте другой профиль. Клиентская сессия не должна автоматически превращаться в административную.

Введите E-mail и пароль нового главного администратора. Пройдите CAPTCHA, подтверждение входа, Google 2FA и проверку нового устройства, если эти механизмы включены.

После входа убедитесь, что открываются:

* **«Пользователи» — «Список пользователей»**;
* **«Пользователи» — «Список групп пользователей»**;
* настройки безопасности;
* другие критичные разделы, необходимые владельцу.

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

## Персональная защита аккаунта

В панели управления откройте: **«Пользователи» — «Список пользователей»**

Откройте карточку владельца и перейдите во вкладку **«Доступ и безопасность»**.

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

Здесь настраиваются пароль, Google 2FA, способ получения кодов, подтверждение входа, доверенные устройства, восстановление пароля, персональные IP-адреса и активные сессии.

Параметры с отметкой **«Применяется сразу»** вступают в силу после подтверждения кода и не ожидают общей кнопки сохранения.

**«Статус аккаунта»**, **«Разрешенные IP адреса»**, новый пароль и обычные данные пользователя сохраняются кнопкой **«Сохранить»**.

## Пароль

Пароль должен содержать от 12 до 128 символов, буквы верхнего и нижнего регистра, цифры и специальные символы.

Для главного администратора используйте уникальный пароль длиной не менее 16 символов, созданный менеджером паролей.

Не используйте этот пароль для E-mail, сервера или других сайтов. Не отправляйте его через мессенджеры и не храните в общей таблице или заметке.

Если пароль задавал другой администратор, владелец должен заменить его после первого входа.

## Google 2FA

В карточке владельца на вкладке **«Доступ и безопасность»** откройте **«Google 2FA»**.

<figure><img src="/files/9DlVvMLLVe0WHDWcWn7K" alt=""><figcaption></figcaption></figure>

{% content-ref url="/pages/0Z0RWWgQoDPndF0oEuVB" %}
[Настройка Google Authenticator](/guide/nachalo-raboty/centr-bezopasnosti/nastroika-google-authenticator)
{% endcontent-ref %}

До активации система показывает QR-код, секретный ключ и поле для шестизначного кода.

1. Откройте приложение-аутентификатор на устройстве владельца.
2. Отсканируйте QR-код или введите секрет вручную.
3. Сохраните резервную копию секрета в защищённом хранилище.
4. Введите текущий шестизначный код.
5. Нажмите **«Активировать»**.

<figure><img src="/files/BgI6qYuq3GcqmnDMMhlF" alt="" width="563"><figcaption></figcaption></figure>

После успешного подключения появится сообщение **«Google Authenticator активирован»**.

Закройте окно и откройте его повторно. Убедитесь, что Google 2FA отображается как активный.

Один код нельзя повторно использовать для нескольких защищённых действий. Если код уже применялся, дождитесь следующего.

Если код отклоняется, проверьте автоматическую синхронизацию времени на телефоне и убедитесь, что выбран правильный аккаунт в приложении.

{% hint style="info" %}
Персональная привязка Google 2FA и глобальное требование Google Authenticator при входе — разные настройки.

Для полноценной защиты необходимо настроить оба уровня.
{% endhint %}

## Способ подтверждения кодов безопасности

В поле **«Способ подтверждения кодов безопасности»** можно выбрать:

* **«Email»**;
* **«Telegram»**;
* **«Google 2FA»**.

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

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

Не выбирайте Telegram или Google 2FA, пока соответствующий вариант отображается недоступным.

{% stepper %}
{% step %}

### Email

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

{% content-ref url="/pages/OkKDfMApGsB2m3bvCsHg" %}
[Уведомление по E-mail](/guide/uvedomleniya/uvedomlenie-po-e-mail)
{% endcontent-ref %}

В панели управления откройте: **«Настройки» — «Общие настройки»**

Перейдите в раздел **«Уведомления» — «E-mail уведомления»**.

Проверьте, что включены **«Отправлять уведомления»** и **«Отправлять письма»**. Отправьте тестовое сообщение и убедитесь, что оно доставляется без задержек и не попадает в спам.

Почта остаётся важной даже при выборе Telegram или Google 2FA. Через неё могут отправляться персональные ссылки и выполняться аварийное восстановление.
{% endstep %}

{% step %}

### Telegram

Сначала настройте канал безопасности.

{% content-ref url="/pages/5ueHtrNh5qkmDPlGOD1m" %}
[Уведомление в Telegram](/guide/uvedomleniya/uvedomlenie-v-telegram)
{% endcontent-ref %}

В панели управления откройте: **«Настройки» — «Общие настройки»**

Перейдите в раздел **«Уведомления» — «Telegram уведомления»**.

Проверьте активную запись с назначением **«Коды и подтверждения безопасности»** и действующий токен бота.

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

В карточке пользователя на вкладке **«Доступ и безопасность»** нажмите **«Создать ссылку Telegram»**. Откройте полученную ссылку или отправьте боту показанную команду, затем вернитесь в панель и нажмите **«Проверить привязку»**.

Другой администратор не должен выполнять персональную привязку вместо владельца.

Отключение Telegram-привязки подтверждается кодами из E-mail и Telegram.
{% endstep %}

{% step %}

### Google 2FA

Этот способ становится доступен после активации персонального Google 2FA.

{% content-ref url="/pages/0Z0RWWgQoDPndF0oEuVB" %}
[Настройка Google Authenticator](/guide/nachalo-raboty/centr-bezopasnosti/nastroika-google-authenticator)
{% endcontent-ref %}

До выбора убедитесь, что владелец получает актуальные коды и сохранил резервный секрет.

{% endstep %}
{% endstepper %}

## Подтверждение входа

Включите **«Подтверждение входа в админку»**.

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

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

Текст интерфейса в отдельных версиях может упоминать подтверждение по почте, но фактически используется выбранный канал: Email, Telegram или Google 2FA.

## Доверенные устройства

Включите **«Доверенные устройства админки»**.

<figure><img src="/files/6KCvQJZ4srS6v0yyd1EZ" alt=""><figcaption></figcaption></figure>

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

Доверенное устройство и активная сессия — разные записи.

Отзыв устройства удаляет сохранённое доверие, но не обязательно завершает уже открытую сессию. Закрытие сессии, в свою очередь, не всегда отзывает доверенное устройство.

При потере устройства:

1. Отзовите его из списка доверенных.
2. Закройте связанные активные сессии.
3. Закройте персональные ссылки.
4. Измените пароль, если он мог быть раскрыт.

Если отключить **«Доверенные устройства админки»**, все сохранённые доверенные устройства пользователя будут отозваны.

## Восстановление пароля

Настройка **«Восстановление пароля»** управляет возможностью самостоятельно запросить ссылку восстановления.

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

{% hint style="danger" %}
Не отключайте восстановление пароля у единственного главного администратора без подготовленного аварийного сценария.

Сначала сохраните пароль, резервный секрет Google 2FA и убедитесь, что владелец сможет восстановить контроль при потере устройства.
{% endhint %}

Если проверенного технического сценария восстановления нет, оставьте настройку включённой и максимально защитите почту владельца.

## Персональное ограничение по IP

В поле **«Разрешенные IP адреса»** можно указать IPv4, IPv6 и CIDR-подсети.

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

Значения разделяются переносом строки, пробелом, запятой или точкой с запятой. Допускается не более 100 записей.

Пустое поле означает отсутствие персонального ограничения.

Если администратор изменяет собственный непустой список, текущий внешний IP-адрес должен входить в него. Система не позволит сохранить настройку, которая сразу заблокирует текущего пользователя.

{% content-ref url="/pages/dIuIyDNhBfI8ypz4IEoC" %}
[Доступ к панели по IP-адресу](/guide/nachalo-raboty/centr-bezopasnosti/dostup-k-paneli-po-ip-adresu)
{% endcontent-ref %}

{% hint style="warning" %}
Персональное и глобальное ограничения по IP применяются одновременно.

Для входа адрес должен соответствовать обоим спискам.
{% endhint %}

Не включайте персональное ограничение при мобильном интернете, меняющемся VPN или нестабильном IP без резервного способа доступа.

## Активные сессии

В блоке **«Активные сессии»** отображаются IP-адрес, платформа, браузер и User Agent.

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

Проверьте список и закройте неизвестные авторизации.

Если пользователь закрывает собственные сессии через **«Закрыть все сессии»**, текущая сессия сохраняется, а остальные завершаются.

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

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

## Глобальная безопасность панели

В панели управления откройте: **«Настройки» — «Общие настройки»**

В категории **«Основные»** откройте **«Безопасность»**.

Здесь находятся вкладки **«Общее»**, **«Защищённые операции»**, **«CAPTCHA»** и **«Антиспам заявок»**.

<figure><img src="/files/8923xDbS8lyix66DpTGR" alt=""><figcaption></figcaption></figure>

Изменяйте потенциально опасные параметры по одному. Не завершайте текущую сессию, пока не проверите новый вход в другом браузере.

## Доверенные прокси

В поле **«Выберите установленную защиту от DDOS»** укажите сервис, через который запросы поступают к сайту.

Если сайт доступен напрямую и перед сервером нет Cloudflare, StormWall, балансировщика или другого обратного прокси, оставьте поле пустым.

При использовании прокси нажмите **«Управление»**, выберите существующий файл провайдера либо создайте **«Новый файл»**. Укажите доверенные IPv4, IPv6 и CIDR-сети, затем сохраните настройки.

При необходимости используйте **«Обновить IP-адреса»**.

После настройки убедитесь, что панель видит реальный IP владельца, а не адрес прокси.

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

Не включайте доверие ко всем прокси, если сервер можно открыть напрямую.

## Глобальный Google Authenticator

На вкладке **«Общее»** включите **«Двухфакторная авторизация через Google Authenticator»**.

Перед сохранением убедитесь, что персональный Google 2FA уже подключён и проверен у владельца и других критичных администраторов.

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

Глобальный переключатель не создаёт персональный секрет. Для защиты нужны и глобальная настройка, и активный Google 2FA конкретного пользователя.

## Ограничение неверных входов

Настройте **«Максимальное количество неверных входов»** и **«Блокировка после неверных паролей, в минутах»**.

Практические значения:

```
Максимальное количество неверных входов: 5
Блокировка: 10–15 минут
```

Допустимое количество ошибок — от 1 до 20. Продолжительность блокировки — от 1 до 1440 минут.

Ограничение временно применяется к сочетанию E-mail и IP-адреса и защищает форму входа от перебора.

## Защита после смены пароля

Включите **«Защищать админ-доступ после событий пароля»**.

Для параметров можно использовать:

```
Ошибок текущего пароля до блокировки: 5
Окно ошибок текущего пароля: 15 минут
```

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

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

## CAPTCHA при входе

Перейдите во вкладку **«CAPTCHA»**.

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

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/bkg6pTtEjhwMrS0Qyn57" %}
[Подключение Google reCaptcha](/help-center/rabota-v-sisteme/integracii/podklyuchenie-google-recaptcha)
{% endcontent-ref %}

Для защиты административного входа должны быть настроены:

* **«Включить защиту CAPTCHA»**;
* **«Публичный ключ CAPTCHA»**;
* **«Секретный ключ CAPTCHA»**;
* **«Включить CAPTCHA при входе в админку»**.

После сохранения проверьте вход в приватном окне.

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

## Глобальное ограничение по IP

На вкладке **«Общее»** включите **«Ограничить вход в админ-панель по IP»** и заполните **«Разрешённые IP-адреса для админ-панели»**.

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

{% content-ref url="/pages/dIuIyDNhBfI8ypz4IEoC" %}
[Доступ к панели по IP-адресу](/guide/nachalo-raboty/centr-bezopasnosti/dostup-k-paneli-po-ip-adresu)
{% endcontent-ref %}

Поддерживаются IPv4, IPv6 и CIDR. Максимальное количество записей — 100.

Текущий IP администратора должен присутствовать в списке. Неверный адрес, некорректная сеть или превышение лимита не позволят сохранить настройки.

{% hint style="danger" %}
Если ограничение включено, но список разрешённых адресов пуст, фактическая фильтрация не работает.

**«Проверка безопасности админки»** отмечает такое состояние как критическое.
{% endhint %}

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

## Контроль смены IP

Для контроля IP во время сессии доступны варианты:

<figure><img src="/files/8Uvaa9oGRO1RxCcu4ipx" alt=""><figcaption></figcaption></figure>

{% content-ref url="/pages/k5GOlP0mIUsyOYHZoTpK" %}
[Контроль изменения IP-адреса](/guide/nachalo-raboty/centr-bezopasnosti/kontrol-izmeneniya-ip-adresa)
{% endcontent-ref %}

* **«Не проверять IP»**;
* **«Завершать вход при смене IP»**;
* **«Завершать вход и уведомлять»**.

Для главного администратора со стабильной сетью используйте **«Завершать вход и уведомлять»**.

При смене IP система завершает административную сессию и отзывает связанные с ней персональную ссылку, временный доступ к защищённым зонам, состояние Google-проверки и подключения дополнительных аккаунтов.

При использовании мобильной сети или VPN с меняющимися адресами частые завершения входа могут быть ожидаемым результатом.

## Одна активная сессия

Включите **«Сбрасывать ключ авторизации при каждом входе»**.

После этого новый вход пользователя завершает предыдущую сессию.

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

Также включите **«Показывать активные сессии»**, чтобы пользователь мог видеть свои текущие авторизации.

## Время жизни сессии

Поле **«Время жизни сессии, в минутах»** действует на общие веб-сессии проекта, а не только на панель управления.

Практическое значение — около 120 минут. **«Проверка безопасности админки»** предупреждает, если срок превышает 240 минут.

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

## Постоянный адрес панели управления

Поле **«Постоянный адрес входа в админку»** позволяет заменить стандартный путь панели.

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

{% content-ref url="/pages/uHKEWAv7eV47thogO94I" %}
[Защита адреса административной панели](/guide/nachalo-raboty/centr-bezopasnosti/zashita-adresa-administrativnoi-paneli)
{% endcontent-ref %}

Значение должно содержать от 3 до 64 символов. Разрешены латинские буквы, цифры и дефисы. Первый и последний символ должны быть буквой или цифрой.

Начальный `/` добавляется автоматически.

Не используйте очевидные значения:

```
admin
panel
administrator
```

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

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

Скрытый адрес является дополнительной мерой. Он не заменяет пароль, Google 2FA, CAPTCHA и IP-ограничение.

## Персональная ссылка панели управления

Включите **«Персональная ссылка админки после входа»**.

{% content-ref url="/pages/uHKEWAv7eV47thogO94I" %}
[Защита адреса административной панели](/guide/nachalo-raboty/centr-bezopasnosti/zashita-adresa-administrativnoi-paneli)
{% endcontent-ref %}

После первоначальной авторизации система отправляет пользователю по E-mail персональную ссылку для текущей сессии браузера.

Постоянный адрес используется для начала входа, а дальнейшая работа выполняется по персональному адресу вида `/c/...`.

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

В поле **«Сколько действует ссылка из письма, в минутах»** укажите срок первого открытия. Допустимый диапазон — от 1 до 1440 минут. Практическое значение — 10–15 минут.

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

В блоке **«Активные уникальные ссылки»** отображаются подтверждённые ссылки. Полный секретный адрес не показывается. Каждую ссылку можно закрыть отдельно.

Не пересылайте персональную ссылку и не сохраняйте её в общем браузере.

## Проверка безопасности админки

В верхней части панели управления откройте **«Проверка безопасности админки»**.

Окно проверяет глобальные параметры и защиту текущего администратора, включая Google 2FA, CAPTCHA, IP-ограничения, контроль сессий, персональные ссылки, почтовую отправку, защищённые операции и количество главных администраторов.

После изменения настроек обновите страницу и запустите проверку повторно.

Отсутствие критических предупреждений подтверждает настройку проверяемых механизмов, но не исключает уже произошедший инцидент.

## Защищённые операции

В панели управления откройте: **«Настройки» — «Общие настройки»**

{% content-ref url="/pages/BWGJfTB82Ju7RSAJhpcl" %}
[Защищённые операции](/guide/nachalo-raboty/centr-bezopasnosti/zashishyonnye-operacii)
{% endcontent-ref %}

В категории **«Основные»** откройте **«Безопасность»**, затем перейдите во вкладку **«Защищённые операции»**.

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

Защита настраивается отдельно для зон **«Мерчанты и автовыплаты»** и **«Платёжные реквизиты»**.

Первая зона защищает настройки платёжных интеграций, секретных параметров, привязок валют и направлений.

Вторая зона защищает создание, изменение, архивирование, выдачу и замену платёжных реквизитов.

Для каждой зоны можно настроить:

* **«Требовать код при изменениях»**;
* шестизначный код доступа;
* время доступа после ввода кода;
* второе подтверждение;
* отдельный список разрешённых IP.

Для разных зон используйте разные коды. Не используйте пароль пользователя, Google-код или код подтверждения выплаты.

Практическое время доступа после ввода кода — 10–30 минут.

Код зоны не предоставляет функциональные права. Пользователю всё равно требуется обычное разрешение на изменение мерчанта, автовыплаты или реквизита.

## Изменение настроек защищённой зоны

Для изменения используются действия **«Запросить подтверждение»**, **«Запросить изменение»**, **«Изменить настройки»** или **«Запросить отключение»**.

Система создаёт запрос для активных администраторов с правом **«Подтверждение настроек защищённых операций»**.

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

Если у одного подтверждающего администратора не работает Email, Telegram или Google 2FA, запрос может остаться неподтверждённым.

Временный доступ к зоне привязывается к конкретному пользователю, браузеру и текущей версии настроек. После изменения кода или правил старый доступ прекращается.

## Код подтверждения выплаты

В панели управления откройте раздел **«Заявки»** и перейдите во вкладку **«Все заявки»**.

Нажмите кнопку с иконкой шестерёнки **«Настройки всех заявок»** и найдите блок **«Код подтверждения выплаты»**.

{% content-ref url="/pages/yNZkJFTj75eKhN7PptnE" %}
[Код подтверждения выплаты](/guide/zayavki/kod-podtverzhdeniya-vyplaty)
{% endcontent-ref %}

Для создания используйте **«Установить код»**, для замены — **«Сменить код»**.

Укажите отдельный шестизначный код и сохраните его в защищённом хранилище. После сохранения система не показывает код повторно.

Настройте защиту от подбора:

```
Неверных попыток: 5
Блокировать на: 15 минут
```

Код выплаты должен отличаться от пароля, кодов защищённых зон и других служебных PIN-кодов.

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

## Подтверждение несколькими администраторами

На вкладке **«Защищённые операции»** найдите блок **«Подтверждение критичных действий»**.

Включите **«Подтверждать несколькими администраторами»** и укажите **«Сколько подтверждений требуется»**.

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

Допустимое значение — от 1 до 10.

Можно защитить мерчанты и автовыплаты, платёжные реквизиты, настройки безопасности, экспорт клиентских данных и партнёрские выплаты заявок.

После выбора параметров нажмите **«Запросить подтверждение»**.

Подтверждающий пользователь должен быть активным, иметь административный доступ, право **«Подтверждение критичных действий»** и рабочий способ получения защитных кодов.

Инициатор не может подтвердить собственную операцию.

Для подтверждающего администратора не требуется группа **«Главные администраторы»**. Создайте отдельную ограниченную группу с правами входа и подтверждения.

{% hint style="danger" %}
Требуемое количество подтверждений не уменьшается автоматически.

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

## Разница между согласованиями

Изменение правил защищённых операций должны подтвердить все активные пользователи с правом **«Подтверждение настроек защищённых операций»**.

Для выполнения отдельного критичного действия требуется указанное количество администраторов с правом **«Подтверждение критичных действий»**. Инициатор операции не учитывается.

Эти механизмы работают независимо.

## Опасные права

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

Особенно внимательно контролируйте:

* **«Создание и изменение групп»**;
* **«Выдача групп пользователям»**;
* **«Выдача важных прав»**;
* **«Выдача главной группы администраторов»**;
* **«Изменение главной группы администраторов»**;
* **«Настройки безопасности пользователей»**;
* **«Google 2FA пользователей»**;
* **«Настройки безопасности»**;
* **«Подтверждение критичных действий»**;
* права просмотра закрытых ключей;
* права выплат и изменения критичных данных заявки.

Придерживайтесь принципа минимальных прав.

## Использование нескольких аккаунтов

Не добавляйте главного администратора как дополнительную учётную запись в существующую multi-auth-сессию.

Сначала войдите главным администратором как основным аккаунтом. После этого можно подключить обычную рабочую учётную запись.

Для полного завершения используйте **«Выйти из всех»**.

Безопаснее использовать отдельные профили браузера:

* главный профиль — только аккаунт владельца;
* рабочий профиль — ограниченная учётная запись;
* отдельный профиль — проверка нового входа.

## Передача управления новому владельцу

Не удаляйте последнего действующего главного администратора до полной проверки нового владельца.

1. Новый владелец самостоятельно регистрирует аккаунт.
2. Прежний владелец проверяет E-mail, статус и отсутствие блокировки.
3. Новому владельцу назначается группа **«Главные администраторы»** без срока окончания.
4. Новый владелец выполняет вход в отдельном браузере.
5. Он самостоятельно подключает Google 2FA и проверяет получение кодов.
6. Проверяются CAPTCHA, IP-ограничения, доверенные прокси, сессии и персональная ссылка.
7. Проверяется доступ к защищённым операциям.
8. Проверяется необходимое количество независимых подтверждающих администраторов.
9. В **«Истории прав»** проверяется назначение нового владельца.
10. Только после этого прежний владелец отключается от главной и других административных групп.

Чтобы отключить прежнего владельца, откройте:

**«Пользователи» — «Список групп пользователей»**

У группы **«Главные администраторы»** откройте **«Выдача пользователям»**.

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

В блоке **«Пользователи в группе»** нажмите **«Отключить»** у прежнего пользователя, укажите причину и подтвердите действие.

После этого закройте его активные сессии, отзовите доверенные устройства, персональные ссылки и дополнительные аккаунты.

Если аккаунт больше не нужен, отключите **«Статус аккаунта»** или заблокируйте пользователя.

{% hint style="warning" %}
Система не позволит отключить последнего участника группы **«Главные администраторы»**.

Сначала назначьте и полностью проверьте нового владельца.
{% endhint %}

## Инфраструктура после передачи

Удаление прав в панели управления не отзывает доступ к серверу и внешним сервисам.

После передачи проекта проверьте и при необходимости замените:

* пароль панели управления сервером;
* SSH-ключи и системных пользователей;
* пароли базы данных;
* доступ к регистратору домена;
* DNS и Cloudflare;
* почтовые аккаунты;
* токены Telegram-ботов;
* ключи мерчантов и автовыплат;
* секреты вебхуков;
* API-ключи;
* доступ к резервным копиям;
* мониторинг;
* учётные данные плагинов и интеграций.

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

## Финальная проверка входа

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

1. Откройте новый постоянный адрес панели.
2. Пройдите CAPTCHA.
3. Введите E-mail и пароль владельца.
4. Подтвердите вход выбранным каналом.
5. Введите Google-код, если он запрашивается отдельно.
6. Если используется персональная ссылка, откройте её в том же браузере.
7. Убедитесь, что панель управления открылась.
8. Запустите **«Проверка безопасности админки»**.
9. Проверьте группу и **«Историю прав»**.
10. Проверьте активные сессии, доверенные устройства и уникальные ссылки.
11. Выполните контролируемую проверку защищённой зоны.
12. Проверьте механизм подтверждения несколькими администраторами.
13. Убедитесь, что код выплаты установлен, не выполняя реальную выплату.
14. Завершите вход.
15. Проверьте, что прежняя персональная ссылка больше не открывает панель.

Не отключайте прежнего владельца до успешного прохождения всех этапов.

## Ежедневная работа

Используйте главную учётную запись только для критичных операций.

Для обычной обработки заявок входите через ограниченный рабочий аккаунт.

Не используйте общий компьютер, открытые сети Wi-Fi и чужой браузер. Не сохраняйте пароль на временных устройствах и не пересылайте персональные ссылки.

При использовании IP-ограничения входите через стабильный VPN и не меняйте сеть во время защищённой сессии.

Не подтверждайте неожиданный код или операцию, которую вы не начинали.

Регулярно проверяйте:

* **«Проверка безопасности админки»**;
* состав группы **«Главные администраторы»**;
* **«История прав»**;
* активные сессии;
* доверенные устройства;
* активные уникальные ссылки;
* журнал авторизаций;
* multi-auth-сессии;
* изменения мерчантов, автовыплат и реквизитов;
* подозрительные действия с выплатами.

## Действия при подозрении на взлом

Используйте чистое доверенное устройство.

1. Защитите почтовый аккаунт владельца.
2. Измените пароль почты и закройте неизвестные почтовые сессии.
3. Проверьте восстановление и двухфакторную защиту почты.
4. Приостановите критические операции и автовыплаты, если это можно сделать безопасно.
5. Закройте активные уникальные ссылки.
6. Отзовите неизвестные доверенные устройства.
7. Закройте административные сессии.
8. Завершите multi-auth-сессии.
9. Измените пароль главного администратора.
10. Сбросьте и повторно подключите Google 2FA.
11. Проверьте способ подтверждения и Telegram-привязку.
12. Проверьте состав административных групп.
13. Удалите неизвестные аккаунты и права.
14. Проверьте мерчанты, автовыплаты, реквизиты, выплаты, API и плагины.
15. Замените раскрытые ключи и секреты.
16. Проверьте сервер, SSH, DNS, Cloudflare, почту и резервные копии.
17. Сохраните журналы и время событий.
18. Не очищайте журнал до окончания расследования.
19. Создайте резервную копию текущего состояния.
20. Обратитесь в службу поддержки iEXExchanger.

Смены одного пароля недостаточно. Злоумышленник может сохранить сессию, доверенное устройство, персональную ссылку или инфраструктурный доступ.

## Если настройка не работает

<details>

<summary>Пользователь не отображается при выдаче группы</summary>

Убедитесь, что это зарегистрированный пользователь, а не гостевая запись заявки.

Проверьте ID и E-mail.

</details>

<details>

<summary>Нет действия «Выдача пользователям»</summary>

Проверьте права текущего администратора на просмотр групп, выдачу групп и управление защищённой группой.

</details>

<details>

<summary>Нельзя отключить главного администратора</summary>

Система не позволяет удалить последнего участника защищённой группы.

Сначала назначьте и проверьте нового владельца.

</details>

<details>

<summary>Вход остаётся запрещённым</summary>

Проверьте **«Статус аккаунта»**, блокировку пользователя, назначенные группы и оба уровня IP-ограничений.

Выполните вход в отдельном профиле браузера.

</details>

<details>

<summary>Код не приходит</summary>

Проверьте выбранный способ подтверждения.

Для Email проверьте отправку писем. Для Telegram — канал безопасности и персональную привязку. Для Google 2FA — активное состояние и время на устройстве.

</details>

<details>

<summary>Персональная ссылка не приходит</summary>

Проверьте отправку E-mail, адрес пользователя и срок действия ссылки.

</details>

<details>

<summary>Персональная ссылка не открывает панель</summary>

Ссылка могла быть открыта в другом браузере, истечь до первого открытия, быть отозвана или потерять связь с сессией и IP-адресом.

</details>

<details>

<summary>Ограничение по IP не сохраняется</summary>

Добавьте текущий внешний IP, проверьте формат адреса или CIDR, лимит в 100 записей и настройку доверенных прокси.

</details>

<details>

<summary>Сессия постоянно завершается</summary>

IP-адрес может меняться из-за мобильной сети, VPN или неверной настройки прокси.

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

</details>

<details>

<summary>Google-код отклоняется</summary>

Синхронизируйте время на устройстве, выберите правильный аккаунт и дождитесь нового кода, если предыдущий уже использовался.

</details>

<details>

<summary>Защищённая настройка не применяется</summary>

Все администраторы с правом **«Подтверждение настроек защищённых операций»** должны подтвердить запрос.

</details>

<details>

<summary>Недостаточно подтверждающих администраторов</summary>

Количество подтверждений не уменьшается автоматически.

Добавьте нужное число независимых администраторов или осознанно измените правило.

</details>

<details>

<summary>Сессии закрыты, но устройство снова получает доступ</summary>

Отзовите доверенное устройство и персональную ссылку отдельно.

</details>

<details>

<summary>Проверка безопасности показывает прежнее состояние</summary>

Обновите страницу или выполните повторный вход. Проверка использует актуальные настройки и данные текущего пользователя.

</details>

## Финальная проверка

Настройка завершена, если:

* аккаунт принадлежит владельцу;
* E-mail контролируется только владельцем;
* пользователь состоит в группе **«Главные администраторы»**;
* назначение отображается как бессрочное;
* событие находится в **«Истории прав»**;
* пароль сохранён в менеджере паролей;
* персональный Google 2FA подключён и проверен;
* глобальный Google Authenticator включён;
* способ получения кодов работает;
* подтверждение входа включено;
* доверенные устройства проверены;
* восстановление пароля настроено осознанно;
* IP-ограничения не блокируют владельца;
* неизвестные сессии и ссылки отсутствуют;
* CAPTCHA работает;
* защищённые зоны настроены;
* код подтверждения выплаты установлен;
* подтверждающие администраторы доступны;
* новый вход проверен в отдельном браузере;
* прежний доступ отозван только после полной проверки;
* внешние и серверные учётные данные заменены после передачи;
* **«Проверка безопасности админки»** не показывает критических проблем.


# Защищённые операции

Раздел «Защищённые операции» используется для дополнительной защиты критически важных действий в панели управления iEXExchanger.

С его помощью можно ограничить работу с мерчантами, автоматическими выплатами, платёжными реквизитами, настройками безопасности и экспортом клиентских данных. Для выполнения таких операций система может запрашивать отдельный код, личное подтверждение администратора или согласование действия другими администраторами.

Защита проверяется самой системой при выполнении операции. Ограничения действуют не только для кнопок в интерфейсе, но и для запросов, отправляемых в панель управления.

## Где находится раздел

В панели управления откройте: **«Настройки» — «Общие настройки»**

Затем перейдите в раздел: **«Основное» — «Безопасность»**

Откройте вкладку **«Защищённые операции»**.

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

Вкладка доступна только администраторам, которым выданы соответствующие права безопасности.

## Для чего нужны защищённые операции

Через этот раздел можно:

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

Защищённые операции рекомендуется использовать в проектах, где несколько администраторов или операторов имеют доступ к панели управления.

***

## Как устроена защита

В разделе предусмотрено два независимых механизма.

{% stepper %}
{% step %}

### Защита мерчантов, выплат и реквизитов

Для выполнения защищённого действия администратор должен ввести отдельный код соответствующей зоны.

После правильного ввода кода система временно открывает доступ к операциям внутри этой зоны. Время доступа настраивается администратором.

При необходимости перед вводом общего кода можно дополнительно запрашивать личное подтверждение администратора через:

* E-mail;
* Telegram-бот безопасности;
* Google Authenticator.
  {% endstep %}

{% step %}

### Подтверждение критичных действий

Для выполнения конкретной операции требуется подтверждение других администраторов.

Такое подтверждение создаётся отдельно для каждого действия и не открывает общий доступ к разделу. После согласования выполняется только та операция, для которой был создан запрос.

Оба механизма можно использовать отдельно или одновременно.

Если включены оба уровня защиты, администратору потребуется:

1. подтвердить свою личность, если включено второе подтверждение;
2. ввести код защищённой зоны;
3. получить необходимое количество подтверждений от других администраторов;
4. завершить исходную операцию.
   {% endstep %}
   {% endstepper %}

## Какие коды используются

При работе с защищёнными операциями система может запрашивать разные виды кодов.

<table><thead><tr><th width="278.078125">Код</th><th>Для чего используется</th></tr></thead><tbody><tr><td>Код защищённой зоны</td><td>Общий шестизначный код для временного доступа к мерчантам, выплатам или реквизитам</td></tr><tr><td>Личное подтверждение администратора</td><td>Дополнительный код из E-mail, Telegram или Google Authenticator</td></tr><tr><td>Подтверждение изменения настроек</td><td>Индивидуальный код администратора для включения, изменения или отключения защиты</td></tr><tr><td>Подтверждение критичного действия</td><td>Индивидуальный код другого администратора для выполнения конкретной операции</td></tr></tbody></table>

Эти коды выполняют разные задачи и не заменяют друг друга.

## Защищённые зоны

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

{% stepper %}
{% step %}

### Мерчанты и автовыплаты

Защита распространяется на действия, связанные с приёмом и отправкой средств:

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

* создание, изменение и удаление мерчантов;
* создание, изменение и удаление модулей автовыплат;
* просмотр защищённых подключений и секретных параметров;
* изменение правил доступа к секретным подключениям;
* привязку мерчантов к валютам;
* привязку автовыплат к валютам;
* настройку правил выбора мерчантов в направлениях;
* настройку правил выбора автовыплат в направлениях;
* изменение параметров автоматизации мерчантов и выплат.

Просмотр списка может быть доступен без ввода кода. Подтверждение запрашивается при выполнении действия, которое изменяет защищённые данные или раскрывает секретные параметры.
{% endstep %}

{% step %}

### Платёжные реквизиты

Защита распространяется на следующие операции:

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

Открытие заявки само по себе обычно не требует подтверждения. Код запрашивается при выполнении действия, которое изменяет, заменяет или выдаёт платёжные данные.
{% endstep %}
{% endstepper %}

***

## Настройка защищённой зоны

### Требовать код при изменениях

Параметр включает обязательный ввод кода при выполнении защищённых действий.

Если параметр включён, операции внутри выбранной зоны нельзя выполнить без подтверждения. При первом включении необходимо установить код защищённой зоны.

Если защита отключена, отдельный код этой зоны не запрашивается. При этом подтверждение критичных действий другими администраторами продолжит работать, если оно включено отдельно.

### Код доступа к разделу

Укажите код, состоящий ровно из шести цифр.

Пример:

```
583194
```

Используйте случайную комбинацию. Не устанавливайте простые коды:

```
123456
000000
111111
654321
```

Для зон **«Мерчанты и автовыплаты»** и **«Платёжные реквизиты»** рекомендуется использовать разные коды.

После сохранения код:

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

Если вы редактируете уже настроенную зону и не хотите менять код, оставьте поле пустым.

{% hint style="warning" %}
**Важно.** Не храните код защищённой зоны вместе с паролем от панели управления и не передавайте его в общих чатах.
{% endhint %}

### Время доступа после ввода кода

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

Допустимые значения:

<table><thead><tr><th width="361.5">Значение</th><th align="right">Время</th></tr></thead><tbody><tr><td>Минимальное</td><td align="right">5 минут</td></tr><tr><td>Стандартное</td><td align="right">30 минут</td></tr><tr><td>Максимальное</td><td align="right">1440 минут</td></tr></tbody></table>

Временный доступ привязывается к текущему администратору и текущему входу в панель управления.

Открытый доступ не переносится:

* в другой браузер;
* на другое устройство;
* другому администратору;
* в другую защищённую зону.

Например, если администратор открыл доступ к зоне «Мерчанты и автовыплаты», это не даст ему доступ к платёжным реквизитам. Для второй зоны потребуется ввести её собственный код.

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

Для ежедневной работы рекомендуется устанавливать время от 10 до 30 минут.

### Требовать второе подтверждение

Если параметр включён, одного кода защищённой зоны будет недостаточно.

Перед вводом общего кода администратор должен подтвердить свою личность одним из доступных способов:

* кодом из E-mail;
* кодом из Telegram-бота безопасности;
* текущим кодом Google Authenticator.

Способ подтверждения настраивается отдельно для каждого администратора.

Для настройки откройте: **«Пользователи» — «Список пользователей»**

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

Выберите администратора, откройте раздел **«Безопасность»** и настройте поле **«Способ подтверждения кодов безопасности»**.

<figure><img src="/files/3kl1JWqiHX2TT50JX632" alt=""><figcaption></figcaption></figure>

Для выбранного способа должна быть заранее выполнена соответствующая настройка:

* для E-mail должна работать отправка писем;
* для Telegram должен быть подключён и подтверждён Telegram-бот безопасности;
* для Google 2FA у администратора должен быть настроен Google Authenticator.

{% content-ref url="/pages/OkKDfMApGsB2m3bvCsHg" %}
[Уведомление по E-mail](/guide/uvedomleniya/uvedomlenie-po-e-mail)
{% endcontent-ref %}

{% content-ref url="/pages/5ueHtrNh5qkmDPlGOD1m" %}
[Уведомление в Telegram](/guide/uvedomleniya/uvedomlenie-v-telegram)
{% endcontent-ref %}

{% content-ref url="/pages/0Z0RWWgQoDPndF0oEuVB" %}
[Настройка Google Authenticator](/guide/nachalo-raboty/centr-bezopasnosti/nastroika-google-authenticator)
{% endcontent-ref %}

Если выбранный способ недоступен, администратор не сможет пройти второе подтверждение.

### Разрешённые IP для этой зоны

Поле позволяет ограничить выполнение защищённых операций определёнными IP-адресами.

Поддерживаются:

* IPv4;
* IPv6;
* CIDR-подсети.

Пример:

```
192.0.2.10
198.51.100.0/24
2001:db8::1
```

Адреса можно указывать:

* с новой строки;
* через пробел;
* через запятую;
* через точку с запятой.

Повторяющиеся значения удаляются автоматически. Можно добавить не более 50 адресов или подсетей.

Если поле оставлено пустым, защищённые операции будут доступны с любых IP-адресов.

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

{% hint style="warning" %}
**Важно.** Перед включением ограничения убедитесь, что текущий внешний IP-адрес указан правильно. При использовании VPN, прокси-сервера, Cloudflare или корпоративной сети система должна корректно определять реальный IP администратора.
{% endhint %}

Неправильно настроенный список IP-адресов может заблокировать выполнение защищённых операций.

***

## Как включить защиту зоны

{% stepper %}
{% step %}

### Подготовьте администраторов

Перед включением убедитесь, что в системе существует хотя бы один активный администратор с правом: **«Подтверждение настроек защищённых операций»**

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

У каждого подтверждающего администратора должен работать выбранный способ получения кодов.

В подтверждении не участвуют:

* заблокированные пользователи;
* деактивированные пользователи;
* пользователи без доступа к панели управления;
* администраторы без соответствующего права.
  {% endstep %}

{% step %}

### Выберите защищённую зону

Откройте одну из доступных зон:

* «Мерчанты и автовыплаты»;
* «Платёжные реквизиты».

Каждая зона настраивается отдельно.
{% endstep %}

{% step %}

### Заполните настройки

Укажите:

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

Проверьте настройки перед отправкой запроса. Особенно внимательно проверьте код, способы подтверждения и IP-адреса.
{% endstep %}

{% step %}

### Запросите подтверждение

Нажмите **«Запросить подтверждение»**.

Новые настройки не применяются сразу. Система создаст запрос и отправит отдельное подтверждение каждому активному администратору с необходимым правом.
{% endstep %}

{% step %}

### Соберите подтверждения

В окне запроса отображаются:

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

В зависимости от выбранного способа администратор:

* вводит код из письма;
* переходит по одноразовой ссылке из письма;
* передаёт код из Telegram-бота;
* вводит текущий код Google Authenticator.

Администратор, изменяющий настройки, может ввести код, который ему передал соответствующий подтверждающий администратор.

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

Для изменения настроек зоны требуются подтверждения всех активных администраторов, которым выдано право **«Подтверждение настроек защищённых операций»**.
{% endstep %}

{% step %}

### Дождитесь применения настроек

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

Запрос на изменение настроек действует 30 минут. Если за это время не были получены все подтверждения, запрос станет недействительным. В этом случае создайте новый запрос.
{% endstep %}
{% endstepper %}

## Как выполняется защищённая операция

После включения защиты система работает в следующем порядке:

1. Администратор изменяет мерчант, автовыплату или платёжные реквизиты.
2. Нажимает кнопку сохранения или выполнения операции.
3. Если включено второе подтверждение, система запрашивает личный код администратора.
4. После успешного личного подтверждения система запрашивает код защищённой зоны.
5. Администратор вводит правильный код.
6. Система автоматически повторяет исходное действие.
7. Для текущего администратора открывается временный доступ на установленное количество минут.
8. До окончания этого времени другие действия в той же зоне выполняются без повторного ввода кода.

Для выполнения операции в другой защищённой зоне потребуется ввести код этой зоны.

### Пример

Для зоны «Мерчанты и автовыплаты» установлены следующие параметры:

```
Требовать код: Да
Требовать второе подтверждение: Да
Время доступа: 15 минут
```

Администратор изменяет настройки мерчанта.

Сначала система запрашивает его личный код из Google Authenticator. После успешной проверки администратор вводит общий код зоны.

Изменения сохраняются, а доступ к операциям с мерчантами и автовыплатами открывается на 15 минут. Доступ к платёжным реквизитам при этом не открывается.

***

## Ограничение неверных попыток

Для защиты от перебора кодов действует ограничение:

* после пяти неверных попыток ввод временно блокируется;
* продолжительность блокировки составляет 10 минут.

Ограничение привязывается к администратору и конкретной защищённой зоне. Изменение IP-адреса не позволяет обойти блокировку.

Если код неизвестен, не пытайтесь подбирать комбинацию. Запросите изменение кода у администратора, управляющего настройками безопасности.

## Активные доступы

Когда временный доступ к защищённой зоне открыт, в верхней части защищённых страниц появляется значок замка.

В окне активных доступов отображаются:

* название защищённой зоны;
* количество активных доступов;
* имя администратора;
* частично скрытый E-mail;
* IP-адрес;
* время окончания доступа;
* отметка текущего пользователя и текущего входа.

Список активных доступов автоматически обновляется во время работы.

Администратор может нажать **«Закрыть доступ»**, чтобы немедленно завершить свой временный доступ к выбранной зоне. При следующем защищённом действии потребуется повторное подтверждение.

Выход из административной панели также прекращает возможность использовать открытый доступ.

## Как изменить настройки защиты

После включения защиты текущие параметры отображаются в режиме просмотра.

Чтобы изменить настройки:

1. Откройте нужную защищённую зону.
2. Нажмите **«Изменить настройки»**.
3. Измените необходимые параметры.
4. Если код менять не нужно, оставьте поле кода пустым.
5. Если код необходимо заменить, укажите новую комбинацию из шести цифр.
6. Нажмите **«Запросить изменение»**.
7. Соберите подтверждения обязательных администраторов.
8. Дождитесь применения настроек.

Пока запрос не подтверждён полностью, продолжают действовать старые настройки.

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

## Как отключить защиту зоны

Чтобы отключить запрос кода:

1. Откройте настроенную защищённую зону.
2. Нажмите **«Запросить отключение»**.
3. Подтвердите действие кодами всех обязательных администраторов.
4. Дождитесь применения запроса.

До получения всех обязательных подтверждений защита продолжит работать.

После отключения сохранённый код зоны удаляется. Для повторного включения потребуется установить новый код.

Отключение кода защищённой зоны не отключает подтверждение критичных действий другими администраторами. Эти механизмы настраиваются независимо.

***

## Подтверждение критичных действий

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

В отличие от кода защищённой зоны, согласование:

* создаётся отдельно для каждого действия;
* не открывает временный доступ ко всему разделу;
* не может использоваться для другой операции;
* перестаёт действовать после выполнения подтверждённого действия.

### Подтверждать несколькими администраторами

Параметр включает обязательное согласование критичных операций.

Если параметр отключён, выбранные категории действий не будут запрашивать подтверждение других администраторов.

### Сколько подтверждений требуется

Можно установить от 1 до 10 подтверждений.

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

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

**«Подтверждение критичных действий»**

Например, установлены следующие параметры:

```
Количество подтверждений: 2
```

В этом случае, помимо инициатора действия, в системе должны быть доступны как минимум два активных администратора с правом подтверждения критичных действий.

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

Для решения проблемы потребуется:

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

## Защищаемые категории

{% stepper %}
{% step %}

### Мерчанты и автовыплаты

Подтверждение запрашивается при создании и изменении:

* мерчантов;
* модулей автовыплат;
* защищённых подключений;
* секретных параметров;
* правил автоматизации;
* связанных настроек приёма и отправки средств.
  {% endstep %}

{% step %}

### Платёжные реквизиты

Подтверждение запрашивается при:

* создании реквизитов;
* изменении реквизитов;
* архивировании;
* восстановлении из архива;
* выдаче реквизитов;
* замене ранее выданных реквизитов;
* других защищённых действиях с платёжными данными.
  {% endstep %}

{% step %}

### Настройки безопасности

Подтверждение запрашивается при изменении защищённых системных настроек панели управления.

После включения этой категории изменение самой политики подтверждений также может потребовать согласования другими администраторами.
{% endstep %}

{% step %}

### Экспорт клиентских данных

Подтверждение запрашивается при:

* экспорте данных заявок;
* выгрузке информации о заявках пользователя.

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

***

## Как проходит подтверждение критичного действия

1. Администратор выполняет защищённое действие.
2. Система останавливает выполнение операции.
3. Создаётся отдельный запрос подтверждения.
4. Другим администраторам отправляются индивидуальные коды или ссылки.
5. В окне запроса отображаются его ID, список администраторов и текущий прогресс.
6. Подтверждающие администраторы передают коды инициатору или подтверждают действие доступным способом.
7. После получения необходимого количества подтверждений система повторяет исходное действие.
8. Запрос помечается использованным и больше не может применяться повторно.

Срок действия запроса составляет 15 минут.

Подтверждение связано:

* с администратором, который начал операцию;
* с текущим входом этого администратора;
* с конкретным действием;
* с отправленными данными.

Если после создания запроса изменить данные формы, старое подтверждение не подойдёт. Для изменённой операции потребуется создать новый запрос.

{% hint style="info" %}

### Пример

Администратор изменяет платёжные реквизиты и нажимает кнопку сохранения.

Система создаёт запрос подтверждения для этих конкретных данных. После этого администратор меняет номер счёта в форме.

Ранее полученные подтверждения нельзя использовать для сохранения нового номера счёта. Система потребует создать другой запрос.

Это защищает операцию от изменения данных после её согласования.
{% endhint %}

## Повторная отправка кода

Для ожидающего подтверждения можно запросить новый код.

Повторная отправка доступна для:

* E-mail;
* Telegram.

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

Для Google Authenticator повторная отправка не используется. Администратор должен открыть приложение и ввести текущий код.

***

## Необходимые права доступа

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

<table><thead><tr><th width="333.05078125">Право</th><th>Для чего используется</th></tr></thead><tbody><tr><td>«Защита мерчантов, выплат и реквизитов»</td><td>Позволяет настраивать коды зон, время доступа, второе подтверждение и IP-ограничения</td></tr><tr><td>«Подтверждение настроек защищённых операций»</td><td>Позволяет получать и подтверждать запросы на включение, изменение или отключение защиты</td></tr><tr><td>«Подтверждение несколькими администраторами»</td><td>Позволяет настраивать согласование критичных действий</td></tr><tr><td>«Подтверждение критичных действий»</td><td>Позволяет подтверждать операции, выполняемые другими администраторами</td></tr></tbody></table>

Права назначаются через группы пользователей.

Не выдавайте права управления защищёнными операциями обычным операторам, если они не участвуют в настройке безопасности или подтверждении критичных действий.

## Как проверить работу защиты

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

{% stepper %}
{% step %}

### Проверка кода защищённой зоны

1. Откройте раздел, относящийся к защищённой зоне.
2. Выполните некритичное изменение.
3. Убедитесь, что система запросила личное подтверждение, если оно включено.
4. Введите код защищённой зоны.
5. Проверьте выполнение исходного действия.
6. Убедитесь, что появился активный временный доступ.
7. Выполните ещё одно действие в той же зоне.
8. Проверьте, что до окончания установленного времени код повторно не запрашивается.

После проверки нажмите **«Закрыть доступ»** и убедитесь, что при следующей операции система снова запрашивает подтверждение.
{% endstep %}

{% step %}

### Проверка подтверждения другими администраторами

1. Выберите некритичное действие из защищаемой категории.
2. Выполните действие от имени администратора-инициатора.
3. Убедитесь, что система создала запрос подтверждения.
4. Проверьте получение кодов другими администраторами.
5. Соберите необходимое количество подтверждений.
6. Убедитесь, что исходная операция была выполнена.
7. Проверьте, что использованный запрос нельзя применить повторно.
   {% endstep %}
   {% endstepper %}

***

## Частые ошибки

<details>

<summary>«Защищённые операции» не отображается</summary>

У текущего администратора отсутствуют права управления защищёнными операциями или подтверждением несколькими администраторами.

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

</details>

<details>

<summary>Не удаётся запросить включение или изменение защиты</summary>

Проверьте:

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

Заблокированные и деактивированные пользователи не могут участвовать в подтверждении.

</details>

<details>

<summary>Код не приходит на E-mail</summary>

Проверьте:

* настройки отправки почты;
* правильность E-mail администратора;
* работу очередей;
* отправку других уведомлений;
* папку со спамом.

Если почта не работает, администратор не сможет подтвердить запрос этим способом.

</details>

<details>

<summary>Код не приходит в Telegram</summary>

Проверьте:

* подключён ли Telegram-бот безопасности;
* подтверждён ли Telegram-аккаунт администратора;
* доступен ли бот;
* правильно ли настроен способ подтверждения в карточке администратора.

</details>

<details>

<summary>Для Google Authenticator нет кнопки повторной отправки</summary>

Это нормальное поведение.

Google Authenticator самостоятельно создаёт временные коды. Откройте приложение и введите код, который отображается в текущий момент.

</details>

<details>

<summary>Отображается ошибка о запрещённом IP</summary>

Текущий IP-адрес отсутствует в списке разрешённых адресов выбранной зоны.

Проверьте внешний IP и подключитесь с разрешённого адреса. Если список настроен неправильно, запросите изменение IP-ограничений у администратора с необходимыми правами.

</details>

<details>

<summary>Система постоянно запрашивает код</summary>

Возможные причины:

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

Проверьте активные доступы и время их окончания.

</details>

<details>

<summary>Запрос подтверждения истёк</summary>

Создайте новый запрос.

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

Для изменения настроек срок составляет 30 минут, а для подтверждения критичного действия — 15 минут.

</details>

<details>

<summary>Критичное действие не выполняется</summary>

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

Если необходимое количество уже собрано, нажмите **«Обновить»** или **«Повторить действие»**, если операция не продолжилась автоматически.

Также убедитесь, что после создания запроса данные формы не изменялись.

</details>

<details>

<summary>Недостаточно подтверждающих администраторов</summary>

Выдайте другим активным администраторам право **«Подтверждение критичных действий»** или уменьшите установленное количество обязательных подтверждений.

Инициатор операции не учитывается в необходимом количестве.

</details>

<details>

<summary>После запроса отключения код продолжает запрашиваться</summary>

Запрос на отключение ещё не подтверждили все обязательные администраторы.

До завершения процедуры продолжают действовать прежние настройки защиты.

</details>

***

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

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

* использовать разные коды для мерчантов и платёжных реквизитов;
* устанавливать время временного доступа от 10 до 30 минут;
* включить личное подтверждение администратора;
* использовать Google 2FA или Telegram-бот безопасности;
* применять IP-ограничение только при наличии постоянных и заранее проверенных адресов;
* иметь не менее двух отдельных администраторов;
* включить подтверждение критичных действий для мерчантов, автовыплат и платёжных реквизитов;
* начать с одного подтверждения другого администратора;
* проверить защиту на некритичном изменении;
* не передавать рабочие коды в общих чатах;
* не хранить коды вместе с паролями от панели управления;
* регулярно проверять список администраторов с правами подтверждения.

**Важно.** Настраивайте защищённые операции только после проверки способов получения кодов у всех участвующих администраторов.

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

Если восстановить доступ через панель управления невозможно, обратитесь к владельцу сервера или в техническую поддержку iEXExchanger. Не отключайте защиту прямым изменением базы данных.

## Коротко

Защищённые операции добавляют отдельную проверку для мерчантов, автовыплат, платёжных реквизитов, настроек безопасности и экспорта данных.

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

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

Перед включением защиты проверьте права администраторов, способы получения кодов и список разрешённых IP-адресов.


# Блокировка входа при атаке на пароль

Функция «Блокировать вход при атаке на пароль» защищает административные аккаунты от подбора паролей и подозрительных изменений учётных данных.

Если система обнаружит несколько неудачных попыток входа или рискованное действие с паролем, административный доступ пользователя будет заблокирован. Для продолжения работы потребуется ввести правильный пароль и подтвердить вход кодом из письма.

Блокируется только доступ к административной панели. Клиентский аккаунт пользователя при этом может продолжать работать.

### Где находится настройка

В панели управления откройте: **«Настройки» — «Общие настройки»**

Затем перейдите в раздел: **«Основное» — «Безопасность»**

Откройте вкладку **«Общее»**.

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

Найдите параметры:

* «Блокировать вход при атаке на пароль»;
* «Попыток до блокировки входа»;
* «Окно подсчёта попыток, в минутах».

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

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

**«Защита паролей админки»**

### Для чего нужна функция

Защита применяется к пользователям, которым предоставлен доступ в административную панель.

Она помогает защититься от:

* автоматического подбора пароля;
* повторяющихся попыток входа с неправильным паролем;
* продолжения подбора с другого IP-адреса;
* подозрительного изменения пароля;
* компрометации административного аккаунта;
* несанкционированного восстановления пароля;
* использования нового пароля без подтверждения владельца.

Попытки учитываются для конкретной административной учётной записи. Смена IP-адреса, браузера, VPN или устройства не сбрасывает накопленный счётчик.

***

## Когда блокируется административный доступ

Система может заблокировать вход в следующих случаях:

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

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

## Параметры защиты

{% stepper %}
{% step %}

### Блокировать вход при атаке на пароль

Это основной переключатель функции.

Если параметр включён, система контролирует попытки ввода пароля и блокирует административный доступ при достижении установленного лимита.

Если параметр выключен, специальная блокировка административной учётной записи не применяется. Стандартное ограничение частоты попыток входа при этом может продолжать работать отдельно.
{% endstep %}

{% step %}

### Попыток до блокировки входа

Параметр определяет, сколько неверных попыток разрешено до блокировки административного доступа.

Допустимые значения:

| Значение     | Количество попыток |
| ------------ | -----------------: |
| Минимальное  |                  2 |
| Стандартное  |                  5 |
| Максимальное |                 20 |

Чем меньше значение, тем строже защита. Однако слишком маленький лимит повышает вероятность блокировки из-за обычной ошибки администратора.

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

* главный администратор — 3 попытки;
* остальные администраторы — 5 попыток.

Не устанавливайте большой лимит без необходимости, поскольку это снижает эффективность защиты от подбора пароля.
{% endstep %}

{% step %}

### Окно подсчёта попыток, в минутах

Параметр определяет период, в течение которого система объединяет неправильные попытки ввода пароля.

Допустимые значения:

| Значение     |      Время |
| ------------ | ---------: |
| Минимальное  |   1 минута |
| Стандартное  |   15 минут |
| Максимальное | 1440 минут |

Например, настроено:

```
Попыток до блокировки: 5
Окно подсчёта: 15 минут
```

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

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

Успешный ввод правильного пароля также очищает накопленный счётчик, если блокировка ещё не установлена.
{% endstep %}
{% endstepper %}

## Окно подсчёта и время блокировки

Параметр «Окно подсчёта попыток» не определяет продолжительность блокировки.

Он устанавливает только период, за который система считает неправильные попытки.

Если административный доступ уже заблокирован, ожидание 15, 30 или 60 минут не снимет блокировку автоматически.

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

* войти с правильным паролем и подтвердить код из письма;
* либо выполнить аварийную разблокировку на сервере.

## Как включить защиту

{% stepper %}
{% step %}

### Проверьте E-mail администратора

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

* в аккаунте указан правильный E-mail;
* почта принадлежит владельцу аккаунта;
* владелец имеет к ней доступ;
* для почты включена двухфакторная авторизация.
  {% endstep %}

{% step %}

### Проверьте отправку писем

{% content-ref url="/pages/8o153GvnDX1mGEprhzbN" %}
[Очереди и письма](/guide/uvedomleniya/ocheredi-i-pisma)
{% endcontent-ref %}

{% content-ref url="/pages/OkKDfMApGsB2m3bvCsHg" %}
[Уведомление по E-mail](/guide/uvedomleniya/uvedomlenie-po-e-mail)
{% endcontent-ref %}

Перед включением убедитесь, что:

* SMTP настроен;
* почтовые уведомления отправляются;
* письма доставляются без задержек;
* письма не попадают в спам;
* очереди Laravel работают.
  {% endstep %}

{% step %}

### Подготовьте аварийный доступ

У владельца проекта или доверенного технического специалиста должен быть доступ к серверу на случай, если почта станет недоступна.
{% endstep %}

{% step %}

### Включите функцию

Откройте вкладку «Общее» в настройках безопасности и включите:

**«Блокировать вход при атаке на пароль»**
{% endstep %}

{% step %}

### Установите лимиты

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

```
Попыток до блокировки входа: 5
Окно подсчёта попыток: 15 минут
```

Для главного администратора можно использовать более строгий лимит:

```
Попыток до блокировки входа: 3
Окно подсчёта попыток: 15 минут
```

{% endstep %}

{% step %}

### Сохраните настройки

Нажмите **«Сохранить»**.

После сохранения защита начнёт учитывать попытки входа административных пользователей.
{% endstep %}
{% endstepper %}

***

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

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

| Параметр                             | Значение |
| ------------------------------------ | -------: |
| Блокировать вход при атаке на пароль | Включено |
| Попыток до блокировки входа          |        5 |
| Окно подсчёта попыток                | 15 минут |

Для главного администратора можно установить три попытки за 15 минут.

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

## Как происходит блокировка

После достижения установленного лимита система:

1. блокирует административный доступ пользователя;
2. запрещает дальнейшее использование административной сессии;
3. сохраняет блокировку до подтверждения владельца;
4. при следующем правильном входе запрашивает код из письма.

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

Смена IP, браузера или устройства не снимает блокировку.

## Как восстановить доступ через E-mail

1. Откройте постоянный адрес административной панели.
2. Введите правильный E-mail и пароль администратора.
3. Система определит, что административный доступ заблокирован.
4. На E-mail пользователя будет отправлен код подтверждения.
5. Введите полученный код в открывшемся окне.
6. После успешной проверки блокировка будет снята.
7. Административный вход продолжится.

Код необходимо вводить:

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

Если запросить новый код, предыдущий может стать недействительным. Используйте последнее полученное письмо.

## Блокировка после изменения пароля

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

Это происходит, если:

* администратор изменил пароль самостоятельно;
* главный администратор изменил пароль сотруднику;
* пароль восстановлен через E-mail.

Для продолжения работы необходимо:

1. открыть постоянный адрес панели;
2. войти с новым паролем;
3. получить код на E-mail владельца аккаунта;
4. подтвердить новый вход.

Такой порядок защищает аккаунт, если пароль был изменён без ведома владельца.

## Как отключить защиту

Отключение функции является защищённым действием и требует подтверждения через E-mail.

1. Откройте вкладку «Общее» в настройках безопасности.
2. Отключите параметр **«Блокировать вход при атаке на пароль»**.
3. Система отправит шестизначный код на E-mail текущего администратора.
4. В окне подтверждения будет показан частично скрытый адрес получателя.
5. Введите полученный код.
6. Подтвердите отключение.

Простого изменения переключателя и обычного сохранения недостаточно.

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

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

Для отключения также требуется право: **«Защита паролей админки»**

## Аварийная разблокировка на сервере

Если доступ к почте потерян или письма временно не отправляются, владелец сервера либо доверенный технический специалист может снять блокировку через Backend.

Перед выполнением команды перейдите в директорию Backend, где находится файл `artisan`.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

### Разблокировка по E-mail

```bash
php artisan admin:password-guard-unlock --email=admin@example.com
```

### Разблокировка по ID пользователя

```bash
php artisan admin:password-guard-unlock --id=1
```

Команда:

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

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

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

## Отличие от стандартного ограничения входа

В iEXExchanger используются два связанных, но разных механизма.

| Механизм                                | Что учитывается                                     | Результат                             |
| --------------------------------------- | --------------------------------------------------- | ------------------------------------- |
| Максимальное количество неверных входов | Частые запросы на вход, преимущественно с одного IP | Временное ограничение новых попыток   |
| Блокировка входа при атаке на пароль    | Попытки для конкретного административного аккаунта  | Блокировка до подтверждения владельца |

Стандартное ограничение помогает остановить большое количество запросов с одного адреса.

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

* меняет IP-адрес;
* использует VPN;
* меняет устройство;
* распределяет попытки между несколькими адресами.

Рекомендуется включить оба механизма.

## Как проверить работу

Проверку рекомендуется выполнять на отдельном тестовом административном аккаунте.

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

1. Создайте или выберите тестового администратора.
2. Убедитесь, что у него указан доступный E-mail.
3. Проверьте доставку обычного письма.
4. Установите подходящий лимит попыток.
5. Выйдите из административной панели.
6. Несколько раз введите неправильный пароль до достижения лимита.
7. После блокировки введите правильный пароль.
8. Проверьте получение кода.
9. Введите код в том же браузере.
10. Убедитесь, что административный доступ восстановлен.
11. Проверьте запись события в журнале.

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

## Частые ошибки

<details>

<summary>Правильный пароль не открывает панель</summary>

Если защитная блокировка уже установлена, одного правильного пароля недостаточно.

Получите код на E-mail и подтвердите вход. Ожидание окончания окна подсчёта не снимает блокировку.

</details>

<details>

<summary>Письмо с кодом не приходит</summary>

Проверьте:

* правильность E-mail администратора;
* папки «Спам», «Нежелательные» и «Рассылки»;
* настройки SMTP;
* адрес отправителя;
* очередь писем;
* журнал уведомлений;
* системные журналы ошибок.

Не создавайте большое количество повторных запросов. Используйте последний полученный код.

Если отправку писем быстро восстановить невозможно, выполните аварийную разблокировку на сервере.

</details>

<details>

<summary>Код не принимается</summary>

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

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

Если был создан новый запрос, старый код может стать недействительным.

</details>

<details>

<summary>Аккаунт заблокировался после смены пароля</summary>

Это нормальное поведение защиты.

Войдите с новым паролем и подтвердите код, отправленный владельцу аккаунта.

</details>

<details>

<summary>Настройка не отображается</summary>

Проверьте наличие права: **«Защита паролей админки»**

Без этого разрешения администратор не может управлять параметрами защиты.

</details>

<details>

<summary>Ожидание не снимает блокировку</summary>

Окно подсчёта определяет только период учёта неправильных попыток.

Установленная блокировка сохраняется до подтверждения через E-mail или серверной разблокировки.

</details>

## Что делать при неожиданной блокировке

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

После восстановления входа:

1. Смените пароль административного аккаунта.
2. Смените пароль связанной почты.
3. Убедитесь, что для почты включена двухфакторная авторизация.
4. Проверьте Google Authenticator администратора.
5. Просмотрите активные административные сессии.
6. Завершите неизвестные сессии.
7. Отзовите неизвестные доверенные устройства.
8. Закройте неизвестные персональные ссылки.
9. Проверьте журнал событий.
10. Проверьте группы и права пользователей.
11. Проверьте изменения мерчантов и автовыплат.
12. Проверьте платёжные реквизиты.
13. Проверьте выполненные и ожидающие выплаты.
14. При необходимости замените API-ключи.

Не снимайте неожиданную блокировку и не продолжайте работу без проверки её причины.

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

Для максимальной защиты административных аккаунтов:

* оставьте только одного главного администратора;
* не используйте главный аккаунт для ежедневной обработки заявок;
* создайте отдельные аккаунты для сотрудников;
* не передавайте пароль главного администратора;
* используйте уникальный пароль длиной не менее 16 символов;
* подключите Google Authenticator;
* защитите E-mail двухфакторной авторизацией;
* включите подтверждение административного входа;
* настройте доверенные устройства;
* включите персональную ссылку админки;
* включите контроль изменения IP;
* регулярно проверяйте журнал событий;
* храните серверный доступ только у владельца и доверенного технического специалиста.

## Коротко

Функция «Блокировать вход при атаке на пароль» контролирует неправильные попытки для конкретного административного аккаунта.

После достижения лимита доступ блокируется до подтверждения владельца через E-mail. Смена IP, браузера или устройства не сбрасывает блокировку.

Окно подсчёта определяет период учёта попыток, но не продолжительность блокировки.

Перед включением обязательно настройте SMTP, проверьте E-mail главного администратора и сохраните возможность аварийной разблокировки через сервер.


# Защита адреса административной панели

В iEXExchanger предусмотрено два связанных способа защиты адреса панели управления:

* **«Постоянный адрес входа в админку»** — общий адрес, с которого администраторы начинают авторизацию;
* **«Персональная ссылка админки после входа»** — автоматически создаваемый рабочий адрес для конкретного администратора и текущего браузера.

Эти функции решают разные задачи. Постоянный адрес скрывает стандартную страницу входа, а персональная ссылка защищает доступ к рабочей части панели после авторизации.

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

### Где находятся настройки

В панели управления откройте: **«Настройки» — «Общие настройки»**

Затем перейдите в раздел: **«Основное» — «Безопасность»**

Откройте вкладку **«Общее»**.

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

При использовании стандартного адреса прямой URL страницы выглядит так:

```
https://app.ваш_домен/iexadmin/settings/generals/security
```

Если постоянный адрес уже изменён, вместо `/iexadmin` используется установленное значение.

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

### Для чего нужна защита адреса

Через настройки безопасности можно:

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

### Как работают две функции

| Настройка                     | До авторизации             | После авторизации        |
| ----------------------------- | -------------------------- | ------------------------ |
| Только постоянный адрес       | Собственный общий URL      | Работа через этот же URL |
| Только персональная ссылка    | Адрес из `APP_ADMIN_PATH`  | Индивидуальный URL       |
| Включены обе функции          | Собственный постоянный URL | Индивидуальный URL       |
| Персональная ссылка отключена | Постоянный URL             | Постоянный URL           |

Если включены обе функции, вход выполняется следующим образом:

1. Администратор открывает скрытый постоянный адрес.
2. Вводит логин и пароль.
3. Проходит Google 2FA и другие включённые проверки.
4. Получает письмо с персональной ссылкой.
5. Открывает ссылку в том же браузере.
6. Работает в панели через индивидуальный адрес.

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

### Что эти функции не заменяют

Защита адреса административной панели не заменяет:

* надёжный пароль;
* Google Authenticator;
* ограничение входа по IP;
* контроль изменения IP-адреса;
* подтверждение нового устройства;
* защищённые операции;
* правильную настройку групп и прав доступа;
* контроль активных административных сессий.

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

***

## Постоянный адрес входа в админку

<figure><img src="/files/56f05tSBS5rrFSdtYvJ8" alt=""><figcaption></figcaption></figure>

### Для чего нужен постоянный адрес

Постоянный адрес — это общий URL страницы авторизации для всех администраторов.

Стандартный адрес может выглядеть так:

```
https://app.example.com/iexadmin
```

Его можно заменить на собственный:

```
https://app.example.com/control-7f29m4x8
```

После изменения предыдущий адрес перестаёт открывать административную панель. Система также не перенаправляет посетителя со старого адреса на новый.

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

```
app.ваш_домен
```

Адрес основного клиентского сайта не изменяется.

### Требования к адресу

В поле указывается один URL-сегмент без домена и начального символа `/`.

Адрес должен соответствовать следующим требованиям:

* длина — от 3 до 64 символов;
* разрешены строчные латинские буквы;
* разрешены цифры;
* разрешены дефисы внутри адреса;
* первый символ должен быть буквой или цифрой;
* последний символ должен быть буквой или цифрой.

<mark style="color:$success;">**Допустимые варианты:**</mark>

```
secure-admin
control-7f29m4x8
manager-area-93
```

<mark style="color:red;">**Недопустимые варианты:**</mark>

```
ab
admin_panel
панель
my/admin
-admin
admin-
```

Заглавные буквы автоматически преобразуются в строчные.

<mark style="color:red;">**Нельзя использовать системные адреса:**</mark>

```
api
frontend
frontend-api
storage
static
horizon
pulse
oauth
webhooks
callbacks
```

Другие зарезервированные системой значения также не будут приняты.

### Как выбрать постоянный адрес

Не используйте очевидные варианты:

```
admin
panel
backend
administrator
название-проекта
```

Рекомендуется выбрать непредсказуемую комбинацию длиной не менее 12–16 символов:

```
control-7f29m4x8
```

Постоянный адрес не является паролем, но его не следует публиковать:

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

### Как изменить постоянный адрес

1. Откройте вкладку **«Общее»** в настройках безопасности.
2. Найдите поле **«Постоянный адрес входа в админку»**.
3. Введите только завершающую часть адреса без домена и начального `/`.
4. Проверьте предварительный URL под полем.
5. Нажмите **«Сохранить»**.
6. Дождитесь автоматического перехода на новый адрес.
7. Проверьте новый URL в другом браузере.
8. Обновите закладки доверенных администраторов.

Например, в поле указано:

```
control-7f29m4x8
```

Итоговый адрес:

```
https://app.example.com/control-7f29m4x8
```

Система автоматически:

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

Изменять конфигурацию Nginx вручную не требуется.

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

### Что произойдёт со старым адресом

После сохранения новый постоянный адрес полностью заменяет предыдущий.

Старый адрес:

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

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

## Настройка через APP\_ADMIN\_PATH

`APP_ADMIN_PATH` — серверный вариант настройки постоянного адреса. Параметр находится в файле `.env` Backend-проекта.

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

Пример:

```env
APP_ADMIN_PATH=iexadmin
```

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

{% stepper %}
{% step %}

### Приоритет адресов

Система выбирает постоянный адрес в следующем порядке:

1. значение из поля **«Постоянный адрес входа в админку»** в панели управления;
2. значение `APP_ADMIN_PATH`, если поле в панели пустое;
3. `/iexadmin`, если серверное значение отсутствует или не соответствует требованиям.

`APP_ADMIN_PATH` не создаёт второй параллельный адрес.

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

```
control-7f29m4x8
```

то адрес из `.env` и стандартный `/iexadmin` не будут использоваться для входа.

Чтобы снова использовать значение `APP_ADMIN_PATH`, очистите поле **«Постоянный адрес входа в админку»** и сохраните настройки.
{% endstep %}

{% step %}

### Как изменить APP\_ADMIN\_PATH

Откройте файл `.env` Backend-проекта и укажите адрес без начального `/`:

```env
APP_ADMIN_PATH=server-control-82
```

Если поле постоянного адреса в панели управления заполнено, оно продолжит иметь приоритет. Для применения `APP_ADMIN_PATH` сначала очистите поле в панели или выполните аварийный сброс.
{% endstep %}
{% endstepper %}

***

## Персональная ссылка админки после входа

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

{% stepper %}
{% step %}

### Для чего нужна персональная ссылка

Персональная ссылка создаёт отдельный рабочий URL для каждого администратора и каждой браузерной сессии.

Пример:

```
https://app.example.com/c/уникальный-идентификатор
```

Администратор не создаёт этот адрес вручную. Система генерирует его после успешного ввода пароля и прохождения включённых проверок безопасности.

Постоянный адрес остаётся точкой начала авторизации. После подтверждения рабочая часть панели становится доступна только через персональный URL.
{% endstep %}

{% step %}

### Что защищает персональная ссылка

После включения функции:

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

Если ссылка открыта в другом браузере или на другом устройстве, система показывает обычную ошибку `404` без раскрытия причины отказа.
{% endstep %}
{% endstepper %}

### Перед включением

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

* у всех администраторов указаны действующие E-mail;
* SMTP настроен и проверен;
* почтовые уведомления включены;
* тестовые письма успешно доставляются;
* администраторы имеют доступ к своей почте;
* письма не попадают в папку «Спам»;
* у владельца проекта есть резервный доступ к серверу.

{% content-ref url="/pages/OkKDfMApGsB2m3bvCsHg" %}
[Уведомление по E-mail](/guide/uvedomleniya/uvedomlenie-po-e-mail)
{% endcontent-ref %}

Если почтовая доставка не работает и серверный резервный способ отключён, система не позволит включить персональные ссылки.

{% hint style="info" %}
**Важно.** Не включайте функцию до проверки E-mail каждого администратора. Без доступа к почте пользователь не сможет открыть рабочую панель после авторизации.
{% endhint %}

### Как включить персональные ссылки

1. Откройте вкладку **«Общее»** в настройках безопасности.
2. Включите параметр **«Персональная ссылка админки после входа»**.
3. Укажите срок действия ссылки из письма.
4. Нажмите **«Сохранить»**.
5. Выйдите из административной панели.
6. Выполните новый вход.
7. Проверьте получение письма и открытие персонального адреса.

После включения текущему администратору может потребоваться повторная авторизация. Персональная ссылка создаётся только после полноценного прохождения входа.

### Срок действия ссылки из письма

Параметр **«Сколько действует ссылка из письма, в минутах»** определяет, сколько времени даётся администратору на первое открытие письма.

Допустимые значения:

| Значение     |      Время |
| ------------ | ---------: |
| Минимальное  |   1 минута |
| Стандартное  |   15 минут |
| Максимальное | 1440 минут |

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

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

Например, установлено:

```
Срок действия ссылки: 15 минут
```

Порядок работы:

1. Администратор выполняет вход.
2. Система отправляет письмо.
3. Ссылку необходимо открыть в течение 15 минут.
4. После подтверждения персональный адрес продолжает работать до завершения административной сессии.

Работающая панель не закроется через 15 минут, если ссылка уже была подтверждена.

### Как происходит вход

1. Администратор открывает постоянный адрес.
2. Вводит E-mail и пароль.
3. Проходит Google Authenticator и другие включённые проверки.
4. Система создаёт персональную ссылку.
5. На экране появляется сообщение **«Проверьте почту»**.
6. На E-mail отправляется письмо с кнопкой входа.
7. Администратор открывает ссылку в том же браузере.
8. Система проверяет ссылку и браузерную сессию.
9. Открывается рабочая панель по персональному адресу.
10. Исходную вкладку ожидания можно закрыть.

Если вход выполнялся на компьютере, открытие письма на телефоне не подтвердит эту сессию.

### Почему нужен тот же браузер

Персональная ссылка связана одновременно с:

* конкретным администратором;
* текущей серверной сессией;
* браузером, в котором выполнялся вход;
* одноразовым подтверждающим элементом.

Ссылка не сработает, если открыть её:

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

Если авторизация выполнялась в Google Chrome на компьютере, письмо нужно открыть в том же экземпляре Google Chrome.

Для приватного режима требуется использовать то же приватное окно.

Если почтовое приложение открывает ссылки во встроенном браузере, выберите открытие в основном браузере, где выполнялся вход.

### Как хранится персональная ссылка

Полный персональный адрес и подтверждающий элемент не хранятся в базе данных в открытом виде.

Отдельно защищаются:

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

В панели управления полный адрес и подтверждающий элемент не отображаются.

Несмотря на это, персональную ссылку необходимо считать секретной информацией. Не пересылайте её другим людям и не сохраняйте в общедоступных местах.

### Когда персональный адрес перестаёт работать

Персональный адрес отзывается, если:

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

Истечение срока письма после успешного подтверждения не завершает активную сессию.

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

## Активные уникальные ссылки

Для просмотра подтверждённых входов найдите параметр **«Активные уникальные ссылки»** и нажмите **«Открыть список»**.

<figure><img src="/files/85YNfKb5SCMxGvnTyS16" alt=""><figcaption></figcaption></figure>

В списке отображаются:

* имя администратора;
* E-mail;
* дата создания;
* дата активации;
* последняя активность;
* IP-адрес;
* браузер или устройство;
* отметка текущей сессии.

Секретный адрес, идентификатор пути и подтверждающий элемент не показываются.

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

**«Уникальная ссылка админки»**

Право позволяет:

* просматривать подтверждённые входы;
* видеть администратора, IP-адрес и устройство;
* отзывать доступ для выбранной сессии.

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

### Как отозвать персональную ссылку

1. Откройте список активных ссылок.
2. Найдите нужного администратора или устройство.
3. Нажмите **«Закрыть»**.
4. Подтвердите действие.

После отзыва:

* персональный адрес немедленно перестаёт работать;
* открытая панель больше не может выполнять запросы;
* администратору потребуется заново пройти авторизацию;
* восстановить отозванный адрес невозможно.

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

Уже загруженная страница может остаться видимой в браузере, но действия внутри неё выполняться не будут. После обновления страницы система потребует новую авторизацию или покажет ошибку `404`.

Обычный выход из аккаунта также отзывает текущую персональную ссылку.

## Несколько устройств

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

Пример:

```
Рабочий компьютер — первая ссылка
Ноутбук — вторая ссылка
Телефон — третья ссылка
```

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

Если в системе включено ограничение одной активной административной сессии, новый вход может завершить предыдущую сессию и отозвать связанную с ней персональную ссылку.

## Работа с мультиавторизацией

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

1. ссылка предыдущего аккаунта отзывается;
2. для выбранного администратора создаётся новая ссылка;
3. письмо отправляется на E-mail нового аккаунта;
4. новый адрес необходимо подтвердить в том же браузере.

Один персональный URL не используется одновременно для нескольких административных аккаунтов.

## Серверное получение персональной ссылки

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

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Этот режим:

* не обходит пароль;
* не обходит Google 2FA;
* не отменяет привязку к браузеру;
* не создаёт новый вход;
* позволяет получить только уже созданную ожидающую ссылку.

### Как включить серверное получение

В файле `.env` Backend-проекта укажите:

```env
APP_ADMIN_SESSION_PATH_SERVER_FALLBACK_ENABLED=true
```

### Как получить ожидающую ссылку

Сначала администратор должен выполнить обычный вход и пройти настроенные проверки безопасности.

После появления экрана ожидания технический специалист может получить ссылку по E-mail:

```bash
php artisan admin:session-path-link --email=admin@example.com --latest
```

Или по ID пользователя:

```bash
php artisan admin:session-path-link --user-id=1 --latest
```

Команда не создаёт новую ссылку. Она выводит только уже созданную, неподтверждённую и неистёкшую ссылку текущего входа.

Полученный URL необходимо открыть в том же браузере, где вводились пароль и код Google 2FA.

Серверная копия хранится в зашифрованном виде в закрытой директории Backend. Она удаляется после:

* подтверждения;
* отзыва;
* окончания срока действия.

### Как отключить серверное получение

После восстановления почтовой доставки установите:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel)
{% endcontent-ref %}

```env
APP_ADMIN_SESSION_PATH_SERVER_FALLBACK_ENABLED=false
```

{% hint style="warning" %}
**Важно.** Серверное получение должен использовать только доверенный технический специалист с доступом к Backend. Не оставляйте этот режим включённым без необходимости.
{% endhint %}

## Как отключить персональные ссылки

1. Откройте вкладку **«Общее»** в настройках безопасности.
2. Отключите параметр **«Персональная ссылка админки после входа»**.
3. Нажмите **«Сохранить»**.
4. Дождитесь перехода на постоянный адрес.

После отключения:

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

## Как проверить защиту

После настройки проверьте оба механизма отдельно.

{% stepper %}
{% step %}

### Проверка постоянного адреса

1. Сохраните новый постоянный адрес.
2. Убедитесь, что система перенаправила текущую страницу.
3. Откройте новый адрес в другом браузере.
4. Проверьте отображение страницы авторизации.
5. Откройте старый адрес.
6. Убедитесь, что он больше не открывает панель и не перенаправляет на новый URL.
   {% endstep %}

{% step %}

### Проверка персональной ссылки

1. Выйдите из административной панели.
2. Откройте постоянный адрес.
3. Введите E-mail и пароль.
4. Пройдите Google 2FA, если он включён.
5. Убедитесь, что появился экран ожидания.
6. Проверьте получение письма.
7. Откройте ссылку в том же браузере.
8. Убедитесь, что панель открылась по персональному адресу.
9. Найдите текущий вход в списке активных ссылок.
10. Попробуйте открыть письмо в другом браузере.
11. Убедитесь, что система отклонила переход.
12. Отзовите тестовую ссылку и проверьте прекращение доступа.
    {% endstep %}
    {% endstepper %}

***

## Частые ошибки

<details>

<summary>Письмо не приходит</summary>

Проверьте:

* SMTP;
* E-mail администратора;
* почтовые уведомления;
* очередь отправки писем;
* журнал уведомлений;
* папки «Спам» и «Промоакции»;
* адрес отправителя;
* пароль почтового приложения.

Если включено серверное получение, технический специалист может получить ожидающую ссылку командой.

</details>

<details>

<summary>Персональная ссылка показывает ошибку 404</summary>

Возможные причины:

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

Закройте старые вкладки, вернитесь на постоянный адрес и выполните новый вход.

</details>

<details>

<summary>Старый постоянный адрес не работает</summary>

Это нормальное поведение.

Новый постоянный адрес полностью заменяет предыдущий URL и адрес из `APP_ADMIN_PATH`.

</details>

<details>

<summary>APP_ADMIN_PATH не применяется</summary>

Проверьте:

* очищено ли поле постоянного адреса в панели;
* изменён ли `.env` именно Backend-проекта;
* указано ли значение без начального `/`;
* выполнена ли очистка кеша;
* пересобраны ли кеши конфигурации и маршрутов.

</details>

<details>

<summary>Подтверждённый персональный адрес перестал работать</summary>

Возможные причины:

* административная сессия завершилась;
* ссылка была отозвана;
* выполнен выход;
* административный аккаунт переключён;
* удалены cookies;
* функция отключена;
* выполнен аварийный сброс.

Вернитесь на постоянный адрес и авторизуйтесь заново.

</details>

<details>

<summary>Вход зациклился на экране ожидания</summary>

Убедитесь, что ссылка открывается:

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

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

</details>

## Аварийный сброс

Если постоянный адрес забыт или персональные ссылки препятствуют входу, технический специалист может выполнить:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```bash
php artisan admin:security-reset --session-path
```

Команда:

* удаляет пользовательский постоянный адрес;
* возвращает вход к значению `APP_ADMIN_PATH`;
* отключает персональные ссылки;
* отзывает активные и ожидающие ссылки;
* удаляет закрытые серверные файлы подтверждений.

После выполнения откройте:

```
https://app.ваш_домен/значение_APP_ADMIN_PATH
```

Если в `.env` не задано допустимое значение `APP_ADMIN_PATH`, используется стандартный адрес:

```
https://app.ваш_домен/iexadmin
```

{% hint style="warning" %}

### **Важно.**

Аварийный сброс отключает часть настроенной защиты. После восстановления доступа заново установите постоянный адрес, включите персональные ссылки и проверьте активные административные сессии.
{% endhint %}

***

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

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

* использовать постоянный адрес длиной не менее 12–16 символов;
* избегать слов `admin`, `panel`, `backend` и названия проекта;
* включить персональные ссылки для всех администраторов;
* установить срок первого открытия 15 минут;
* подключить Google Authenticator;
* использовать отдельный E-mail для каждого администратора;
* регулярно проверять активные персональные ссылки;
* отзывать неизвестные устройства и сессии;
* не публиковать постоянный адрес;
* не пересылать персональные ссылки;
* хранить доступ к серверу и `APP_ADMIN_PATH` только у владельца;
* использовать серверное получение только как временный аварийный способ;
* не закрывать рабочую вкладку до проверки нового постоянного адреса;
* после аварийного сброса сразу восстановить настройки защиты.

## Коротко

Постоянный адрес заменяет стандартный URL входа для всех администраторов.

Персональная ссылка создаёт отдельный рабочий адрес для конкретного администратора, браузера и серверной сессии.

Наиболее защищённый сценарий — использовать собственный постоянный адрес, Google 2FA и персональные ссылки одновременно.

До включения проверьте отправку писем, E-mail всех администраторов и резервный доступ к Backend.


# Настройка Google Authenticator

Google Authenticator используется для двухфакторной защиты входа в административную панель. После активации пользователь сможет войти в систему только после подтверждения одноразовым кодом из приложения Google Authenticator.

Важно: Google Authenticator — это не вход через Google-аккаунт. Это дополнительный уровень защиты, который работает поверх обычного логина и пароля.

### Для чего нужен Google Authenticator

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

Это помогает защитить панель управления от:

* кражи пароля;
* подбора паролей;
* утечки учётных данных;
* несанкционированного доступа к системе.

Даже если злоумышленник узнает пароль, без кода из Google Authenticator войти в панель управления он не сможет.

***

### Где находятся настройки

Настройка состоит из двух частей:

<table><thead><tr><th width="327.6171875">Раздел</th><th>Назначение</th></tr></thead><tbody><tr><td>«Пользователи» — «Список пользователей»</td><td>Настройка Google Authenticator для конкретного пользователя</td></tr><tr><td>«Настройки» — «Безопасность» — «Общее»</td><td>Глобальное включение обязательной двухфакторной авторизации</td></tr></tbody></table>

***

### Кто может управлять Google 2FA

Для управления двухфакторной авторизацией пользователь должен иметь соответствующее право доступа.

Путь: **«Пользователи» — «Список групп пользователей»**

В настройках группы должно быть включено право:

**Разрешить управление Google Authentication**

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

Если право не выдано, пользователь не увидит действие Google 2FA в карточке пользователя.

***

## Шаг 1. Установите приложение Google Authenticator

Установите приложение на мобильное устройство:

<table><thead><tr><th width="195.3359375">Платформа</th><th>Где установить</th></tr></thead><tbody><tr><td>Android</td><td>Google Play</td></tr><tr><td>iPhone (iOS)</td><td>App Store</td></tr></tbody></table>

Найдите приложение: **Google Authenticator**

После установки откройте приложение.

***

## Шаг 2. Откройте настройки пользователя

Перейдите в раздел: **«Пользователи» — «Список пользователей»**

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

В правом верхнем углу нажмите: **Ещё → Google 2FA**

<figure><img src="/files/asIMoyOzL9lom4htxOLT" alt="" width="375"><figcaption></figcaption></figure>

Откроется окно настройки двухфакторной авторизации.

<figure><img src="/files/0k5PzOK9nqatmzIZVsha" alt="" width="563"><figcaption></figcaption></figure>

***

## Шаг 3. Добавьте аккаунт в приложение

Если Google Authenticator ещё не настроен, система покажет:

* QR-код;
* секретный ключ;
* поле для ввода кода подтверждения.

Пользователь может подключить аккаунт двумя способами.

{% stepper %}
{% step %}

#### Способ 1. Через QR-код

В приложении Google Authenticator:

1. Нажмите кнопку +
2. Выберите Сканировать QR-код
3. Наведите камеру телефона на QR-код из панели управления

После успешного сканирования аккаунт автоматически появится в приложении.
{% endstep %}

{% step %}

### Способ 2. Через секретный ключ

Если нет возможности отсканировать QR-код:

1. Нажмите кнопку +
2. Выберите Ввести ключ настройки
3. Введите секретный ключ, отображаемый в панели управления
4. Сохраните аккаунт
   {% endstep %}
   {% endstepper %}

***

## Шаг 4. Подтвердите активацию

После добавления аккаунта приложение начнёт генерировать одноразовые шестизначные коды.

Введите текущий код из приложения в поле: **Код авторизации**

Затем нажмите: **Активировать**

Если код введён правильно, система сохранит секретный ключ и активирует Google Authenticator для данного пользователя.

***

### Что происходит после активации

После успешной активации:

* QR-код больше не отображается;
* ключ считается подтверждённым;
* пользователь сможет использовать коды для входа;
* в окне управления появится возможность сбросить ключ.

***

## Шаг 5. Включите Google Authenticator глобально

После того как хотя бы один администратор успешно настроил Google Authenticator, откройте:

**«Настройки» — «Безопасность» — «Общее»**

<figure><img src="/files/rCjOfMLmb0Wyjvx3enjO" alt=""><figcaption></figcaption></figure>

Найдите параметр: **Двухфакторная авторизация через Google Authenticator**

Включите переключатель и нажмите: **Сохранить**

После сохранения система начнёт требовать код Google Authenticator при входе в административную панель.

***

## Как происходит вход после включения

После активации двухфакторной авторизации вход выполняется следующим образом:

1. Пользователь вводит Email и пароль.
2. Система запрашивает код подтверждения.
3. Пользователь открывает Google Authenticator.
4. Вводит текущий шестизначный код.
5. После успешной проверки получает доступ к панели управления.

***

## Сброс Google Authenticator

Если пользователь потерял телефон, удалил приложение или больше не может получать коды, администратор может сбросить ключ.

Откройте: **«Пользователи» — «Список пользователей»**

Откройте карточку пользователя.

Выберите: **Ещё → Google 2FA**

Нажмите: **Сбросить ключ**

После сброса старый ключ удаляется полностью.

Для повторного включения защиты потребуется заново:

* отсканировать QR-код;
* подтвердить код активации;
* сохранить новый ключ.

***

### Когда требуется сброс

Сброс рекомендуется выполнять если:

* пользователь потерял телефон;
* приложение Google Authenticator было удалено;
* устройство было заменено;
* коды перестали совпадать;
* требуется перенести 2FA на новое устройство;
* сотрудник больше не должен иметь доступ к системе.

***

## Рекомендуемый порядок настройки

Чтобы не потерять доступ к панели управления:

1. Настройте Google Authenticator для главного администратора.
2. Убедитесь, что коды работают корректно.
3. Настройте Google Authenticator для остальных администраторов.
4. Только после этого включайте глобальную настройку в разделе безопасности.

***

## Рекомендации по безопасности

* Не передавайте QR-код третьим лицам.
* Не отправляйте секретный ключ через мессенджеры.
* Сохраните секретный ключ до завершения настройки.
* Не включайте глобальную защиту, пока не настроен хотя бы один администратор.
* После увольнения сотрудника обязательно сбрасывайте его Google Authenticator.
* Используйте Google Authenticator совместно со сложным паролем и ограничением доступа по IP.

***

## Частые проблемы

<table><thead><tr><th width="307.76953125">Проблема</th><th>Решение</th></tr></thead><tbody><tr><td>Код не подходит</td><td>Проверьте время на телефоне и сервере</td></tr><tr><td>Потерян телефон</td><td>Сбросьте ключ через карточку пользователя</td></tr><tr><td>Нет кнопки Google 2FA</td><td>Проверьте права группы пользователей</td></tr><tr><td>После включения невозможно войти</td><td>Настройте Google 2FA хотя бы для одного администратора до глобального включения</td></tr><tr><td>Коды перестали совпадать</td><td>Выполните сброс ключа и настройте заново</td></tr></tbody></table>

***

## Кратко

1. Установите Google Authenticator.
2. Откройте **«Пользователи» — «Список пользователей».**
3. Выберите пользователя.
4. Нажмите **«Ещё» — «Google 2FA».**
5. Отсканируйте QR-код.
6. Введите код подтверждения.
7. Активируйте Google Authenticator.
8. Откройте **«Настройки» — «Безопасность» — «Общее».**
9. Включите двухфакторную авторизацию.
10. Сохраните настройки.

После этого вход в административную панель будет защищён дополнительным одноразовым кодом из приложения Google Authenticator.


# Управление доступом пользователя

Вкладка **«Доступ и безопасность»** объединяет настройки входа в аккаунт, ограничения по IP-адресам, восстановление пароля, защиту административного входа, Google 2FA, Telegram-подтверждение, доверенные устройства и активные сессии.

Эти параметры управляют доступом к уже существующей учётной записи. Они не назначают пользователю административные права. Доступ в панель управления выдаётся отдельно через группы пользователей.

## Где находятся настройки

В панели управления откройте: **«Пользователи» — «Список пользователей»**

Найдите пользователя по ID, имени, E-mail или другим доступным данным и откройте его редактирование.

В верхней части карточки перейдите во вкладку **«Доступ и безопасность»**.

<figure><img src="/files/cExE3X1SwqgZUa6AhtoK" alt=""><figcaption></figcaption></figure>

Перед изменением параметров проверьте имя, E-mail и ID пользователя. Настройки доступа другого аккаунта могут примениться сразу, поэтому важно убедиться, что открыта правильная карточка.

## Необходимые права доступа

Права назначаются для группы пользователей.

В панели управления откройте: **«Пользователи» — «Список групп пользователей»**

<figure><img src="/files/4RFw6MoL435opYd9QLli" alt=""><figcaption></figcaption></figure>

Найдите группу, к которой относится сотрудник, и откройте её редактирование.

Для работы с карточками пользователей требуется право **«Пользователи»**.

Дополнительные разрешения выдавайте только для тех действий, которые сотрудник действительно должен выполнять:

* **«Настройки безопасности пользователей»** — изменение персональных IP-адресов, подтверждения входа, восстановления пароля, доверенных устройств и способа получения кодов;
* **«API админки»** — просмотр и изменение поля **«Доступ к API»**;
* **«Смена паролей пользователей»** — просмотр поля **«Новый пароль»** и установка нового пароля;
* **«Google 2FA пользователей»** — подключение и сброс Google 2FA;
* **«Закрытие сессий пользователей»** — использование кнопки **«Закрыть все сессии»**;
* **«Telegram-бот безопасности»** — управление глобальным ботом безопасности и отключение Telegram-привязок административных аккаунтов.

После изменения прав сохраните группу пользователей.

{% hint style="warning" %}
Права **«Настройки безопасности пользователей»**, **«Смена паролей пользователей»**, **«Google 2FA пользователей»**, **«Закрытие сессий пользователей»** и **«Telegram-бот безопасности»** относятся к критичным.

Не выдавайте их обычным операторам.
{% endhint %}

Для создания собственной Telegram-привязки отдельное право управления ботом не требуется. Администратор должен войти под своей учётной записью и выполнить привязку самостоятельно.

## Как сохраняются изменения

В карточке используются разные способы применения настроек.

{% stepper %}
{% step %}

### Изменения через кнопку «Сохранить»

Общей кнопкой **«Сохранить»** применяются:

* **«Статус аккаунта»**;
* **«Статус личности»**;
* **«Email-уведомления»**;
* **«Доступ к API»**;
* **«Разрешенные IP адреса»**;
* **«Новый пароль»**.

Кнопка применяется ко всей карточке пользователя. Если на вкладке **«Основное»** остались несохранённые изменения, они также могут быть отправлены вместе с параметрами доступа.

{% hint style="warning" %}
Перед нажатием **«Сохранить»** проверьте значения на обеих верхних вкладках.

Переключение между ними не удаляет введённые данные.
{% endhint %}
{% endstep %}

{% step %}

### Настройки, которые применяются сразу

Отдельным защищённым действием изменяются:

* **«Подтверждение входа в админку»**;
* **«Восстановление пароля»**;
* **«Доверенные устройства админки»**;
* **«Способ подтверждения кодов безопасности»**.

После изменения система применяет настройку сразу либо открывает окно для ввода шестизначного кода.

Нажимать общую кнопку **«Сохранить»** для таких параметров не требуется.

Если закрыть окно подтверждения, изменение не будет применено.
{% endstep %}

{% step %}

### Самостоятельные действия

Отдельно выполняются:

* подключение и сброс Google 2FA;
* создание и удаление Telegram-привязки;
* отзыв доверенного устройства;
* закрытие активных сессий;
* блокировка и разблокировка пользователя.
  {% endstep %}

{% step %}

### Обновление данных карточки

Кнопка **«Обновить»** с круговой стрелкой повторно загружает фактически сохранённые данные пользователя.

Она удаляет несохранённые значения, но не отменяет уже применённые защищённые действия.

Не нажимайте **«Обновить»**, пока обычные поля не сохранены.
{% endstep %}
{% endstepper %}

## Статус аккаунта

Параметр **«Статус аккаунта»** определяет, может ли пользователь выполнять новый вход.

Если статус включён, пользователь сможет войти при одновременном выполнении остальных условий: правильном пароле, отсутствии блокировки, разрешённом IP-адресе и прохождении обязательных проверок безопасности.

Для входа в панель управления дополнительно требуется административная группа с правом входа.

Включённый **«Статус аккаунта»** сам по себе не предоставляет административный доступ.

Если статус отключён, пользователю запрещается новый вход:

* на клиентский сайт;
* в панель управления;
* через внешний сервис авторизации;
* через подключённые административные аккаунты.

Отключение не удаляет пользователя, заявки, баланс, документы, историю верификации, партнёрские начисления, группы, API-токены и доверенные устройства.

### Изменение статуса аккаунта

Переключите **«Статус аккаунта»** и нажмите **«Сохранить»**.

После сохранения нажмите **«Обновить»** и проверьте состояние.

Если доступ отключается полностью, дополнительно закройте действующие сессии и отключите **«Доступ к API»**.

{% hint style="danger" %}
**«Статус аккаунта»** и **«Доступ к API»** работают независимо.

Отключение аккаунта не следует считать автоматическим отзывом API-доступа.
{% endhint %}

Административная сессия отключённого пользователя будет отклонена при следующей проверке доступа. Для немедленного завершения используйте **«Закрыть все сессии»**.

Не отключайте собственный аккаунт, если нет другого проверенного главного администратора.

### Когда не нужно отключать аккаунт

Если необходимо запретить только создание новых обменов, но сохранить доступ к профилю и истории, измените **«Создание новых заявок»** на вкладке **«Основное»**.

Если требуется сохранить причину, сообщение пользователю и срок ограничения, используйте действие **«Заблокировать»**.

Если нужно запретить только обращения через API, отключите **«Доступ к API»**.

## Статус личности

Параметр **«Статус личности»** является ручной отметкой результата проверки личности.

Доступны состояния:

* **«Подтверждено»**;
* **«Не подтверждено»**.

Статус может учитываться при проверке KYC в направлениях обмена, создании заявок, назначении уровней клиентов, работе Бонусного центра и других сценариях, использующих общее состояние личности.

При изменении система обновляет связанные KYC-показатели Бонусного центра и пересчитывает зависимый прогресс. Другие модули учитывают новое значение при следующей проверке своих условий.

{% stepper %}
{% step %}

### Подтверждено

После выбора **«Подтверждено»** пользователь считается прошедшим проверку личности в модулях, которые используют общий KYC-статус.

Ручная отметка не проверяет документы, не создаёт KYC-заявку и не является заключением внешнего провайдера.
{% endstep %}

{% step %}

### Не подтверждено

После выбора **«Не подтверждено»** пользователь может снова увидеть требования верификации при создании заявки, использовании направления, получении уровня или работе с другими KYC-зависимыми функциями.

Ранее загруженные документы и созданные KYC-заявки не удаляются.
{% endstep %}

{% step %}

### Изменение статуса личности

Убедитесь, что фактическая проверка пользователя завершена.

Измените **«Статус личности»**, нажмите **«Сохранить»** и обновите карточку.

При необходимости проверьте KYC-заявку, уровень клиента и данные Бонусного центра.

{% hint style="danger" %}
Не устанавливайте **«Подтверждено»** только по просьбе клиента или оператора.

Ошибочная отметка может открыть функции, доступные только верифицированным пользователям.
{% endhint %}
{% endstep %}
{% endstepper %}

## Email-уведомления

Параметр **«Email-уведомления»** разрешает отправлять пользователю обычные системные письма, если соответствующий модуль учитывает персональную настройку.

{% content-ref url="/pages/OkKDfMApGsB2m3bvCsHg" %}
[Уведомление по E-mail](/guide/uvedomleniya/uvedomlenie-po-e-mail)
{% endcontent-ref %}

К ним могут относиться сообщения о заявках, изменении статусов, пользовательских операциях и событиях подключённых модулей.

Настройка не включает почтовую отправку для всей системы и не изменяет SMTP.

Если глобальная отправка отключена или настроена неправильно, включение **«Email-уведомления»** не обеспечит доставку.

Коды безопасности и персональные ссылки управляются отдельными механизмами и не должны отключаться через эту настройку.

Для изменения переключите **«Email-уведомления»**, нажмите **«Сохранить»** и проверьте результат после обновления карточки.

## Доступ к API

Параметр **«Доступ к API»** разрешает или запрещает работу пользователя с пользовательским REST API и внешними интеграциями.

Поле отображается только сотруднику с правом **«API админки»**.

Если доступ разрешён, пользователь может создавать и использовать API-токены в пределах глобальных ограничений. Сам переключатель не создаёт токен.

Если доступ запрещён, новые и существующие токены не принимаются пользовательским API. Сохранённые записи токенов при этом не удаляются.

Для изменения переключите **«Доступ к API»**, нажмите **«Сохранить»** и обновите карточку.

При окончательном отзыве дополнительно удалите ненужные токены и проверьте подключённые интеграции.

Для административных аккаунтов API рекомендуется оставлять отключённым, если он не используется владельцем напрямую.

## Разрешенные IP адреса

Поле **«Разрешенные IP адреса»** ограничивает адреса, с которых пользователь может авторизоваться.

{% content-ref url="/pages/dIuIyDNhBfI8ypz4IEoC" %}
[Доступ к панели по IP-адресу](/guide/nachalo-raboty/centr-bezopasnosti/dostup-k-paneli-po-ip-adresu)
{% endcontent-ref %}

Ограничение применяется при входе на клиентский сайт, входе через внешний сервис, входе и работе в панели управления, а также при переключении административных аккаунтов.

Пустое поле означает отсутствие персонального ограничения.

{% stepper %}
{% step %}

### Поддерживаемые значения

Можно указывать:

* IPv4;
* IPv6;
* IPv4-подсети в формате CIDR;
* IPv6-подсети в формате CIDR.

Пример:

```
203.0.113.10
198.51.100.0/24
2001:db8::/32
```

Значения можно разделять пробелами, запятыми, точками с запятой и переносами строк.

Максимальное количество — 100 корректных записей. Повторяющиеся значения нормализуются при сохранении.
{% endstep %}

{% step %}

### Как применяется проверка

Пустой список разрешает вход с любого IP-адреса.

Если в непустом списке находится некорректная запись, форма не сохранит значение.

Если неправильное устаревшее значение уже находится в системе, проверка действует по безопасному принципу и запрещает вход.

При редактировании собственного аккаунта текущий IP должен входить в новый непустой список.

При редактировании другого пользователя добавлять IP администратора не требуется. Целевой пользователь может работать с других адресов.

Поле **«Последний IP»** показывает информационное значение и не добавляет адрес в разрешённый список автоматически.

{% hint style="warning" %}
Перед настройкой ограничений проверьте определение реального IP-адреса.

При неправильной конфигурации Cloudflare, обратного прокси или балансировщика система может видеть адрес прокси вместо адреса пользователя.
{% endhint %}
{% endstep %}

{% step %}

### Глобальное и персональное ограничение

Для входа в панель управления одновременно применяются глобальный список разрешённых административных IP и персональный список пользователя.

Адрес должен соответствовать обоим ограничениям.

Глобальный список панели не заменяет персональное ограничение пользователя.
{% endstep %}

{% step %}

### Безопасная настройка

Подготовьте постоянный адрес владельца, офиса или защищённого VPN.

Сравните текущий IP со значением **«Последний IP»** и проверьте настройки доверенных прокси.

При необходимости добавьте резервный контролируемый адрес.

Сохраните список и проверьте новый вход в другом браузере или отдельном профиле.

Не завершайте текущую рабочую сессию до успешной проверки.

Не включайте ограничение для мобильного интернета или VPN с непредсказуемыми выходными адресами.
{% endstep %}
{% endstepper %}

## Подтверждение входа в админку

Параметр **«Подтверждение входа в админку»** требует дополнительный шестизначный код после проверки пароля.

Настройка может отображаться и у обычного пользователя, но начинает влиять на вход после назначения административной группы.

При авторизации система проверяет статус аккаунта, блокировку, IP-адрес и административные права. Затем создаёт одноразовый запрос и предлагает подтвердить вход текущим способом безопасности.

Код может поступить по E-mail, через Telegram или быть получен из Google Authenticator.

### Включение и отключение

Переключите **«Подтверждение входа в админку»**.

Получите код способом, выбранным у редактируемого пользователя, введите шесть цифр и нажмите **«Подтвердить»**.

После успешного применения общую кнопку **«Сохранить»** нажимать не нужно.

Если один администратор изменяет настройку другого пользователя, код получает владелец редактируемого аккаунта.

Безопаснее, чтобы администратор настраивал собственный канал самостоятельно. Не передавайте коды через открытые чаты.

## Восстановление пароля

Параметр **«Восстановление пароля»** управляет публичной функцией **«Забыли пароль?»**.

Если восстановление включено, пользователь может запросить ссылку для сброса пароля при работающей почтовой отправке.

Если настройка отключена, новые ссылки не создаются, а ранее выданные токены удаляются и перестают работать.

Отключение применяется сразу.

Повторное включение для обычного пользователя выполняется без дополнительного подтверждения. Для административного аккаунта потребуется шестизначный код через текущий способ безопасности.

{% hint style="danger" %}
Не отключайте восстановление у главного администратора без рабочего аварийного сценария.

Потеря пароля, E-mail и Google 2FA может потребовать технического восстановления на сервере.
{% endhint %}

Для безопасного отключения пароль должен храниться в менеджере паролей, почта — контролироваться владельцем, а резервный секрет Google 2FA — находиться в защищённом хранилище.

## Доверенные устройства админки

Настройка отображается только у пользователя, имеющего административный доступ.

При включённой функции новый браузер или устройство требуется подтвердить текущим способом безопасности.

Новым считается устройство при использовании другого браузера, другого профиля, приватного окна, после удаления cookies, переустановки браузера, отзыва устройства или окончания срока доверия.

Смена одного IP-адреса не обязательно делает устройство новым. Контроль IP во время сессии настраивается отдельно.

{% stepper %}
{% step %}

### Срок и количество устройств

Доверие может действовать до 180 дней.

Для одного администратора хранится не более 20 активных устройств. При превышении лимита самые старые записи отзываются.
{% endstep %}

{% step %}

### Совместная работа с подтверждением входа

Если одновременно включены **«Подтверждение входа в админку»** и **«Доверенные устройства админки»**, одна проверка может подтвердить вход и добавить браузер в доверенные.

При следующих входах устройство будет распознаваться, но код продолжит запрашиваться, пока отдельно включено подтверждение каждого входа.
{% endstep %}

{% step %}

### Просмотр устройств

Нажмите **«Доверенные устройства»**.

В списке отображаются название устройства, операционная система, браузер, последний IP и отметка **«Текущее»**.
{% endstep %}

{% step %}

### Отзыв устройства

Откройте список, найдите нужную запись и нажмите **«Отозвать»**.

Отзыв запрещает дальнейшее использование доверительного токена, но не обязательно завершает уже открытую сессию. Для немедленного отключения дополнительно закройте активные сессии.
{% endstep %}

{% step %}

### Полное отключение функции

Переключите **«Доверенные устройства админки»**, получите код, введите шесть цифр и подтвердите действие.

После отключения все доверенные устройства пользователя отзываются, а cookie текущего устройства удаляется.

Нажимать **«Сохранить»** не требуется.
{% endstep %}
{% endstepper %}

## Способ подтверждения кодов безопасности

Параметр отображается только у пользователей с административным доступом.

Доступны:

* **«Email»**;
* **«Telegram»**;
* **«Google 2FA»**.

Текущий вариант указывается рядом с кнопками. Недоступный способ отображается отключённым.

Выбранный канал используется при подтверждении входа, нового устройства, изменении настроек безопасности, защищённых операциях и других административных проверках.

### Изменение способа

Сначала полностью настройте новый канал.

Выберите **«Email»**, **«Telegram»** или **«Google 2FA»**.

Система проверит готовность нового способа и запросит код через текущий канал.

Введите шесть цифр и нажмите **«Подтвердить»**.

После применения проверьте строку **«Текущий способ»**.

Новый канал не используется для подтверждения собственной активации. Например, при переходе с Email на Google 2FA код сначала поступит через Email.

## Подтверждение через Email

Для работы Email у пользователя должен быть указан правильный почтовый адрес.

В панели управления откройте: **«Настройки» — «Общие настройки»**

{% content-ref url="/pages/OkKDfMApGsB2m3bvCsHg" %}
[Уведомление по E-mail](/guide/uvedomleniya/uvedomlenie-po-e-mail)
{% endcontent-ref %}

Перейдите в раздел **«Уведомления» — «E-mail уведомления»**.

Проверьте настройки **«Отправлять уведомления»** и **«Отправлять письма»**.

Отправьте тестовое сообщение и убедитесь, что письмо доставляется.

Обычный переключатель **«Email-уведомления»** в карточке пользователя не следует использовать для отключения обязательных кодов безопасности.

## Подтверждение через Telegram

Telegram-коды отправляются через отдельного бота безопасности. Обычный бот клиентских уведомлений его не заменяет.

В панели управления откройте: **«Настройки» — «Общие настройки»**

{% content-ref url="/pages/5ueHtrNh5qkmDPlGOD1m" %}
[Уведомление в Telegram](/guide/uvedomleniya/uvedomlenie-v-telegram)
{% endcontent-ref %}

Перейдите в раздел **«Уведомления» — «Telegram уведомления»**.

Создайте или проверьте активный канал с назначением **«Коды и подтверждения безопасности»**.

После этого пользователь должен самостоятельно войти в свою административную учётную запись и открыть собственную карточку.

На вкладке **«Доступ и безопасность»** нажмите **«Создать ссылку Telegram»**.

Откройте ссылку, запустите бота и подтвердите переданную команду. Если команда не передалась автоматически, отправьте показанное значение вручную.

Вернитесь в панель и нажмите **«Проверить привязку»**.

Убедитесь, что отображается правильный Telegram-аккаунт, затем выберите **«Telegram»** как способ подтверждения и подтвердите смену через прежний канал.

Ссылка действует 15 минут. После окончания срока создайте новую.

Другой администратор не может выполнить персональную привязку вместо владельца аккаунта.

Для отключения Telegram требуются два кода: из E-mail и из Telegram-бота безопасности.

Если Telegram использовался как основной канал, после отвязки система переключает пользователя на Email.

## Подтверждение через Google 2FA

Google 2FA становится доступным после активации Google Authenticator в карточке пользователя.

{% content-ref url="/pages/0Z0RWWgQoDPndF0oEuVB" %}
[Настройка Google Authenticator](/guide/nachalo-raboty/centr-bezopasnosti/nastroika-google-authenticator)
{% endcontent-ref %}

Нажмите **«Google 2FA»**, отсканируйте QR-код и сохраните текстовый секрет в защищённом резервном хранилище.

Введите текущий шестизначный код и нажмите **«Активировать»**.

После успешной активации вернитесь к **«Способ подтверждения кодов безопасности»**, выберите **«Google 2FA»** и подтвердите смену через прежний канал.

Коды создаются приложением и не зависят от доставки почты или Telegram.

## Правила одноразовых кодов

Для защищённых изменений действуют следующие ограничения:

* код состоит из шести цифр;
* запрос действует 15 минут;
* код связан с пользователем и браузерной сессией, где создан запрос;
* подтвердить его в другом браузере нельзя;
* новый запрос того же типа закрывает предыдущий незавершённый запрос;
* использованный код нельзя применить повторно;
* код одного действия не подходит для другого;
* после пяти неправильных попыток запрос блокируется на 10 минут;
* за 10 минут можно создать не более пяти новых кодов одного типа;
* принятый Google-код нельзя повторно использовать для другого административного подтверждения.

Если администратор создаёт запрос для другого пользователя, код доставляется владельцу редактируемого аккаунта.

## Новый пароль

Поле **«Новый пароль»** отображается при наличии права **«Смена паролей пользователей»**.

Если пароль менять не требуется, оставьте поле пустым.

Пароль должен содержать от 12 до 128 символов, минимум одну заглавную и строчную букву, цифру и специальный символ.

Используйте уникальный пароль длиной не менее 16 символов, созданный менеджером паролей.

### Изменение пароля

Убедитесь, что выбрана правильная карточка.

Введите новый пароль и передайте его владельцу только защищённым способом.

Нажмите **«Сохранить»**.

После успешного изменения поле очистится.

Затем закройте старые сессии и проверьте новый вход.

Если включена защита административного доступа после событий пароля, при следующем входе пользователь должен будет пройти дополнительную проверку.

Смена пароля не завершает автоматически все сессии и не удаляет доверенные устройства.

## Способ входа

Поле **«Способ входа»** является информационным.

<figure><img src="/files/s5SkrxwPZqLBJVBAaMbm" alt=""><figcaption></figcaption></figure>

Оно может показывать **«Стандартное»**, название внешнего провайдера или идентификатор связанной внешней учётной записи.

Изменить способ непосредственно в карточке нельзя.

Если пользователь зарегистрирован через внешний сервис, изменение локального пароля не удаляет внешнюю привязку.

Настройки провайдеров находятся в разделе:

**«Пользователи» — «Вход через сервисы»**

## Управление Google 2FA

Диалог Google 2FA можно открыть через кнопку во вкладке **«Доступ и безопасность»** или через меню **«Ещё» — «Google 2FA»**.

<figure><img src="/files/PaRP2A27hK8Uog2Xia9j" alt=""><figcaption></figcaption></figure>

Элемент отображается при наличии права **«Google 2FA пользователей»**.

Владелец аккаунта должен самостоятельно отсканировать QR-код и сохранить резервный секрет отдельно от пароля.

После ввода текущего кода нажмите **«Активировать»** и убедитесь, что система показывает **«Google Authenticator активирован»**.

Активация не выбирает Google 2FA автоматически как основной способ кодов. При необходимости измените **«Способ подтверждения кодов безопасности»** отдельно.

### Сброс Google 2FA

Для административного аккаунта доступны варианты:

* **«Сбросить по Google-коду»** — используется действующий код приложения;
* **«Сбросить через email»** — код отправляется на E-mail пользователя.

Для пользователя без административного доступа сброс может выполняться сразу уполномоченным администратором.

Если Google 2FA был основным способом подтверждения, после сброса система возвращает вариант **«Email»**.

{% hint style="warning" %}
Перед сбросом проверьте работу почты.

Не отключайте единственный действующий способ подтверждения без подготовленной замены.
{% endhint %}

## Активные сессии

Блок **«Активные сессии»** показывает веб-сессии пользователя.

Для каждой записи отображаются IP-адрес, операционная система, браузер, User Agent и отметка **«Текущее устройство»**.

В списке могут находиться входы как с клиентского сайта, так и из панели управления. Тип сессии отдельно не подписывается.

Кнопка **«Закрыть все сессии»** доступна сотруднику с правом **«Закрытие сессий пользователей»**.

При работе с собственной карточкой текущая сессия сохраняется, а остальные завершаются.

При работе с другим пользователем закрываются все его веб-сессии.

Закрытие сессий не удаляет API-токены, доверенные устройства, Telegram-привязку, Google 2FA, группы и права.

Для полного отзыва доступа проверяйте каждый механизм отдельно.

## Блокировка пользователя

В меню **«Ещё»** выберите **«Заблокировать»**.

<figure><img src="/files/XZh4lEEaU9PcRYCSyAOU" alt=""><figcaption></figcaption></figure>

В форме можно указать:

* **«Причина блокировки»**;
* временную или бессрочную блокировку;
* дату окончания;
* сообщение для пользователя;
* внутренний комментарий.

Для сохранения должна быть заполнена причина или внутренний комментарий.

Для временной блокировки необходимо выбрать дату окончания.

Если публичное сообщение не заполнено, пользователь увидит стандартное сообщение о необходимости обратиться в поддержку.

Блокировка запрещает вход на клиентский сайт и в панель управления.

Для полного немедленного отзыва также отключите API и закройте сессии.

## Разблокировка пользователя

Если пользователь заблокирован, в меню **«Ещё»** отображается **«Разблокировать»**.

Разблокировка снимает активное ограничение, но не изменяет **«Статус аккаунта»**, **«Доступ к API»**, разрешённые IP-адреса, группы и восстановление пароля.

После разблокировки проверьте каждый параметр доступа отдельно.

## Полное отключение доступа

Для полного отзыва доступа сначала убедитесь, что выбрана правильная карточка.

Если пользователь имеет административный доступ, откройте **«Доверенные устройства»** и отзовите их до удаления административной группы.

Отключите **«Статус аккаунта»**.

Если поле доступно, установите **«Доступ к API»** в запрещённое состояние.

Нажмите **«Сохранить»**.

При необходимости создайте блокировку с причиной и сроком.

Нажмите **«Закрыть все сессии»**.

Затем откройте:

**«Пользователи» — «Список групп пользователей»**

Удалите ненужные административные назначения.

Дополнительно проверьте multi-auth-сессии, персональные ссылки панели, API-токены и внешние интеграции.

{% hint style="warning" %}\
После удаления административной группы параметры доверенных устройств и способа получения кодов могут исчезнуть из карточки.

Отзывайте устройства до удаления группы.\
{% endhint %}

## Рекомендуемые настройки

{% stepper %}
{% step %}

### Обычный пользователь

Для обычного клиента **«Статус аккаунта»** должен быть включён, если вход разрешён.

**«Статус личности»** устанавливайте только по фактическому результату KYC.

**«Email-уведомления»** настраивайте по политике обменного пункта.

API включайте только при реальной необходимости.

Персональный список IP обычно оставляется пустым.

Восстановление пароля рекомендуется оставить включённым.
{% endstep %}

{% step %}

### Администратор

Для административной учётной записи используйте отдельный рабочий E-mail и уникальный пароль.

Подключите Google 2FA, включите **«Подтверждение входа в админку»** и **«Доверенные устройства админки»**.

В качестве способа кодов используйте Google 2FA или проверенный Telegram-канал.

Персональное IP-ограничение включайте только при наличии стабильного адреса.

API оставляйте отключённым, если он не используется.

Регулярно проверяйте активные сессии и доверенные устройства.
{% endstep %}

{% step %}

### Главный администратор

Главную учётную запись используйте только для критических настроек.

Храните пароль в менеджере паролей, а резервный секрет Google 2FA — отдельно.

Используйте личную защищённую почту.

Не отключайте восстановление без аварийного сценария.

Не добавляйте главного администратора как дополнительный аккаунт в чужую multi-auth-сессию.

Регулярно проверяйте журнал авторизаций, сессии и устройства.
{% endstep %}
{% endstepper %}

## Проверка после настройки

После изменения обычных полей нажмите **«Сохранить»** и дождитесь успешного сообщения.

Нажмите **«Обновить»** и убедитесь, что значения сохранились.

Проверьте пользовательский вход в отдельном браузере, особенно после изменения статуса или IP-адресов.

Для администратора выполните новый вход и убедитесь, что система запрашивает нужный код.

Проверьте выбранный канал: получение E-mail или Telegram-сообщения либо принятие Google-кода.

После подтверждения нового браузера откройте **«Доверенные устройства»** и найдите текущую запись.

Отзовите тестовое устройство и убедитесь, что при следующем входе снова требуется подтверждение.

Проверьте активные сессии.

Для просмотра истории входов откройте: **«Журнал событий» — «Пользователи» — «Лог авторизаций»**

Проверьте пользователя, время и IP-адрес выполненных входов.

## Если настройки работают не так, как ожидается

<details>

<summary>Не удаётся найти прежний раздел управления доступом</summary>

Откройте верхнюю вкладку **«Доступ и безопасность»** в карточке пользователя.

В новой версии прежний единый блок разделён на отдельные части.

</details>

<details>

<summary>Кнопка «Сохранить» недоступна</summary>

Проверьте обязательные поля пользователя на вкладке **«Основное»**, включая имя и E-mail.

Также убедитесь, что нет незавершённого запроса изменения.

</details>

<details>

<summary>Переключатель безопасности недоступен</summary>

Проверьте право **«Настройки безопасности пользователей»** у текущего администратора.

</details>

<details>

<summary>Не отображается «Доступ к API»</summary>

Для поля требуется право **«API админки»**.

</details>

<details>

<summary>Не отображается «Новый пароль»</summary>

Требуется право **«Смена паролей пользователей»**.

</details>

<details>

<summary>Код не приходит на E-mail</summary>

Проверьте E-mail пользователя, глобальные почтовые переключатели и доставку тестового сообщения.

</details>

<details>

<summary>Telegram недоступен</summary>

Проверьте бота безопасности, канал **«Коды и подтверждения безопасности»** и персональную привязку пользователя.

</details>

<details>

<summary>Нельзя привязать Telegram другому пользователю</summary>

Персональную привязку выполняет сам администратор из своей учётной записи.

</details>

## Финальная проверка

Настройка завершена, если:

* открыта карточка нужного пользователя;
* **«Статус аккаунта»** соответствует требуемому доступу;
* **«Статус личности»** установлен по фактическому результату KYC;
* E-mail-уведомления настроены осознанно;
* API разрешён только тем, кому он требуется;
* персональные IP-адреса проверены;
* административная группа назначена отдельно;
* подтверждение входа работает;
* способ получения кодов проверен;
* Google 2FA активирован;
* резервный секрет сохранён;
* доверенные устройства проверены;
* неизвестные устройства отозваны;
* восстановление пароля настроено с учётом аварийного доступа;
* активные сессии проверены;
* при полном отзыве отключены аккаунт и API;
* сессии закрыты;
* доверенные устройства отозваны;
* административные группы удалены;
* API-токены и внешние интеграции проверены;
* результат подтверждён новым входом и данными **«Лога авторизаций»**.


# Доступ к панели по IP-адресу

iEXExchanger позволяет ограничивать доступ по IP-адресу на двух уровнях:

* глобально — для всей административной панели;
* индивидуально — для конкретного пользователя.

Оба уровня поддерживают отдельные IPv4- и IPv6-адреса, а также подсети в формате CIDR.

Если одновременно настроены глобальный и персональный списки, текущий IP должен быть разрешён в каждом из них. Один список не заменяет другой.

### Два уровня ограничения

| Уровень        | Где настраивается      | На что влияет                  |
| -------------- | ---------------------- | ------------------------------ |
| Глобальный     | Настройки безопасности | На всю административную панель |
| Индивидуальный | Карточка пользователя  | На конкретный аккаунт          |

### Пример совместной работы

В глобальном списке разрешена сеть:

```
203.0.113.0/24
```

В карточке администратора указан адрес:

```
203.0.113.15
```

Этот администратор сможет войти только с адреса:

```
203.0.113.15
```

Другой администратор с пустым персональным списком сможет работать с любого адреса внутри глобальной сети:

```
203.0.113.0/24
```

## Глобальное ограничение панели

### Где находится настройка

В панели управления откройте: **«Настройки» — «Общие настройки»**

Затем перейдите в раздел: **«Основное» — «Безопасность»**

<figure><img src="/files/5BCUdkDO49HsrjY7Ikmp" alt=""><figcaption></figcaption></figure>

Откройте вкладку **«Общее»**.

Найдите параметры:

* «Ограничить вход в админ-панель по IP»;
* «Разрешённые IP-адреса для админ-панели».

### Ограничить вход в админ-панель по IP

Это основной переключатель глобального ограничения.

Если параметр включён и список заполнен, рабочие разделы административной панели доступны только с указанных адресов и подсетей.

Если параметр выключен, глобальный список не ограничивает доступ. Персональные ограничения пользователей при этом продолжают работать.

### Разрешённые IP-адреса для админ-панели

В поле указываются IP-адреса и подсети, с которых разрешена работа в административной панели.

Пример:

```
192.48.25.71
129.42.0.0/16
2001:db8::1
2001:db8:100::/48
```

Если глобальный список пустой, доступ разрешается с любых IP, даже когда основной переключатель включён.

Поэтому включённый параметр с пустым списком фактически не защищает панель. Система безопасности отмечает такую конфигурацию как критическую проблему.

### Как настроить глобальное ограничение

1. Определите текущий внешний IP администратора.
2. Если используется Cloudflare или другая защита, сначала настройте доверенные прокси.
3. Добавьте текущий IP в разрешённый список.
4. При необходимости добавьте резервный адрес или безопасную подсеть.
5. Включите параметр **«Ограничить вход в админ-панель по IP»**.
6. Нажмите **«Сохранить»**.
7. Проверьте вход в другом браузере.
8. Не закрывайте текущую сессию до завершения проверки.

Если изменения настроек безопасности подтверждаются несколькими администраторами, сохранение потребует соответствующего согласования.

### Защита от случайной блокировки

Система не позволит включить глобальное ограничение, если текущий IP администратора отсутствует в заполненном списке.

Появится сообщение: **Добавьте текущий IP-адрес в разрешённый список перед включением ограничения.**

Такая же проверка выполняется при последующем изменении уже активного списка.

Это снижает риск случайно заблокировать текущего администратора.

**Важно.** Защита проверяет текущий адрес, но не гарантирует доступ после его изменения. До включения ограничения подготовьте резервный IP и не закрывайте последнюю рабочую сессию, пока не проверите новый список.

## Индивидуальное ограничение пользователя

### Где находится настройка

В панели управления откройте: **«Пользователи» — «Список пользователей»**

Выберите пользователя и нажмите **«Изменить»**.

<figure><img src="/files/J0KrzcpvR7vLIrH3Qfwc" alt=""><figcaption></figcaption></figure>

В карточке найдите блок: **«Разрешённые IP-адреса»**

<figure><img src="/files/KyyQM88VHpzOuXedNzDM" alt="" width="563"><figcaption></figcaption></figure>

Для изменения персонального списка необходимо право:

**«Настройки безопасности пользователей»**

<figure><img src="/files/dSxxTAKFkOA5UW9n3pRv" alt=""><figcaption></figcaption></figure>

### Как работает персональный список

Если поле заполнено, пользователь может авторизоваться только с указанных адресов или подсетей.

Персональная проверка применяется:

* при входе в клиентский аккаунт;
* при входе в административную панель;
* при входе через подключённые сервисы авторизации;
* во время работы в административной панели;
* при добавлении аккаунта в мультиавторизацию;
* при переключении аккаунта в мультиавторизации.

Персональный список относится ко всему аккаунту, а не только к административной панели.

Это особенно важно для пользователей, которые одновременно являются клиентами и администраторами.

### Если персональный список пустой

Пустое поле означает отсутствие индивидуального ограничения.

В этом случае:

* пользователь может входить в клиентский аккаунт с любого IP;
* административный доступ определяется глобальным списком панели;
* остальные механизмы безопасности продолжают работать.

### Как настроить персональный список

1. Откройте карточку пользователя.
2. Найдите блок **«Разрешённые IP-адреса»**.
3. Укажите разрешённые адреса или подсети.
4. Нажмите основную кнопку **«Сохранить»**.
5. Проверьте вход под этим пользователем.

Если администратор редактирует собственный аккаунт, система не позволит сохранить заполненный список, который не включает его текущий IP.

Главный администратор может изменить список другого пользователя. Перед сохранением убедитесь, что рабочий адрес сотрудника указан правильно.

## Поддерживаемые форматы

Система принимает:

* отдельный IPv4;
* отдельный IPv6;
* IPv4-подсеть в формате CIDR;
* IPv6-подсеть в формате CIDR.

### Отдельный IPv4

Разрешает один адрес:

```
203.0.113.15
```

### IPv4-подсеть

Разрешает диапазон адресов:

```
203.0.113.0/24
```

### Отдельный IPv6

Разрешает один IPv6-адрес:

```
2001:db8::15
```

### IPv6-подсеть

Разрешает IPv6-подсеть:

```
2001:db8:100::/48
```

### Разделители

Записи можно разделять:

* переносами строк;
* запятыми;
* точками с запятой;
* пробелами.

Пример:

```
203.0.113.15
198.51.100.0/24
2001:db8::15
```

После сохранения система удаляет повторяющиеся записи и приводит список к единому формату.

### Ограничение количества

На каждом уровне можно указать не более 100 адресов или CIDR-подсетей:

* до 100 записей в глобальном списке;
* до 100 записей в персональном списке каждого пользователя.

## Проверка формата

Если хотя бы одна непустая запись содержит ошибку, весь список считается недействительным.

Неправильные примеры:

```
192.168.1
192.168.1.1/99
2001:db8::/200
example.com
https://203.0.113.15
203.0.113.*
```

Система не поддерживает:

* доменные имена;
* URL;
* диапазоны со звёздочкой;
* неполные адреса;
* недопустимые маски CIDR.

Для разрешения диапазона используйте формат CIDR:

```
203.0.113.0/24
```

Ошибочный сохранённый список не разрешает доступ всем пользователям. Система действует по безопасному принципу и запрещает вход.

## Как взаимодействуют два уровня

Для административного доступа система последовательно проверяет:

1. включён ли глобальный IP-фильтр;
2. входит ли текущий адрес в глобальный список;
3. заполнен ли персональный список пользователя;
4. входит ли адрес в персональный список;
5. включён ли аккаунт;
6. есть ли у пользователя доступ к панели;
7. не заблокирован ли пользователь;
8. пройдены ли остальные проверки безопасности.

Доступ предоставляется только после успешного прохождения всех обязательных проверок.

### Возможные комбинации

| Глобальное ограничение     | Персональный список | Результат                             |
| -------------------------- | ------------------- | ------------------------------------- |
| Выключено                  | Пустой              | Доступ с любого IP                    |
| Включено и заполнено       | Пустой              | Доступ только по глобальному списку   |
| Выключено                  | Заполнен            | Доступ только по персональному списку |
| Включено и заполнено       | Заполнен            | IP должен находиться в обоих списках  |
| Включено, но список пустой | Пустой              | Доступ с любого IP                    |

## Глобальный список и страница входа

Глобальное ограничение защищает рабочие административные разделы и запросы панели.

В зависимости от текущей сессии страница авторизации может открываться с неразрешённого IP. Однако после входа административные функции будут отклонены.

Персональный список проверяется во время авторизации конкретного пользователя.

Наличие доступной страницы входа не означает, что текущий IP разрешён для работы в панели.

## Связь с другими механизмами

{% stepper %}
{% step %}

### Персональная ссылка админки

Персональная ссылка не обходит IP-ограничения.

Даже при наличии действующего персонального URL система продолжает проверять:

* глобальный список панели;
* персональный список пользователя;
* текущую сессию;
* остальные правила доступа.

Если текущий адрес больше не разрешён, персональная ссылка не предоставит доступ к административным функциям.
{% endstep %}

{% step %}

### Мультиавторизация

При добавлении или переключении административного аккаунта система проверяет персональный список выбранного пользователя.

Если текущий IP не разрешён:

* аккаунт не будет подключён;
* переключение будет отклонено;
* ранее подключённый аккаунт может не пройти повторную проверку.

Глобальное ограничение применяется ко всей текущей административной сессии.
{% endstep %}

{% step %}

### Контроль изменения IP

Доступ по IP и контроль изменения IP решают разные задачи.

| Настройка             | Что делает                                               |
| --------------------- | -------------------------------------------------------- |
| Доступ по IP          | Определяет, с каких адресов разрешена авторизация        |
| Контроль изменения IP | Завершает активную сессию, если IP изменился после входа |

Рекомендуется использовать их вместе:

1. разрешить только рабочие IP;
2. включить высокий уровень контроля изменения IP;
3. завершать сессию и отправлять уведомление при смене адреса.
   {% endstep %}
   {% endstepper %}

## Cloudflare, DDoS-защита и reverse proxy

Перед настройкой IP-ограничений система должна правильно определять реальный адрес администратора.

В настройках безопасности находится параметр: **«Выберите установленную защиту от DDOS»**

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/o1W2vTku0rN6lZNvs6VR" %}
[Защита от DDoS-атак](/help-center/administrirovanie/seti-i-bezopasnost/zashita-ot-ddos-atak)
{% endcontent-ref %}

Если используется Cloudflare, StormWall, балансировщик или reverse proxy:

1. выберите соответствующий файл доверенных прокси;
2. обновите список адресов провайдера;
3. убедитесь, что Backend видит реальный IP пользователя;
4. только после этого включайте ограничения.

### Что добавлять в разрешённый список

Добавляйте реальный внешний IP:

* администратора;
* офиса;
* корпоративной сети;
* защищённого VPN.

Не добавляйте диапазоны Cloudflare только потому, что сайт работает через Cloudflare.

Диапазоны Cloudflare относятся к доверенным прокси, а не к списку сотрудников, которым разрешён доступ в административную панель.

При неправильной настройке система может видеть:

* IP Cloudflare;
* адрес балансировщика;
* внутренний адрес Nginx;
* меняющийся адрес reverse proxy.

Это может привести к неправильной блокировке или некорректной проверке доступа.

## Работа с IPv4 и IPv6

Один провайдер может подключать пользователя через IPv4 или IPv6.

Если используются оба протокола, добавьте оба адреса:

```
203.0.113.15
2001:db8:100::15
```

Иначе вход может работать через IPv4 и блокироваться после переключения на IPv6.

Не добавляйте слишком широкую IPv6-подсеть без необходимости.

## Работа через VPN

Для административного доступа рекомендуется использовать VPN с постоянным выделенным IP.

В разрешённый список добавляется внешний адрес VPN.

Если VPN автоматически меняет серверы:

* закрепите один сервер;
* закажите статический IP;
* добавьте безопасные подсети разрешённых выходов;
* не переключайте сервер во время активной сессии.

Не добавляйте широкие диапазоны публичного VPN-сервиса, которыми могут пользоваться посторонние люди.

## Как настроить безопасную схему

{% stepper %}
{% step %}

### Подготовьте адреса

Определите:

* IP главного администратора;
* IP офиса;
* резервный защищённый IP;
* статический адрес корпоративного VPN;
* используемые IPv6-адреса.
  {% endstep %}

{% step %}

### Настройте доверенные прокси

Проверьте настройки:

* Cloudflare;
* StormWall;
* Nginx;
* reverse proxy;
* балансировщиков.

Убедитесь, что Backend видит реальный IP администратора.
{% endstep %}

{% step %}

### Настройте глобальный список

Добавьте адреса, с которых разрешена работа с административной панелью.

Включите глобальное ограничение и сохраните настройки.
{% endstep %}

{% step %}

### Настройте персональные списки

Для каждого администратора укажите только его собственные рабочие адреса или безопасные подсети.
{% endstep %}

{% step %}

### Проверьте разрешённый доступ

Выполните вход через отдельный браузер и вторую административную учётную запись.

Убедитесь, что разрешённые адреса работают.
{% endstep %}

{% step %}

### Проверьте отказ

Попробуйте выполнить вход с адреса, которого нет в списках.

Система должна показать сообщение:

> Ваш IP-адрес не включён в список разрешённых.

Не закрывайте последнюю рабочую административную сессию до успешного завершения проверки.
{% endstep %}
{% endstepper %}

## Как разрешить доступ с любых IP

{% stepper %}
{% step %}

### На глобальном уровне

Используйте один из вариантов:

* отключите параметр **«Ограничить вход в админ-панель по IP»**;
* очистите глобальный список.

Рекомендуется выключить основной переключатель, чтобы состояние настройки было понятно другим администраторам.
{% endstep %}

{% step %}

### На уровне пользователя

Очистите поле **«Разрешённые IP-адреса»** в карточке пользователя и сохраните изменения.

Очистка персонального списка не отключает глобальное ограничение.
{% endstep %}
{% endstepper %}

## Как проверить работу

После настройки выполните проверку обоих уровней.

1. Не закрывая текущую сессию, откройте панель в другом браузере.
2. Выполните вход с разрешённого IP.
3. Убедитесь, что административные функции доступны.
4. Проверьте пользователя с пустым персональным списком.
5. Добавьте этому пользователю отдельный разрешённый адрес.
6. Убедитесь, что теперь действуют оба ограничения.
7. Выполните вход с неразрешённого IP.
8. Проверьте отображение ошибки доступа.
9. При использовании IPv6 отдельно проверьте IPv4 и IPv6.
10. Проверьте переключение аккаунтов в мультиавторизации.

Для тестирования рекомендуется использовать вторую административную учётную запись и резервный безопасный IP.

## Частые ошибки

<details>

<summary>Система не позволяет сохранить глобальный список</summary>

Возможные причины:

* текущий IP отсутствует в списке;
* одна из записей имеет неправильный формат;
* превышено ограничение в 100 записей.

Добавьте адрес, который система показывает в сообщении, исправьте формат и повторите сохранение.

</details>

<details>

<summary>Не удаётся сохранить собственный персональный список</summary>

Новый список не содержит текущий IP администратора.

Добавьте его или выполните изменение через другого уполномоченного администратора.

</details>

<details>

<summary>После включения Cloudflare доступ пропал</summary>

Система неправильно определяет реальный IP.

Настройте доверенные прокси. Не добавляйте IP Cloudflare в список разрешённых адресов сотрудников.

</details>

<details>

<summary>Доступ работает через IPv4, но не работает через IPv6</summary>

</details>

<details>

<summary>Пользователь не может войти на основной сайт</summary>

Персональный список применяется не только к панели, но и к клиентской авторизации.

Проверьте текущий IP пользователя или очистите индивидуальный список, если ограничение больше не требуется.

</details>

<details>

<summary>Не работает переключение аккаунта</summary>

IP текущей сессии отсутствует в персональном списке выбранного администратора либо не проходит глобальную проверку панели.

Проверьте оба уровня ограничения.

</details>

<details>

<summary>После изменения списка открытая страница продолжает отображаться</summary>

Уже загруженная страница может оставаться видимой, но следующий административный запрос будет отклонён.

Для немедленного отключения пользователя:

* завершите активные сессии;
* отзовите персональные ссылки;
* при необходимости отключите аккаунт.

</details>

<details>

<summary>Глобальное ограничение включено, но доступ работает с любого IP</summary>

Проверьте глобальный список.

Если он пустой, включённый переключатель не ограничивает доступ. Добавьте разрешённые адреса и сохраните настройки.

</details>

## Восстановление доступа

Если заблокирован отдельный пользователь, другой администратор с разрешённым IP может:

1. открыть карточку пользователя;
2. исправить или очистить персональный список;
3. сохранить изменения;
4. завершить старые сессии;
5. попросить пользователя войти заново.

Если доступ потерян из-за глобального списка и других доступных администраторов нет, потребуется техническая процедура восстановления через Backend.

Не изменяйте настройки базы данных вручную без понимания работы системы. Обратитесь к владельцу сервера или в техническую поддержку iEXExchanger.

До проверки нового списка не закрывайте последнюю рабочую административную сессию.

## Рекомендуемая конфигурация

Для главного администратора рекомендуется:

* глобальный список с IP офиса и защищённого VPN;
* отдельный персональный список;
* статический IP;
* высокий уровень контроля изменения IP;
* Google Authenticator;
* персональная ссылка админки;
* резервный способ доступа через другой безопасный IP.

Для сотрудников рекомендуется:

* отдельный аккаунт для каждого человека;
* персональный рабочий IP или подсеть;
* отсутствие административного доступа из публичных сетей;
* регулярная проверка активных сессий;
* немедленное удаление старых и ненужных адресов.

## Коротко

Глобальная настройка «Ограничить вход в админ-панель по IP» определяет общую сетевую границу административной панели.

Поле «Разрешённые IP-адреса» в карточке пользователя дополнительно ограничивает конкретный аккаунт и также влияет на клиентскую авторизацию.

Если настроены оба уровня, доступ предоставляется только тогда, когда текущий IP разрешён одновременно глобальным и персональным списками.

Перед включением ограничений настройте доверенные прокси, добавьте текущий и резервный IP, а затем проверьте доступ в отдельном браузере.


# Контроль изменения IP-адреса

Функция «Контроль изменения IP-адреса» защищает активные сессии административной панели iEXExchanger.

После авторизации система запоминает IP-адрес администратора и проверяет его во время дальнейшей работы. Если адрес изменится, текущая административная сессия будет завершена.

Функция применяется только к пользователям, имеющим доступ к панели управления. На клиентские аккаунты и публичную часть обменника она не распространяется.

### Где находится настройка

В панели управления откройте: **«Настройки» — «Общие настройки»**

Затем перейдите в раздел: **«Основное» — «Безопасность»**

Откройте вкладку **«Общее»** и найдите параметр: **«Контроль изменения IP-адреса»**

<figure><img src="/files/5Uo1zYQQvN8y6m5Tmtxd" alt=""><figcaption></figcaption></figure>

### Для чего нужен контроль IP

Функция позволяет:

* привязать административную сессию к IP-адресу входа;
* завершить сессию при неожиданной смене сети;
* отозвать персональный адрес текущего входа;
* закрыть временные доступы к защищённым операциям;
* завершить связанную мультиавторизацию;
* записать событие в журнал аудита;
* отправить уведомления о смене IP;
* снизить риск использования перехваченной административной сессии.

Контроль выполняется не только во время входа, но и при дальнейшей работе с панелью.

***

## Доступные режимы

| Режим                         | Что происходит                                                                           |
| ----------------------------- | ---------------------------------------------------------------------------------------- |
| «Не проверять IP»             | Административная сессия не привязывается к IP-адресу                                     |
| «Завершать вход при смене IP» | При изменении IP текущая сессия полностью завершается                                    |
| «Завершать вход и уведомлять» | Сессия завершается, событие записывается в аудит и отправляются уведомления безопасности |

{% stepper %}
{% step %}

### Не проверять IP

В этом режиме изменение IP-адреса не влияет на активную административную сессию.

Режим может потребоваться, если IP регулярно изменяется без участия пользователя:

* используется мобильный интернет;
* провайдер выдаёт нестабильный адрес;
* корпоративная сеть использует несколько внешних шлюзов;
* VPN автоматически меняет сервер;
* балансировщик настроен неправильно;
* устройство переключается между IPv4 и IPv6;
* инфраструктура доверенных прокси ещё не настроена.

Отключение контроля уменьшает защиту административной панели. Перед выбором этого режима проверьте настройки Cloudflare, DDoS-защиты, балансировщика и других прокси-сервисов.
{% endstep %}

{% step %}

### Завершать вход при смене IP

После успешного входа система сохраняет исходный IP текущей браузерной сессии.

Если во время работы обнаружен другой адрес, система:

1. прекращает выполнение текущего действия;
2. завершает административную сессию;
3. отзывает персональную ссылку админки;
4. закрывает временные доступы к защищённым операциям;
5. сбрасывает подтверждение Google 2FA для текущей сессии;
6. завершает связанную мультиавторизацию;
7. записывает событие смены IP в журнал аудита;
8. возвращает пользователя на страницу входа.

В этом режиме уведомления безопасности не отправляются.
{% endstep %}

{% step %}

### Завершать вход и уведомлять

Это рекомендуемый высокий уровень защиты.

Система выполняет все действия предыдущего режима и дополнительно отправляет:

* Telegram-уведомление административной аудитории;
* почтовое уведомление владельцу затронутого аккаунта.

Уведомление может содержать:

* предыдущий IP-адрес;
* новый IP-адрес;
* время события;
* данные администратора;
* браузер или устройство.

Доставка зависит от настроек SmartNotifier, почты, Telegram и очередей.

Если отправить уведомление не удалось, завершённая сессия не восстанавливается. Защитное действие выполняется независимо от результата доставки.
{% endstep %}
{% endstepper %}

## Как работает проверка

Общий порядок работы:

1. Администратор выполняет вход.
2. Система определяет IP успешной авторизации.
3. Для текущей браузерной сессии создаётся защищённое состояние.
4. При следующих действиях система определяет текущий IP.
5. Текущий адрес сравнивается с исходным.
6. Если адреса совпадают, работа продолжается.
7. Если адрес изменился, административная сессия завершается.

Если при включённой защите система не может получить корректный IP или состояние проверки недоступно, сессия также завершается. Ошибка прокси, сессии или хранилища не должна незаметно отключать контроль.

### Пример

Администратор выполнил вход с адреса:

```
192.0.2.10
```

Во время работы VPN переключился на другой сервер, и система увидела:

```
198.51.100.25
```

При следующем действии в панели система обнаружит изменение IP, завершит сессию и потребует повторную авторизацию.

Если выбран режим «Завершать вход и уведомлять», событие также будет отправлено через настроенные каналы безопасности.

## Что происходит после завершения сессии

Администратор увидит сообщение: **Изменение IP-адреса. Авторизация сброшена.**

После этого необходимо открыть постоянный адрес административной панели и заново пройти авторизацию.

Новый IP не блокируется навсегда. После успешного повторного входа он становится исходным адресом новой сессии.

Если дополнительно включено ограничение входа по списку разрешённых IP, новый адрес должен присутствовать в этом списке. В противном случае повторный вход будет запрещён.

## Связь с другими механизмами безопасности

{% stepper %}
{% step %}

### Персональная ссылка админки

Если включена функция **«Персональная ссылка админки после входа»**, при смене IP персональный адрес текущей сессии отзывается.

{% content-ref url="/pages/uHKEWAv7eV47thogO94I" %}
[Защита адреса административной панели](/guide/nachalo-raboty/centr-bezopasnosti/zashita-adresa-administrativnoi-paneli)
{% endcontent-ref %}

После повторной авторизации система создаст новую ссылку. Её потребуется снова получить через E-mail и открыть в том же браузере.

Старый персональный URL больше не работает.
{% endstep %}

{% step %}

### Защищённые операции

При завершении сессии закрываются временные доступы, полученные для:

* управления мерчантами;
* управления автовыплатами;
* работы с платёжными реквизитами;
* других защищённых операций.

После нового входа необходимые подтверждения и коды потребуется ввести повторно.
{% endstep %}

{% step %}

### Мультиавторизация

Смена IP завершает всю текущую группу мультиавторизации, а не только выбранный аккаунт.

Подключённые административные аккаунты потребуется авторизовать заново. Это предотвращает сохранение дополнительных аккаунтов внутри сессии, состояние которой больше нельзя считать доверенным.
{% endstep %}
{% endstepper %}

## Отличие от ограничения входа по IP

Контроль изменения IP и ограничение входа по IP выполняют разные задачи.

| Настройка                              | Назначение                                                          |
| -------------------------------------- | ------------------------------------------------------------------- |
| «Контроль изменения IP-адреса»         | Завершает уже активную сессию, если IP изменился                    |
| «Ограничить вход в админ-панель по IP» | Разрешает авторизацию только с заранее указанных адресов и подсетей |

Пример:

1. Администратор может войти с любого IP.
2. После авторизации сессия привязывается к текущему адресу.
3. При изменении адреса сессия завершается.
4. Повторный вход с нового IP разрешён, если глобальное ограничение по списку адресов не включено.

Для максимальной защиты обе настройки можно использовать одновременно.

В таком случае:

* войти можно только с разрешённого адреса;
* после входа сессия привязывается к этому адресу;
* при его изменении текущая авторизация завершается;
* повторный вход разрешается только с адреса из списка.

## Настройка доверенных прокси

Перед включением контроля убедитесь, что Backend правильно определяет реальный IP администратора.

В настройках безопасности находится параметр: **«Выберите установленную защиту от DDOS»**

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/o1W2vTku0rN6lZNvs6VR" %}
[Защита от DDoS-атак](/help-center/administrirovanie/seti-i-bezopasnost/zashita-ot-ddos-atak)
{% endcontent-ref %}

Он определяет, каким прокси-серверам система может доверять при получении реального IP посетителя.

### Если прокси не используется

Если Backend доступен напрямую и перед ним нет Cloudflare, StormWall, балансировщика или reverse proxy, оставьте поле пустым.

### Если используется Cloudflare или другая защита

Выберите файл с IP-подсетями используемого провайдера и обновите список доверенных адресов.

После этого система будет принимать заголовки с реальным IP только от выбранных доверенных прокси.

### Доверие всем прокси

Используйте доверие всем прокси только в том случае, если origin-сервер полностью закрыт от прямого доступа и весь трафик гарантированно проходит через защитный сервис или балансировщик.

Если Backend доступен напрямую, доверие любому прокси может позволить подменять заголовки с IP-адресом.

{% hint style="info" %}
**Важно.** Не включайте общий режим доверия всем прокси без проверки сетевой схемы и ограничения прямого доступа к серверу.
{% endhint %}

## Почему неправильная настройка прокси вызывает выходы

Если доверенные прокси настроены неправильно, Backend может видеть:

* IP Cloudflare вместо IP администратора;
* разные адреса балансировщика;
* внутренний адрес reverse proxy;
* поддельный заголовок клиента;
* чередующиеся IPv4 и IPv6.

В результате система может считать, что IP изменился, хотя администратор не переключал сеть.

Если выход происходит сразу после авторизации, IP входа и IP первого запроса панели, скорее всего, определяются по-разному. Обычно это указывает на неправильную настройку доверенных прокси.

Сначала настройте прокси и определение реального IP, а затем включайте высокий уровень контроля.

## Как включить защиту

1. Проверьте настройки Cloudflare, DDoS-защиты и доверенных прокси.
2. Откройте настройки безопасности.
3. Найдите параметр **«Контроль изменения IP-адреса»**.
4. Выберите **«Завершать вход и уведомлять»**.
5. Нажмите **«Сохранить»**.
6. Выйдите из административной панели.
7. Выполните новый вход.
8. Проверьте работу уведомлений.

Изменение применяется сразу после сохранения. Повторный вход рекомендуется для создания нового согласованного состояния IP.

## Настройка уведомлений

Для режима «Завершать вход и уведомлять» проверьте:

* SmartNotifier включён;
* почтовая доставка настроена;
* у администратора указан действующий E-mail;
* Telegram-уведомления для администраторов настроены;
* включён тип уведомления **«Изменение IP администратора»**;
* очереди Laravel работают;
* Horizon работает, если он используется для управления очередями.

Telegram-уведомление отправляется административной аудитории. Почтовое уведомление направляется владельцу аккаунта, IP которого изменился.

## Как проверить работу

Проверку рекомендуется выполнять через вторую административную учётную запись, чтобы случайно не потерять основной доступ.

1. Войдите в панель через обычное подключение.
2. Убедитесь, что работа продолжается без ошибок.
3. Запомните исходный IP.
4. Смените IP, например подключив проверенный VPN.
5. Выполните любое действие в панели.
6. Убедитесь, что система завершила сессию.
7. Проверьте запись в журнале аудита.
8. При высоком режиме проверьте Telegram и E-mail.
9. Откройте постоянный адрес панели.
10. Выполните новый вход с нового IP.

Если включён список разрешённых адресов, заранее добавьте IP, с которого будет выполняться повторная авторизация.

{% hint style="info" %}
**Важно.** Не проверяйте функцию на главном аккаунте без резервного способа доступа.
{% endhint %}

## Журналирование

При обнаружении смены IP система создаёт событие аудита:

```
Смена IP, авторизация сброшена
```

В записи могут отображаться:

* администратор;
* дата и время;
* предыдущий IP;
* новый IP;
* браузер или устройство;
* результат завершения сессии;
* страница, на которой обнаружено изменение;
* выбранный уровень контроля.

Внутреннее состояние проверки хранит защищённые отпечатки IP и сессии. Открытые адреса используются в журнале и уведомлениях, где они необходимы для проверки события.

## Когда контроль можно отключить

Режим «Не проверять IP» может потребоваться, если:

* мобильный оператор меняет адрес несколько раз за одну сессию;
* VPN автоматически переключает выходной сервер;
* корпоративная сеть использует несколько внешних шлюзов;
* устройство постоянно переключается между IPv4 и IPv6;
* инфраструктура прокси ещё не настроена;
* определить стабильный IP для текущей сети невозможно.

Перед отключением убедитесь, что проблема вызвана сетью, а не попыткой постороннего доступа.

Если контроль невозможно использовать, усилите другие механизмы защиты:

* Google 2FA;
* персональные ссылки;
* подтверждение входа;
* доверенные устройства;
* короткий срок административной сессии;
* защищённые операции;
* контроль активных сессий.

## Частые ошибки

<details>

<summary>Администратора постоянно выбрасывает из панели</summary>

Проверьте по порядку:

1. меняется ли внешний IP;
2. включён ли VPN;
3. использует ли VPN автоматическую ротацию;
4. переключается ли устройство между Wi-Fi и мобильной сетью;
5. чередуются ли IPv4 и IPv6;
6. правильно ли настроен Cloudflare;
7. выбран ли правильный файл доверенных прокси;
8. видит ли Backend адрес клиента или балансировщика;
9. доступен ли origin-сервер напрямую;
10. работает ли хранилище сессий;
11. доступна ли база данных.

Если выход происходит сразу после входа, сравните IP авторизации и IP первого запроса панели.

</details>

<details>

<summary>Уведомление не приходит</summary>

Проверьте:

* выбран ли режим «Завершать вход и уведомлять»;
* включён ли SmartNotifier;
* активен ли тип «Изменение IP администратора»;
* настроены ли Telegram и SMTP;
* указан ли E-mail пользователя;
* работают ли очереди;
* нет ли ошибок в журнале уведомлений.

В режиме «Завершать вход при смене IP» отсутствие уведомления является нормальным поведением.

</details>

<details>

<summary>После смены IP не удаётся войти повторно</summary>

Проверьте, включено ли ограничение входа по списку IP.

Если новый адрес отсутствует в списке разрешённых, система завершит старую сессию, но не разрешит создать новую.

Подключитесь с разрешённого адреса или добавьте новый IP через резервный административный доступ.

</details>

<details>

<summary>Персональная ссылка больше не работает</summary>

При завершении сессии персональная ссылка автоматически отзывается.

Откройте постоянный адрес, выполните новый вход и подтвердите новую ссылку через E-mail.

</details>

<details>

<summary>Сессия завершается при включении VPN</summary>

VPN изменяет внешний IP. Это считается сменой адреса даже на том же устройстве и в том же браузере.

Включайте VPN до авторизации и не меняйте сервер во время работы.

</details>

## Аварийный сброс состояния IP

Если после исправления прокси необходимо удалить сохранённые состояния контроля, технический специалист может выполнить:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

```bash
php artisan admin:security-reset --ip-security
```

Для выполнения без интерактивного подтверждения:

```bash
php artisan admin:security-reset --ip-security --force
```

Команда:

* удаляет сохранённые состояния IP административных сессий;
* не отключает выбранный режим контроля;
* не изменяет список разрешённых IP;
* не отключает другие механизмы безопасности.

При следующем входе или запросе система создаст новое состояние.

Перед сбросом исправьте причину неправильного определения IP. Иначе новая сессия будет завершена повторно.

***

## Рекомендуемая конфигурация

Для большинства проектов рекомендуется:

| Параметр                   | Значение                                                        |
| -------------------------- | --------------------------------------------------------------- |
| Контроль изменения IP      | Завершать вход и уведомлять                                     |
| Доверенные прокси          | Файл используемого провайдера                                   |
| Доверять всем прокси       | Только при полностью закрытом origin-сервере                    |
| Ограничение входа по IP    | Включить для главного администратора при наличии постоянного IP |
| Персональная ссылка        | Включить                                                        |
| Google Authenticator       | Включить                                                        |
| Блокировка атаки на пароль | Включить                                                        |

## Коротко

Контроль изменения IP привязывает административную сессию к адресу, с которого был выполнен вход.

При смене IP система завершает авторизацию, отзывает персональную ссылку, закрывает временные доступы и требует повторного входа. В высоком режиме дополнительно отправляются уведомления безопасности.

Перед включением функции особенно важно настроить Cloudflare, DDoS-защиту, балансировщики и другие доверенные прокси.


# Управление группами пользователей

Группы пользователей используются для разграничения прав доступа и управления функциями панели управления. Каждая группа определяет набор разрешений, которыми будет обладать пользователь.

***

## Группы пользователей

Для настройки групп пользователей в панели управления перейдите в раздел **«Пользователи — Список групп пользователей»**.

В этом разделе уже созданы базовые группы (роли), предназначенные для распределения обязанностей между администраторами, менеджерами и службой поддержки.

<figure><img src="/files/ynvFiyilMMLgagQAQL3h" alt=""><figcaption></figcaption></figure>

Чтобы изменить набор прав:

* выберите нужную группу в списке;
* перейдите к её редактированию, нажав на название;
* на открывшейся странице настройте необходимые права и доступы для данной группы;
* после завершения настройки сохраните изменения.

### Назначение группы пользователю

Для привязки группы к пользователю выполните следующие действия:

<figure><img src="/files/fRjIIA1joeLObRuLDz15" alt=""><figcaption></figcaption></figure>

1. В панели управления откройте раздел **«Пользователи — Список пользователей»**.
2. Выберите нужного пользователя и перейдите к его редактированию, нажав на имя в списке.
3. В поле **«Группа»** выберите подходящую роль из списка.
4. Сохраните изменения.

После этого пользователь получит все права и ограничения, предусмотренные выбранной группой.

***

### Рекомендации по работе с группами

* **Не рекомендуется** назначать группу **«Главные администраторы»** всем пользователям подряд. Данная роль предназначена для владельца обменного сервиса или доверенных лиц с полным доступом к системе.
* Рекомендуется назначать пользователю **одну основную группу**, соответствующую его задачам.
* Если менеджер выполняет обязанности из разных областей, допускается назначение **нескольких групп**, однако перед этим необходимо убедиться, что в одной группе нет прав, которые не должны быть доступны пользователю.
* Используйте группы с пометкой **«до»** в тех случаях, когда роль предоставляется **временно** (например, на период подмены или тестирования).


# Защита от CSRF-атак

## Что такое CSRF?

CSRF — это защита от ситуаций, когда кто-то может **незаметно для вас отправить запросы от вашего имени**, например:\
– изменить пароль\
– удалить данные\
– выйти из аккаунта

Laravel может автоматически **блокировать такие вредные запросы**, если правильно включена защита.

## Что нужно сделать

Всё настраивается один раз на сервере. Ниже — простой список шагов.

### Шаг 1: Открой `.env` и добавь домен фронтенда

В файле `.env` добавьте строки:

```
SANCTUM_STATEFUL_DOMAINS=localhost:4200,domain.com
CORS_SUPPORTS_CREDENTIALS=true
```

Здесь нужно указать адрес, с которого будет работать ваш сайт (Angular).\
Если вы тестируете — используйте `localhost:4200`.

### Шаг 2: Проверь файл `config/sanctum.php`

Найдите строку:

```php
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost')),
```

Убедитесь, что она есть — Laravel будет использовать список доменов из `.env`.

### Шаг 3: Проверь настройки `config/cors.php`

Убедитесь, что они выглядят примерно так:

```php
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['http://localhost:4200', 'https://domain.com'],
'allowed_headers' => ['*'],
'supports_credentials' => env('CORS_SUPPORTS_CREDENTIALS', false),
```

Здесь Laravel разрешает принимать запросы от вашего фронтенда.


# Ограничение доступа к панели управления по IP через Cloudflare

Ограничение доступа по IP позволяет защитить административную панель от несанкционированного доступа.

После настройки открыть административную панель смогут только пользователи с разрешённых IP-адресов. Все остальные запросы будут автоматически заблокированы Cloudflare ещё до обращения к вашему серверу.

Для проектов iEXExchanger данная настройка является одной из рекомендуемых мер безопасности.

### Как работает защита

В стандартной архитектуре iEXExchanger административная панель располагается на отдельном техническом поддомене.

Пример: **app.example.com**

Cloudflare проверяет IP-адрес каждого посетителя до передачи запроса на сервер.

Если IP-адрес отсутствует в списке разрешённых адресов, доступ к административной панели блокируется автоматически.

***

## Проверка DNS-записи

Перед настройкой убедитесь, что технический поддомен работает через Cloudflare.

В панели Cloudflare откройте раздел: **«DNS» — «Records»**

Найдите запись технического поддомена.

Например: **app.example.com**

В колонке: **«Proxy status»**

должно быть указано: **Proxied** и отображаться оранжевое облако.

Если указано: **DNS only**

Cloudflare не сможет фильтровать запросы и защита работать не будет.

***

## Создание правила безопасности

Откройте раздел: **«Security» — «Security rules»**

Нажмите кнопку: **«Create rule»**

Выберите: **«Custom rules»**

***

## Настройка правила

В поле:  **«Rule name»**&#x20;

укажите название правила.

Например: **Restrict Admin Access By IP**

В блоке: **«When incoming requests match...»**

нажмите: **«Edit expression»**

***

## Настройка выражения

Если административная панель располагается на поддомене: **app.example.com**

используйте следующее выражение:

```
(
  http.host eq "app.example.com"
  and not (ip.src in {111.111.111.111 222.222.222.222})
)
```

Замените:

```
111.111.111.111
222.222.222.222
```

на <mark style="color:$success;">**ваши реальные IP-адреса.**</mark>

Если необходимо разрешить только один IP-адрес:

```
(
  http.host eq "app.example.com"
  and not (ip.src in {111.111.111.111})
)
```

{% hint style="warning" %}

## Важно:

IP-адреса внутри фигурных скобок указываются через пробел без запятых.

Правило будет работать следующим образом:

* пользователь открывает технический поддомен панели управления;
* Cloudflare проверяет IP-адрес посетителя;
* если IP-адрес отсутствует в списке разрешённых адресов, запрос блокируется.
  {% endhint %}

***

## Выбор действия

В блоке: **«Then take action»**

выберите: **Block**

После этого нажмите: **«Deploy»**

После сохранения правило начнёт работать автоматически.

***

## Проверка работы

После создания правила выполните проверку.

Откройте административную панель с IP-адреса, который присутствует в списке разрешённых адресов.

Панель должна открываться без ограничений.

Затем попробуйте открыть тот же адрес через другой IP-адрес, который отсутствует в списке разрешённых.

Например:

* мобильный интернет;
* VPN;
* другой провайдер.

Cloudflare должен заблокировать запрос.

***

## Просмотр событий безопасности

Все срабатывания правила можно просмотреть в журнале Cloudflare.

Откройте раздел: **«Security» — «Events»**

Здесь будут отображаться все заблокированные запросы и информация о сработавшем правиле.

***

## Добавление нового IP-адреса

Если необходимо предоставить доступ новому сотруднику:

Откройте созданное правило.

Измените выражение:

```
(
  http.host eq "app.example.com"
  and not (ip.src in {111.111.111.111 222.222.222.222})
)
```

и добавьте новый IP-адрес в список.

Пример:

```
(
  http.host eq "app.example.com"
  and not (ip.src in {111.111.111.111 222.222.222.222 333.333.333.333})
)
```

После сохранения новый IP-адрес получит доступ к административной панели.

***

## Защита от обхода Cloudflare

Ограничение доступа по IP работает только для запросов, проходящих через Cloudflare.

Если злоумышленник узнает реальный IP-адрес вашего сервера, он может попытаться обратиться к нему напрямую, минуя Cloudflare.

Для дополнительной защиты рекомендуется:

* разрешить доступ к портам 80 и 443 только с IP-адресов Cloudflare;
* ограничить SSH-доступ только доверенными IP-адресами;
* использовать VPN для административного доступа;
* скрыть реальный IP-адрес сервера.

Дополнительные рекомендации по защите инфраструктуры представлены в разделе «Операционная безопасность (OPSEC)».

***

## Рекомендации по безопасности

* Используйте двухфакторную аутентификацию для всех административных аккаунтов.
* Не передавайте доступ к панели управления третьим лицам.
* Регулярно проверяйте список разрешённых IP-адресов.
* Используйте статический IP-адрес или VPN с постоянным IP.
* Контролируйте события безопасности в журнале Cloudflare.
* Не отключайте правило без необходимости.

После выполнения данной настройки административная панель iEXExchanger будет доступна только с разрешённых IP-адресов.


# Настройка защиты Fail2ban

Fail2Ban — это система автоматической защиты сервера от перебора паролей, сканирования портов и попыток несанкционированного доступа.

Программа анализирует журналы системы и автоматически блокирует IP-адреса, с которых выполняются подозрительные действия. Это позволяет значительно снизить риск взлома сервера через SSH и другие сетевые службы.

Для проектов iEXExchanger использование Fail2Ban является одной из рекомендуемых мер безопасности.

***

## Что защищает Fail2Ban

После настройки Fail2Ban может автоматически обнаруживать:

* перебор паролей SSH;
* попытки подбора логинов;
* массовые ошибки авторизации;
* автоматические сканеры уязвимостей;
* ботов, пытающихся получить доступ к серверу.

При обнаружении подозрительной активности IP-адрес нарушителя автоматически блокируется на заданное время.

***

## Перед началом

Перед настройкой убедитесь, что:

* сервер работает под управлением Debian 12;
* установлен FastPanel;
* имеется SSH-доступ к серверу;
* вы знаете свой IP-адрес.

Если вы не знаете свой IP-адрес, откройте сайт:

```
https://whatismyipaddress.com
```

или

```
https://ipinfo.io
```

Сохраните свой IP-адрес. Он потребуется для добавления в список исключений.

***

## Подключение к серверу

Подключитесь к серверу по SSH.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Пример подключения:

```bash
ssh root@IP_АДРЕС_СЕРВЕРА
```

Пример:

```bash
ssh root@192.168.1.100
```

После подключения введите пароль пользователя root.

***

## Установка Fail2Ban

Обновите список пакетов:

```bash
apt update
```

Установите Fail2Ban:

```bash
apt install fail2ban -y
```

После завершения установки проверьте состояние службы:

```bash
systemctl status fail2ban
```

Если установка выполнена успешно, служба должна находиться в состоянии:

```
active (running)
```

***

## Создание пользовательской конфигурации

Не рекомендуется изменять системный файл:

```
/etc/fail2ban/jail.conf
```

Все пользовательские настройки необходимо хранить отдельно.

Создайте файл конфигурации:

```bash
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
```

После этого откройте файл:

```bash
nano /etc/fail2ban/jail.local
```

***

## Настройка защиты SSH

Найдите раздел:

```
[sshd]
```

Замените его содержимое следующим образом:

```ini
[sshd]
enabled = true
port = ssh
backend = systemd

maxretry = 5
findtime = 10m
bantime = 24h

ignoreip = 127.0.0.1/8 ВАШ_IP
```

Пример:

```ini
[sshd]
enabled = true
port = ssh
backend = systemd

maxretry = 5
findtime = 10m
bantime = 24h

ignoreip = 127.0.0.1/8 203.0.113.10
```

***

## Объяснение настроек

<table><thead><tr><th width="255.23046875">Параметр</th><th>Значение</th></tr></thead><tbody><tr><td>enabled</td><td>Включает защиту SSH</td></tr><tr><td>port</td><td>Порт SSH</td></tr><tr><td>backend</td><td>Источник системных журналов</td></tr><tr><td>maxretry</td><td>Количество допустимых ошибок авторизации</td></tr><tr><td>findtime</td><td>Период анализа попыток входа</td></tr><tr><td>bantime</td><td>Время блокировки IP-адреса</td></tr><tr><td>ignoreip</td><td>Белый список IP-адресов</td></tr></tbody></table>

Логика работы:

Если за 10 минут будет выполнено более 5 неудачных попыток входа, IP-адрес автоматически блокируется на 24 часа.

***

## Если используется нестандартный SSH-порт

Если SSH работает на нестандартном порту, например:

```
2222
```

укажите его в настройках:

```ini
port = 2222
```

Проверить текущий SSH-порт можно командой:

```bash
ss -tulpn | grep ssh
```

***

## Перезапуск Fail2Ban

После изменения конфигурации сохраните файл и выполните:

```bash
systemctl restart fail2ban
```

Проверьте состояние службы:

```bash
systemctl status fail2ban
```

***

## Включение автоматического запуска

Чтобы защита запускалась автоматически после перезагрузки сервера:

```bash
systemctl enable fail2ban
```

***

## Проверка работы

Посмотреть активные правила:

```bash
fail2ban-client status
```

Пример результата:

```
Status
|- Number of jail: 1
`- Jail list: sshd
```

***

## Просмотр заблокированных IP-адресов

Посмотреть информацию по защите SSH:

```bash
fail2ban-client status sshd
```

Пример:

```
Status for the jail: sshd
|- Currently failed: 0
|- Total failed: 15
`- Banned IP list:
   192.168.1.15
   10.10.10.10
```

***

## Разблокировка IP-адреса

Если необходимо вручную снять блокировку:

```bash
fail2ban-client set sshd unbanip IP_АДРЕС
```

Пример:

```bash
fail2ban-client set sshd unbanip 203.0.113.10
```

***

## Просмотр журналов Fail2Ban

Для просмотра последних событий:

```bash
tail -f /var/log/fail2ban.log
```

В журнале отображаются:

* блокировки IP-адресов;
* разблокировки;
* ошибки конфигурации;
* информация о работе службы.

***

## Рекомендации по безопасности

Для максимальной защиты сервера рекомендуется дополнительно:

* изменить стандартный SSH-порт;
* использовать авторизацию по SSH-ключам;
* отключить вход по паролю для root;
* ограничить доступ к SSH по IP через Firewall;
* включить двухфакторную аутентификацию для панели управления;
* использовать Cloudflare для защиты публичных сервисов.

Fail2Ban не заменяет Firewall или Cloudflare, а является дополнительным уровнем защиты сервера.


# Советы по безопасности от BestChange

{% hint style="success" %}
i<mark style="color:green;">EXExchanger соответствует всем требованиям, менеджерам обменных пунктом следует включить и настроить пункты.</mark>
{% endhint %}

## Безопасность доступа

1. 2FA входа в панель управления сайтом **\[обязательное]**;
2. дополнительная защита для доступа к файлам сайта ОП помимо пароля, например, 2FA, доступ из офисной VPN;
3. доступ к панели администратора сайта только с определенных IP-адресов/браузеров/устройств;
4. разграничение прав доступа для разных сотрудников;
5. запрет или отсутствие прямого доступа к счетам и/или кошелькам, содержащим резерв ОП из панели администратора;
6. оповещение о факте входа в панель администратора;
7. оповещение о ключевых действиях оператора, администратора;
8. отслеживание активность в корневой папке сайта с оповещением о загрузке или изменении файлов;
9. запись истории ключевых действий оператора, администратора, активности в корневой папке сайта, загрузки или изменении файлов;
10. принимаемые от пользователей файлы загружаются и просматриваются на устройствах, не связанных с рабочими процессами обменного пункта, при необходимости принять какие-либо файлы, кроме растровых это происходит при помощи соответствующего хостинга.
11. на устройствах, с которых осуществляется работа установлены платные популярные антивирусные программы (Eset, Kaspersky, DrWeb) с оперативно обновляемыми базами и модулями.
12. Защита от DDoS **\[обязательное].**

## Безопасность рабочего процесса

1. осуществление передачи реквизитов только через сайт обменного пункта;
2. в состав обязательных реквизитов входит актуальный E-mail клиента;
3. замена реквизитов по просьбе клиента осуществляться только по средствам указанного клиентом в заявке E-mail (с обязательной проверкой заголовка письма на подлинность адреса отправителя) или создания новой заявки;
4. На сайте ОП отсутствуют названия аккаунтов мессенджеров, вместо этого присутствуют кликабельные кнопки;
5. ссылки на обменные боты отсутствуют или скрыты для пользователей, переходящих из мониторинга;
6. прием криптовалют осуществляется на уникальные адреса (по крайней мере в рамках одной рабочей смены);
7. приема средств через банкинг производится после верификации счета или реквизиты для приема средств через банкинг содержат телефон, привязанный к банковской карте, с которой клиент осуществляет перевод, перед исполнением заявки производится проверка принадлежности номера к банковской карте и запрашивается подтверждение операции по номеру;
8. при отсутствии круглосуточной поддержки блокировать прием в мониторинг экспортного файла курсов из панели управления обменным пунктом в мониторинге в не рабочее время;
9. при работе с криптовалютами исключить вероятность нахождения нежелательной предыстории в отправляемых клиентам транзакциях **\[обязательное]**;
10. организовать AML-проверки транзакций и разместить соответствующую информацию на сайте обменного пункта на страницах обмена, передавать в мониторинг соответствующие метки, а также дополнить правила использования сайта обменного пункта.

## Проверка персонала

1. подписание соглашений, устанавливающих уровень ответственности сотрудников;
2. проведение тестов с применением полиграфа на регулярной основе.

## Аудит безопасности (Встреча с администратором BestChange)

* статус и размер организации;
* основные принципы и политики работы обменного пункта в части касающейся работы с клиентами;
* основные принципы и политики работы обменного пункта в части касающейся безопасности;
* уровень организации безопасности вашего обменного пункта;
* методы работы со зловредным трафиком;
* способы и эффективность взаимодействия с пользователями, общий уровень сервиса;
* популярность отдельных направлений и перспективы добавления новых направлений;
* способы привлечения трафика.


# Конфигурация брандмауэра UFW

UFW (Uncomplicated Firewall) — это встроенный брандмауэр Linux, который позволяет контролировать входящие сетевые подключения к серверу.

С помощью UFW можно разрешить доступ только к необходимым сервисам и автоматически блокировать все остальные подключения.

Для проектов iEXExchanger использование брандмауэра является обязательной мерой безопасности и рекомендуется для всех серверов без исключения.

***

## Что защищает UFW

После настройки UFW позволяет:

* ограничить доступ к серверу только необходимыми портами;
* скрыть неиспользуемые сервисы от внешней сети;
* снизить количество автоматических атак и сканирований;
* ограничить доступ к панели управления сервером;
* защитить внутренние сервисы от прямого доступа из Интернета.

***

## Перед началом

Перед настройкой убедитесь, что:

* сервер работает под управлением Debian 12;
* установлен FastPanel;
* имеется SSH-доступ к серверу;
* вы знаете используемый SSH-порт.

Если используется стандартный SSH-порт, обычно это:

```
22
```

Если ранее порт был изменён, используйте свой номер порта.

***

## Важное предупреждение

Перед включением UFW обязательно разрешите доступ к SSH.

Если включить брандмауэр без открытия SSH-порта, сервер станет недоступен и потребуется доступ через консоль хостинг-провайдера.

***

## Подключение к серверу

Подключитесь к серверу по SSH.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh)
{% endcontent-ref %}

Пример:

```bash
ssh root@IP_АДРЕС_СЕРВЕРА
```

После подключения выполните настройку.

***

## Установка UFW

Обновите список пакетов:

```bash
apt update
```

Установите UFW:

```bash
apt install ufw -y
```

Проверьте состояние:

```bash
ufw status
```

Если брандмауэр ещё не включён, будет отображено:

```
Status: inactive
```

***

## Сброс старых правил

Если сервер использовался ранее и вы не уверены в существующих настройках, рекомендуется очистить конфигурацию.

```bash
ufw reset
```

Подтвердите действие:

```
y
```

***

## Настройка политики безопасности

Запретить все входящие подключения по умолчанию:

```bash
ufw default deny incoming
```

Разрешить исходящие подключения:

```bash
ufw default allow outgoing
```

Проверить настройки:

```bash
ufw status verbose
```

***

## Разрешение SSH

Если используется стандартный SSH-порт:

```bash
ufw allow 22/tcp
```

или

```bash
ufw allow ssh
```

Если используется нестандартный порт, например:

```
2222
```

выполните:

```bash
ufw allow 2222/tcp
```

***

## Разрешение доступа к сайтам

Для работы сайта необходимо открыть HTTP и HTTPS.

```bash
ufw allow 80/tcp
```

```bash
ufw allow 443/tcp
```

***

## Разрешение доступа к FastPanel

По умолчанию FastPanel использует порт:

```
8888
```

или

```
8080
```

в зависимости от версии панели.

Если панель работает через порт 8888:

```bash
ufw allow 8888/tcp
```

Если используется порт 8080:

```bash
ufw allow 8080/tcp
```

Если доступ к панели управления ограничен по IP, рекомендуется разрешать доступ только со своего IP-адреса.

Пример:

```bash
ufw allow from 203.0.113.10 to any port 8888 proto tcp
```

***

## Redis

Если Redis используется только внутри сервера, открывать порт Redis не требуется.

Порт:

```
6379
```

должен быть доступен только локально.

Проверить:

```bash
ss -tulpn | grep 6379
```

Если Redis слушает:

```
127.0.0.1:6379
```

дополнительная настройка не требуется.

***

## Laravel Reverb и WebSocket

Если используется Laravel Reverb, обычно применяется порт:

```
8080
```

или другой внутренний порт.

Если подключение происходит через Nginx Proxy Pass, открывать данный порт в UFW не требуется.

Рекомендуется оставлять WebSocket доступным только локально:

```
127.0.0.1
```

***

## Включение брандмауэра

После добавления всех необходимых правил включите UFW:

```bash
ufw enable
```

Подтвердите действие:

```
y
```

После включения появится сообщение:

```
Firewall is active and enabled on system startup
```

***

## Проверка правил

Посмотреть текущие правила:

```bash
ufw status numbered
```

Пример:

```
Status: active

[1] 22/tcp      ALLOW IN Anywhere
[2] 80/tcp      ALLOW IN Anywhere
[3] 443/tcp     ALLOW IN Anywhere
[4] 8888/tcp    ALLOW IN Anywhere
```

***

## Удаление правила

Чтобы удалить правило:

```bash
ufw status numbered
```

Найдите номер правила.

Например:

```
[4] 8888/tcp
```

Удалите его:

```bash
ufw delete 4
```

***

## Временное отключение UFW

При необходимости:

```bash
ufw disable
```

Повторное включение:

```bash
ufw enable
```

***

## Проверка открытых портов

Проверить активные сервисы:

```bash
ss -tulpn
```

Проверить прослушиваемые порты:

```bash
ss -tulpn | grep LISTEN
```

После настройки рекомендуется убедиться, что открыты только необходимые порты.

***

## Рекомендуемая конфигурация для iEXExchanger

Для большинства проектов достаточно следующего набора:

<table><thead><tr><th width="222.02734375">Порт</th><th>Назначение</th></tr></thead><tbody><tr><td>22</td><td>SSH</td></tr><tr><td>80</td><td>HTTP</td></tr><tr><td>443</td><td>HTTPS</td></tr><tr><td>8888 или 8080</td><td>FastPanel</td></tr></tbody></table>

Все остальные входящие подключения рекомендуется блокировать.

***

## Дополнительная защита

Для повышения безопасности рекомендуется дополнительно настроить:

* Fail2Ban;
* Cloudflare;
* ограничение доступа к административной панели по IP;
* двухфакторную аутентификацию;
* защиту Origin Server от прямого доступа;
* регулярное обновление системы.


# Защита от регистрации с нежелательных почтовых адресов

Настройка **«Защита от регистрации с нежелательных почтовых адресов»** ограничивает использование почтовых доменов при регистрации клиентов и создании заявок.

С её помощью можно запретить отдельные домены, разрешить регистрацию только с заранее выбранных доменов или проверять, существует ли указанный почтовый домен и может ли он принимать почту.

Почтовый домен — это часть e-mail после символа `@`. Например, в адресе:

```
client@example.com
```

почтовым доменом является:

```
example.com
```

{% hint style="info" %}
Ограничение применяется ко всему домену, а не к отдельному адресу.

Если добавить `example.com` в список запрещённых доменов, проверку не пройдут все адреса этого домена, включая `client@example.com`, `manager@example.com` и другие.
{% endhint %}

## Где применяется проверка

Почтовая защита используется при регистрации клиента на сайте, создании гостевой заявки и автоматическом создании учётной записи во время обмена.

Проверка также выполняется, когда клиент создаёт аккаунт через подключённый внешний сервис входа или указывает настоящий e-mail в Telegram Mini App.

Настройка действует на весь обменный пункт. Отдельные списки для направлений обмена, валют и языков не предусмотрены.

Существующие пользователи и ранее созданные заявки повторно не проверяются. Включение защиты не блокирует готовые аккаунты и не изменяет сохранённые заявки.

Настройка не управляет отправкой писем, SMTP-подключением и шаблонами уведомлений.

## Как работает проверка

После получения нового e-mail система проверяет адрес в следующем порядке:

1. Проверяет состояние настройки **«Защита от регистрации с нежелательных почтовых адресов»**.
2. Проверяет формат e-mail и наличие домена после символа `@`.
3. Проверяет DNS-записи почтового домена.
4. Сравнивает домен со списком **«Разрешенные почтовые домены»**, если этот список заполнен.
5. Проверяет отсутствие домена в списке **«Запрещенные почтовые домены»**.

Для прохождения технической проверки у домена должна существовать запись MX или A.

MX-запись указывает сервер, который принимает почту домена. A-запись связывает домен с IP-адресом сервера.

Проверка подтверждает существование домена, но не проверяет отдельный почтовый ящик. Например, домен `example.com` может пройти проверку, даже если адрес `client@example.com` в действительности не создан.

{% hint style="warning" %}
В системе нет автоматически обновляемого списка временных почтовых сервисов.

Если временный почтовый домен технически доступен, он будет принят, пока вы не добавите его в **«Запрещенные почтовые домены»** или не включите закрытый список разрешённых доменов.
{% endhint %}

## Варианты работы

**Защита выключена** — дополнительная проверка почтового домена не выполняется.

**Защита включена, оба списка пустые** — система проверяет формат e-mail и техническую доступность домена.

**Заполнено только поле «Разрешенные почтовые домены»** — принимаются только адреса с доменами из этого списка.

**Заполнено только поле «Запрещенные почтовые домены»** — принимаются все технически доступные домены, кроме указанных в списке.

**Заполнены оба поля** — домен должен присутствовать в разрешённом списке и отсутствовать в запрещённом.

Если один домен указан в обоих полях, применяется запрет.

Для обычного публичного обменного пункта чаще используется поле **«Запрещенные почтовые домены»**. Оно позволяет блокировать отдельные нежелательные сервисы, не ограничивая остальные адреса.

Поле **«Разрешенные почтовые домены»** подходит для закрытого обменного пункта, в котором клиенты могут использовать только корпоративные, партнёрские или другие заранее известные домены.

## Где находится настройка

В панели управления откройте: **«Настройки» — «Общие настройки»**

<figure><img src="/files/sObosmkXfTBudK6Ugua1" alt=""><figcaption></figcaption></figure>

В категории **«Основные»** выберите **«Посетители»**.

На странице **«Настройки пользователей»** найдите блок **«Почтовая защита»**.

## Необходимые права доступа

Для изменения почтовой защиты сотруднику требуется право **«Настройки пользователей»** из группы прав **«Настройки»**.

Также доступ может быть открыт через право **«Общие настройки»** из группы **«Админпанель»**, но оно разрешает работу и с другими разделами общих настроек. Не выдавайте его только ради управления почтовой защитой, если достаточно более узкого права **«Настройки пользователей»**.

Чтобы предоставить доступ, в панели управления откройте: **«Пользователи» — «Список групп пользователей»**

Откройте группу, к которой относится сотрудник. В группе прав **«Настройки»** отметьте **«Настройки пользователей»** и нажмите **«Сохранить изменения»**.

Для изменения группы у текущего администратора должны быть права **«Просмотр групп пользователей»**, **«Создание и изменение групп»** и **«Выдача важных прав»**. Администратор не сможет выдать разрешение, которого нет у него самого.

После сохранения войдите под учётной записью сотрудника и убедитесь, что в **«Общие настройки»** отображается раздел **«Посетители»**.

Если необходимого права нет, раздел не отображается. При попытке открыть или сохранить его напрямую система показывает сообщение:

```
Недостаточно прав для этого раздела настроек.
```

## Настройка почтовой защиты

В панели управления откройте: **«Настройки» — «Общие настройки»**

Выберите **«Основные» — «Посетители»** и найдите блок **«Почтовая защита»**.

Переведите настройку **«Защита от регистрации с нежелательных почтовых адресов»** в состояние **«Включен»**.

После включения станут доступны поля **«Разрешенные почтовые домены»** и **«Запрещенные почтовые домены»**.

Для проверки только формата e-mail и технической доступности домена оставьте оба поля пустыми.

Чтобы принимать адреса только с определённых доменов, заполните **«Разрешенные почтовые домены»**.

Чтобы блокировать отдельные домены, оставьте разрешённый список пустым и заполните **«Запрещенные почтовые домены»**.

После настройки нажмите **«Сохранить»**.

При успешном сохранении система показывает сообщение:

```
Настройки успешно сохранены
```

Это сообщение подтверждает сохранение текста в полях, но не означает, что каждый указанный домен введён правильно или имеет действующие DNS-записи.

## Разрешённые почтовые домены

Поле **«Разрешенные почтовые домены»** создаёт закрытый список.

Если в нём указана хотя бы одна запись, адреса со всех остальных доменов будут отклоняться.

Например, если добавить:

```
mail.company.ru
```

адрес:

```
client@mail.company.ru
```

сможет пройти проверку списка, а адреса:

```
client@company.ru
client@other-company.ru
```

будут отклонены.

Основной домен и его поддомены проверяются отдельно. Запись `company.ru` не разрешает автоматически `mail.company.ru`.

{% hint style="warning" %}
Не добавляйте в **«Разрешенные почтовые домены»** один тестовый домен на рабочем сайте без предварительной проверки.

После сохранения все остальные домены перестанут проходить проверку.
{% endhint %}

## Запрещённые почтовые домены

Поле **«Запрещенные почтовые домены»** блокирует адреса с указанными доменами.

Если поле **«Разрешенные почтовые домены»** пустое, остальные адреса с корректными и технически доступными доменами продолжат приниматься.

Например, запись:

```
temporary.example.com
```

заблокирует адрес:

```
client@temporary.example.com
```

но не заблокирует:

```
client@example.com
```

## Формат списка доменов

Каждый домен можно указать с новой строки:

```
example.com
mail.example.com
```

Также домены можно перечислить через запятую:

```
example.com, mail.example.com
```

При обработке списка система удаляет пробелы перед доменом и после него, не учитывает регистр букв и разделяет записи по запятым и переносам строк.

Сравнение выполняется по точному совпадению.

В поля нужно добавлять только домен:

```
example.com
```

Не указывайте полный e-mail:

```
client@example.com
```

Не добавляйте символ `@`:

```
@example.com
```

Не используйте полный адрес сайта:

```
https://example.com
```

Не добавляйте пути:

```
example.com/register
```

Не используйте маски:

```
*.example.com
```

Не разделяйте домены точкой с запятой.

Маски и автоматическое включение поддоменов не поддерживаются. Если требуется разрешить или запретить основной домен и поддомен, добавьте каждое значение отдельно:

```
example.com
mail.example.com
```

## Связь с другими настройками регистрации

{% stepper %}
{% step %}

### Отключить автоматическую регистрацию клиентов

Настройка **«Отключить автоматическую регистрацию клиентов»** определяет, должна ли гостевая заявка создавать учётную запись клиента.

Она не отключает почтовую защиту.

Если при создании заявки передаётся e-mail, его домен может быть проверен и отклонён, даже если автоматическая регистрация клиентов выключена.
{% endstep %}

{% step %}

### Отключить поле для ввода e-mail адреса

Эта настройка находится отдельно.

В панели управления откройте: **«Настройки» — «Общие настройки»**

Выберите **«Основные» — «Обмен»** и найдите блок **«Создание и отображение заявки»**.

Если настройка **«Отключить поле для ввода e-mail адреса»** включена, гость не указывает собственный e-mail. Клиентский сайт формирует служебный адрес с использованием своего домена.

Например, для сайта:

```
https://ваш_домен
```

служебный адрес будет использовать домен:

```
ваш_домен
```

{% hint style="warning" %}
Если поле **«Разрешенные почтовые домены»** заполнено, добавьте в него точный домен клиентского сайта без `https://` и дополнительных путей.

Иначе почтовая защита может отклонить служебный адрес и остановить создание гостевой заявки.
{% endhint %}

Если клиентский сайт открывается по адресу:

```
https://www.ваш_домен
```

добавьте:

```
www.ваш_домен
```

Записи `ваш_домен` и `www.ваш_домен` считаются разными.

Также убедитесь, что домен клиентского сайта не добавлен в **«Запрещенные почтовые домены»**.
{% endstep %}
{% endstepper %}

## Что изменится после сохранения

Новые попытки регистрации, создания заявки и привязки e-mail будут проверяться по сохранённым правилам.

Если адрес не проходит проверку, текущая операция прекращается. Учётная запись, заявка или привязка нового e-mail в рамках этой попытки не создаётся.

У оператора не появляется новая заявка или отдельный статус, связанный с отклонённой попыткой.

При отключении настройки **«Защита от регистрации с нежелательных почтовых адресов»** дополнительная проверка прекращается.

Поля со списками доменов скрываются, но сохранённые значения не удаляются. После повторного включения защиты они снова отображаются и начинают применяться.

## Сообщения при отклонении адреса

**«Некорректный формат email.»** — проверьте написание адреса и наличие корректного домена после символа `@`.

**«Почтовый домен не существует или не принимает почту.»** — у указанного домена отсутствуют доступные записи MX и A либо DNS-проверка вернула отрицательный результат.

**«Регистрация с этого почтового домена не разрешена.»** — поле **«Разрешенные почтовые домены»** заполнено, но введённого домена в нём нет.

**«Регистрация с этого почтового домена запрещена.»** — введённый домен присутствует в поле **«Запрещенные почтовые домены»**.

Проверка формата и DNS выполняется раньше проверки списков. Поэтому технически недоступный домен может получить сообщение о формате или отсутствии почтового домена, даже если он добавлен в запрещённый список.

## Проверка настройки

Для проверки используйте тестовый домен с действующими DNS-записями. Не добавляйте в тестовый запрет домен, который в этот момент используют реальные клиенты.

1. Настройте защиту и нажмите **«Сохранить»**.
2. Повторно откройте раздел **«Основные» — «Посетители»**.
3. Убедитесь, что состояние настройки и введённые домены сохранились.
4. Откройте клиентский сайт в режиме инкогнито.
5. Выполните регистрацию или начните создание гостевой заявки с новым тестовым e-mail.
6. Проверьте адрес с разрешённым доменом.
7. Проверьте адрес с запрещённым доменом.
8. Если используется закрытый список, проверьте адрес с действующим доменом, которого в списке нет.
9. Убедитесь, что отклонённый пользователь не появился в разделе **«Пользователи» — «Список пользователей»**.
10. Убедитесь, что отклонённая заявка не появилась в разделе **«Заявки» — «Список заявок»**.
11. Удалите временные тестовые значения.
12. Верните рабочие домены и повторно нажмите **«Сохранить»**.

Настройка работает правильно, если разрешённые домены проходят проверку, запрещённые отклоняются, а служебный e-mail гостевой заявки не блокируется.

## Если защита работает не так, как ожидается

<details>

<summary>Запрещённый домен продолжает приниматься</summary>

В панели управления откройте:

**«Настройки» — «Общие настройки»**

Выберите **«Основные» — «Посетители»** и найдите блок **«Почтовая защита»**.

Убедитесь, что настройка **«Защита от регистрации с нежелательных почтовых адресов»** находится в состоянии **«Включен»**.

Проверьте значение в поле **«Запрещенные почтовые домены»**. В нём должен быть указан только домен после `@`, без полного e-mail, символа `@`, протокола `https://` и маски.

Если клиент использует адрес:

```
client@mail.example.com
```

запись:

```
example.com
```

его не заблокирует. Добавьте точный поддомен:

```
mail.example.com
```

После изменения создайте новую регистрацию или гостевую заявку. Уже существующий аккаунт повторно не проверяется.

</details>

<details>

<summary>После включения защиты гости не могут создать заявку</summary>

Проверьте поле **«Разрешенные почтовые домены»**. Если в нём есть хотя бы одна запись, все отсутствующие домены отклоняются.

Если включена настройка **«Отключить поле для ввода e-mail адреса»**, добавьте в разрешённый список точный домен клиентского сайта.

Также убедитесь, что этот домен отсутствует в поле **«Запрещенные почтовые домены»**.

После исправления нажмите **«Сохранить»** и повторите проверку в режиме инкогнито.

</details>

<details>

<summary>Разрешённый адрес отклоняется</summary>

Сравните домен e-mail с записью в поле **«Разрешенные почтовые домены»**. Совпадение должно быть точным.

Проверьте основной домен и поддомен. Например, `example.com` и `mail.example.com` считаются разными значениями.

Убедитесь, что этот же домен не добавлен в **«Запрещенные почтовые домены»**. Если он находится в обоих списках, применяется запрет.

Также проверьте наличие у домена действующих записей MX или A. Наличие домена в разрешённом списке не отменяет техническую DNS-проверку.

</details>

<details>

<summary>Изменение DNS не повлияло на результат</summary>

Результат проверки MX- и A-записей сохраняется в кеше на 24 часа.

После создания или исправления DNS-записей система может продолжать использовать предыдущий результат до окончания этого периода.

Изменение списков **«Разрешенные почтовые домены»** и **«Запрещенные почтовые домены»** применяется отдельно и не требует ожидания DNS-кеша.

</details>

<details>

<summary></summary>

</details>


# Валюты


# Управление валютами

Инструкция по работе с валютами

Модуль **«Валюты»** — один из основных разделов iEXExchanger. Здесь создаются и настраиваются все валюты, которые затем используются в направлениях обмена.

Валютой в системе может быть:

* банк;
* платёжная система;
* криптовалюта;
* токен в определённой сети;
* наличная валюта;
* другой способ приёма или выплаты средств.

Например:

```
Сбербанк RUB
USDT TRC20
Bitcoin BTC
Наличные AED
```

В карточке валюты настраиваются её название и код, поля реквизитов, тексты для клиента, верификация, мерчанты, автовыплаты, AML-проверки, резервы, лимиты и дополнительные функции.

Эти настройки используются во всех направлениях, где участвует валюта. Например, правила мерчантов и проверки карты обычно применяются, когда валюта находится на стороне **«Отдаю»**, а выплаты и резерв — когда она находится на стороне **«Получаю»**.

Если для отдельного направления настроены собственные правила, они могут иметь приоритет над настройками валюты. Поэтому при поиске ошибки необходимо проверять не только карточку валюты, но и настройки конкретного направления.

{% hint style="info" %}

## Важно учитывать

Настройки валюты могут повлиять сразу на несколько работающих направлений.

Не меняйте одновременно платёжную систему, код, XML-обозначение, сеть, мерчанты, выплаты и реквизиты у активной валюты.

Для существенного изменения безопаснее:

1. Временно отключить валюту или связанные направления.
2. Внести изменения.
3. Сохранить настройки.
4. Создать тестовое направление или заявку.
5. Проверить реквизиты, курс, резерв и автоматизацию.
6. Только после проверки вернуть валюту в работу.
   {% endhint %}

***

В панели управления перейдите в раздел **«Основное — Валюты — Список валют».** Здесь отображается список всех валют с текущими настройками.

<figure><img src="/files/vIFPttl3QTC9qayl0qyA" alt=""><figcaption></figcaption></figure>

Чтобы добавить новую валюту, нажмите кнопку **«Добавить валюту»**.

В появившемся окне выберите ранее созданную Платёжную систему и соответствующий Код валюты.

После выбора обязательно свяжите валюту с платёжной системой и кодом валюты, а затем выполните все необходимые настройки для её корректной работы.

<figure><img src="/files/8QuP0VERXtAyslMs37oS" alt=""><figcaption></figcaption></figure>

{% stepper %}
{% step %}

#### Платежная система

{% content-ref url="/pages/FljLdANBrcGFfSeU3i4b" %}
[Платёжные системы](/guide/obmen/valyuty/platyozhnye-sistemy)
{% endcontent-ref %}

Выберите из списка платёжную систему, с которой будет связана создаваемая валюта.

Например: Perfect Money, Tether TRC20, Qiwi, Bitcoin и т.д.
{% endstep %}

{% step %}

#### Код валюты

{% content-ref url="/pages/VcUqtA2ulSzzQz9CicRP" %}
[Коды валют](/guide/obmen/valyuty/kody-valyut)
{% endcontent-ref %}

Далее выберите код валюты из предложенного списка (например: USD, USDT, BTC, ETH).

Код определяет, какую именно валюту система будет использовать при обменах и расчётах.
{% endstep %}
{% endstepper %}

После выбора всех параметров нажмите **«Добавить»** — валюта появится в общем списке и будет доступна для дальнейшей настройки.

Чтобы изменить параметры созданной валюты, просто откройте её, нажав на название в списке.

<figure><img src="/files/pnYVS4MSTARdAl21eEUL" alt=""><figcaption></figcaption></figure>

***

## Общее

Группа **«Общее»** содержит базовые настройки валюты, поля платёжных реквизитов и тексты, которые отображаются клиенту во время оформления и оплаты заявки.

<figure><img src="/files/7ir1si8S4uGzrUg5t7DS" alt=""><figcaption></figcaption></figure>

Здесь определяется, к какой платёжной системе относится валюта, какой код она использует, как называется на сайте, с какой точностью рассчитываются суммы и какие реквизиты должен указать клиент.

Настройки валюты могут использоваться сразу в нескольких направлениях обмена. Поэтому изменение рабочей валюты способно повлиять на калькулятор, направления, реквизиты, курсы, резерв, экспорт и уже настроенные интеграции.

{% content-ref url="/pages/KH07IRh2EqFkCoY2G85F" %}
[Общее](/guide/obmen/valyuty/upravlenie-valyutami/obshee)
{% endcontent-ref %}

***

## Верификация

Группа **«Верификация»** содержит базовые настройки проверки банковской карты, платёжного реквизита и личности клиента.

<figure><img src="/files/gevOfRK6JUXThS7v5WlN" alt=""><figcaption></figcaption></figure>

Эти правила применяются во всех направлениях, где выбранная валюта используется на стороне **«Отдаю»**.

Например, если для валюты **«Сбербанк RUB»** включить проверку новой карты, клиенту потребуется подтвердить карту во всех направлениях, где он отдаёт Сбербанк RUB.

В группу входят:

* **«Карт»**;
* **«Личности»**.

{% content-ref url="/pages/9koJVLCrT26DDsrAWiAz" %}
[Верификация](/guide/obmen/valyuty/upravlenie-valyutami/verifikaciya)
{% endcontent-ref %}

***

## Автоматизация

Группа **«Автоматизация»** связывает валюту с сервисами, которые принимают платежи, выполняют автоматические выплаты и проверяют криптовалютные операции через AML-сервисы.

<figure><img src="/files/VcOXFk5p8MLp9vFU886R" alt=""><figcaption></figcaption></figure>

Эти настройки используются как базовые для всех направлений, в которых участвует выбранная валюта:

* мерчанты работают, когда валюта находится на стороне **«Отдаю»**;
* выплаты работают, когда валюта находится на стороне **«Получаю»**;
* AML-проверки могут применяться к адресу клиента, входящей транзакции или автовыплате.

Выбор сервиса в карточке валюты не заменяет его основную настройку. Перед подключением убедитесь, что модуль установлен, включён, имеет рабочие API-ключи и поддерживает нужную валюту или сеть.

В группу входят:

* **«Мерчанты»**;
* **«Выплаты»**;
* **«AML анализ»**.

{% content-ref url="/pages/yKfHnOPJ7PRMrKJGACki" %}
[Автоматизация](/guide/obmen/valyuty/upravlenie-valyutami/avtomatizaciya)
{% endcontent-ref %}

***

## Дополнительное

Группа **«Дополнительное»** содержит настройки, которые влияют на резервы, лимиты, выдачу реквизитов, пересчёт заявок, партнёрские выплаты и отдельные функции валюты.

<figure><img src="/files/VQCRIdjwvjFgp19DIhqT" alt=""><figcaption></figcaption></figure>

Эти параметры используются во всех направлениях, где участвует выбранная валюта. При этом часть настроек направления может иметь приоритет над настройками валюты.

В группу входят:

* **«Резервы и лимиты»**;
* **«Реквизиты»**;
* **«Пересчёт заявок»**;
* **«Партнёрская программа»**;
* **«Другие опции»**.

{% content-ref url="/pages/W21WZxyDbeRGD5nKjjc9" %}
[Дополнительное](/guide/obmen/valyuty/upravlenie-valyutami/dopolnitelnoe)
{% endcontent-ref %}


# Общее

Группа **«Общее»** содержит основные параметры валюты, настройки реквизитов и тексты, которые клиент видит на форме обмена и на странице созданной заявки.

Эти параметры применяются во всех направлениях, где используется валюта. Например, одна и та же настройка реквизита может работать во всех парах, в которых валюта находится на стороне **«Отдаю»** или **«Получаю»**.

Отдельные настройки направления, текстовых шаблонов, мерчантов и других модулей могут иметь более высокий приоритет. Такие случаи отдельно описаны в соответствующих разделах.

## Где находятся настройки

В панели управления откройте: **«Основное» — «Валюты» — «Список валют»**

<figure><img src="/files/LNIgDP4v05KgDe9kOLnT" alt=""><figcaption></figcaption></figure>

Найдите нужную валюту и перейдите к её редактированию.

<figure><img src="/files/MZa1xgBinzVPLvHamYt4" alt=""><figcaption></figcaption></figure>

После изменения параметров на каждой странице отдельно нажмите **«Сохранить»**.

{% hint style="info" %}
Страницы сохраняются независимо друг от друга. Если перейти в соседний раздел без сохранения, внесённые изменения будут потеряны.
{% endhint %}

## Основное

Откройте: **«Общее» — «Основное»**

Здесь определяется, как валюта называется, отображается и идентифицируется в системе.

На странице настраиваются:

* статус валюты;
* платёжная система;
* код валюты;
* отображение кода;
* техническое название;
* обозначение для XML и API;
* количество знаков после запятой;
* начальная сумма калькулятора;
* подзаголовок.

### Статус

Поле **«Статус»** определяет доступность валюты.

Доступны три значения:

<table><thead><tr><th width="292.08984375">Статус</th><th>Результат</th></tr></thead><tbody><tr><td><strong>«Активная валюта»</strong></td><td>Валюта может использоваться в активных направлениях и отображаться клиентам</td></tr><tr><td><strong>«Не активная валюта»</strong></td><td>Валюта остаётся в рабочем списке, но не используется для новых обменов</td></tr><tr><td><strong>«Архивная валюта»</strong></td><td>Валюта переносится в архив и исключается из обычного списка</td></tr></tbody></table>

Если сохранить валюту со статусом **«Не активная валюта»** или **«Архивная валюта»**, система автоматически отключит активные направления, в которых она используется.

После повторного включения валюты направления автоматически не активируются.

Их необходимо проверить и включить вручную в разделе:

**«Основное» — «Направления обмена» — «Список направлений»**

При переводе валюты в архив после сохранения панель открывает список архивных валют.

После восстановления из архива валюта возвращается в неактивном состоянии.

{% hint style="warning" %}
Не используйте статус валюты как временный переключатель во время активной обработки заявок без предварительной проверки. Отключение одной валюты может сразу остановить большое количество связанных направлений.
{% endhint %}

### Платёжная система

Поле **«Платёжная система»** связывает валюту с банком, платёжным сервисом, криптовалютой, наличным способом расчёта или другой системой.

{% content-ref url="/pages/FljLdANBrcGFfSeU3i4b" %}
[Платёжные системы](/guide/obmen/valyuty/platyozhnye-sistemy)
{% endcontent-ref %}

Примеры:

```
Bitcoin
Tether
Сбербанк
Visa/Mastercard
Наличные
```

Из платёжной системы могут использоваться:

* публичное название;
* логотип;
* изображение на форме обмена;
* изображение в карточке заявки;
* связи со справочниками и интеграциями.

Платёжные системы создаются в разделе: **«Основное» — «Платёжные системы»**

Например, для валюты:

```
USDT TRC20
```

можно выбрать платёжную систему:

```
Tether
```

а сетевое уточнение указать в техническом названии или подзаголовке.

### Код валюты

Поле **«Код валюты»** связывает запись с расчётной единицей.

{% content-ref url="/pages/VcUqtA2ulSzzQz9CicRP" %}
[Коды валют](/guide/obmen/valyuty/kody-valyut)
{% endcontent-ref %}

Примеры:

```
RUB
USD
EUR
BTC
TRX
USDT
```

Коды создаются в разделе:

**«Основное» — «Коды валют»**

Одна платёжная система может использоваться с разными кодами.

Например, для одного банка можно создать:

```
Банк RUB
Банк USD
Банк EUR
```

### Отображать код валюты

Параметр определяет, показывать ли клиенту код рядом с названием платёжной системы.

Если параметр включён:

```
Tron TRX
```

Если параметр выключен:

```
Tron
```

Настройка влияет на:

* список валют формы обмена;
* карточку заявки;
* отдельные информационные блоки клиентского сайта.

Если в системе несколько похожих валют, рекомендуется отображать код.

Например:

```
USDT TRC20
USDT ERC20
USDT BEP20
```

Без кода или сетевого уточнения клиенту будет сложнее выбрать правильный вариант.

### Техническое название валюты

Поле **«Техническое название валюты»** используется внутри панели управления.

Оно отображается:

* в списке валют;
* в поиске;
* в настройках направлений;
* в списках мерчантов и выплат;
* в журналах;
* в административных инструментах.

Примеры:

```
USDT TRC20
Сбербанк RUB
Bitcoin BTC
Наличные AED
```

Название должно быть понятным и уникальным.

Если поле оставить пустым, система может сформировать его автоматически из названия платёжной системы и кода валюты.

Изменение технического названия:

* не создаёт новую валюту;
* не меняет ID записи;
* не удаляет направления;
* не удаляет реквизиты;
* не разрывает существующие связи.

Однако операторам может стать сложнее находить валюту по старому названию.

### Обозначение для XML

Поле **«Обозначение для XML»** — обязательный технический идентификатор валюты.

<figure><img src="/files/fACVhkNIMLAXJFBoat5k" alt=""><figcaption></figcaption></figure>

Несмотря на название, он используется не только в XML-файлах.

В списке могут предлагаться обозначения BestChange.

Если внешний список временно недоступен, система может использовать ранее загруженный локальный справочник.

Поле также поддерживает ручной ввод.

Примеры:

```
BTC
USDTTRC
USDTERC
SBERRUB
CASHUSD
```

У каждой валюты должно быть собственное уникальное обозначение.

{% hint style="warning" %}
Не меняйте обозначение рабочей валюты без необходимости. После изменения могут перестать работать старые ссылки, пары курсов, файлы экспорта, мониторинги и внешние API-запросы.
{% endhint %}

### Знаков после запятой

Поле **«Знаков после запятой»** задаёт точность валюты.

<figure><img src="/files/n5tkrDfGdKgwBRggLjNH" alt=""><figcaption></figcaption></figure>

Значение используется:

* при вводе суммы клиентом;
* в калькуляторе;
* в карточке заявки;
* при округлении;
* при отображении резервов;
* в API;
* в файлах курсов.

Рекомендуемые примеры:

<table><thead><tr><th width="286.11328125">Тип валюты</th><th align="right">Пример точности</th></tr></thead><tbody><tr><td>Фиатная валюта</td><td align="right"><code>2</code></td></tr><tr><td>Криптовалюта</td><td align="right"><code>6</code> или <code>8</code></td></tr><tr><td>Валюта без дробной части</td><td align="right"><code>0</code></td></tr></tbody></table>

Пример для RUB:

```
1000.50 RUB
```

Точность:

```
2
```

Пример для BTC:

```
0.00125000 BTC
```

Точность:

```
8
```

Слишком маленькое значение приводит к заметному округлению.

Слишком большое значение показывает клиенту лишние дробные знаки и может не поддерживаться платёжной системой.

### Конвертировать по

Поле **«Конвертировать по»** задаёт начальную сумму для стороны **«Отдаю»** при первом открытии формы обмена.

<figure><img src="/files/kTl9fzFDbfWTjqtOI4hG" alt=""><figcaption></figcaption></figure>

Пример:

```
Конвертировать по: 10000
```

Форма может открыться с суммой:

```
10 000 RUB
```

Поле не является минимальным или максимальным лимитом.

Клиент может изменить начальное значение, если другая сумма разрешена направлением.

На итоговый выбор стартовой суммы также влияют:

* минимальная сумма направления;
* общая настройка начального значения калькулятора;
* приоритет лимита направления;
* сохранённая клиентом сумма.

Обычно значение используется, если оно больше `1`.

Если указано:

```
0
```

```
1
```

или значение меньше `1`, клиентская часть может использовать минимальную сумму направления.

{% hint style="info" %}
Минимальные и максимальные суммы настраиваются в карточке направления. Поле **«Конвертировать по»** задаёт только начальное значение формы.
{% endhint %}

### Подзаголовок валюты

Поле **«Подзаголовок валюты»** является мультиязычным.

<figure><img src="/files/XNVi19bSefpWN9oORLoA" alt="" width="563"><figcaption></figcaption></figure>

Оно отображается под основным названием валюты и помогает уточнить её особенности.

Примеры:

```
TRC20
ERC20
По номеру карты
Перевод внутри банка
Наличные в Москве
```

Подзаголовок рекомендуется использовать для:

* названия сети;
* региона;
* способа перевода;
* краткого предупреждения;
* отличия от похожих валют.

Заполните его отдельно для каждого языка сайта.

***

## Доп. поля

Откройте: **«Общее» — «Доп. поля»**

Страница управляет двумя видами данных:

* основным реквизитом клиента;
* дополнительными полями.

Основным реквизитом может быть:

* номер банковской карты;
* номер счёта;
* IBAN;
* адрес криптовалютного кошелька;
* номер телефона;
* другой основной идентификатор платежа.

Дополнительными полями могут быть:

* Ф. И. О.;
* название банка;
* Memo;
* Tag;
* код отделения;
* назначение платежа;
* комментарий;
* номер документа.

### Стороны «Отдаю» и «Получаю»

Настройки применяются в зависимости от положения валюты в направлении.

{% stepper %}
{% step %}

#### Отдаю

Используется, когда клиент передаёт эту валюту обменнику.

Например:

```
Сбербанк RUB - USDT TRC20
```

Для Сбербанк RUB применяются поля стороны **«Отдаю»**.
{% endstep %}

{% step %}

#### Получаю

Используется, когда клиент получает эту валюту.

В том же направлении для USDT TRC20 применяются поля стороны **«Получаю»**.
{% endstep %}
{% endstepper %}

### Доп. поля для «Отдаю» и «Получаю»

Поля:

* **«Доп. поля для отдаю»**;
* **«Доп. поля для получаю»**

позволяют прикрепить к валюте записи из общего справочника.

<figure><img src="/files/HBC5hZoPFMHwELkjWHrM" alt="" width="563"><figcaption></figcaption></figure>

Перед привязкой создайте их в разделе: **«Основное» — «Валюты» — «Доп. поля валют»**

{% content-ref url="/pages/dfrFMxR3oFPMaDXdhp9c" %}
[Доп. поля для валют](/guide/obmen/dop.-polya/dop.-polya-dlya-valyut)
{% endcontent-ref %}

Посторонние поля в запросе заявки отклоняются.

### Название и комментарий для поля «Номер счёта»

<figure><img src="/files/bCtlQF61bYn7VsMmmaua" alt="" width="563"><figcaption></figcaption></figure>

Поля:

* **«Название для поля "Номер счёта"»**;
* **«Комментарий для поля "Номер счёта"»**

относятся к реквизиту обменника, который клиент видит после создания заявки.

Например:

```
Название:
Номер карты для оплаты
```

```
Комментарий:
Переведите точную сумму одним платежом
```

Это не название поля, в которое клиент вводит собственный реквизит на первоначальной форме.

Для клиентского ввода используются:

* **«Название поля "со счёта"»**;
* **«Название поля "на счёт"»**.

### Скрыть номер счёта для «Отдаю»

Если параметр включён:

* основное поле реквизита стороны **«Отдаю»** скрывается;
* клиент не передаёт стандартное значение;
* сервер не проверяет его формат.

Используйте настройку, если реквизит:

* не требуется;
* собирается через дополнительное поле;
* определяется автоматически;
* передаётся другим модулем.

### Скрыть номер счёта для «Получаю»

Если параметр включён:

* основное поле стороны **«Получаю»** скрывается;
* стандартная серверная проверка не выполняется;
* реквизит можно получить через дополнительные поля или мульт-счёт.

Если для валюты настроен мульт-счёт, он также может заменить стандартный реквизит получения.

{% hint style="warning" %}
Скрытие основного поля не создаёт замену автоматически. Перед включением убедитесь, что все обязательные данные клиента собираются другим способом.
{% endhint %}

Настройки длины, маски, допустимых символов и валидатора применяются только к видимому основному реквизиту.

<figure><img src="/files/CZzwJJigJfWauBQ9JiOW" alt="" width="563"><figcaption></figcaption></figure>

Если оба поля скрыты, соответствующий блок настроек может не отображаться в панели.

### Минимальное и максимальное количество символов

Поля задают допустимую длину основного реквизита.

Проверка диапазона выполняется, если оба значения больше `0`.

Если одно поле равно `0`, совместная проверка минимальной и максимальной длины может не выполняться.

Доступны готовые пресеты:

<table><thead><tr><th width="225.8125">Пресет</th><th align="right">Диапазон</th></tr></thead><tbody><tr><td>Карта 16</td><td align="right"><code>14–16</code></td></tr><tr><td>Карта 18</td><td align="right"><code>16–19</code></td></tr><tr><td>IBAN</td><td align="right"><code>15–34</code></td></tr><tr><td>BTC</td><td align="right"><code>26–35</code></td></tr><tr><td>ETH / ERC20</td><td align="right"><code>33–35</code></td></tr><tr><td>TRC20</td><td align="right"><code>33–35</code></td></tr></tbody></table>

Пресеты являются только заготовками.

### Текст ошибки длины

Поле задаёт мультиязычное сообщение при неправильной длине реквизита.

Можно использовать шорткод:

```
[currency]
```

Система заменит его названием валюты.

Пример:

```
Проверьте реквизит [currency]: допустимо от 16 до 19 символов.
```

Если поле не заполнено, используется стандартное системное сообщение.

### Названия полей «со счёта» и «на счёт»

<figure><img src="/files/ZsPdPqdTHXGjAhQg2VY5" alt=""><figcaption></figcaption></figure>

{% stepper %}
{% step %}

#### Название поля «со счёта»

Используется, когда клиент отдаёт валюту.

Примеры:

```
Номер карты отправителя
Адрес кошелька отправителя
IBAN отправителя
```

{% endstep %}

{% step %}

#### Название поля «на счёт»

Используется, когда клиент получает валюту.

Примеры:

```
Номер карты получателя
Адрес кошелька для выплаты
IBAN получателя
```

{% endstep %}
{% endstepper %}

Названия могут также использоваться:

* в заявке;
* в уведомлениях;
* в административной панели;
* в шаблонах.

### Комментарии для полей

Комментарии отображаются рядом с реквизитом.

Используйте их для коротких пояснений:

```
Укажите карту, оформленную на ваше имя.
```

```
Используйте только сеть TRC20.
```

```
Memo необходимо указать обязательно.
```

Не размещайте здесь длинную инструкцию по оплате.

Для неё используется раздел **«Информация»**.

### QR-сканирование

Параметр **«Включить сканирование QR-кода»** настраивается отдельно для сторон **«Отдаю»** и **«Получаю»**.

<figure><img src="/files/5NDRvG5MAFlSTP8fMnNf" alt="" width="563"><figcaption></figcaption></figure>

После включения клиент может:

1. Открыть камеру устройства.
2. Отсканировать QR-код.
3. Автоматически подставить распознанный реквизит.

Если QR-код содержит URI, клиентская часть пытается извлечь из него адрес.

Например:

```
bitcoin:bc1exampleaddress
```

QR-сканирование:

* не создаёт QR-код для оплаты;
* не заменяет валидатор;
* не гарантирует правильность сети;
* требует разрешения браузера на использование камеры.

Проверяйте функцию на реальных QR-кодах выбранной сети.

### Валидатор

Валидатор проверяет реквизит по правилам выбранной карты, банка, монеты или сети.

Валидаторы сторон сохраняются отдельно:

* валидатор **«со счёта»**;
* валидатор **«на счёт»**.

При первом выборе валидатора стороны **«Отдаю»** панель может автоматически подставить такое же значение для **«Получаю»**, если второе поле пустое.

После ручного изменения значения сохраняются независимо.

На публичной форме:

* для стороны **«Отдаю»** используется валидатор **«со счёта»**;
* для стороны **«Получаю»** используется валидатор **«на счёт»**.

При серверной проверке текущая версия может дополнительно применять оба настроенных валидатора валюты.

Поэтому два несовместимых правила могут привести к отклонению корректного реквизита.

Пример проблемной настройки:

```
Со счёта:
валидатор банковской карты
```

```
На счёт:
валидатор криптовалютного адреса
```

Если оба участвуют в серверной проверке одной валюты, правильное значение может быть отклонено.

{% hint style="warning" %}
Если валюта использует одинаковый формат на обеих сторонах, безопаснее выбрать один и тот же валидатор.

Разные валидаторы используйте только после полного тестирования.
{% endhint %}

Валидатор **«со счёта»** также может использоваться при проверке реквизита партнёра для выплаты в этой валюте.

После изменения проверьте:

* форму обмена;
* создание заявки;
* партнёрскую выплату.

Для каждого валидатора используйте минимум два теста:

1. Корректный реквизит.
2. Реквизит неправильного формата.

### Текст ошибки валидатора

Для каждой стороны можно заполнить собственный текст ошибки.

Однако в текущей версии окончательная серверная ошибка основного реквизита может формироваться стандартным системным сообщением.

Поэтому обязательно проверьте реальный результат на клиентском сайте.

Это ограничение не относится к ошибке минимальной и максимальной длины: её собственный текст применяется сервером.

### Маска ввода

Маска помогает вводить реквизит в ожидаемом формате.

Основные символы:

<table><thead><tr><th width="238.12890625">Символ</th><th>Значение</th></tr></thead><tbody><tr><td><code>0</code></td><td>Цифра</td></tr><tr><td><code>A</code></td><td>Латинская буква</td></tr><tr><td><code>*</code></td><td>Любой символ</td></tr><tr><td>Пробел, <code>-</code>, <code>/</code></td><td>Постоянный разделитель</td></tr></tbody></table>

Пример маски банковской карты:

```
0000 0000 0000 0000
```

Для каждой стороны можно:

* выбрать готовый пресет;
* создать собственную маску;
* скопировать маску;
* поменять маски местами.

Режим **«Связано»** синхронизирует значения только во время редактирования.

На сервер отправляются две готовые маски. Отдельная постоянная связь между ними не сохраняется.

### Плейсхолдер маски

Плейсхолдер показывает незаполненную часть.

Примеры:

```
_
```

```
•
```

Также можно выбрать вариант **«Без»**.

Плейсхолдер влияет только на внешний вид и не сохраняется как часть реквизита.

### Разрешённые символы

Поле задаёт серверное ограничение формата.

| Значение                      | Что разрешено                          |
| ----------------------------- | -------------------------------------- |
| **«Любые символы»**           | Дополнительная проверка не применяется |
| **«Цифры»**                   | Только цифры                           |
| **«Буквы»**                   | Латинские и кириллические буквы        |
| **«Латинские буквы и цифры»** | Латинские буквы и цифры                |
| **«Латинские буквы»**         | Только латинские буквы                 |

Пробелы удаляются перед серверной проверкой.

Другие разделители, например дефис, могут быть запрещены выбранным режимом.

Маска не заменяет проверку разрешённых символов.

Например, маска может визуально показывать дефисы, но сервер отклонит их, если разрешены только цифры.

### Удалять пробелы в реквизитах

Если настройка включена, пробельные символы удаляются перед:

* проверкой;
* сохранением;
* сравнением с чёрными списками.

Полезно использовать для:

* банковских карт;
* IBAN;
* криптовалютных адресов;
* других реквизитов, которые клиент вставляет с форматированием.

Не включайте настройку для данных, где пробел имеет смысловое значение.

#### Пример настройки банковской карты

1. Оставьте основное поле нужной стороны видимым.
2. Укажите название **«Номер карты»**.
3. Задайте длину от `16` до `19`.
4. Выберите валидатор банковской карты.
5. Укажите маску:

```
0000 0000 0000 0000
```

6. Выберите разрешённые символы **«Цифры»**.
7. Включите удаление пробелов.
8. Добавьте текст ошибки.
9. Проверьте корректную карту.
10. Проверьте слишком короткое значение.
11. Проверьте буквы.
12. Проверьте невалидный номер.

#### Пример настройки криптовалютного адреса

1. Укажите актив и сеть в названии:

```
Адрес USDT TRC20
```

2. Оставьте поле видимым.
3. Выберите валидатор TRC20.
4. Укажите допустимую длину.
5. Выберите разрешённые символы.
6. Включите QR-сканирование.
7. Добавьте комментарий:

```
Используйте только сеть TRC20.
```

8. Проверьте обычный адрес.
9. Проверьте адрес неправильной сети.
10. Проверьте QR-код реального кошелька.

***

## Информация

Откройте: **«Общее» — «Информация»**

Здесь находятся тексты для формы обмена и страницы оплаты.

Все текстовые поля мультиязычные.

Заполняйте каждый язык, доступный клиентам.

Если перевода нет, система может использовать резервную локаль. Для важных инструкций лучше не полагаться на автоматическую подстановку.

{% content-ref url="/pages/GHMaBNB2dCcPb7NMa5KY" %}
[Тексты и инструкции по валютам](/guide/obmen/informaciya/teksty-i-instrukcii-po-valyutam)
{% endcontent-ref %}

***

## Как безопасно изменить рабочую валюту

Если необходимо изменить:

* платёжную систему;
* код;
* сеть;
* XML-обозначение;
* назначение валюты;

безопаснее не переделывать рабочую запись, а создать новую валюту.

Рекомендуемый порядок:

1. Создайте новую валюту.
2. Выберите правильную платёжную систему.
3. Выберите код.
4. Настройте обозначение.
5. Настройте реквизиты и поля.
6. Настройте тексты.
7. Подключите мерчанты и выплаты.
8. Настройте резерв и лимиты.
9. Создайте новые направления.
10. Выполните тестовый обмен.
11. Отключите старую валюту.
12. После проверки перенесите её в архив.

Такой порядок снижает риск нарушения:

* ссылок;
* курсов;
* реквизитов;
* мониторингов;
* внешних интеграций.

## Рекомендации

Для большинства валют рекомендуется:

* использовать понятное уникальное техническое название;
* не менять рабочее XML-обозначение без необходимости;
* указывать реальную точность валюты;
* различать сети через название и подзаголовок;
* скрывать основной реквизит только при наличии замены;
* использовать совместимые валидаторы;
* включать удаление пробелов для карт и адресов;
* проверять QR-сканирование реальными кошельками;
* заполнять тексты на всех языках;
* не дублировать длинные инструкции в нескольких полях;
* создавать новую валюту при существенном изменении назначения;
* выполнять тестовый обмен после важных изменений.

## Коротко

Группа **«Общее»** содержит основные настройки валюты.

В разделе **«Основное»** задаются:

* статус;
* платёжная система;
* код;
* техническое название;
* XML-обозначение;
* точность;
* начальная сумма;
* подзаголовок.

В разделе **«Доп. поля»** настраиваются:

* основные реквизиты;
* дополнительные поля;
* длина;
* маски;
* валидаторы;
* QR-сканирование;
* допустимые символы.

В разделе **«Информация»** задаются:

* инструкции;
* описания;
* уведомления;
* тексты кнопок;
* оформление валюты.

После изменения настроек обязательно сохраните каждую страницу, проверьте валюту на публичном сайте и создайте новую тестовую заявку.


# Верификация

Группа **«Верификация»** определяет базовые правила проверки карты, платёжного реквизита и личности клиента для выбранной валюты.

Настройки применяются только тогда, когда валюта используется в направлении на стороне **«Отдаю»** — клиент передаёт её обменнику.

Если валюта находится на стороне **«Получаю»**, правила её верификации карты и личности не применяются.

В группу входят два независимых раздела:

* **«Карт»** — проверка карты, счёта или другого реквизита, с которого клиент отправляет средства;
* **«Личности»** — проверка личности клиента через подключённую KYC-систему.

Проверка карты и проверка личности не заменяют друг друга. В одной заявке могут потребоваться обе проверки.

## Где находятся настройки

В панели управления откройте:

**«Основное» — «Валюты» — «Список валют»**

<figure><img src="/files/LNIgDP4v05KgDe9kOLnT" alt=""><figcaption></figcaption></figure>

Выберите нужную валюту и перейдите к её редактированию.

<figure><img src="/files/z680NlLNbzWJrVD891yF" alt=""><figcaption></figcaption></figure>

Затем раскройте группу **«Верификация»** и откройте нужный раздел:

* **«Карт»**;
* **«Личности»**.

После изменения параметров нажмите **«Сохранить»**.

Настройки карты и личности находятся на разных страницах и сохраняются отдельно.

## Как связаны настройки валюты и направления

Правила валюты являются базовыми. Они используются во всех направлениях, где выбранная валюта находится на стороне **«Отдаю»**, если в конкретном направлении не установлено собственное правило.

Для проверки карт в направлении доступны три режима:

* **«По умолчанию: из настроек валюты»** — используются правила текущей валюты;
* **«Из настроек направления»** — используются отдельные настройки конкретной пары;
* **«Индивидуальный конструктор»** — клиенту предлагаются варианты обмена с проверкой карты и без неё.

Для проверки личности направление может:

* использовать настройки валюты;
* использовать отдельные правила направления.

Пример:

```
Валюта Сбербанк RUB:
проверять только новую карту

Направление Сбербанк RUB - USDT TRC20:
проверять карту всегда
```

В этом направлении будет применяться индивидуальное правило направления — проверка карты всегда.

Если направление использует наследование, будет применяться базовое правило валюты.

Подробная настройка направления описана в отдельном документе:

{% content-ref url="/pages/2N1N4AALG7R3PCEyUw5E" %}
[Верификация](/guide/obmen/napravleniya-obmena/upravlenie-napravleniyami/verifikaciya)
{% endcontent-ref %}

{% hint style="info" %}
Изменение настроек валюты влияет на новые заявки. Уже созданная заявка сохраняет результат проверки, определённый в момент её создания.
{% endhint %}

***

## Верификация карт

Откройте: **«Верификация» — «Карт»**

<figure><img src="/files/L3kLmutvCwvpv4vVf0nR" alt=""><figcaption></figcaption></figure>

Раздел определяет, когда система должна запросить подтверждение карты, банковского счёта или другого платёжного реквизита клиента.

Если проверка обязательна, дальнейший процесс заявки зависит от установленного сценария верификации. Платёжные реквизиты или действия по заявке могут стать доступны только после успешного подтверждения.

### Запрашивать проверку карты

В блоке **«Включить верификацию счёта “Отдаю”»** находится поле **«Запрашивать проверку карты»**.

Доступны следующие режимы:

{% stepper %}
{% step %}

#### Нет

Валюта сама по себе не требует подтверждения карты.

Это не гарантирует, что проверка будет отключена во всех направлениях.

Конкретное направление может:

* установить собственное правило;
* включить обязательную проверку;
* использовать индивидуальный конструктор;
* запросить проверку через другой защитный механизм.
  {% endstep %}

{% step %}

#### Да

Система требует подтверждение карты в заявках, где эта валюта используется на стороне **«Отдаю»**.

Если такая же карта уже была успешно подтверждена:

* тем же пользователем;
* для той же валюты;
* с тем же нормализованным номером;

повторная проверка не создаётся.
{% endstep %}

{% step %}

#### Да, если мин. сумма «Отдаю» больше чем

Проверка включается после достижения установленной суммы.

После выбора режима появляется поле:

**«Мин. сумма обмена для Отдаю»**

Значение указывается в редактируемой валюте.

Система сравнивает его с итоговой суммой **«Отдаю»** в заявке.

Пример:

```
Валюта: RUB
Мин. сумма обмена для Отдаю: 100 000
```

Результат:

<table><thead><tr><th width="202.07421875" align="right">Сумма «Отдаю»</th><th>Проверка карты</th></tr></thead><tbody><tr><td align="right"><code>99 999 RUB</code></td><td>Не требуется</td></tr><tr><td align="right"><code>100 000 RUB</code></td><td>Требуется</td></tr><tr><td align="right"><code>150 000 RUB</code></td><td>Требуется</td></tr></tbody></table>

Сумма, равная установленному значению, уже попадает под проверку.

Указывайте положительный порог.

Значение `0` фактически делает условие подходящим для любой неотрицательной суммы.

{% hint style="warning" %}
Порог сравнивается только с суммой **«Отдаю»**, а не с рассчитанной суммой **«Получаю»**.
{% endhint %}
{% endstep %}

{% step %}

#### Только для клиентов без идентификации

Проверка карты требуется, если личность клиента ещё не подтверждена.

Система проверяет статус личности в аккаунте пользователя.

После успешного KYC новые заявки этого клиента не будут требовать проверку карты по данному условию, если направление не задаёт отдельное правило.
{% endstep %}

{% step %}

#### Только для новой карты/реквизитов

Проверка требуется, если система не нашла ранее подтверждённый такой же реквизит у текущего пользователя для этой валюты.

При сравнении учитываются:

* аккаунт клиента;
* валюта **«Отдаю»**;
* нормализованный номер карты или реквизита.

Перед сравнением из номера удаляются пробелы и разделительные символы.

Например:

```
1234 5678 9012 3456
```

и:

```
1234567890123456
```

могут считаться одним реквизитом.

Подтверждение принадлежит конкретному пользователю.

Карта, подтверждённая одним клиентом, не становится подтверждённой для другого клиента.

Система рассматривает реквизит как новый, если:

* используется другой аккаунт;
* изменился номер карты;
* выбрана другая валюта **«Отдаю»**;
* ранее проверка не была успешно завершена.
  {% endstep %}

{% step %}

#### Для клиентов с подозрительной историей

Проверка запрашивается только у клиентов, для которых система обнаружила подозрительную историю заявок.

В этом режиме сумма текущей заявки не является основным условием.

Результат зависит от истории клиента и признаков, используемых системой для определения подозрительных операций.

Перед применением режима проверьте его на тестовом клиенте и убедитесь, что используемые статусы и отметки действительно вызывают проверку.
{% endstep %}
{% endstepper %}

### Текст верификации карт

Поле **«Текст верификации карт»** содержит краткое мультиязычное сообщение.

<figure><img src="/files/Ns8nuqL9e8m5QCcmmHdZ" alt=""><figcaption></figcaption></figure>

Оно может показываться клиенту ещё до создания заявки или при выборе направления.

В тексте рекомендуется указать:

* что может потребоваться подтверждение карты;
* зачем выполняется проверка;
* что клиенту нужно подготовить.

Пример:

```
Для выполнения обмена может потребоваться подтверждение банковской карты. Подготовьте фотографию карты в соответствии с инструкцией.
```

Заполните текст отдельно для каждого активного языка сайта.

Если в направлении указан собственный текст верификации карты, он имеет приоритет над текстом валюты.

### Информация для верификации карт

Поле **«Информация для верификации карт»** содержит подробную инструкцию, которая отображается на странице проверки заявки.

<figure><img src="/files/OWqDMdUbcEUhyYjvlqvu" alt=""><figcaption></figcaption></figure>

Пример:

```
Загрузите цветную фотографию карты на фоне страницы текущей заявки.

На фотографии должны быть видны:

- первые шесть и последние четыре цифры карты;
- имя владельца, если оно указано;
- номер текущей заявки.

Средние цифры карты и код безопасности необходимо закрыть.
```

Поле поддерживает форматирование и изображения.

Содержимое заполняется отдельно для каждого языка.

#### Приоритет подробной инструкции

На странице заявки система выбирает инструкцию в следующем порядке:

1. инструкция направления обмена;
2. инструкция валюты **«Отдаю»**;
3. общая инструкция раздела верификации карт.

Если в направлении заполнен собственный текст, он заменяет инструкцию валюты для этой пары.

### Верификация карты в личном кабинете

Параметр определяет, может ли клиент заранее отправить карту на проверку из личного кабинета.

<figure><img src="/files/nIm4Wh63aiX7IA6L9Ads" alt=""><figcaption></figcaption></figure>

Доступны два значения:

{% stepper %}
{% step %}

#### Разрешено

Валюта может отображаться в разделе предварительной проверки карт личного кабинета.

Чтобы она появилась, должны одновременно выполняться условия:

* валюта активна;
* режим проверки карты не равен **«Нет»**;
* предварительная проверка в кабинете разрешена.
  {% endstep %}

{% step %}

#### Запрещено

Клиент не сможет выбрать валюту для предварительной проверки в личном кабинете.

При этом запрет не отменяет проверку карты внутри уже созданной заявки.

Если заявка требует подтверждение реквизита, клиент всё равно должен пройти его в установленном процессе.
{% endstep %}
{% endstepper %}

### Общие настройки проверки карт

Настройки валюты определяют, **когда** должна быть запрошена проверка.

Общий раздел верификации определяет, **как** она проходит и как сотрудники обрабатывают результат.

{% content-ref url="/pages/BJZc8REy1JdOjFdgzRGm" %}
[Верификация карт](/guide/verifikaciya/verifikaciya-kart)
{% endcontent-ref %}

Откройте: **«Заявки» — «Верификация» — «Верификация карт»**

***

## Верификация личности

Откройте: **«Верификация» — «Личности»**

<figure><img src="/files/lcmBVLCVdxmHWFnOrGzl" alt=""><figcaption></figcaption></figure>

Раздел задаёт базовое KYC-правило для валюты **«Отдаю»**.

Настройка валюты сама по себе не подключает KYC-сервис.

Для работы должна быть включена общая система проверки личности и выбран активный поставщик KYC.

### Что необходимо настроить заранее

Перед включением KYC для валюты:

{% content-ref url="/pages/fQok59Mv18SqJ7AozMeY" %}
[KYC сервисы](/guide/integracii/kyc-servisy)
{% endcontent-ref %}

{% content-ref url="/pages/P197pKxC4vezvC5zGLCn" %}
[Верификация личности (KYC)](/guide/verifikaciya/verifikaciya-lichnosti-kyc)
{% endcontent-ref %}

1. Откройте **«Утилиты» — «KYC сервисы»**.
2. Добавьте нужный KYC-сервис.
3. Заполните параметры подключения.
4. Включите сервис.
5. Откройте **«Заявки» — «Верификация» — «Верификация личности»**.
6. Перейдите к настройкам раздела.
7. Включите параметр **«Верификация личности»**.
8. Выберите активный KYC-сервис.
9. Сохраните настройки.

Дополнительно можно включить: **«Верификация внутри заявки»**

Если параметр включён, форма KYC отображается непосредственно в карточке заявки.

Если он выключен, клиент может быть перенаправлен в раздел проверки личности личного кабинета.

Правила валюты не применяются, если:

* общая проверка личности выключена;
* KYC-сервис не выбран;
* выбранный сервис отключён;
* подключение к сервису не работает.

### Когда запрашивать верификацию личности

Доступны пять режимов:

{% stepper %}
{% step %}

#### Выключена

Валюта не требует проверку личности.

Конкретное направление всё равно может установить собственное KYC-правило.
{% endstep %}

{% step %}

#### Всегда требуется

KYC требуется для каждой заявки с этой валютой **«Отдаю»**, если личность пользователя ещё не подтверждена.

Уже верифицированный клиент повторно не проходит проверку, если его статус остаётся действующим.
{% endstep %}

{% step %}

#### Только с указанной суммы

После выбора появляется поле:

**«Мин. сумма обмена, с которой требуется верификация»**

Значение указывается в валюте **«Отдаю»**.

Проверка работает следующим образом:

|        Сумма | KYC          |
| -----------: | ------------ |
|  Ниже порога | Не требуется |
| Равна порогу | Требуется    |
|  Выше порога | Требуется    |

Пример:

```
Мин. сумма: 10 000 USDT
```

| Сумма «Отдаю» | Результат        |
| ------------: | ---------------- |
|  `9 999 USDT` | KYC не требуется |
| `10 000 USDT` | KYC требуется    |
| `15 000 USDT` | KYC требуется    |

Укажите положительное значение.

При нулевом или отрицательном пороге проверка по сумме не срабатывает.
{% endstep %}

{% step %}

#### Только для новых клиентов

Проверка требуется клиенту, у которого ещё нет успешно выполненной заявки.

Клиент перестаёт считаться новым после появления хотя бы одной выполненной заявки в его аккаунте.

История другого аккаунта не учитывается.

Неавторизованный клиент обычно рассматривается как новый.
{% endstep %}

{% step %}

#### Только для клиентов без идентификации

Проверка требуется до тех пор, пока личность пользователя не получит подтверждённый статус.

После успешного KYC новые заявки клиента не требуют повторной проверки по этому правилу.
{% endstep %}
{% endstepper %}

### Если клиент не прошёл верификацию личности

Поле появляется после выбора любого режима, кроме **«Выключена»**.

Оно определяет, когда клиент проходит KYC:

* до создания заявки;
* после её создания.

{% stepper %}
{% step %}

#### Сначала верификация, затем заявка

Система проверяет статус личности до создания заявки.

Если клиент должен пройти KYC, но ещё не подтверждён:

* заявка не создаётся;
* клиент получает сообщение о необходимости пройти проверку;
* после подтверждения личности он должен повторить создание заявки.

Этот вариант подходит для направлений, в которых заявку нельзя принимать до завершения KYC.

Перед включением убедитесь, что клиент может:

* открыть страницу проверки;
* пройти процедуру без созданной заявки;
* загрузить необходимые данные;
* получить результат;
* вернуться к форме обмена.
  {% endstep %}

{% step %}

#### Создать заявку, затем запросить верификацию

Система позволяет создать заявку, после чего отмечает её как требующую KYC.

Клиент проходит проверку перед дальнейшей обработкой.

Если включена настройка **«Верификация внутри заявки»**, форма открывается непосредственно в заявке.

Если настройка выключена, клиенту предлагается перейти в личный кабинет.

Этот вариант подходит, если сначала необходимо зафиксировать заявку, а затем запросить документы.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
При обязательном KYC заявка не должна завершаться до подтверждения личности клиента.
{% endhint %}

### Краткое описание проверки личности

Поле содержит мультиязычное сообщение о требовании KYC.

Текст передаётся на публичный сайт вместе с настройками направления.

Если направление использует собственные правила и в нём заполнено отдельное описание, применяется текст направления.

Пример:

```
Для обмена по этому направлению необходимо подтвердить личность. Обычно проверка занимает несколько минут.
```

Заполните текст для каждого активного языка.

### Подробная инструкция по верификации личности

Поле содержит расширенное описание процедуры KYC.

Оно поддерживает форматирование и изображения.

Пример:

```
Загрузите фотографию действующего документа, удостоверяющего личность.

На снимке должны быть видны все края документа. Изображение должно быть чётким, без бликов, размытия и редактирования.
```

Основная форма и часть инструкций могут формироваться выбранным KYC-сервисом.

После заполнения проверьте фактическое отображение в используемой теме и интеграции.

Собирайте только те персональные данные, которые действительно нужны для процедуры проверки.

### Где обрабатываются проверки личности

Поступившие проверки находятся в разделе:

**«Заявки» — «Верификация» — «Верификация личности»**

{% content-ref url="/pages/P197pKxC4vezvC5zGLCn" %}
[Верификация личности (KYC)](/guide/verifikaciya/verifikaciya-lichnosti-kyc)
{% endcontent-ref %}

Дополнительные технические журналы доступны в разделе: **«Журнал событий» — «KYC логи»**

### Если требуются обе проверки

Проверка карты и проверка личности рассчитываются независимо.

Если заявка требует обе проверки, клиентский интерфейс обычно проводит их последовательно:

1. проверка карты;
2. проверка личности;
3. продолжение оплаты и обработки заявки.

Обе проверки не обязательно отображаются на одном экране одновременно.

Если для KYC выбрано:

**«Сначала верификация, затем заявка»**

клиент сначала проходит проверку личности.

Проверка карты появляется уже после успешного создания заявки.

***

## Рекомендуемая настройка проверки карт

### Для банковской валюты

1. Откройте **«Верификация» — «Карт»**.
2. Выберите **«Только для новой карты/реквизитов»**.
3. Заполните краткий текст.
4. Добавьте подробную безопасную инструкцию.
5. Разрешите проверку в личном кабинете, если она нужна.
6. Нажмите **«Сохранить»**.
7. Создайте тестовую заявку с новой картой.
8. Подтвердите карту в панели.
9. Создайте новую заявку тем же пользователем и с той же картой.

Повторная проверка не должна запрашиваться, если направление не переопределяет правило.

### Для крупных обменов

1. Выберите **«Да, если мин. сумма Отдаю больше чем»**.
2. Укажите положительный порог.
3. Сохраните настройки.
4. Проверьте сумму ниже порога.
5. Проверьте сумму, равную порогу.
6. Проверьте сумму выше порога.

## Рекомендуемая настройка проверки личности

### Обязательный KYC до создания заявки

1. Подключите KYC-сервис.
2. Включите общую верификацию личности.
3. Выберите активный сервис.
4. Откройте **«Верификация» — «Личности»** в валюте.
5. Выберите режим, например **«Всегда требуется»**.
6. Выберите **«Сначала верификация, затем заявка»**.
7. Заполните тексты на всех языках.
8. Сохраните настройки.
9. Проверьте направление под клиентом без KYC.
10. Повторите проверку под подтверждённым пользователем.

### KYC после создания заявки

1. Настройте общий KYC-сервис.
2. Выберите необходимый режим в валюте.
3. Выберите **«Создать заявку, затем запросить верификацию»**.
4. При необходимости включите KYC внутри заявки.
5. Сохраните настройки.
6. Создайте новую тестовую заявку.
7. Убедитесь, что после создания появляется требование проверки.

***

## Рекомендации

Для большинства валют рекомендуется:

* использовать проверку только на стороне **«Отдаю»**;
* применять базовые правила валюты для одинаковых направлений;
* задавать отдельные правила направления только для исключений;
* проверять новую карту вместо каждой заявки;
* не запрашивать секретные банковские данные;
* разрешать предварительную проверку в кабинете только при готовом процессе;
* подключать KYC-сервис до включения обязательной проверки;
* проверять точные значения порогов;
* заполнять тексты для всех языков;
* тестировать клиента без проверки и подтверждённого клиента;
* создавать новую заявку после изменения правил;
* не использовать крупную реальную сумму для первого теста.

## Коротко

Группа **«Верификация»** задаёт базовые правила проверки карты и личности для валюты **«Отдаю»**.

Проверка карты может применяться:

* всегда;
* от определённой суммы;
* только для клиента без KYC;
* только для нового реквизита;
* только при подозрительной истории.

Клиент может заранее подтвердить карту в личном кабинете, если это разрешено настройками валюты.

Проверка личности может выполняться:

* всегда;
* от установленной суммы;
* только для нового клиента;
* только для клиента без подтверждённой личности.

KYC может проходить до создания заявки или после неё.

Для работы проверки личности необходимо включить общую KYC-систему и подключить активный сервис.

После настройки обязательно проверьте направление на стороне **«Отдаю»**, приоритет правил направления, новую карту, подтверждённого клиента и новую тестовую заявку.


# Автоматизация

Группа **«Автоматизация»** связывает валюту с сервисами, которые принимают платежи, отправляют средства клиентам и выполняют AML-проверки.

Выбор модуля в карточке валюты не выполняет его первоначальную настройку.

Перед подключением к валюте мерчант, выплата или AML-сервис должны быть:

* установлены;
* настроены;
* подключены к API провайдера;
* включены;
* проверены отдельно.

{% hint style="danger" %}
Автоматизация выполняет финансовые операции. Перед запуском на рабочих суммах проверьте API-доступы, сеть, лимиты и поведение на тестовой заявке.

Особенно внимательно настраивайте автоматические выплаты: неправильная сеть или реквизит могут привести к необратимой отправке средств.
{% endhint %}

## Где находятся настройки

В панели управления откройте:

**«Основное» — «Валюты» — «Список валют»**

<figure><img src="/files/LNIgDP4v05KgDe9kOLnT" alt=""><figcaption></figcaption></figure>

Выберите нужную валюту и перейдите к её редактированию.

<figure><img src="/files/xD1inIsvhzAy9YcONWj7" alt=""><figcaption></figcaption></figure>

После изменения параметров на каждой странице отдельно нажмите **«Сохранить»**.

{% hint style="info" %}
Страницы сохраняются независимо друг от друга. Переход в другой раздел без сохранения не применяет внесённые изменения.
{% endhint %}

## Как связаны настройки валюты и направления

Мерчанты и выплаты могут настраиваться на двух уровнях:

1. в карточке валюты;
2. в правилах конкретного направления обмена.

{% stepper %}
{% step %}

### Настройки валюты

Настройки валюты являются базовыми.

Если в направлении нет активных индивидуальных правил:

* мерчанты выбираются из валюты **«Отдаю»**;
* выплаты выбираются из валюты **«Получаю»**;
* используются сети и лимиты, сохранённые в карточке соответствующей валюты.

Этот вариант подходит, если одна валюта должна работать одинаково во всех направлениях.
{% endstep %}

{% step %}

### Правила направления

Для конкретной валютной пары можно создать отдельные:

* правила мерчантов;
* правила выплат;
* сети;
* приоритеты;
* ограничения;
* валидаторы.

Правила находятся в разделах:

* **«Основное» — «Направления обмена» — «Правила мерчантов»**;
* **«Основное» — «Направления обмена» — «Правила выплат»**.

Если у направления есть активные правила:

* валютный список модулей не используется;
* правила проверяются согласно их приоритету;
* учитываются ограничения правила и самого модуля;
* при отсутствии подходящего правила система не возвращается к настройкам валюты.
  {% endstep %}
  {% endstepper %}

{% hint style="warning" %}
Если модуль выбран в валюте, но заявка его не использует, сначала проверьте активные правила текущего направления.

Наличие активных правил полностью заменяет базовый список валюты.
{% endhint %}

## Мерчанты

Откройте: **«Автоматизация» — «Мерчанты»**

Мерчант используется для получения реквизитов, приёма средств и автоматической проверки входящей оплаты.

Он применяется, когда редактируемая валюта находится на стороне **«Отдаю»**.

Например, для направления:

```
USDT TRC20 - Сбербанк RUB
```

мерчант для приёма USDT должен быть подключён к валюте:

```
USDT TRC20
```

Перед привязкой настройте сам модуль в разделе: **«Мерчанты и API» — «Список мерчантов»**

### Выбор мерчантов

В поле **«Мерчанты»** можно выбрать один или несколько модулей.

<figure><img src="/files/QojmUZiv76NnkUT44sL2" alt=""><figcaption></figcaption></figure>

Окно настройки содержит три вкладки:

* **«Выбор»** — добавление и удаление мерчантов;
* **«Сети»** — общая и индивидуальные сети;
* **«Проверка»** — валидатор реквизитов для каждого модуля.

В списке могут отображаться активные и отключённые модули.

Отключённый мерчант можно сохранить в валюте, но при обработке заявки система его пропустит.

### Как выбирается мерчант

Если у направления нет активных правил мерчантов, система:

1. получает активные мерчанты валюты **«Отдаю»**;
2. сортирует их по приоритету самого мерчанта;
3. сначала проверяет модуль с большим значением приоритета;
4. при одинаковом приоритете раньше проверяет более новый модуль;
5. исключает кандидатов, которые не проходят лимиты;
6. использует первый подходящий мерчант.

Одновременно применяются:

* ограничения валюты;
* ограничения самого мерчанта;
* доступность сети;
* состояние API;
* другие условия модуля.

Если первый мерчант не подходит, проверяется следующий.

Если в направлении есть активные правила мерчантов, используется порядок правил направления, а список валюты в выборе не участвует.

### Сеть мерчанта

Для криптовалютного мерчанта необходимо указать код сети, который ожидает API провайдера.

{% content-ref url="/pages/zEyPL7CgzEo11hFHLWrh" %}
[Автоматизация валют с разными сетями](/guide/integracii/merchanty-i-api/avtomatizaciya-valyut-s-raznymi-setyami)
{% endcontent-ref %}

{% stepper %}
{% step %}

#### Сеть по умолчанию для мерчантов

На вкладке **«Сети»** поле **«Сеть по умолчанию для мерчантов»** задаёт общий код сети для валюты.

Примеры:

```
TRC20
ERC20
BEP20
```

Это только примеры обозначений.

Разные провайдеры могут использовать разные значения для одной сети:

```
TRC20
TRON
TRX
```

Такие значения не всегда взаимозаменяемы.

Используйте код из официальной документации выбранного провайдера.

Кнопка **«К выбранным»** позволяет применить общий код к выбранным модулям.

Кнопка **«Сбросить сети»** очищает индивидуальные значения.
{% endstep %}

{% step %}

#### Индивидуальная сеть мерчанта

Для каждого выбранного мерчанта можно задать отдельный код сети.

Он сохраняется для конкретной связи:

```
Валюта + мерчант
```

Фактическая сеть определяется в следующем порядке:

1. сеть из правила мерчанта направления;
2. сеть, явно заданная в настройках самого мерчанта;
3. индивидуальная сеть мерчанта в карточке валюты;
4. общая сеть валюты для мерчантов;
5. резервное обозначение валюты, если интеграция его использует.

Если модуль не поддерживает настройку сети, соответствующее поле может быть недоступно.
{% endstep %}
{% endstepper %}

{% hint style="danger" %}
Неправильный код сети может привести к выдаче неподходящего адреса или к невозможности распознать входящий платёж.

Не подбирайте код сети экспериментальным способом на рабочей заявке.
{% endhint %}

### Проверка реквизитов мерчанта

На вкладке **«Проверка»** можно выбрать валидатор отдельно для каждого мерчанта.

Валидатор проверяет реквизит, который вернул провайдер, до его отображения клиенту.

Например, для USDT TRC20 можно убедиться, что мерчант вернул адрес формата сети TRON.

Вариант:

```
Без валидатора
```

отключает дополнительную проверку для выбранного модуля.

#### Если адрес не прошёл проверку

Доступны два действия:

| Действие                                           | Результат                                                             |
| -------------------------------------------------- | --------------------------------------------------------------------- |
| **«Пропустить — игнорировать проверку»**           | Реквизит может быть показан клиенту, несмотря на результат валидатора |
| **«Выдать ошибку — остановить выдачу реквизитов»** | Непрошедший проверку реквизит клиенту не показывается                 |

Для рабочих финансовых направлений рекомендуется использовать:

```
Выдать ошибку — остановить выдачу реквизитов
```

Режим пропуска подходит для временной диагностики, когда совместимость формата ещё проверяется.

Если используется правило направления, валидатор и действие правила имеют приоритет над настройками валюты.

### Лимиты мерчантов

Лимиты в карточке валюты применяются ко всем мерчантам, выбранным в этой валюте.

Дополнительно действуют ограничения, заданные в карточке самого мерчанта.

Расчёты выполняются:

* в валюте **«Отдаю»**;
* по сумме **«Отдаю»** заявки.

<table><thead><tr><th width="349.921875">Поле</th><th>Что ограничивает</th></tr></thead><tbody><tr><td><strong>«Суточный объём»</strong></td><td>Общую сумму заявок через конкретный мерчант за текущие сутки</td></tr><tr><td><strong>«Месячный объём»</strong></td><td>Общую сумму заявок через конкретный мерчант за текущий месяц</td></tr><tr><td><strong>«Мин. сумма обмена для одной заявки»</strong></td><td>Минимальную сумму «Отдаю» одной заявки</td></tr><tr><td><strong>«Макс. сумма обмена для одной заявки»</strong></td><td>Максимальную сумму «Отдаю» одной заявки</td></tr><tr><td><strong>«Дневной лимит заявок»</strong></td><td>Количество учитываемых заявок через мерчант за сутки</td></tr><tr><td><strong>«Месячный лимит заявок»</strong></td><td>Количество учитываемых заявок через мерчант за месяц</td></tr></tbody></table>

При проверке объёма и количества учитываются заявки, закреплённые за конкретным мерчантом, в предусмотренных системой рабочих статусах.

Период определяется по дате создания заявки.

При проверке учитывается новая заявка.

Пример:

```
Дневной лимит заявок: 10
```

Результат:

* десятая заявка допускается;
* одиннадцатая блокируется.

Значение `0` отключает соответствующее ограничение.

### Пример настройки мерчанта

Необходимо принимать USDT только в сети TRC20:

```
Минимум: 20 USDT
Максимум: 5 000 USDT
Суточный объём: 20 000 USDT
```

Порядок настройки:

1. Откройте **«Мерчанты и API» — «Список мерчантов»**.
2. Настройте и включите подходящий модуль.
3. В валюте USDT TRC20 откройте **«Автоматизация» — «Мерчанты»**.
4. На вкладке **«Выбор»** добавьте модуль.
5. На вкладке **«Сети»** укажите код, требуемый API.
6. На вкладке **«Проверка»** выберите валидатор TRC20.
7. Выберите остановку выдачи при ошибке проверки.
8. Укажите минимальную, максимальную и суточную сумму.
9. Нажмите **«Сохранить»**.
10. Создайте тестовые заявки ниже минимума, внутри диапазона и выше максимума.

## Выплаты

Откройте: **«Автоматизация» — «Выплаты»**

Раздел подключает сервисы, которые отправляют средства клиенту.

Выплата используется, когда редактируемая валюта находится на стороне **«Получаю»**.

Например, в направлении:

```
Сбербанк RUB - USDT TRC20
```

выплата USDT должна быть подключена к валюте:

```
USDT TRC20
```

Перед привязкой настройте модуль в разделе: **«Мерчанты и API» — «Список автовыплат»**

### Выбор выплат

В поле **«Выплаты»** выберите один или несколько модулей.

<figure><img src="/files/hsYywEOdJVOAUffoe2LB" alt=""><figcaption></figcaption></figure>

Окно содержит вкладки:

* **«Выбор»** — добавление и удаление выплат;
* **«Сети»** — общая и индивидуальные сети.

Отключённая выплата может сохраняться в списке, но не участвует в обработке заявки.

### Как выбирается выплата

Если у направления нет активных правил выплат, система:

1. получает активные выплаты валюты **«Получаю»**;
2. проверяет ограничения валюты;
3. проверяет лимиты самого модуля;
4. исключает неподходящие выплаты;
5. выбирает один из доступных модулей.

Если для конкретной пары нужен строгий порядок, отдельная сеть или конкретный провайдер, используйте: **«Правила выплат»**

Активные правила направления проверяются от большего приоритета к меньшему.

{% hint style="warning" %}
При наличии активных правил выплат система не возвращается к списку валюты.

Если ни одно правило не подходит, автоматическая выплата завершится ошибкой отсутствия доступного сервиса или конфигурации.
{% endhint %}

### Сеть выплаты

{% content-ref url="/pages/zEyPL7CgzEo11hFHLWrh" %}
[Автоматизация валют с разными сетями](/guide/integracii/merchanty-i-api/avtomatizaciya-valyut-s-raznymi-setyami)
{% endcontent-ref %}

{% stepper %}
{% step %}

#### Сеть по умолчанию для выплат

На вкладке **«Сети»** поле **«Сеть по умолчанию для выплат»** задаёт общий код сети для валюты **«Получаю»**.

Он используется, если для выбранной выплаты не задано более приоритетное значение.
{% endstep %}

{% step %}

#### Индивидуальная сеть выплаты

Для каждого модуля можно указать отдельный **«Код сети»**.

Фактический код определяется в следующем порядке:

1. сеть из правила выплаты направления;
2. сеть из настроек самого модуля;
3. индивидуальная сеть выплаты в валюте;
4. общая сеть валюты для выплат;
5. код валюты как резервное значение.

Если модуль не поддерживает отдельную настройку сети, поле может быть недоступно.
{% endstep %}
{% endstepper %}

### Автоматическая выплата

Поле: **«Разрешить авто-выплату, если заявка имеет статус “Оплаченная заявка”»**

управляет автоматическим запуском выплаты через фоновые процессы.

Доступны три значения:

<table><thead><tr><th width="246.3046875">Значение</th><th>Как работает</th></tr></thead><tbody><tr><td><strong>«По умолчанию»</strong></td><td>Используется разрешение из настроек самого модуля</td></tr><tr><td><strong>«Нет»</strong></td><td>Автоматическая выплата запрещена на уровне валюты</td></tr><tr><td><strong>«Да»</strong></td><td>Автоматическая выплата разрешена на уровне валюты</td></tr></tbody></table>

Настройка валюты применяется, если выплата выбирается из её списка.

При использовании правила направления приоритет разрешения работает следующим образом:

1. настройка автовыплаты в правиле;
2. настройка автовыплаты направления;
3. настройка самого модуля.

Значение **«Да»** только разрешает запуск.

{% hint style="danger" %}
Перед включением автоматической выплаты выполните минимальную тестовую операцию на собственный реквизит и убедитесь, что провайдер использует нужную сеть.
{% endhint %}

### Лимиты выплат

Лимиты валюты применяются ко всем модулям, выбранным в этой валюте.

Также действуют ограничения, заданные в карточке самой выплаты.

Лимиты одной операции проверяются по итоговой сумме **«Получаю»**.

| Поле                                      | Что ограничивает                                       |
| ----------------------------------------- | ------------------------------------------------------ |
| **«Суточный объём»**                      | Общую сумму операций через конкретную выплату за сутки |
| **«Месячный объём»**                      | Общую сумму операций через выплату за месяц            |
| **«Мин. сумма обмена для одной заявки»**  | Минимальную сумму «Получаю»                            |
| **«Макс. сумма обмена для одной заявки»** | Максимальную сумму «Получаю»                           |
| **«Дневной лимит заявок»**                | Количество заявок через выплату за сутки               |
| **«Месячный лимит заявок»**               | Количество заявок через выплату за месяц               |

Количество учитывается по заявкам в предусмотренных системой рабочих статусах.

Для периода выплаты используется время последнего обновления заявки.

Денежный объём учитывает заявки, которым уже назначен конкретный модуль выплаты.

Поэтому при диагностике проверяйте не только выполненные заявки, но и другие заявки с заполненным модулем за выбранный период.

Значение `0` отключает ограничение.

### Пример настройки выплаты

Необходимо автоматически отправлять USDT TRC20:

```
Минимум: 20 USDT
Максимум: 3 000 USDT
```

Порядок настройки:

1. Откройте **«Мерчанты и API» — «Список автовыплат»**.
2. Настройте API-ключи и разрешения.
3. Включите модуль.
4. Проверьте подключение.
5. Убедитесь, что у провайдера достаточно средств.
6. В валюте USDT TRC20 откройте **«Автоматизация» — «Выплаты»**.
7. Выберите нужный модуль.
8. Укажите точный код сети.
9. Разрешите автоматическую выплату или оставьте **«По умолчанию»**.
10. Укажите минимальную и максимальную сумму.
11. Добавьте безопасные суточные ограничения.
12. Нажмите **«Сохранить»**.
13. Проведите минимальную выплату на собственный адрес.

***

## AML-анализ

Откройте: **«Автоматизация» — «AML анализ»**

Раздел управляет проверкой:

* криптовалютного адреса клиента;
* входящей криптовалютной транзакции.

Перед настройкой валюты подключите AML-провайдера в разделе: **«Утилиты» — «AML-сервисы»**

{% content-ref url="/pages/NoO4SbbUtbGB321EiCGC" %}
[AML сервисы](/guide/integracii/aml-servisy)
{% endcontent-ref %}

Сервис должен иметь:

* действующие API-доступы;
* включённый статус;
* поддержку нужного актива и сети;
* настроенные пороги риска;
* правила оценки результата.

### Источник AML

Поле **«Источник»** определяет сервис, который будет использоваться для текущей валюты.

В списке могут отображаться активные и отключённые записи.

Выбор отключённого сервиса не включает его автоматически и не исправляет API-настройки.

После выбора источника становятся доступны:

* режим проверки адреса;
* режим проверки транзакции;
* пороги запуска;
* действия при превышении риска;
* тексты для клиента.

Если очистить источник, автоматические AML-проверки валюты не запускаются.

Информационные AML-тексты при этом можно сохранить.

Для запроса к провайдеру используется поле валюты: **«Обозначение для XML»**

Оно должно соответствовать активу и сети, которые понимает выбранный AML-сервис.

### Проверка счёта

Проверка счёта относится к адресу клиента на стороне **«Получаю»**.

Например, в направлении:

```
Сбербанк RUB - USDT TRC20
```

проверяется USDT-адрес, на который клиент хочет получить выплату.

Доступны три режима:

{% stepper %}
{% step %}

#### Нет

Адрес клиента не проверяется через AML-сервис.
{% endstep %}

{% step %}

#### Да, перед созданием заявки

Адрес проверяется до завершения создания заявки.

Система передаёт AML-провайдеру:

* обозначение валюты **«Получаю»**;
* адрес клиента;
* сумму **«Получаю»**.

При этом порог запуска проверки сравнивается с суммой **«Отдаю»**.

Если AML-сервис ещё обрабатывает запрос, клиент получает сообщение о необходимости подождать.

Техническая ошибка подключения или запуска AML-драйвера блокирует создание заявки и сообщает о невозможности выполнить проверку.

Если провайдер вернул неуспешный ответ без готового результата и без состояния ожидания, такой ответ следует проверить в журналах AML-сервиса.
{% endstep %}

{% step %}

#### Да, при проверке оплаты

Адрес клиента проверяется во время автоматической проверки входящего платежа мерчантом.

Этот режим работает только в сценариях, где:

* используется поддерживаемый мерчант;
* выполняется автоматическая проверка оплаты;
* этап проверки действительно запускается.

Для полностью ручной заявки автоматическая AML-проверка на этом этапе может не выполняться.
{% endstep %}
{% endstepper %}

### Порог проверки счёта

Поле **«Сумма обменов “От” для проверки счёта»** задаёт минимальную сумму **«Отдаю»** для запуска AML.

Проверка выполняется только тогда, когда сумма строго больше установленного значения.

Пример:

```
Порог: 1 000
```

Результат:

<table><thead><tr><th width="199.890625" align="right">Сумма «Отдаю»</th><th>AML-проверка</th></tr></thead><tbody><tr><td align="right"><code>999</code></td><td>Не запускается</td></tr><tr><td align="right"><code>1 000</code></td><td>Не запускается</td></tr><tr><td align="right"><code>1 000.01</code></td><td>Запускается</td></tr></tbody></table>

Значение `0` не отключает AML.

Оно означает отсутствие минимального порога, поэтому проверка применяется к обычным положительным суммам.

Чтобы полностью отключить проверку адреса, выберите:

```
Нет
```

### Действие при превышении риска счёта

Доступны два значения:

<table><thead><tr><th width="311.12890625">Действие</th><th>Результат</th></tr></thead><tbody><tr><td><strong>«Ничего не делать»</strong></td><td>Результат сохраняется, но высокий риск не блокирует этап</td></tr><tr><td><strong>«Выдать ошибку»</strong></td><td>Операция останавливается, если сервис сообщил о превышении допустимого риска</td></tr></tbody></table>

Допустимый уровень риска и категории определяются настройками выбранного AML-сервиса.

### Проверка транзакции

Проверка транзакции относится к входящему платежу в валюте **«Отдаю»**.

Для неё необходим идентификатор транзакции, который получил мерчант.

Доступны режимы:

{% stepper %}
{% step %}

#### Нет

Входящая транзакция не проверяется.
{% endstep %}

{% step %}

#### Да, во время проверки оплаты

При проверке входящего платежа система передаёт AML-провайдеру:

* валюту **«Отдаю»**;
* идентификатор транзакции;
* адрес приёма.

Если риск превышен и выбрано действие **«Выдать ошибку»**, заявка не проходит обычный автоматический сценарий и требует внимания менеджера.
{% endstep %}

{% step %}

#### Да, во время автовыплаты

Этот вариант отображается в интерфейсе, но в текущей основной цепочке автоматической выплаты AML-проверка транзакции по нему не запускается.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Не используйте режим **«Да, во время автовыплаты»** как единственную защиту.

Для фактической проверки входящей транзакции используйте **«Да, во время проверки оплаты»**.
{% endhint %}

### Порог проверки транзакции

Поле **«Сумма обменов “От” для проверки транзакции»** сравнивается с суммой **«Отдаю»**.

Проверка запускается, только если сумма строго больше установленного значения.

Значение `0` означает отсутствие минимального порога.

Чтобы отключить проверку транзакции, выберите:

```
Нет
```

### Действие при превышении риска транзакции

Доступны два варианта:

* **«Ничего не делать»** — сохранить результат без автоматической остановки;
* **«Выдать ошибку»** — остановить автоматический этап при превышении риска.

Ошибка AML-сервиса не означает низкий риск.

Если провайдер не смог вернуть корректный результат, система сообщает об ошибке проверки.

### AML-тексты для клиента

Доступны два мультиязычных поля:

* **«AML текст — Отдаю»**;
* **«AML текст — Получаю»**.

Текст **«Отдаю»** относится к валюте, которую клиент отправляет.

Текст **«Получаю»** относится к валюте выплаты.

В них рекомендуется указать:

* что адрес или транзакция может проходить AML-проверку;
* что при повышенном риске обработка может быть остановлена;
* что задержка проверки не означает необходимость повторной оплаты;
* как обратиться в поддержку.

Пример:

```
Адрес и транзакция могут проходить автоматическую AML-проверку. При повышенном уровне риска обработка заявки может быть приостановлена для дополнительной проверки.
```

Не публикуйте:

* API-ключи;
* внутренние категории риска;
* технические параметры провайдера;
* внутренние идентификаторы.

### Где посмотреть результат AML

Результаты адреса и транзакции сохраняются отдельно.

Проверить их можно:

* в карточке заявки;
* в разделе **«Журнал событий» — «Логи заявок» — «AML лог»**.

При повторном запуске система может использовать последний сохранённый результат соответствующего типа, чтобы не отправлять лишние запросы к AML-провайдеру.

***

## Защищённое сохранение

Изменение списков мерчантов и выплат относится к защищённым финансовым операциям.

В зависимости от настроек безопасности система может потребовать:

* код подтверждения;
* подтверждение нового устройства;
* подтверждение недоверенного устройства;
* согласование второго администратора.

## Рекомендуемый порядок настройки

{% stepper %}
{% step %}

### Мерчант

1. Создайте и настройте мерчант.
2. Проверьте API-подключение.
3. Убедитесь, что модуль поддерживает нужную валюту.
4. Подключите его к валюте **«Отдаю»**.
5. Укажите точный код сети.
6. Настройте валидатор.
7. Выберите действие при ошибке реквизита.
8. Установите лимиты.
9. Нажмите **«Сохранить»**.
10. Создайте тестовую заявку.
    {% endstep %}

{% step %}

### Выплата

1. Создайте и настройте модуль выплаты.
2. Проверьте API-доступы.
3. Проверьте баланс провайдера.
4. Подключите выплату к валюте **«Получаю»**.
5. Укажите сеть.
6. Настройте разрешение автовыплаты.
7. Установите лимиты.
8. Сохраните настройки.
9. Выполните минимальную тестовую выплату.
   {% endstep %}

{% step %}

### AML

1. Подключите AML-сервис.
2. Проверьте поддержку актива и сети.
3. Выберите источник в валюте.
4. Настройте проверку адреса.
5. Настройте проверку транзакции.
6. Установите пороги.
7. Сначала выберите безопасное действие без блокировки.
8. Проведите тесты.
9. Проверьте результаты в логах.
10. Только после проверки включайте блокирующее действие.
    {% endstep %}
    {% endstepper %}

## Проверка после настройки

### Проверка мерчанта

1. Обновите страницу и убедитесь, что модуль сохранился.
2. Проверьте активность мерчанта.
3. Проверьте API-подключение.
4. Сравните сеть в валюте, модуле и правилах направления.
5. Создайте заявку с валютой на стороне **«Отдаю»**.
6. Проверьте выданный реквизит.
7. Проверьте фактическую сеть.
8. Проверьте валидатор.
9. Проверьте сумму ниже минимума.
10. Проверьте точную границу.
11. Проверьте сумму выше максимума.

### Проверка выплаты

1. Проверьте активность модуля.
2. Проверьте разрешение автовыплаты на всех уровнях.
3. Проверьте правила направления.
4. Проверьте сеть.
5. Выполните минимальную выплату.
6. Проверьте хеш транзакции.
7. Проверьте фактическую сеть.
8. Проверьте полученную сумму.
9. Проверьте поведение при достижении лимитов.

### Проверка AML

1. Проверьте активность сервиса.
2. Проверьте **«Обозначение для XML»**.
3. Используйте безопасную тестовую сумму.
4. Проверьте сумму ниже порога.
5. Проверьте сумму, равную порогу.
6. Проверьте сумму выше порога.
7. Проверьте успешный ответ.
8. Проверьте ответ с повышенным риском.
9. Проверьте недоступность сервиса.
10. Найдите результат в заявке и AML-логе.
11. После проверки включите необходимое блокирующее действие.

***

## Рекомендации

Для большинства валют рекомендуется:

* использовать настройки валюты для одинаковых направлений;
* создавать правила направления только для исключений;
* указывать сеть согласно документации провайдера;
* использовать валидатор реквизитов;
* блокировать выдачу адреса при ошибке проверки;
* устанавливать безопасные лимиты;
* начинать автоматические выплаты с минимальных сумм;
* проверять баланс провайдера;
* не включать блокирующий AML до завершения тестов;
* помнить, что AML-порог использует строгое сравнение;
* проверять результаты в журналах;
* создавать новую заявку после изменения настроек;
* использовать защищённые операции для мерчантов и выплат.

## Коротко

Группа **«Автоматизация»** связывает валюту с финансовыми сервисами.

В разделе **«Мерчанты»** настраиваются:

* получение реквизитов;
* приём платежей;
* сети;
* валидаторы;
* лимиты.

В разделе **«Выплаты»** настраиваются:

* сервисы отправки средств;
* сети;
* автоматический запуск;
* лимиты операций.

В разделе **«AML анализ»** настраиваются:

* проверка адреса клиента;
* проверка входящей транзакции;
* пороги запуска;
* действия при повышенном риске;
* тексты для клиента.

Перед запуском обязательно проверьте API, сеть, лимиты и полный процесс на новой тестовой заявке.


# Дополнительное

Группа **«Дополнительное»** содержит настройки валюты, которые влияют на резервы, оборотные лимиты, выдачу платёжных реквизитов, пересчёт открытых заявок, партнёрские выплаты и отдельные функции клиентской страницы.

{% hint style="info" %}
Каждая страница сохраняется независимо. После изменения параметров обязательно нажмите **«Сохранить»** перед переходом в другой раздел.
{% endhint %}

## Где находятся настройки

В панели управления откройте: **«Основное» — «Валюты» — «Список валют»**

<figure><img src="/files/LNIgDP4v05KgDe9kOLnT" alt=""><figcaption></figcaption></figure>

Выберите нужную валюту и перейдите к её редактированию.

<figure><img src="/files/ChFueybBZ6BQ4MIUOJ1V" alt=""><figcaption></figcaption></figure>

Затем раскройте группу **«Дополнительное»** и откройте необходимый раздел.

Для просмотра и изменения настроек группе менеджера должно быть разрешено управление валютами.

***

## Резервы и лимиты

Откройте: **«Дополнительное» — «Резервы и лимиты»**

В этом разделе настраиваются:

* ограничения по текущему резерву;
* дневные и месячные оборотные лимиты;
* ограничения количества незавершённых заявок;
* корректировка входящего резерва после завершения обмена;
* комиссия перевода на стороне **«Получаю»**.

Эти настройки не заменяют минимальные и максимальные суммы направления. Лимиты валюты и направления проверяются независимо и могут применяться одновременно.

### Максимальная сумма резерва «Отдаю»

Поле устанавливает верхний порог текущего резерва входящей валюты.

Во время создания заявки система проверяет резерв валюты **«Отдаю»**.

Если для направления используется общий резерв, проверяется эффективный резерв валюты с учётом связанных источников.

Если у направления настроен индивидуальный резерв, проверяется значение этого направления.

Новая заявка блокируется только тогда, когда текущий резерв уже **больше** установленного значения.

Пример:

```
Максимальная сумма резерва «Отдаю»: 1 000 000 RUB
Текущий резерв: 1 100 000 RUB
```

Система запретит создание новой заявки, в которой клиент отдаёт RUB.

Параметр:

* не ограничивает сумму одной заявки;
* не уменьшает резерв;
* не задаёт доступную сумму выплаты;
* не заменяет резерв валюты **«Получаю»**.

Его назначение — прекратить дальнейший приём валюты, если её накопленный остаток стал слишком большим.

Значение `0` отключает проверку.

{% hint style="warning" %}
Не используйте это поле как ограничение суммы, которую клиент может получить. Достаточность резерва валюты **«Получаю»** проверяется отдельно.
{% endhint %}

### Максимальное отображаемое значение резерва валюты

Поле ограничивает резерв, который передаётся на публичный сайт.

Сначала система рассчитывает доступный резерв:

```
Доступный резерв = фактический резерв − скрытая сумма резерва
```

Если результат превышает установленный максимум, клиенту показывается значение из этого поля.

Пример:

```
Фактический резерв: 5 000 000 RUB
Скрытая сумма: 500 000 RUB
Доступный резерв: 4 500 000 RUB
Максимальное отображаемое значение: 1 000 000 RUB
```

На сайте будет показано:

```
1 000 000 RUB
```

Настройка:

* не изменяет фактический резерв;
* не создаёт финансовое ограничение;
* не отменяет проверку реальной доступной суммы;
* влияет только на публичные данные о резерве.

Значение `0` отключает специальное ограничение отображения.

{% hint style="info" %}
Максимальный отображаемый резерв используется для представления данных клиенту. Он не должен применяться как основная финансовая защита.
{% endhint %}

### Дополнительный процент, снимаемый с резерва

После успешного завершения заявки система может дополнительно уменьшить сумму, которая зачисляется во входящий резерв валюты **«Отдаю»**.

Расчёт:

```
Корректировка = сумма «Отдаю» × процент / 100
```

Пример:

```
Сумма «Отдаю»: 100 000 RUB
Дополнительный процент: 1%
Корректировка: 1 000 RUB
```

В общий резерв будет добавлено:

```
100 000 − 1 000 = 99 000 RUB
```

Настройка подходит, если часть принятой суммы:

* удерживается провайдером;
* относится к расходам;
* не должна увеличивать доступный резерв;
* используется для отдельного финансового учёта.

Значение `0` отключает корректировку.

{% hint style="info" %}
Не учитывайте один расход одновременно в комиссиях направления и в этом поле. Иначе он будет применён дважды.
{% endhint %}

### Количество заявок «Ожидается оплата» за час

Ограничивает количество заявок одного авторизованного пользователя:

* с этой валютой на стороне **«Отдаю»**;
* в статусе **«Ожидается оплата»**;
* созданных за последний час.

Если пользователь превысил установленное количество, новая заявка блокируется.

Настройка помогает уменьшить:

* массовое создание заявок;
* резервирование средств без оплаты;
* нагрузку на операторов;
* злоупотребление платёжными реквизитами.

Для гостевой заявки без связанного аккаунта ограничение не применяется.

Значение `0` отключает лимит.

### Количество заявок «В процессе оплаты» за час

Работает так же, но учитывает заявки в статусе **«В процессе оплаты»**.

Оба часовых ограничения относятся к количеству заявок, а не к их общей сумме.

Значение `0` отключает лимит.

### Дневные лимиты

{% stepper %}
{% step %}

#### Дневной лимит для «Отдаю»

Ограничивает общий дневной оборот валюты на стороне **«Отдаю»**.

Перед созданием новой заявки система складывает:

* суммы **«Отдаю»** по выполненным заявкам за текущий день;
* сумму **«Отдаю»** новой заявки.

Пример:

```
Дневной лимит: 1 000 000 RUB
Выполнено сегодня: 900 000 RUB
Новая заявка: 150 000 RUB
```

Общий объём:

```
1 050 000 RUB
```

Новая заявка будет заблокирована.

Лимит действует сразу во всех направлениях, где редактируемая валюта находится на стороне **«Отдаю»**.
{% endstep %}

{% step %}

#### Дневной лимит для «Получаю»

Ограничивает общий дневной объём выполненных заявок, в которых клиент получает редактируемую валюту.

Система учитывает:

* суммы **«Получаю»** выполненных заявок;
* сумму **«Получаю»** новой заявки.

Лимит действует во всех направлениях с этой валютой на стороне **«Получаю»**.
{% endstep %}
{% endstepper %}

### Месячные лимиты

{% stepper %}
{% step %}

#### Месячный лимит для «Отдаю»

Работает как дневной лимит, но учитывает выполненные заявки за текущий календарный месяц.
{% endstep %}

{% step %}

#### Месячный лимит для «Получаю»

Ограничивает общий месячный объём заявок на стороне **«Получаю»**.

Для дневных и месячных лимитов:

* учитываются только выполненные заявки;
* период определяется по времени последнего обновления заявки;
* к накопленному объёму добавляется новая заявка;
* значение `0` отключает ограничение.
  {% endstep %}
  {% endstepper %}

### Чем отличаются резервные настройки

| Настройка                          | Что контролирует                                                | Изменяет фактический резерв |
| ---------------------------------- | --------------------------------------------------------------- | --------------------------- |
| Максимальная сумма резерва «Отдаю» | Возможность принимать новые заявки при большом входящем остатке | Нет                         |
| Максимальный отображаемый резерв   | Число, показанное клиенту                                       | Нет                         |
| Дополнительный процент             | Сумму, которая добавляется во входящий резерв после выполнения  | Да                          |
| Дневные и месячные лимиты          | Общий оборот за период                                          | Нет                         |
| Часовые лимиты                     | Количество незавершённых заявок пользователя                    | Нет                         |

***

## Реквизиты

Откройте: **«Дополнительное» — «Реквизиты»**

{% content-ref url="/pages/JMjl3lO9g7QNMtdGmv6J" %}
[Платёжные реквизиты](/guide/obmen/rekvizity/platyozhnye-rekvizity)
{% endcontent-ref %}

Раздел определяет:

* порядок выбора ручных реквизитов валюты;
* способ их выдачи клиенту;
* кто устанавливает сроки;
* когда запускается таймер оплаты;
* какой текст отображается во время ожидания.

Настройки применяются, когда валюта находится на стороне **«Отдаю»**.

### Приоритет источников реквизитов

При открытии страницы оплаты система проверяет источники в следующем порядке:

1. активный мерчант направления;
2. активный мерчант валюты **«Отдаю»**;
3. реквизиты, выданные оператором по запросу;
4. ручные реквизиты направления;
5. ручные реквизиты валюты **«Отдаю»**.

{% hint style="warning" %}
Если активный мерчант не вернул подходящие реквизиты, система не обязана заменять его ручным счётом. Сначала проверьте журнал мерчанта и причину ошибки.
{% endhint %}

### Тип вывода реквизитов

Параметр управляет только ручными реквизитами, привязанными к валюте.

Если в направлении выбраны собственные реквизиты, они используются раньше и имеют собственную стратегию выбора.

{% stepper %}
{% step %}

#### По умолчанию

Используется обычный порядок записей. Система выбирает первый доступный реквизит.

Режим не выполняет случайное распределение или круговую ротацию.
{% endstep %}

{% step %}

#### Рандомно

Перед каждой новой выдачей порядок доступных реквизитов перемешивается.

Режим помогает распределять заявки, но не гарантирует одинаковое количество операций на каждом счёте.
{% endstep %}

{% step %}

#### По порядку

Реквизиты сортируются по внутреннему ID, после чего выбирается первый доступный.

Это не круговая очередь.

Пока первый реквизит:

* активен;
* не исчерпал лимит;
* не занят как одноразовый;

он может выдаваться многократно.

Следующий используется только после того, как предыдущий перестал подходить.
{% endstep %}
{% endstepper %}

### Когда реквизит считается доступным

Система проверяет, что запись:

* активна;
* относится к нужной области использования;
* содержит карту, счёт или кошелёк;
* не использована ранее, если она одноразовая;
* не достигла лимита просмотров;
* не достигла дневного лимита суммы;
* не достигла месячного лимита суммы.

Если реквизит становится недоступным во время одновременного создания заявок, система переходит к следующему кандидату.

### Способ выдачи реквизитов

#### Стандартный

После создания заявки клиент сразу получает:

* реквизит мерчанта;
* либо доступный ручной реквизит.

Оператору не нужно выдавать данные вручную.

#### По запросу клиента

Заявка создаётся без платёжных данных.

Оператор открывает её и выдаёт реквизиты через блок **«Реквизиты по запросу»**.

{% content-ref url="/pages/DJETI2fstUXgKpYX9f28" %}
[Реквизиты по запросу](/guide/obmen/rekvizity/rekvizity-po-zaprosu)
{% endcontent-ref %}

До выдачи клиент видит состояние ожидания и настроенный текст.

{% hint style="info" %}
Клиент не должен выполнять оплату до появления платёжных реквизитов непосредственно на странице его заявки.
{% endhint %}

### Приоритет направления и валюты

Режим по запросу выбирается так:

1. если он включён в направлении, используются настройки направления;
2. если в направлении он не включён, проверяется валюта **«Отдаю»**;
3. если режим не включён ни на одном уровне, используется стандартная выдача.

Способ выдачи фиксируется при создании заявки.

Последующее изменение валюты или направления не изменяет уже созданную заявку.

***

## Пересчёт заявок

Откройте: **«Дополнительное» — «Пересчёт заявок»**

Раздел определяет, когда сумма открытой заявки может быть повторно рассчитана по актуальному курсу.

Правило валюты применяется только к заявкам, где редактируемая валюта находится на стороне **«Отдаю»**.

{% hint style="warning" %}
Пересчёт изменяет финансовые параметры уже созданной заявки. Не разрешайте его в статусах, где клиент уже выполнил окончательную оплату или сумма была зафиксирована оператором.
{% endhint %}

### Приоритет правил пересчёта

При запуске система проверяет правила в следующем порядке:

1. фиксированный курс направления;
2. плавающий курс направления;
3. индивидуальная политика валюты **«Отдаю»**;
4. общая политика валют.

Если правило направления успешно выполнило пересчёт, правила валюты не применяются.

Если индивидуальная политика валюты не подошла по условиям, система может перейти к общей политике.

### Где находятся общие правила

Общая политика валют настраивается через список валют:

1. Откройте **«Основное» — «Валюты» — «Список валют»**.
2. Нажмите кнопку настроек в верхней части страницы.
3. Настройте общие статусы и условия.
4. Нажмите **«Сохранить»**.

Способ запуска пересчёта настраивается отдельно: **«Настройки» — «Общие настройки» — «Основные» — «Обмен»**

Найдите поле: **«Способ пересчёта заявок»**

Доступны варианты:

* **«При изменении статуса»**;
* **«По cron»**;
* **«В обоих случаях»**.

### Откуда брать настройки

{% stepper %}
{% step %}

#### Общие настройки

Для валюты используется общая политика.

Индивидуальные условия текущей валюты не применяются.

Текст под курсом остаётся отдельным и может быть сохранён независимо.
{% endstep %}

{% step %}

#### Индивидуальные настройки

Для валюты задаются собственные:

* статусы;
* условия;
* пороги;
* интервалы;
* ограничения.
  {% endstep %}
  {% endstepper %}

### В каких статусах можно пересчитывать заявку

Выберите статусы, в которых разрешено изменение суммы.

Выполненная заявка в список не включается.

Если пересчёт включён, но не выбран ни один статус, правило не будет работать.

Пересчёт также блокируется, если у заявки установлен признак заморозки средств.

### Когда пересчитывать сумму

{% stepper %}
{% step %}

#### Не пересчитывать

Индивидуальная политика выключена.

Общая политика при этом может продолжать работать.
{% endstep %}

{% step %}

#### Пересчитывать всегда

При каждом подходящем запуске система выполняет пересчёт, если пройдены:

* статус;
* направление изменения курса;
* пороги;
* задержка;
* минимальная пауза;
* количество пересчётов;
* максимальное время в статусе;
* другие ограничения.

Слово **«всегда»** не отменяет дополнительные проверки.
{% endstep %}

{% step %}

#### Пересчитывать только при выполнении условий

Необходимо указать минимум одно основное условие:

* процент изменения курса;
* интервал проверки.

Между этими двумя условиями действует логика **«ИЛИ»**: достаточно выполнения одного.

Остальные ограничения применяются одновременно по логике **«И»**.
{% endstep %}
{% endstepper %}

### Изменение курса в процентах

Система сравнивает новый курс с курсом последнего успешного пересчёта.

Если абсолютное изменение достигло заданного процента, условие считается выполненным.

Если у заявки ещё нет предыдущего пересчитанного курса, процентное условие может не запуститься самостоятельно.

Для первого автоматического пересчёта можно также задать временной интервал.

### Проверять не чаще одного раза в

Поле задаёт минимальный интервал для периодической проверки через CRON.

После успешного пересчёта следующая попытка выполняется не раньше указанного времени.

При запуске по изменению статуса это поле не создаёт отдельную задержку.

Для задержки после перехода в статус используется отдельная настройка.

### Направление изменения курса

Доступны варианты:

* **«Рост или падение»**;
* **«Только если курс вырос»**;
* **«Только если курс снизился»**.

#### Минимальный рост курса

Пересчёт разрешается, если рост достиг указанного процента.

Значение `0` отключает порог.

#### Минимальное падение курса

Пересчёт разрешается, если снижение достигло указанного процента по абсолютному значению.

Значение `0` отключает порог.

{% hint style="warning" %}
Не устанавливайте одновременно положительный порог роста и положительный порог падения. Эти условия должны выполняться одновременно, а курс не может одновременно расти и снижаться.
{% endhint %}

### Пересчитывать только при изменении курса

Если параметр включён, пересчёт не выполняется, когда новый курс равен текущему курсу заявки.

Если получить новый курс не удалось, заявка также не пересчитывается.

#### Минимальная сумма «Отдаю»

Правило применяется только к заявкам с суммой не ниже установленного значения.

Значение `0` отключает ограничение.

### Задержка после перехода в статус

Определяет, сколько минут должно пройти после смены статуса до первого пересчёта.

Значение `0` отключает задержку.

### Минимальная пауза между пересчётами

Защищает заявку от слишком частого изменения.

Система учитывает время последнего успешного пересчёта независимо от того, каким механизмом он был выполнен.

Значение `0` отключает ограничение.

### Максимум пересчётов в одном статусе

Ограничивает количество успешных пересчётов, пока заявка находится в одном статусе.

После перехода в другой статус счётчик начинается заново.

Значение `0` означает отсутствие ограничения.

### Максимальное время нахождения в статусе

Пересчёт разрешён только в течение установленного времени после перехода заявки в статус.

После окончания периода правило перестаёт применяться.

Значение `0` отключает ограничение.

### Текст под курсом обмена

Мультиязычный текст показывается клиенту рядом с курсом.

Пример:

```
Курс и итоговая сумма заявки могут измениться до фиксации оплаты.
```

Текст:

* не включает пересчёт;
* не меняет курс;
* может использоваться и при общей политике.

### Пример настройки пересчёта

Задача: пересчитывать крупные неоплаченные заявки при изменении курса минимум на `1%`, но не чаще одного раза в `10` минут.

1. Выберите **«Индивидуальные настройки»**.
2. Добавьте нужные неоплаченные статусы.
3. Выберите пересчёт по условиям.
4. Укажите изменение курса `1%`.
5. Укажите интервал `10 минут`.
6. Включите проверку фактического изменения курса.
7. Установите минимальную сумму, если правило нужно только для крупных заявок.
8. Укажите минимальную паузу `10 минут`.
9. Нажмите **«Сохранить»**.
10. Проверьте каждый выбранный статус на тестовой заявке.

***

## Партнёрская программа

Откройте: **«Дополнительное» — «Партнёрская программа»**

Раздел определяет:

* доступна ли валюта для вывода партнёрского баланса;
* каким партнёрам она показывается;
* какую комиссию удерживать при выплате.

Эта страница не включает начисление бонуса за обмен. Она относится к выводу уже начисленного партнёрского баланса.

{% content-ref url="/pages/KUXKUzy3pdjSY2T7qsoI" %}
[Валюты для партнёрских выплат](/guide/marketing/partnyorskaya-programma/valyuty-dlya-partnyorskikh-vyplat)
{% endcontent-ref %}

***

## Другие опции

Откройте: **«Дополнительное» — «Другие опции»**

Настройки этого раздела применяются, когда валюта находится на стороне **«Отдаю»**.

### Статус QR-кода

Включает формирование QR-кода для платёжного реквизита на странице заявки.

QR-код может быть создан только после того, как система получила непустой платёжный реквизит.

Если реквизит ещё не выдан, QR-код сформировать невозможно.

### Префикс QR-кода

Значение добавляется перед платёжным реквизитом.

Формула:

```
QR = префикс + реквизит
```

Примеры:

```
bitcoin:
ethereum:
tron:
```

Указывайте только формат, который поддерживают кошельки выбранной сети.

Неправильный префикс не изменит реквизит заявки, но QR-код может:

* не открыться;
* открыть неподходящее приложение;
* использовать неправильный сценарий оплаты.

### Добавлять сумму

Если параметр включён, в QR-код добавляется:

```
amount=сумма_заявки
```

Система автоматически использует разделитель:

* `?`, если параметров ещё нет;
* `&`, если они уже присутствуют.

Примеры:

```
bitcoin:address?amount=0.01
```

```
https://example.com/pay?address=address&amount=0.01
```

Перед включением проверьте результат в нескольких кошельках. Разные приложения могут ожидать другое название или формат параметра.

### Прикрепить чек к заявке

Если выбрано **«Да»**, клиент должен загрузить подтверждение оплаты.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/YHOY6VLRs06cVB3gInz1" %}
[Как клиенты могут привязать чек к заявке?](/help-center/rabota-v-sisteme/zayavki/kak-klienty-mogut-privyazat-chek-k-zayavke)
{% endcontent-ref %}

Пока файл не выбран и не прошёл первичную проверку, кнопка подтверждения оплаты остаётся недоступной.

{% hint style="warning" %}
Прикреплённый чек не подтверждает фактическое поступление средств. Перед завершением заявки проверьте оплату через банк, мерчант или блокчейн.
{% endhint %}

### Разрешить приём заявок

{% stepper %}
{% step %}

#### Да

Валюта может использоваться на стороне **«Отдаю»**, если остальные условия также выполнены.
{% endstep %}

{% step %}

#### Нет

Создание новых заявок с этой валютой на стороне **«Отдаю»** блокируется.

При этом:

* валюта может оставаться активной;
* направления могут отображаться;
* использование на стороне **«Получаю»** не запрещается;
* открытые заявки не отменяются.

Настройка подходит для временной остановки приёма валюты без полного отключения всех связанных направлений.
{% endstep %}
{% endstepper %}

### Отображение этапов в карточке заявки

Включает публичный список этапов обработки заявки.

{% content-ref url="/pages/BepmKdxHjoK3KJR0vkg3" %}
[Этапы для Заявок](/guide/zayavki/upravlenie-zayavkami/etapy-dlya-zayavok)
{% endcontent-ref %}

Настройка влияет только на отображение.

Она не:

* создаёт этапы;
* меняет статусы;
* запускает автоматизацию;
* определяет workflow.

Чтобы клиент увидел этапы, для заявки должна существовать настроенная публичная последовательность.

### Email-верификация

Если параметр включён, основное содержимое страницы оплаты закрывается до подтверждения email.

{% content-ref url="/pages/OkKDfMApGsB2m3bvCsHg" %}
[Уведомление по E-mail](/guide/uvedomleniya/uvedomlenie-po-e-mail)
{% endcontent-ref %}

Клиент видит состояние:

```
Ожидается подтверждение E-mail
```

После подтверждения адреса он может продолжить работу с заявкой без повторного создания.

Настройка:

* не относится к Google 2FA;
* не является кодом входа администратора;
* не заменяет KYC;
* не относится к защищённым операциям менеджера.

Для работы должны быть настроены:

* почтовый сервис;
* адрес отправителя;
* фоновые очереди;
* шаблоны писем;
* корректный публичный адрес сайта.

Если email уже подтверждён, повторная проверка не требуется.

***

## Рекомендации

Для большинства валют рекомендуется:

* использовать максимальный резерв **«Отдаю»** только для ограничения накопления входящей валюты;
* не использовать отображаемый резерв как финансовую защиту;
* проверять изменение общего резерва на тестовой заявке;
* ограничивать количество незавершённых заявок;
* не дублировать комиссии;
* учитывать приоритет мерчантов и реквизитов направления;
* запускать таймер после выдачи реквизитов при ручной обработке;
* проверять изменённые настройки только на новых заявках;
* использовать понятные статусы пересчёта;
* не задавать одновременно пороги роста и падения;
* проверять CRON и очереди;
* рассчитывать партнёрскую выплату вручную перед запуском;
* проверять QR-код в реальных кошельках;
* не считать загруженный чек подтверждением поступления средств;
* временно отключать приём заявок перед серьёзными изменениями.

## Коротко

Группа **«Дополнительное»** содержит дополнительные правила работы валюты.

В разделе **«Резервы и лимиты»** настраиваются:

* ограничения резерва;
* публичное отображение;
* дневные и месячные обороты;
* количество незавершённых заявок;
* комиссии перевода.

Раздел **«Реквизиты»** управляет порядком и способом выдачи платёжных данных.

Раздел **«Пересчёт заявок»** задаёт индивидуальные условия изменения суммы по актуальному курсу.

Раздел **«Партнёрская программа»** управляет доступностью валюты и комиссиями при выводе партнёрского баланса.

Раздел **«Другие опции»** включает QR-код, загрузку чека, приём заявок, этапы и подтверждение email.

После изменения настроек обязательно сохраните каждую страницу и создайте новую тестовую заявку.


# Коды валют

Раздел **«Коды валют»** предназначен для управления базовыми обозначениями валют, которые используются в системе iEXExchanger для расчётов курсов, формирования направлений обмена, партнёрских вознаграждений и корректной работы платёжных систем.

Коды валют являются фундаментальной частью системы. Они не относятся к сетям или платёжным шлюзам и используются как единая точка идентификации валюты во всех модулях.

{% hint style="info" %}

## Рекомендации

* Используйте только общепринятые международные коды валют.
* Не дублируйте валюты с разными кодами для одной и той же сущности.
* Для мультисетевых валют всегда используйте один общий код.
* Задавайте ручной курс только в случае необходимости жёсткой фиксации расчётов.
  {% endhint %}

Чтобы настроить или добавить новые коды валют, откройте в панели управления раздел **«Основное — Коды валют».**

<figure><img src="/files/YaG7iU8BlAjtmZoGe23Z" alt=""><figcaption></figcaption></figure>

***

Для добавления нового кода валюты:

1. Нажмите кнопку **«Добавить код»** в правом верхнем углу страницы.
2. В открывшемся окне укажите значение в поле **«Код валюты».**
3. Подтвердите действие, нажав кнопку **«Добавить код»**.

После сохранения код валюты станет доступен для использования во всех связанных разделах системы.

<figure><img src="/files/XPs3Tko7k2UsAs0SP5bo" alt=""><figcaption></figcaption></figure>

***

#### Поле «Код валюты»

В поле «Код валюты» необходимо указывать стандартное обозначение валюты в международном формате.

Примеры корректных кодов:

* USD
* EUR
* RUB
* USDT
* BTC
* ETH<br>

Допускается добавление нескольких кодов одновременно. В этом случае значения указываются через запятую: `USD, EUR, RUB`

Система автоматически создаст отдельный код валюты для каждого значения.

{% hint style="danger" %}

#### Важные правила заполнения

Запрещено указывать название сети в коде валюты.

Некорректные примеры:

* USDTTRC
* USDT\_ERC20
* BTCBEP

Корректные примеры:

* USDT
* BTC

Если валюта поддерживает несколько сетей (например, USDT TRC20 и USDT ERC20), используется один общий код валюты — «USDT».

Название сети (TRC20, ERC20, BEP20 и другие) указывается отдельно при настройке платёжной системы или направления обмена.

Соблюдение этих правил обязательно. Некорректные коды валют могут привести к ошибкам в расчётах и нестабильной работе обменного сервиса.
{% endhint %}

<details>

<summary>Где взять коды фиатных валют?</summary>

Откройте сайт [FiatMarketCap](https://fiatmarketcap.com/) и в списке вы увидите все доступные фиатные коды.

<img src="/files/E1XFXxoLH2u9kSQm0WJU" alt="" data-size="original">

</details>

<details>

<summary>Где взять коды криптовалют?</summary>

Открываете самый популярный сайт [CoinMarketCap](https://coinmarketcap.com/) и в списке вы увидите все доступные платежные системы. (Пример: Bitcoin BTC, Tether USDT).&#x20;

Вам необходимо добавить только код, который находится рядом с платежной системой. (Пример: BTC, USDT, MATIC, XRP)

<img src="/files/vW8fagi7PuHDwJuagO2O" alt="" data-size="original">

</details>

***

### Редактирование кода валюты

Для изменения параметров существующего кода валюты:

1. Найдите нужный код в списке.
2. Нажмите на название валюты или иконку редактирования.
3. В открывшемся окне внесите необходимые изменения.
4. Сохраните изменения, нажав кнопку «Сохранить».

<figure><img src="/files/nRFmEXWyyuqBCTRklWEP" alt=""><figcaption></figcaption></figure>

На открывшемся окне, выберите курс

<figure><img src="/files/FCSNmeUPotPxYE5Mypoh" alt="" width="563"><figcaption></figcaption></figure>

**Курс** — укажите фиксированный ручной курс обмена, который будет использоваться для расчёта бонусов партнёрам.

{% hint style="info" %}

## Важно&#x20;

Параметр **«Курс»** не являются обязательными. Если вы их не заполните, курс будет определяться автоматически.
{% endhint %}

***

### Настройка курса валюты для партнёрских расчётов

Каждому коду валюты можно задать курс, который используется исключительно для расчёта партнёрских вознаграждений.

#### Поле «Курс»

Курс указывается в следующем формате: `1 USDT = 1.01 USDC`

Значение может быть дробным. Допускается ввод с использованием точки или запятой — система автоматически приведёт формат при сохранении.

***

#### Автоматический и ручной режим курса

* Ручной курс — используется фиксированное значение, заданное администратором.
* Автоматический курс — если поле «Курс» не заполнено, система автоматически определяет актуальный курс и применяет его при расчётах.

Параметр **«Курс»** не является обязательным. При отсутствии значения система всегда корректно работает в автоматическом режиме.


# Платёжные системы

Инструкция по созданию платежной системы

Для управления платёжными системами перейдите в раздел **«Основное — Платёжные системы».**

Здесь вы можете:

* добавлять новые платёжные системы;
* настраивать параметры и изменять существующие;
* указывать названия платёжных систем и загружать их логотипы;
* задавать сети, в которых работает выбранная валюта — например, TRC20, ERC20 и другие.

***

<figure><img src="/files/DWZUM8WqnSTorlt6jAy2" alt=""><figcaption></figcaption></figure>

Чтобы добавить новую платёжную систему, нажмите кнопку **«Добавить ПС»**, расположенную в верхнем правом углу страницы.

<figure><img src="/files/VeIwuGIe7ph2bv1uZn3y" alt=""><figcaption></figcaption></figure>

После этого откроется форма для ввода названия, загрузки логотипа и указания необходимых параметров платёжной системы.

<figure><img src="/files/hfRmn2wJwOUgtSsEh2vo" alt="" width="563"><figcaption></figcaption></figure>

#### **Поле «Название ПС»**

В этом поле укажите понятное и короткое название платёжной системы, которое будет отображаться клиентам. Не добавляйте код валюты — для этого предусмотрен отдельный раздел.

**Примеры подходящих названий:**

* Bitcoin
* Tether TRC20
* Tether ERC20
* Litecoin
* Ethereum
* Binance Coin BEP20

Если одна и та же валюта доступна в нескольких сетях, обязательно указывайте сеть рядом с её названием (например, Tether TRC20 или Tether ERC20) — это поможет пользователям выбрать правильный вариант и избежать ошибок при оплате.

#### Поле «Выберите изображение»

В этом разделе вы можете выбрать и загрузить логотип платёжной системы. Он будет отображаться рядом с её названием, помогая пользователям легко узнавать и различать платёжные методы.

**Рекомендации по загрузке:**

* используйте чёткие и качественные изображения для лучшего визуального восприятия;
* поддерживаемые форматы: PNG, JPG, WEBP, SVG, GIF;
* максимальный размер файла — до 5 МБ.

**Как загрузить:**

* кликните по области загрузки, чтобы выбрать файл;
* перетащите изображение в поле;
* или вставьте из буфера обмена: ⌘ V (macOS) / Ctrl + V (Windows).

{% file src="/files/yuo8Dryp33mSLz7PtOSA" %}
**Архив иконок платежных систем**
{% endfile %}


# Фильтры для валют

Раздел «Фильтры для валют» используется для удобной группировки валют на сайте обменника. С помощью фильтров клиент может быстро переключаться между категориями валют и находить нужные направления обмена.

Раздел находится в панели управления: **«Основное» — «Фильтры для валют»**

<figure><img src="/files/tbyykN2EzIEjbHWENOFG" alt=""><figcaption></figcaption></figure>

## Для чего нужны фильтры валют

Если в обменнике используется большое количество валют, банков, криптовалют и наличных направлений, поиск нужной валюты может занимать время.

Фильтры позволяют объединить валюты в логические группы и упростить навигацию.

Например:

<table><thead><tr><th width="255.65234375">Фильтр</th><th>Валюты внутри</th></tr></thead><tbody><tr><td>Криптовалюты</td><td>BTC, ETH, USDT, LTC</td></tr><tr><td>Банки</td><td>Сбербанк, Т-Банк, Альфа-Банк</td></tr><tr><td>Наличные</td><td>Cash USD, Cash EUR, Cash RUB</td></tr><tr><td>Карты</td><td>Visa, MasterCard, Мир</td></tr><tr><td>Электронные кошельки</td><td>Payeer, Volet, YooMoney</td></tr></tbody></table>

После выбора фильтра клиент увидит только валюты, относящиеся к выбранной группе.

***

## Включение фильтров на сайте

Создание фильтров не включает их отображение автоматически.

<figure><img src="/files/g18Gr4bg7uAGWd3QZYW0" alt="" width="563"><figcaption></figcaption></figure>

Чтобы фильтры появились на главной странице сайта:

1. Перейдите в раздел **«Настройки» — «Общие настройки» — «Оформление».**
2. Найдите параметр **«Включить отображение фильтров».**
3. Включите настройку.
4. Нажмите **«Сохранить».**

Если параметр выключен, фильтры останутся доступными в админке, но не будут отображаться клиентам.

## Что отображается в списке фильтров

На странице отображаются все созданные фильтры.

Для каждого фильтра показывается:

* название фильтра;
* иконка фильтра (если загружена);
* отметка Cash-first (если режим включён);
* количество привязанных валют;
* кнопка редактирования;
* кнопка удаления;
* область для сортировки перетаскиванием.

Также доступна кнопка:

«Привязанные валюты»

Она показывает количество валют, входящих в выбранный фильтр.

## Создание фильтра

Чтобы создать новый фильтр:

<figure><img src="/files/3tTOEkzzWcox6idPdODy" alt=""><figcaption></figcaption></figure>

1. Откройте **«Основное» — «Фильтры для валют».**
2. Нажмите **«Добавить фильтр».**
3. Укажите название фильтра.
4. При необходимости загрузите иконку.
5. Выберите валюты, которые должны входить в этот фильтр.
6. При необходимости включите режим Cash-first.
7. Сохраните изменения.

{% stepper %}
{% step %}

### Название фильтра

Название отображается клиентам на сайте.

Поддерживается мультиязычность.

Название на основном языке системы обязательно.

Примеры:

* Криптовалюты
* Банки
* Наличные
* Карты
* Электронные кошельки
* Популярные
  {% endstep %}

{% step %}

### Иконка фильтра

Для фильтра можно загрузить собственную иконку.

Поддерживаемые форматы:

* JPG
* JPEG
* PNG
* WEBP
* SVG
* GIF

Максимальный размер файла: **до 5 МБ**

Иконку можно заменить или удалить в любой момент.
{% endstep %}

{% step %}

### Привязка валют

В блоке «Валюты» выбираются валюты, которые будут входить в фильтр.

Пример:

Для фильтра «Криптовалюты» можно выбрать:

* Bitcoin BTC
* Ethereum ETH
* Tether USDT
* Litecoin LTC

Для фильтра «Банки» можно выбрать:

* Сбербанк RUB
* Т-Банк RUB
* Альфа-Банк RUB

{% hint style="info" %}

#### Ограничение на привязку

Одна валюта может входить только в один фильтр.

Если валюта уже используется в другом фильтре, система не позволит выбрать её повторно.

Это предотвращает дублирование валют в нескольких категориях и делает интерфейс более понятным для клиента.
{% endhint %}
{% endstep %}
{% endstepper %}

### Режим Cash-first

<figure><img src="/files/yorkAVHIuBJzDKOVgRs1" alt=""><figcaption></figcaption></figure>

Для фильтров наличных валют доступна специальная настройка:

Cash-first

Этот режим меняет стандартную логику отображения валют.

Вместо обычного списка валют клиент сначала увидит:

* страны;
* города;
* доступные наличные направления.

{% stepper %}
{% step %}

#### Когда использовать Cash-first

Режим рекомендуется только для фильтров наличных направлений:

* Наличные
* Cash
* Cash USD
* Cash EUR
* Cash RUB

Для обычных фильтров этот режим обычно не используется.
{% endstep %}

{% step %}

#### Как работает Cash-first

Чтобы режим работал корректно:

* фильтр должен быть создан;
* режим Cash-first должен быть включён;
* к фильтру должны быть привязаны наличные валюты;
* по этим валютам должны существовать активные направления обмена;
* в направлениях должны быть настроены города.

Пример:

Клиент выбрал:

Отдаю: USDT TRC20

Затем открыл фильтр:

Наличные

Система покажет список доступных стран и городов, в которых можно получить наличные за USDT.
{% endstep %}
{% endstepper %}

***

## Просмотр привязанных валют

<figure><img src="/files/mp9dzunR1SrZcfjjlFs5" alt=""><figcaption></figcaption></figure>

Для каждого фильтра доступна кнопка: **«Привязанные валюты»**

После нажатия система откроет список валют, которые входят в выбранный фильтр.

Это удобно для проверки состава группы без открытия режима редактирования.

## Редактирование фильтра

Чтобы изменить существующий фильтр:

1. Откройте раздел **«Основное» — «Фильтры для валют».**
2. Нажмите на название фильтра.
3. Измените необходимые параметры:
   * название;
   * иконку;
   * список валют;
   * режим Cash-first.
4. Сохраните изменения.

## Удаление фильтра

При удалении фильтра:

* удаляется сам фильтр;
* удаляется его иконка;
* все валюты отвязываются от фильтра.

Важно:

Сами валюты при этом не удаляются.

Удаляется только группа фильтрации.

<table><thead><tr><th width="191.54296875">Валюта</th><th>Код</th></tr></thead><tbody><tr><td>Bitcoin</td><td>BTC</td></tr><tr><td>Ethereum</td><td>ETH</td></tr><tr><td>Tether</td><td>USDT</td></tr><tr><td>Dollar</td><td>USD</td></tr><tr><td>Euro</td><td>EUR</td></tr></tbody></table>

Для корректной фильтрации код валюты должен быть указан правильно.

## Рекомендуемая схема настройки

Для большинства обменников удобно использовать следующую структуру:

<table><thead><tr><th width="267.828125">Фильтр</th><th>Валюты</th></tr></thead><tbody><tr><td>Криптовалюты</td><td>BTC, ETH, USDT, LTC</td></tr><tr><td>Банки</td><td>Сбербанк, Т-Банк, Альфа-Банк</td></tr><tr><td>Наличные</td><td>Cash USD, Cash EUR, Cash RUB</td></tr><tr><td>Электронные кошельки</td><td>Payeer, Volet, YooMoney</td></tr><tr><td>Популярные</td><td>самые востребованные валюты</td></tr></tbody></table>

Для фильтра «Наличные» рекомендуется включить режим Cash-first.

## Частые проблемы

{% stepper %}
{% step %}

### Фильтры не отображаются на сайте

Проверьте настройку:

**«Настройки» — «Общие настройки» — «Оформление» — «Включить отображение фильтров»**
{% endstep %}

{% step %}

### Фильтр отображается, но валют нет

Проверьте, привязаны ли валюты к фильтру.
{% endstep %}

{% step %}

### Валюта не добавляется в фильтр

Скорее всего она уже используется в другом фильтре.

Откройте существующие фильтры и проверьте привязки.
{% endstep %}

{% step %}

### Cash-first не показывает города

Проверьте:

* существуют ли активные направления;
* включены ли города;
* привязаны ли наличные валюты к фильтру;
* активны ли сами валюты.
  {% endstep %}
  {% endstepper %}

## Рекомендация

Не создавайте слишком много фильтров.

Обычно достаточно:

* Криптовалюты
* Банки
* Наличные
* Электронные кошельки
* Популярные

Такой набор помогает клиенту быстро находить нужные направления и не перегружает интерфейс лишними категориями.

***

## Рекомендуемые ссылки

{% content-ref url="/pages/3u7IwxDxkioxjJFsx5pq" %}
[Настройка фильтрация валют](/guide/sait/vneshnii-vid/nastroika-filtraciya-valyut)
{% endcontent-ref %}


# Сети для валют

Раздел **«Сети для валют»** используется для объединения нескольких вариантов одной валюты в общую группу на клиентском сайте.

Чаще всего функция применяется для криптовалют, которые работают в разных блокчейн-сетях.

Например, вместо отдельных пунктов:

```
USDT TRC20
USDT ERC20
USDT BEP20
USDT TON
```

можно создать общую группу:

```
USDT
```

Внутри неё клиент сможет выбрать нужный вариант:

```
TRC20
ERC20
BEP20
TON
```

Такая группировка делает список валют компактнее, упрощает выбор и снижает риск того, что клиент перепутает разные сети одного актива.

## Где находится раздел

Откройте панель управления и перейдите в раздел: **«Основное» — «Валюты» — «Сети для валют»**

<figure><img src="/files/Zsz72vKDol8fq6GNL4sj" alt=""><figcaption></figcaption></figure>

На странице отображается список всех созданных сетей.

Для каждой записи доступны:

* название;
* иконка;
* привязанные валюты;
* тип отображения;
* дата последнего изменения;
* редактирование;
* удаление.

## Права доступа

Для просмотра и управления разделом у менеджера должно быть право:

**«Разрешить управление валютами в админпанели»**

Права настраиваются в разделе: **«Пользователи» — «Список групп пользователей»**

Откройте нужную группу, перейдите к настройке прав и включите необходимое разрешение.

Если менеджеру нужно выбирать изображения из медиатеки, дополнительно выдайте право:

**«Просмотр медиатеки»**

Если раздел отсутствует в меню, сначала проверьте права текущего пользователя.

***

## Для чего используются сети

Сеть для валют решает три основные задачи:

1. Объединяет несколько вариантов одного актива в общую визуальную группу.
2. Показывает клиенту доступные блокчейн-сети или способы использования валюты.
3. Позволяет выводить короткие обозначения, например `TRC20`, `ERC20` или `BEP20`.

Пример:

```
USDT
├── TRC20
├── ERC20
├── BEP20
└── TON
```

Сеть влияет только на отображение валют на клиентском сайте.

Каждая привязанная валюта продолжает оставаться самостоятельной сущностью iEXExchanger.

У неё сохраняются собственные:

* направления обмена;
* курсы;
* резервы;
* лимиты;
* реквизиты;
* мерчанты;
* модули выплат;
* комиссии;
* правила верификации;
* инструкции;
* настройки автоматизации.

## Что сеть не настраивает

Создание сети не приводит к автоматическому созданию или копированию:

* валют;
* направлений обмена;
* курсов;
* резервов;
* лимитов;
* реквизитов;
* мерчантов;
* автовыплат;
* комиссий;
* кодов сети для внешних API.

Например, после создания группы **USDT** направления для `USDT TRC20`, `USDT ERC20` и `USDT BEP20` необходимо создать и настроить отдельно.

{% hint style="warning" %}
Сеть объединяет валюты только визуально. Она не объединяет их финансовые данные, настройки приёма, выплаты и автоматизацию.
{% endhint %}

## Отличие сети от других настроек

Сеть для валют не следует путать с фильтрами и кодами внешних интеграций.

<table><thead><tr><th width="222.49609375">Настройка</th><th>Для чего используется</th></tr></thead><tbody><tr><td>Сеть для валют</td><td>Объединяет варианты одного актива на клиентском сайте</td></tr><tr><td>Фильтр валют</td><td>Позволяет отбирать валюты по категории</td></tr><tr><td>Короткий код</td><td>Показывает обозначение конкретного варианта внутри сети</td></tr><tr><td>Код сети мерчанта</td><td>Передаётся во внешнее API при приёме платежа</td></tr><tr><td>Код сети выплаты</td><td>Передаётся во внешнее API при отправке выплаты</td></tr></tbody></table>

Пример фильтра:

```
Криптовалюты
Банки
Электронные деньги
Наличные
```

Пример сети:

```
USDT
├── TRC20
├── ERC20
└── BEP20
```

Одна валюта может быть привязана только к одной сети, но при этом может участвовать в доступных фильтрах и других классификациях.

## Подготовка валют

Перед созданием сети подготовьте отдельную валюту для каждого поддерживаемого варианта.

Пример:

<table><thead><tr><th width="198.93359375">Валюта</th><th>Короткий код</th></tr></thead><tbody><tr><td>Tether TRC20</td><td>TRC20</td></tr><tr><td>Tether ERC20</td><td>ERC20</td></tr><tr><td>Tether BEP20</td><td>BEP20</td></tr><tr><td>Tether TON</td><td>TON</td></tr></tbody></table>

Не рекомендуется использовать одну валюту одновременно для нескольких блокчейн-сетей.

У разных сетей могут отличаться:

* формат адреса;
* комиссия сети;
* мерчант;
* способ проверки платежа;
* модуль выплаты;
* минимальная сумма;
* время подтверждения;
* правила обработки транзакций.

Поэтому каждый вариант лучше создавать как отдельную валюту.

## Как создать сеть

{% stepper %}
{% step %}

### Откройте форму

Перейдите в раздел:

**«Основное» — «Валюты» — «Сети для валют»**

Нажмите: **«Добавить сеть»**

<figure><img src="/files/p996roIUrNrNK26vi9Zz" alt=""><figcaption></figcaption></figure>

Откроется форма **«Новая сеть»**.
{% endstep %}

{% step %}

### Укажите название

В поле **«Название»** укажите общее название актива.

Примеры:

```
USDT
USDC
Ethereum
Bitcoin
Tether
```

Название будет отображаться клиентам на сайте.

Если сайт работает на нескольких языках, заполните название для каждой используемой языковой версии.

Название на основном языке системы является обязательным.

Рекомендуется использовать короткое название без перечисления всех вариантов.

Правильно:

```
USDT
```

Нежелательно:

```
USDT TRC20 ERC20 BEP20 TON
```

Конкретные варианты будут отображаться через короткие коды валют.
{% endstep %}

{% step %}

### Загрузите иконку

В поле **«Иконка»** можно:

* загрузить новое изображение;
* выбрать файл из медиатеки;
* удалить установленную иконку.

Поддерживаются форматы:

```
JPG
JPEG
PNG
WebP
SVG
```

Максимальный размер файла:

```
5 MB
```

Рекомендуется использовать квадратное изображение с прозрачным фоном.

Для криптовалют обычно используется официальный логотип актива.

Если отдельная иконка сети не загружена, клиентский сайт может использовать иконку первой доступной валюты из этой группы.

{% hint style="info" %}
Для выбора изображения из медиатеки у менеджера должно быть право **«Просмотр медиатеки»**.
{% endhint %}
{% endstep %}
{% endstepper %}

### Выберите тип отображения

{% tabs %}
{% tab title="Стандартная группировка" %}

<figure><img src="/files/a8ThOeD1eSOp308mJTWb" alt="" width="375"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Компактный список" %}

<figure><img src="/files/L1qEacODJNSlI34sQwto" alt="" width="375"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

В поле **«Тип отображения»** доступны два варианта:

* **«Стандартная»**;
* **«Компактная»**.

{% stepper %}
{% step %}

#### Стандартное отображение

При стандартном варианте валюты показываются внутри раскрывающейся группы полноценными строками.

Пример:

```
USDT
├── Tether TRC20
├── Tether ERC20
├── Tether BEP20
└── Tether TON
```

Стандартное отображение подходит, если:

* у валют длинные названия;
* нужно показывать полные названия;
* важно отображать иконки валют;
* в группе немного вариантов;
* клиенту нужна дополнительная информация перед выбором.
  {% endstep %}

{% step %}

#### Компактное отображение

При компактном варианте валюты выводятся как короткие кнопки.

Пример:

```
USDT

TRC20   ERC20   BEP20   TON
```

Компактное отображение подходит для мультисетевых криптовалют и групп с большим количеством вариантов.

Если у валюты не заполнен короткий код, система использует её ISO-код.

Поэтому для компактного режима рекомендуется обязательно заполнить короткие коды всех валют.
{% endstep %}
{% endstepper %}

### Выберите валюты

В поле **«Валюты в сети»** выберите валюты, которые должны войти в группу.

Например, для USDT:

* Tether TRC20;
* Tether ERC20;
* Tether BEP20;
* Tether TON.

В списке отображаются валюты, которые не находятся в архиве.

Одна валюта может находиться только в одной сети.

### Настройте короткие коды

<figure><img src="/files/5UlbrzxTQJxog18ncskj" alt="" width="563"><figcaption></figcaption></figure>

После выбора валют нажмите: **«Настроить сети»**

Откроется окно **«Сети выбранных валют»**.

Напротив каждой валюты укажите короткий код.

<table><thead><tr><th width="200.74609375">Валюта</th><th>Короткий код</th></tr></thead><tbody><tr><td>Tether TRC20</td><td>TRC20</td></tr><tr><td>Tether ERC20</td><td>ERC20</td></tr><tr><td>Tether BEP20</td><td>BEP20</td></tr><tr><td>Tether TON</td><td>TON</td></tr></tbody></table>

Короткий код может содержать не более:

```
32 символов
```

Пробелы в начале и конце удаляются автоматически.

Используйте понятные обозначения, которые клиент сможет однозначно сопоставить с нужной сетью.

После заполнения нажмите **«Сохранить»** в окне настройки кодов.

### Сохраните сеть

Нажмите: **«Создать сеть»**

Система сохранит:

* название;
* переводы;
* иконку;
* тип отображения;
* список валют;
* короткие коды.

После этого проверьте результат на клиентском сайте.

***

## Как сеть отображается на сайте

Клиентский сайт получает данные сети вместе со списком валют и доступных направлений.

Для отображения используются:

* название;
* иконка;
* тип отображения;
* количество доступных вариантов;
* короткие коды валют.

{% stepper %}
{% step %}

### Если доступно несколько вариантов

Если на выбранной стороне обмена доступно две или больше валют одной сети, система объединяет их в группу.

Например:

```
USDT — 3 варианта
```

Внутри могут быть доступны:

```
TRC20
ERC20
BEP20
```

{% endstep %}

{% step %}

### Если доступен только один вариант

Если после применения направлений, фильтров и ограничений доступна только одна валюта сети, отдельная группа не создаётся.

Валюта отображается как обычный самостоятельный пункт.

Например, сеть может отображаться в колонке **«Отдаю»**, но не отображаться в колонке **«Получаю»**, если на стороне получения доступен только один вариант USDT.
{% endstep %}

{% step %}

### Если нет доступных валют

Пустая сеть на клиентском сайте не отображается.

Группа также не появится, если все её валюты:

* отключены;
* находятся в архиве;
* скрыты на соответствующей стороне;
* не имеют активных направлений;
* исключены текущими фильтрами;
* недоступны для выбранной валюты второй стороны.
  {% endstep %}

{% step %}

### Раскрытие сети

По умолчанию содержимое группы может быть скрыто.

Если внутри сети уже выбрана определённая валюта, группа раскрывается, чтобы выбранный вариант оставался видимым.

При стандартном типе клиент может раскрывать и сворачивать список.

При компактном типе доступны короткие кнопки вариантов.

При первом выборе группы система может выбрать первый доступный вариант, после чего клиент сможет переключиться на другую сеть.
{% endstep %}
{% endstepper %}

## Как определяется порядок

В разделе **«Сети для валют»** нет отдельной ручной сортировки групп на клиентском сайте.

Положение сети определяется порядком валют, входящих в неё.

Группа отображается в позиции первой доступной валюты этой сети.

Порядок может отличаться:

* в колонке **«Отдаю»**;
* в колонке **«Получаю»**;
* после выбора фильтра;
* для разных валют второй стороны;
* в разных наборах направлений.

Чтобы изменить положение группы, проверьте сортировку валют и направлений, включая параметры:

{% content-ref url="/pages/R5qRaFxhYuknqYPC9OIf" %}
[Сортировка направлений](/guide/obmen/napravleniya-obmena/sortirovka-napravlenii)
{% endcontent-ref %}

* **«Сортировка отдаю»**;
* **«Сортировка получаю»**.

***

## Быстрая привязка валют

В таблице сетей доступна колонка: **«Валюты в сети»**

<figure><img src="/files/rLeaFJa4xOO9PLA2Vbdl" alt=""><figcaption></figcaption></figure>

Через неё можно быстро:

* добавить валюту;
* удалить валюту;
* выбрать несколько валют;
* перенести валюту из другой сети.

Изменения сохраняются сразу.

В быстром режиме нельзя изменить короткие коды.

Для этого откройте сеть на редактирование и нажмите:

**«Настроить сети»**

## Перенос валюты из другой сети

Если выбранная валюта уже находится в другой сети, система запросит подтверждение.

Появится окно: **«Разрешить перенос валют из других сетей»**

<figure><img src="/files/zKbUOK42xLffGVV8nafb" alt="" width="563"><figcaption></figcaption></figure>

После подтверждения валюта:

1. удаляется из предыдущей группы;
2. добавляется в текущую;
3. сохраняет свои направления;
4. сохраняет курсы;
5. сохраняет резервы;
6. сохраняет автоматизацию и остальные настройки.

Если перенос выбран случайно, закройте окно и измените список.

{% hint style="warning" %}
Одна валюта не может одновременно находиться в двух сетях.
{% endhint %}

Если сеть одновременно редактирует другой менеджер, система может сообщить, что состав валют уже изменился.

Обновите страницу и повторите действие с учётом актуальных данных.

## Как изменить сеть

Откройте: **«Основное» — «Валюты» — «Сети для валют»**

Нажмите на название нужной сети.

Можно изменить:

* название;
* языковые версии;
* иконку;
* тип отображения;
* список валют;
* короткие коды.

После изменения нажмите: **«Сохранить изменения»**

Все параметры и привязки сохраняются одной операцией.

Если возникает ошибка, частично изменённая конфигурация не сохраняется.

## Как отвязать валюту

Отвязать валюту можно двумя способами:

1. Удалить её из колонки **«Валюты в сети»** в общем списке.
2. Открыть сеть, снять выбор с валюты и сохранить изменения.

После отвязки:

* валюта не удаляется;
* направления сохраняются;
* курсы сохраняются;
* резервы сохраняются;
* мерчанты сохраняются;
* выплаты сохраняются;
* валюта снова отображается отдельно;
* короткий код сохраняется.

## Как удалить короткий код при отвязке

Обычная отвязка не очищает короткий код валюты.

<figure><img src="/files/NeNYar6CKmaLcaf3n7lM" alt="" width="563"><figcaption></figcaption></figure>

Если код больше не нужен:

1. Откройте сеть на редактирование.
2. Нажмите **«Настроить сети»**.
3. Очистите короткий код нужной валюты.
4. Сохраните коды.
5. Сохраните изменения сети.
6. Снова откройте сеть.
7. Отвяжите валюту.
8. Сохраните изменения.

## Как удалить сеть

В строке нужной сети нажмите кнопку удаления и подтвердите действие.

После удаления:

* сеть удаляется;
* валюты отвязываются;
* короткие коды очищаются;
* архивные валюты также отвязываются;
* сами валюты сохраняются;
* направления обмена сохраняются;
* курсы сохраняются;
* резервы сохраняются;
* автоматизация сохраняется.

{% hint style="warning" %}
Перед удалением запишите используемые короткие коды, если они могут понадобиться позднее.
{% endhint %}

***

## Связь с направлениями обмена

Добавление валюты в сеть не создаёт направления обмена.

Для каждого варианта необходимо отдельно создать нужные направления.

Например:

```
RUB — USDT TRC20
RUB — USDT ERC20
RUB — USDT BEP20
```

Если для валюты нет подходящего направления, она не будет доступна клиенту на соответствующей стороне.

Каждый вариант может иметь собственные:

* минимальные суммы;
* максимальные суммы;
* курсы;
* комиссии;
* инструкции;
* верификацию;
* статус;
* автоматизацию.

## Связь с курсами

Сеть не объединяет курсы.

Курс рассчитывается отдельно для каждого направления.

Например, `USDT TRC20` и `USDT ERC20` могут иметь разные:

* источники курса;
* формулы;
* комиссии;
* расходы;
* итоговые значения.

Изменение курса одного варианта не влияет на остальные валюты сети.

## Связь с резервами

Сеть не объединяет резервы.

У каждой валюты может быть:

* собственный резерв;
* связанный резерв;
* общий резерв;
* резерв из файла;
* индивидуальный резерв направления.

Если несколько сетевых вариантов используют один фактический баланс, общий резерв необходимо настроить отдельно в разделе: **«Основное» — «Резервы для валют»**

Само добавление валют в сеть не создаёт общий баланс.

## Пример настройки USDT

{% stepper %}
{% step %}

### Создайте валюты

Подготовьте:

```
Tether TRC20
Tether ERC20
Tether BEP20
```

Для каждой валюты отдельно настройте направления, курсы, резервы и автоматизацию.
{% endstep %}

{% step %}

### Создайте сеть

Используйте следующие параметры:

| Поле            | Значение                                 |
| --------------- | ---------------------------------------- |
| Название        | USDT                                     |
| Иконка          | Логотип Tether                           |
| Тип отображения | Компактная                               |
| Валюты          | Tether TRC20, Tether ERC20, Tether BEP20 |
| {% endstep %}   |                                          |

{% step %}

### Создайте направления

Например:

```
Сбербанк RUB — USDT TRC20
Сбербанк RUB — USDT ERC20
Сбербанк RUB — USDT BEP20
```

{% endstep %}

{% step %}

### Настройте каждый вариант

Для каждой валюты отдельно проверьте:

* курс;
* лимиты;
* резерв;
* комиссии;
* статус;
* инструкции;
* мерчант;
* выплату;
* код сети API.
  {% endstep %}
  {% endstepper %}

### Проверьте сайт

Убедитесь, что:

* отображается группа USDT;
* доступны все нужные варианты;
* короткие коды указаны правильно;
* выбранная сеть открывает правильное направление;
* курс меняется в соответствии с вариантом;
* резерв соответствует выбранной валюте;
* мерчант создаёт адрес в нужной сети;
* выплата отправляется через правильную сеть.

## Частые ошибки

<details>

<summary>Сеть не отображается на сайте</summary>

Проверьте:

* привязано ли минимум две доступные валюты;
* включены ли валюты;
* не находятся ли они в архиве;
* разрешён ли показ на нужной стороне;
* существуют ли активные направления;
* доступны ли направления для текущего выбора;
* сохранены ли изменения;
* обновлена ли клиентская страница.

Если доступна только одна валюта, она отображается без группировки.

</details>

<details>

<summary>Вместо TRC20 отображается USDT</summary>

У валюты не заполнен короткий код.

Откройте сеть, нажмите **«Настроить сети»** и укажите нужное значение.

Если код отсутствует, компактный режим использует ISO-код валюты.

</details>

<details>

<summary>Валюта исчезла из другой сети</summary>

При сохранении был подтверждён перенос.

Одна валюта не может находиться в двух сетях одновременно.

Проверьте текущую привязку и при необходимости перенесите валюту обратно.

</details>

<details>

<summary>Валюта отсутствует в списке</summary>

Проверьте, не находится ли она в архиве.

Архивные валюты не предлагаются для новой привязки.

</details>

<details>

<summary>Не открывается медиатека</summary>

Проверьте право:

**«Просмотр медиатеки»**

Без него можно загрузить собственный файл, но нельзя выбрать существующий файл из медиатеки.

</details>

<details>

<summary>Сеть отображается только в одной колонке</summary>

На другой стороне доступно меньше двух валют этой сети либо отсутствуют подходящие направления.

Проверьте направления и доступность валют отдельно для **«Отдаю»** и **«Получаю»**.

</details>

<details>

<summary>Используется неправильный язык</summary>

Откройте сеть и заполните название для всех языков клиентского сайта.

</details>

<details>

<summary>Сеть находится не на том месте</summary>

Положение определяется первой доступной валютой сети.

Проверьте сортировку валют и направлений отдельно для сторон **«Отдаю»** и **«Получаю»**.

</details>

## Рекомендации

Создавайте отдельную валюту для каждой реально поддерживаемой блокчейн-сети.

Объединяйте только варианты одного и того же актива.

Используйте короткое общее название, например `USDT` или `USDC`.

Для компактного режима обязательно заполняйте короткие коды.

Не путайте короткий код на сайте с кодом сети внешнего API.

Настраивайте направления, курсы, резервы, мерчанты и выплаты отдельно для каждой валюты.

Общий резерв для мультисетевого актива настраивайте в разделе резервов.

Не подтверждайте перенос валюты, если не уверены, из какой сети она будет удалена.

Перед удалением сети учитывайте, что короткие коды будут очищены.

После каждого изменения проверяйте обе стороны калькулятора.

Приём и выплату проверяйте небольшими тестовыми суммами.

## Итоговая проверка

Перед запуском убедитесь, что:

* создана отдельная валюта для каждого варианта;
* валюты привязаны к правильной сети;
* название заполнено на всех языках;
* загружена подходящая иконка;
* выбран правильный тип отображения;
* короткие коды заполнены;
* созданы направления обмена;
* настроены курсы и комиссии;
* настроены резервы;
* подключены нужные мерчанты;
* подключены нужные модули выплат;
* API-коды соответствуют документации провайдеров;
* сеть отображается на стороне **«Отдаю»**;
* сеть отображается на стороне **«Получаю»**, если доступно несколько вариантов;
* тестовые платежи создаются в правильной сети;
* тестовые выплаты отправляются в правильной сети.

## Коротко

Сети для валют объединяют несколько вариантов одного актива на клиентском сайте.

Раздел находится по пути: **«Основное» — «Валюты» — «Сети для валют»**

Пример:

```
USDT
├── TRC20
├── ERC20
└── BEP20
```

Сеть влияет только на отображение.

Она не объединяет:

* направления;
* курсы;
* резервы;
* мерчанты;
* выплаты;
* API-коды.

Для каждого варианта необходимо отдельно настроить финансовую логику и автоматизацию.

После создания сети обязательно проверьте клиентский сайт, приём платежей и выплаты в каждой поддерживаемой блокчейн-сети.


# Категории валют

При большом количестве валют пользователям становится сложно быстро ориентироваться в формах обмена и находить нужные направления.

Чтобы упростить навигацию и сделать интерфейс более понятным, в системе iEXExchanger реализован инструмент **«Категории валют».**

Категории позволяют:

* объединять валюты в логические группы;
* управлять порядком отображения валют для клиентов;
* структурировать формы обмена без изменения самих валют и направлений.

Использование категорий особенно актуально при работе с большим количеством фиатных валют, криптовалют и платёжных систем.

***

Для настройки категорий валют откройте панель управления и перейдите в раздел: **«Основное — Валюты — Категории»**

<figure><img src="/files/LdSICGMhLh92Ii1Fx69E" alt=""><figcaption></figcaption></figure>

В этом разделе осуществляется полное управление категориями, включая создание, редактирование, сортировку и удаление.

В списке отображаются:

* все созданные категории валют;
* их текущий статус (активна или выключена);
* элементы управления для редактирования и удаления;
* порядок отображения категорий на сайте.

***

### Создание категории валют

<figure><img src="/files/hPMU02OwO8OoZpMBTZCA" alt="" width="375"><figcaption></figcaption></figure>

Чтобы создать новую категорию:

1. Нажмите кнопку **«Добавить категорию».**
2. В открывшемся окне выполните настройку категории.

{% stepper %}
{% step %}

#### Название

Введите название категории, которое будет отображаться клиентам.

Поддерживается мультиязычность — вы можете указать название для каждого языка интерфейса.

Примеры названий:

* «Популярные»
* «Криптовалюты»
* «Фиат»
* «Банковские переводы»

Название используется как заголовок группы валют в форме обмена.
{% endstep %}

{% step %}

### Статус

Категория может находиться в одном из двух состояний:

* Активна — категория отображается клиентам;
* Выключена — категория скрыта, но сохраняется в системе.

Выключенные категории можно в любой момент снова активировать без повторной настройки.
{% endstep %}

{% step %}

### Валюты в категории

Выберите валюты, которые должны входить в данную категорию.

{% hint style="info" %}

## Важно

**Одна валюта может принадлежать только одной категории.**

Если валюта уже добавлена в другую категорию, система предупредит об этом и не позволит сохранить изменения.
{% endhint %}

Это правило исключает дублирование валют в разных группах и делает интерфейс максимально понятным для клиентов.
{% endstep %}
{% endstepper %}

После заполнения всех параметров нажмите **«Добавить»** — категория будет сохранена.

***

### Редактирование категории

Для изменения существующей категории:

Нажмите на название категории в списке.

<figure><img src="/files/pG2Kvdm1IFqudJKraY8j" alt=""><figcaption></figcaption></figure>

В открывшейся форме вы можете:

* изменить название категории (на любом языке);
* включить или выключить категорию;
* изменить список валют, входящих в категорию.

Нажмите **«Сохранить»**, чтобы применить изменения.

{% hint style="info" %}

## Обратите внимание

Технический идентификатор категории формируется автоматически при создании и в дальнейшем не изменяется, даже если вы переименуете категорию.
{% endhint %}

***

### Сортировка категорий

Порядок категорий в панели управления напрямую влияет на порядок их отображения на сайте.

Чтобы изменить порядок категорий:

1. Наведите курсор на иконку перетаскивания слева от названия категории.
2. Зажмите кнопку мыши и перетащите категорию в нужное место.
3. Новый порядок сохраняется автоматически.

Рекомендуется размещать наиболее востребованные и популярные категории в начале списка.

***

### Как категории отображаются для клиентов

<figure><img src="/files/7T5kxqJgonklA4hP72YH" alt="" width="563"><figcaption></figcaption></figure>

Логика отображения валют на клиентской стороне следующая:

* если в системе создана хотя бы одна категория, валюты отображаются сгруппированными;
* каждая категория выводится отдельным блоком с собственным заголовком;
* внизу автоматически формируется группа «Все валюты» — в неё попадают все валюты, которые не добавлены ни в одну категорию;
* если категории не созданы, валюты отображаются единым списком без группировки.

Таким образом, вы можете гибко управлять структурой отображения валют, не влияя на расчёты и направления обмена.

***

### Удаление категории

<figure><img src="/files/Zq4Hiz3LvbnkxeguXWGO" alt="" width="320"><figcaption></figcaption></figure>

Для удаления категории:

1. Нажмите на иконку корзины справа от нужной категории.
2. Подтвердите действие.

При удалении категории:

* **валюта не удаляется из системы;**
* все валюты, входившие в категорию, автоматически становятся частью группы «Все валюты».

***

### Практические рекомендации

* оптимальное количество категорий — от 3 до 7;
* используйте короткие и понятные названия;
* группируйте валюты с точки зрения удобства клиента, а не внутренней логики системы;
* не создавайте дублирующие категории;
* используйте отключение категории вместо удаления, если она может понадобиться в будущем.


# Метки для валют

**Метки — это короткие цветовые подписи**, которые отображаются рядом с валютой в блоках **«Отдаёте»** и **«Получаете»** и мгновенно дают понять важные условия обмена — сроки, ограничения или особенности.

Это позволяет клиенту быстро ориентироваться в правилах обмена без необходимости читать длинные описания.

{% hint style="success" %}

## **Примеры коротких меток:**&#x20;

«Спрос ↑», «До 2 ч», «Экспресс», «Верификация», «Будни», «24/7», «Приоритет», «Только РФ», «SWIFT»
{% endhint %}

***

## Возможности меток

* **Раздельные настройки** для «Отдаёте» и «Получаете» — можно задать разные условия для каждой стороны обмена.
* **Массовое назначение валют —** одну метку можно привязать сразу к нескольким валютам.
* **Настраиваемый внешний вид —** цвет фона и текста подбирается индивидуально, метки отображаются компактно и аккуратно рядом с названием валюты.
* **Умное отображение —** в блоке «Получаете», если у валюты нет меток, показывается её резерв; если метки есть — отображаются они.
* **Многоязычность —** названия меток можно указать на нескольких языках, чтобы пользователи видели их в своём интерфейсе.

***

В панели управления откройте: **«Основное — Валюты — Метки для валют».**

На странице отобразится список всех созданных меток.

<figure><img src="/files/GqjIsM5oyGHQlaXPQikC" alt=""><figcaption></figcaption></figure>

## Как создать метку

Нажмите кнопку **«Добавить метку»** в правом верхнем углу страницы.&#x20;

В открывшемся окне заполните поля:&#x20;

<figure><img src="/files/DbPicydf7ryBD6lqR6pC" alt="" width="375"><figcaption></figcaption></figure>

* **Название —** короткое и понятное, при необходимости с переводами на другие языки.
* **Стиль фона —** выберите или укажите цвет фона метки *(например, b53636).*
* **Стиль текста —** выберите или укажите цвет текста метки *(например, ffffff).*
* **Выберите валюты (Отдаю) —** отметьте валюты, для которых метка будет отображаться в блоке «Отдаёте».
* **Выберите валюты (Получаю) —** отметьте валюты, для которых метка будет отображаться в блоке «Получаете».

Нажмите **«Добавить»** — метка появится в списке и сразу начнёт отображаться на сайте у выбранных валют.

***

## Как редактировать метку

<figure><img src="/files/LcbyrHX67yMQCcIJBEbH" alt="" width="563"><figcaption></figcaption></figure>

Чтобы изменить метку, нажмите на её название в списке.

Откроется окно редактирования, где можно внести изменения и сохранить их.

***

## Как это видят клиенты

<figure><img src="/files/5GFnhEhYd0NJIKi5JWBa" alt="" width="563"><figcaption></figcaption></figure>

* Метки отображаются рядом с названием валюты в блоках **«Отдаёте»** и **«Получаете»**.
* В блоке **«Получаете»**, если у валюты нет меток, показывается её резерв; если метки есть — отображаются они.

***

## Рекомендации

* Используйте **короткие и понятные названия** (1–3 слова).
* Выбирайте **контрастные цвета** фона и текста для хорошей читаемости.
* Если условие важно и при отправке, и при получении — привяжите валюту и в «Отдаёте», и в «Получаете».
* Не перегружайте валюту множеством меток — выделяйте только главное.


# Мульт-счета

Модуль «Мульт-счета» используется в тех случаях, когда клиент хочет распределить сумму обмена не на один, а сразу на несколько реквизитов. Вместо стандартного варианта «одна заявка — один счёт» система позволяет указать несколько получателей и поделить сумму между ними.

Эта возможность особенно полезна для клиентов, у которых несколько карт, кошельков или есть необходимость разделять поступающие средства.

{% hint style="danger" %}

## Внимание

Мульт-счета доступны только при ручных выплатах — **автоматические переводы** и **автовыплаты** через сторонние сервисы не поддерживают распределение суммы по нескольким реквизитам, поэтому указанные клиентом реквизиты и суммы должны быть обработаны **оператором вручную.**
{% endhint %}

## Как это работает для клиента

При создании заявки в блоке «Реквизиты» появляется специальная панель. Клиент видит кнопку для добавления новых получателей (например, «Выбрать карту» или «Добавить кошелёк»).

Каждый добавленный реквизит имеет отдельное поле для данных и сумму, которую клиент хочет направить именно на него. В верхней части панели показывается общая сумма заявки, количество добавленных реквизитов и максимально допустимое количество.

Клиент может:

* добавить несколько реквизитов (до установленного лимита);
* распределить сумму между ними вручную;
* удалить ненужные реквизиты, если передумал.

Система проверяет корректность данных:

* сумма на каждом реквизите должна быть не меньше заданного минимума;
* общая сумма должна соответствовать правилам направления;
* количество реквизитов не может превышать разрешённого лимита.

Если условия нарушены, система предупредит клиента и не даст создать заявку с ошибочными параметрами.

***

## Настройка профиля

Чтобы включить поддержку мульт-счетов для определённых валют, администратор создаёт профиль в разделе **«Основное — Валюты — Мульт-счета»**.

<figure><img src="/files/7tlG7Uufoth13E9fU2bC" alt=""><figcaption></figcaption></figure>

В настройках профиля указываются:

<figure><img src="/files/GWC4lWrKNsi8toT9zzmU" alt="" width="375"><figcaption></figcaption></figure>

* **Название поля —** заголовок, который увидит клиент (например, «Выберите карту»).
* **Текст кнопки —** подпись для кнопки добавления нового реквизита.
* **Описание —** пояснение для клиента, зачем нужна возможность добавления нескольких реквизитов и как ею пользоваться.
* **Минимальная сумма выплаты на один реквизит —** порог, ниже которого заявка не будет создана.
* **Минимальная сумма «Получаю» для активации —** значение, начиная с которого панель мульт-счётов включается.
* **Максимальное количество реквизитов —** ограничение по количеству реквизитов, которые клиент может добавить (от 1 до 200).
* **Выбор валют —** перечень валют, для которых действует данный профиль.

После сохранения профиль становится доступен клиентам в выбранных валютах.

***

## Отображение в заявках

Все данные по мульт-счетам фиксируются в заявке и видны администратору в блоке **«Переводит сервис».**

<figure><img src="/files/bgyEbyzuE1iqjQqh1BWk" alt=""><figcaption></figcaption></figure>

Там отображаются:

* список всех реквизитов, добавленных клиентом (например: «Карта 1», «Карта 2»);
* данные реквизитов (номер карты, кошелёк и т. д.);
* сумма по каждому реквизиту;
* общая сумма по реквизитам;
* сравнение с ожидаемой суммой заявки;
* разница (если есть несоответствие).

Это позволяет администратору контролировать правильность распределения и видеть детализацию сразу при обработке заявки.

***

## Пример сценария

{% tabs %}
{% tab title="Отображение на сайте" %}

<figure><img src="/files/RMLOejE6Cmxyo2lY1NNW" alt="" width="563"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Вариант 2" %}

<figure><img src="/files/2fqyLOp0RKoxtCi36hH2" alt="" width="375"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

Клиент оформляет заявку на 5000 USDT. Для валюты «USDT TRC20» администратор настроил профиль с лимитом в 3 реквизита.

Клиент добавляет три карты и распределяет сумму:

* «Карта 1» — 2000 USDT,
* «Карта 2» — 1500 USDT,
* «Карта 3» — 1500 USDT.

Система проверяет минимальные суммы и ограничения, после чего принимает заявку к исполнению.

***

Модуль **«Мульт-счета»** делает работу сервиса гибкой и удобной:

* клиенты могут самостоятельно управлять распределением выплат;
* администратор контролирует условия с помощью минимальных и максимальных параметров;
* система автоматически следит за корректностью данных.

В результате клиент получает больше возможностей для удобного получения средств, а администратор — дополнительный инструмент для настройки логики выплат.


# Направления обмена


# Управление направлениями

Модуль **«Направления обмена»** используется для создания и настройки валютных пар, доступных клиентам на сайте.

Каждое направление связывает две валюты:

```
Отдаю - Получаю
```

Например:

```
Сбербанк RUB - USDT TRC20
```

В этом направлении клиент отдаёт Сбербанк RUB и получает USDT TRC20.

## Перед началом

Перед созданием направления убедитесь, что в системе подготовлены основные элементы:

* созданы нужные платёжные системы;
* созданы соответствующие коды валют;
* добавлено как минимум две валюты;
* одна валюта будет использоваться на стороне **«Отдаю»**;
* другая валюта будет использоваться на стороне **«Получаю»**;
* обе валюты включены и не находятся в архиве;
* настроен хотя бы один источник курса;
* при необходимости добавлены резервы, реквизиты, мерчанты и автовыплаты.

Источник курса можно подготовить через один из разделов:

{% content-ref url="/pages/jeoaov5fe022eSxO3aeo" %}
[Источники](/guide/kursy/istochniki)
{% endcontent-ref %}

{% content-ref url="/pages/WQ7Sr26pHTEFr2jwAscq" %}
[Формулы](/guide/kursy/formuly)
{% endcontent-ref %}

{% content-ref url="/pages/JfPNGdg3CsmBT5tQQCvB" %}
[BestChange](/guide/kursy/bestchange)
{% endcontent-ref %}

{% hint style="warning" %}
Направление можно создать без полностью настроенного курса, резерва или реквизитов. Однако включать его для клиентов следует только после проверки всех обязательных настроек.
{% endhint %}

## Где находятся направления обмена

В панели управления откройте: **«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/GOitJJ3eKfwcqstfKT2t" alt=""><figcaption></figcaption></figure>

На странице отображаются все созданные направления обмена.

## Создание направления

Чтобы добавить новую валютную пару:

<figure><img src="/files/Yjl9EeWsV8lk3ytWOEru" alt="" width="563"><figcaption></figcaption></figure>

1. Нажмите **«Добавить»** в верхней части страницы.
2. Выберите валюту, которую клиент будет отдавать.
3. Выберите валюту, которую клиент будет получать.
4. Заполните доступные начальные параметры.
5. Нажмите **«Добавить»**.

После создания направление появится в общем списке.

<figure><img src="/files/jGnxIE7itWHjFgMJ9239" alt=""><figcaption></figcaption></figure>

Выберите его и перейдите к редактированию. Для начала настройки откройте: **«Общее» — «Основное»**

{% hint style="info" %}
Новое направление лучше сначала оставить неактивным. Включите его только после настройки курса, лимитов, комиссий, резерва и реквизитов.
{% endhint %}

***

## Общее

Группа **«Общее»** содержит базовые настройки направления.

<figure><img src="/files/DK1S4V5v9rJrOfWq1FuE" alt=""><figcaption></figcaption></figure>

Здесь выбираются валюты **«Отдаю»** и **«Получаю»**, задаются статус, техническое название и ограничения по суммам. В этой же группе настраиваются тексты для формы обмена, страницы оплаты, статусов заявки, почтовых уведомлений и SEO.

{% content-ref url="/pages/7q9ZuKDaG2pOJlNg6VKR" %}
[Общее](/guide/obmen/napravleniya-obmena/upravlenie-napravleniyami/obshee)
{% endcontent-ref %}

## Верификация

Группа **«Верификация»** определяет, когда клиент должен подтвердить банковскую карту или пройти проверку личности.

<figure><img src="/files/OTZvSuUmFRYCukocRp1h" alt=""><figcaption></figcaption></figure>

Направление может использовать общие правила валюты **«Отдаю»** или собственные условия, действующие только для выбранной пары.

{% content-ref url="/pages/2N1N4AALG7R3PCEyUw5E" %}
[Верификация](/guide/obmen/napravleniya-obmena/upravlenie-napravleniyami/verifikaciya)
{% endcontent-ref %}

## Обмен

Группа **«Обмен»** отвечает за формирование и защиту курса направления.

<figure><img src="/files/FjvbCZVt3aCuNGDQIWNn" alt=""><figcaption></figcaption></figure>

Здесь выбирается основной источник курса, настраиваются резервные варианты, страховка от опасных отклонений и условия наличного обмена по городам.

{% content-ref url="/pages/fYIfhbrUHBfVX5rMCNgs" %}
[Обмен](/guide/obmen/napravleniya-obmena/upravlenie-napravleniyami/obmen)
{% endcontent-ref %}

## Комиссии

Группа **«Комиссии»** управляет прибылью обменника и дополнительными изменениями курса или суммы заявки.

<figure><img src="/files/5jwFtarip3d0jnYhyd0O" alt=""><figcaption></figcaption></figure>

Комиссии из разных разделов могут применяться последовательно. Поэтому итоговый результат необходимо проверять на публичном калькуляторе.

{% content-ref url="/pages/czrrC1toh5eSj9blwX4b" %}
[Комиссии](/guide/obmen/napravleniya-obmena/upravlenie-napravleniyami/komissii)
{% endcontent-ref %}

## Дополнительное

Группа **«Дополнительное»** содержит настройки, которые влияют на фактическую доступность и дальнейшую обработку направления.

<figure><img src="/files/NUlKoi6SuM5c4G89AGSI" alt=""><figcaption></figcaption></figure>

Даже при активном статусе и рабочем курсе направление может быть недоступно из-за нулевого резерва, отсутствия реквизитов или дополнительных ограничений.

{% content-ref url="/pages/o5UXoiBLCvRxpO00Cmvy" %}
[Дополнительное](/guide/obmen/napravleniya-obmena/upravlenie-napravleniyami/dopolnitelnoe)
{% endcontent-ref %}


# Общее

Группа **«Общее»** содержит базовые настройки конкретного направления обмена: его статус, валюты пары, техническое название, допустимые суммы и дополнительные поля формы заявки.

## Где находятся настройки

В панели управления откройте:

**«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/GOitJJ3eKfwcqstfKT2t" alt=""><figcaption></figcaption></figure>

Выберите нужное направление и перейдите к его редактированию.

<figure><img src="/files/jGnxIE7itWHjFgMJ9239" alt=""><figcaption></figcaption></figure>

После открытия карточки раскройте группу **«Общее»** и выберите нужный раздел.

***

## Основное

Откройте: **«Общее» — «Основное»**

<figure><img src="/files/NTEiWK4vID2UYmohdu5D" alt=""><figcaption></figcaption></figure>

На странице **«Основные настройки»** задаются валюты направления, его статус, техническое название и допустимые суммы обмена.

### Статус

Определяет, может ли направление использоваться для создания новых заявок.

Доступны два значения:

* **«Активно»** — направление может отображаться на сайте и использоваться клиентами;
* **«Неактивно»** — направление отключено для новых обменов.

Отключение не удаляет настройки. После повторного включения сохранённая конфигурация продолжит использоваться.

Активного статуса самого направления недостаточно. Для публикации также должны выполняться другие условия:

* обе валюты активны;
* источник курса работает;
* рассчитан положительный курс;
* доступен необходимый резерв;
* лимиты позволяют выполнить обмен;
* направление не заблокировано расписанием или другими ограничениями;
* настроены реквизиты либо автоматический приём платежа.

Если хотя бы одна из валют отключена, направление не передаётся на публичный сайт, даже когда его собственный статус установлен в положение **«Активно»**.

{% hint style="info" %}
Если направление активно, но отсутствует на сайте, проверьте не только его статус, но также валюты, курс, резерв и дополнительные ограничения.
{% endhint %}

### Отдаёте

В поле **«Отдаёте»** выбирается валюта, которую клиент передаёт обменнику.

Например, в направлении:

```
Сбербанк RUB - Tether TRC20 USDT
```

валютой **«Отдаёте»** является:

```
Сбербанк RUB
```

Выбранная валюта определяет:

* единицу измерения суммы **«Клиент отдаёт»**;
* поля реквизитов отправителя;
* доступные мерчанты;
* правила приёма платежа;
* проверку банковской карты или счёта;
* проверку личности;
* комиссии стороны **«Отдаю»**;
* связанные платёжные и сетевые параметры.

В списке выбора отображаются только активные валюты.

Если нужной записи нет, откройте: **«Основное» — «Валюты» — «Список валют»**

{% content-ref url="/pages/W1YSQLgyvrPHfQSO5J7X" %}
[Валюты](/guide/obmen/valyuty)
{% endcontent-ref %}

и проверьте её статус.

### Получаете

В поле **«Получаете»** выбирается валюта, которую обменник выдаёт клиенту.

Для направления:

```
Сбербанк RUB - Tether TRC20 USDT
```

валютой **«Получаете»** является:

```
Tether TRC20 USDT
```

Выбранная валюта определяет:

* единицу измерения суммы **«Клиент получает»**;
* поля реквизитов получателя;
* доступные модули автоматической выплаты;
* используемую сеть;
* необходимый резерв;
* комиссии стороны **«Получаю»**;
* правила выполнения выплаты.

В списке отображаются только активные валюты.

### Техническое название

**«Техническое название»** — обязательное внутреннее название направления.

Оно используется:

* в списке направлений;
* в поиске;
* в редакторе;
* в журналах;
* в административных инструментах;
* при работе операторов.

Пример:

```
Сбербанк RUB - Tether TRC20 USDT
```

Если для одинаковой пары используются разные сценарии, название можно уточнить:

```
Сбербанк RUB - Tether TRC20 USDT — автоматическая выплата
```

или:

```
Сбербанк RUB - Tether TRC20 USDT — ручная обработка
```

Название должно однозначно объяснять:

* какие валюты используются;
* какая сеть выбрана;
* чем направление отличается от похожих записей.

Не оставляйте поле пустым. Текущая форма требует техническое название для сохранения.

### Суммы обмена

Блок **«Суммы обмена»** определяет диапазон, в котором клиент может создать заявку.

Проверяются четыре значения:

| Сторона         | Поле     | Что ограничивает                                   |
| --------------- | -------- | -------------------------------------------------- |
| Клиент отдаёт   | Минимум  | Наименьшую допустимую сумму в валюте «Отдаёте»     |
| Клиент отдаёт   | Максимум | Наибольшую допустимую сумму в валюте «Отдаёте»     |
| Клиент получает | Минимум  | Наименьшую рассчитанную сумму в валюте «Получаете» |
| Клиент получает | Максимум | Наибольшую рассчитанную сумму в валюте «Получаете» |

Для направления:

```
Сбербанк RUB - Tether TRC20 USDT
```

лимиты **«Клиент отдаёт»** задаются в RUB, а лимиты **«Клиент получает»** — в USDT.

При создании заявки проверяются обе стороны.

Например, клиент может пройти ограничение по сумме **«Отдаю»**, но получить ошибку, если рассчитанная сумма **«Получаю»** ниже установленного минимума.

{% content-ref url="/pages/F8LPm1dEQTRVsgkNhyvz" %}
[Сумма обмена](/guide/obmen/napravleniya-obmena/summa-obmena)
{% endcontent-ref %}

### Главное направление

Кнопка **«Сделать главным направлением»** назначает текущую валютную пару основной для стартового выбора на публичном сайте.

Главным может быть только одно направление.

После назначения новой пары признак автоматически снимается с предыдущей.

Действие выполняется сразу и не зависит от общей кнопки **«Сохранить»**.

У уже назначенной пары вместо кнопки отображается состояние:

```
Главное направление
```

### Как главное направление используется на сайте

Поведение определяется общей настройкой:

**«Настройки» — «Общие настройки» — «Основные» — «Основное»**

Найдите параметр: **«Как определить направление обмена при загрузке страницы»**

Доступны основные сценарии.

{% stepper %}
{% step %}

#### Главное направление из настроек

При открытии формы система выбирает пару, отмеченную как главная.
{% endstep %}

{% step %}

#### Сохранённое направление

Сначала используется последняя валютная пара, которую ранее выбирал клиент.

Если сохранённого выбора нет, система переходит к главному направлению.

Если главное направление:

* отключено;
* использует неактивную валюту;
* не имеет рабочего курса;
* недоступно по другим причинам;

оно не попадает в опубликованный список. В этом случае сайт выбирает другую доступную пару.

После изменения главного направления:

1. Дождитесь очередного обновления опубликованных курсов или запустите его вручную.
2. Откройте сайт в приватном окне.
3. Убедитесь, что выбирается ожидаемая пара.
   {% endstep %}
   {% endstepper %}

***

## Информация

Раздел **«Общее» — «Информация»** содержит:

<figure><img src="/files/UKZYnsoDWIWtfrXlTIsd" alt=""><figcaption></figcaption></figure>

* инструкции по оплате;
* описания обмена;
* предупреждения;
* тексты кнопок;
* сообщения для статусов;
* тексты почтовых уведомлений;
* SEO-параметры.

{% content-ref url="/pages/JdLvoYuqrVKxItOqnzqN" %}
[Тексты и инструкции по направлениям обмена](/guide/obmen/informaciya/teksty-i-instrukcii-po-napravleniyam-obmena)
{% endcontent-ref %}

## Доп. поля

Откройте: **«Общее» — «Доп. поля»**

<figure><img src="/files/kLyZqBCg6t4yg2v49OEo" alt=""><figcaption></figcaption></figure>

{% content-ref url="/pages/ALwU5VUiFHQLVDofT99w" %}
[Доп. поля для направлений](/guide/obmen/dop.-polya/dop.-polya-dlya-napravlenii)
{% endcontent-ref %}

На странице **«Настройка полей»** выбираются дополнительные данные, которые клиент должен указать только для текущего направления.

Примеры:

* номер документа;
* код банка или отделения;
* назначение платежа;
* идентификатор кошелька;
* комментарий клиента;
* дополнительный номер счёта;
* данные для конкретной платёжной системы.

Не путайте дополнительные поля направления с полями валюты.

Поля валюты зависят от стороны **«Отдаю»** или **«Получаю»**.

Дополнительные поля направления привязываются к конкретной валютной паре.

***

## Рекомендации

Для большинства направлений рекомендуется:

* создавать отдельную запись для каждой валютной пары;
* не заменять валюты в рабочем направлении без необходимости;
* использовать понятное техническое название;
* применять профили для одинаковых лимитов;
* настраивать каждый источник лимита отдельно;
* проверять точные граничные значения;
* учитывать приоритет городов и конструктора карты;
* назначать главным только полностью рабочее направление;
* подключать только действительно необходимые дополнительные поля;
* не изменять ID ключа без проверки интеграций;
* создавать новую тестовую заявку после существенных изменений.

## Коротко

Группа **«Общее»** содержит базовые настройки направления обмена.

В разделе **«Основное»** задаются:

* статус;
* валюты **«Отдаёте»** и **«Получаете»**;
* техническое название;
* минимальные и максимальные суммы;
* профиль и источники лимитов;
* главное направление.

Раздел **«Информация»** содержит пользовательские тексты и SEO-параметры.

В разделе **«Доп. поля»** к направлению подключаются дополнительные данные формы заявки.

После изменения настроек обязательно обновите редактор, проверьте публичную форму и создайте новую тестовую заявку.


# Верификация

Группа **«Верификация»** определяет, когда клиент должен подтвердить банковскую карту или другой платёжный реквизит, а также пройти проверку личности.

Настройки действуют только в выбранном направлении обмена и относятся к валюте **«Отдаю»** — той валюте, которую клиент передаёт обменнику.

В группу входят два раздела:

* **«Карт»** — проверка карты или счёта, с которого клиент отправляет средства;
* **«Личности»** — проверка личности через подключённый KYC-сервис.

Для каждого раздела можно использовать общие правила валюты **«Отдаю»** или настроить отдельные условия только для текущего направления.

## Где находятся настройки

В панели управления откройте:

**«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/GOitJJ3eKfwcqstfKT2t" alt=""><figcaption></figcaption></figure>

Выберите нужное направление и перейдите к его редактированию.

<figure><img src="/files/jGnxIE7itWHjFgMJ9239" alt=""><figcaption></figcaption></figure>

В карточке направления откройте:

<figure><img src="/files/1xCdsIv9upq5dOcvjeLN" alt=""><figcaption></figcaption></figure>

* **«Верификация» — «Карт»** — для настройки проверки карты;
* **«Верификация» — «Личности»** — для настройки проверки личности.

Настройки карты и личности находятся на разных страницах. После изменения каждой страницы отдельно нажмите **«Сохранить»**.

## Какие настройки имеют приоритет

Направление может наследовать правила валюты **«Отдаю»** или использовать собственные настройки.

Приоритет работает следующим образом:

1. Сначала проверяются настройки текущего направления.
2. Если выбраны отдельные правила, используются они.
3. Если включено наследование, применяются настройки валюты **«Отдаю»**.

Проверка карты и личности настраивается независимо.

Например:

```
Проверка карты:
из настроек направления

Проверка личности:
из настроек валюты
```

В этом случае для карты будут действовать индивидуальные правила направления, а для KYC — общие правила валюты **«Отдаю»**.

Наследование удобно, если одна валюта должна проверяться одинаково во всех направлениях.

Отдельные настройки нужны, если требования зависят от:

* конкретной валютной пары;
* суммы обмена;
* истории клиента;
* используемой карты;
* условий направления.

***

## Верификация карт

В карточке направления откройте: **«Верификация» — «Карт»**

{% content-ref url="/pages/BJZc8REy1JdOjFdgzRGm" %}
[Верификация карт](/guide/verifikaciya/verifikaciya-kart)
{% endcontent-ref %}

На странице находится поле **«Тип верификации»**.

<figure><img src="/files/abtnN0i5Ih0usCXkYImS" alt="" width="563"><figcaption></figcaption></figure>

Доступны три варианта:

| Тип                              | Как работает                                  |
| -------------------------------- | --------------------------------------------- |
| По умолчанию: из настроек валюты | Используются правила валюты «Отдаю»           |
| Из настроек направления          | Используются отдельные правила текущей пары   |
| Индивидуальный конструктор       | Клиент выбирает обмен с проверкой или без неё |

{% stepper %}
{% step %}

#### По умолчанию: из настроек валюты

Направление использует настройки проверки карты, заданные в карточке валюты **«Отдаю»**.

Учитываются:

* режим проверки;
* минимальная сумма;
* краткий текст;
* подробная инструкция.

Поля индивидуальной настройки направления и конструктора в этом режиме не применяются.

Используйте этот вариант, если для одной валюты должны действовать одинаковые правила во всех направлениях.
{% endstep %}

{% step %}

#### Из настроек направления

Для текущей пары используются отдельные условия.

Настройки валюты **«Отдаю»** для этого направления заменяются.

После выбора появляется блок:

**«Включить верификацию счета “Отдаю”»**

В нём доступно поле **«Запрашивать проверку карты»**.
{% endstep %}
{% endstepper %}

### Когда запрашивать проверку карты

{% stepper %}
{% step %}

#### Нет

Направление не требует подтверждения карты.

Это правило отключает проверку, даже если она включена в настройках валюты **«Отдаю»**.

Проверка всё равно может потребоваться, если её отдельно назначил оператор или другой защитный модуль.
{% endstep %}

{% step %}

#### Да

Проверка применяется к заявкам текущего направления.

Если такая же карта уже подтверждена для этого клиента и валюты **«Отдаю»**, повторная проверка не создаётся.

Пример:

```
Клиент уже подтвердил карту:
1234 **** **** 3456

Новая заявка создана:
тем же клиентом;
с той же картой;
с той же валютой «Отдаю».
```

В этом случае система может использовать ранее подтверждённую карту.
{% endstep %}

{% step %}

#### Да, если мин. сумма «Отдаю» больше чем

Проверка включается после достижения установленной суммы.

После выбора появляется поле:

**«Мин. сумма обмена для Отдаю»**

Система сравнивает это значение с суммой, которую клиент отдаёт.

Пример:

```
Мин. сумма обмена для Отдаю: 100 000 RUB
```

Результат:

<table><thead><tr><th width="199.9921875" align="right">Сумма «Отдаю»</th><th>Требуется проверка</th></tr></thead><tbody><tr><td align="right"><code>99 999 RUB</code></td><td>Нет</td></tr><tr><td align="right"><code>100 000 RUB</code></td><td>Да</td></tr><tr><td align="right"><code>150 000 RUB</code></td><td>Да</td></tr></tbody></table>

Проверка начинается с точного значения, указанного в поле.

{% hint style="warning" %}
Отдельного поля **«Порог»** в панели нет. Сумма указывается в поле **«Мин. сумма обмена для Отдаю»**, которое появляется после выбора этого режима.
{% endhint %}

Значение `0` фактически делает условие подходящим для любой положительной суммы.

Если проверка должна начинаться только с определённого объёма, укажите положительное значение.
{% endstep %}

{% step %}

#### Только для клиентов без идентификации

Проверка карты требуется клиентам, которые ещё не прошли проверку личности.

Пример:

```
Клиент A:
личность подтверждена

Клиент B:
личность не подтверждена
```

Для клиента A это условие не запрашивает проверку карты.

Для клиента B проверка будет обязательной.
{% endstep %}

{% step %}

#### Только для новой карты/реквизитов

Проверка требуется, если система не нашла такую же подтверждённую карту у текущего клиента для валюты **«Отдаю»**.

Перед сравнением из номера удаляются:

* пробелы;
* дефисы;
* другие символы, кроме цифр.

Поэтому значения:

```
1234 5678 9012 3456
```

и:

```
1234567890123456
```

считаются одним номером.

Подтверждение привязано к конкретному аккаунту. Если один клиент подтвердил карту, для другого клиента она не становится подтверждённой автоматически.
{% endstep %}

{% step %}

### Для клиентов с подозрительной историей

Проверка требуется, если у клиента уже есть заявка, отмеченная системой как мошенническая.

Если такой истории нет, проверка карты по этому условию не запрашивается.

Используйте этот вариант только в том случае, если в системе действительно настроена работа с мошенническими заявками и сотрудники правильно отмечают такие случаи.
{% endstep %}
{% endstepper %}

### Текст верификации карт

Краткое мультиязычное сообщение, которое передаётся на публичную форму обмена вместе с активным правилом.

Текст должен коротко объяснять, что клиенту может потребоваться подтверждение карты.

Пример:

```
Для обмена по этому направлению может потребоваться подтверждение банковской карты.
```

Заполните текст для каждого языка, доступного на клиентском сайте.

### Информация для верификации карт

Подробная мультиязычная инструкция, которую клиент видит в заявке, когда проверка действительно требуется.

В инструкции можно указать:

* какую фотографию нужно загрузить;
* что должно быть видно;
* какие данные разрешено скрыть;
* нужен ли номер заявки на снимке;
* допустимые форматы файлов;
* примерный срок рассмотрения;
* причины отклонения;
* порядок повторной отправки.

Пример:

```
Загрузите цветную фотографию карты на фоне страницы текущей заявки.

На фотографии должны быть видны:

- первые шесть и последние четыре цифры карты;
- имя владельца, если оно указано;
- номер текущей заявки.

Средние цифры карты и код безопасности необходимо закрыть.
```

#### Как выбирается инструкция

На странице заявки тексты проверяются в следующем порядке:

1. инструкция направления;
2. инструкция валюты **«Отдаю»**;
3. общий текст верификации карт.

Если в направлении заполнена собственная инструкция, она имеет приоритет.

### Индивидуальный конструктор

Тип **«Индивидуальный конструктор»** добавляет на публичную форму два варианта:

<figure><img src="/files/1mjhGU4EDRZRr16FUFb7" alt="" width="563"><figcaption></figcaption></figure>

* **«Без верификации»**;
* **«С верификацией»**.

Клиент может переключаться между ними до создания заявки.

Выбранный вариант влияет на:

* минимальную сумму;
* максимальную сумму;
* курс;
* комиссию;
* необходимость проверки карты.

### Режим по умолчанию для клиента

Определяет, какой вариант будет выбран при первом открытии направления.

Доступны:

* **«Без верификации»**;
* **«С верификацией»**.

Это только начальный выбор. Клиент может переключить вариант перед созданием заявки.

{% stepper %}
{% step %}

#### Без верификации

Для варианта отдельно задаются:

* **«Минимальная сумма»**;
* **«Максимальная сумма»**;
* **«Комиссия»**;
* **«Описание»**.

Пример:

```
Минимальная сумма: 5 000 RUB
Максимальная сумма: 50 000 RUB
Комиссия: +1%
Описание: Обмен без проверки карты
```

{% endstep %}

{% step %}

#### С верификацией

Доступны те же поля.

Пример:

```
Минимальная сумма: 5 000 RUB
Максимальная сумма: 500 000 RUB
Комиссия: 0
Описание: Повышенный лимит после проверки карты
```

В результате клиент видит понятную разницу:

* без проверки доступен меньший лимит;
* после подтверждения карты можно обменять более крупную сумму;
* курс или комиссия могут отличаться.
  {% endstep %}
  {% endstepper %}

### Как используются лимиты конструктора

Положительные значения минимальной и максимальной суммы заменяют общие лимиты **«Отдаю»** для выбранного варианта.

Если поле:

* пустое;
* равно `0`;
* содержит некорректное значение;
* содержит отрицательное значение;

используется соответствующий действующий лимит направления из раздела:

**«Общее» — «Основное»**

Пример:

```
Максимум направления: 100 000 RUB
Максимум варианта без верификации: 0
```

Для этого варианта будет использован максимум направления:

```
100 000 RUB
```

Для понятной работы рекомендуется явно задавать лимиты обоих вариантов.

### Комиссия конструктора

Комиссия изменяет курс выбранного клиентом варианта.

Поле принимает арифметические выражения с:

* числами;
* `+`;
* `-`;
* `*`;
* `/`;
* `%`.

Примеры:

```
0
+1%
-0.5%
+10
```

Значение:

```
0
```

означает, что дополнительное изменение не применяется.

Некорректное выражение не участвует в расчёте.

{% hint style="warning" %}
Не оценивайте комиссию только по знаку. При прямом и обратном отображении курса выражение может влиять на сумму клиента по-разному.
{% endhint %}

После сохранения проверьте на публичной форме:

* сумму **«Отдаю»**;
* сумму **«Получаю»**;
* итоговый курс;
* оба варианта;
* граничные значения лимитов.

### Что происходит после создания заявки

При создании заявки сохраняются:

* выбранный клиентом вариант;
* действующие лимиты;
* применённая комиссия;
* необходимость проверки карты.

Если проверка требуется и такая карта ещё не подтверждена для текущего клиента и валюты **«Отдаю»**, заявка помечается как требующая верификации.

На странице оплаты клиент видит инструкцию и форму отправки подтверждения.

Отправленные материалы можно проверить в разделе:

**«Заявки» — «Верификация» — «Верификация карт»**

Менеджер может открыть отправленные данные и принять решение по проверке.

***

## Верификация личности

В карточке направления откройте: **«Верификация» — «Личности»**

Раздел определяет, должен ли клиент пройти проверку личности перед обменом или после создания заявки.

{% hint style="info" %}
Настройки направления не подключают KYC-сервис автоматически. Для работы должна быть включена общая система проверки личности и настроен активный KYC-сервис.
{% endhint %}

{% content-ref url="/pages/P197pKxC4vezvC5zGLCn" %}
[Верификация личности (KYC)](/guide/verifikaciya/verifikaciya-lichnosti-kyc)
{% endcontent-ref %}

{% content-ref url="/pages/fQok59Mv18SqJ7AozMeY" %}
[KYC сервисы](/guide/integracii/kyc-servisy)
{% endcontent-ref %}

### Тип верификации личности

Доступны два варианта:

| Тип                               | Как работает                            |
| --------------------------------- | --------------------------------------- |
| По умолчанию: из настроек валюты  | Используются KYC-правила валюты «Отдаю» |
| Отдельные правила для направления | Используются настройки текущей пары     |

{% stepper %}
{% step %}

#### По умолчанию: из настроек валюты

Используются параметры валюты **«Отдаю»**:

* режим проверки;
* минимальная сумма;
* поведение для неверифицированного клиента;
* краткое описание;
* подробная инструкция.

Поля отдельных правил направления не применяются.
{% endstep %}

{% step %}

#### Отдельные правила для направления

Настройки текущего направления заменяют правила валюты **«Отдаю»** только для выбранной пары.

После выбора становятся доступны:

* режим проверки личности;
* минимальная сумма;
* действие для неверифицированного клиента;
* краткое описание;
* подробная инструкция.
  {% endstep %}
  {% endstepper %}

### Когда запрашивать проверку личности

{% stepper %}
{% step %}

#### Выключена

Направление не требует проверку личности.

При выборе отдельных правил этот вариант отключает требование валюты **«Отдаю»** только для текущей пары.

Проверка всё равно может быть назначена вручную или другим защитным модулем.
{% endstep %}

{% step %}

#### Всегда требуется

Проверка требуется при каждом обмене, если личность клиента ещё не подтверждена.

Уже верифицированный клиент сможет продолжить обмен без повторного прохождения KYC, если его статус остаётся действующим.
{% endstep %}

{% step %}

#### Только с указанной суммы

После выбора появляется поле:

**«Мин. сумма обмена, с которой требуется верификация»**

Проверка включается, если сумма **«Отдаю»** равна установленному значению или превышает его.

Пример:

```
Мин. сумма: 10 000 USDT
```

Результат:

<table><thead><tr><th width="180.97265625" align="right">Сумма «Отдаю»</th><th>Требуется KYC</th></tr></thead><tbody><tr><td align="right"><code>9 999 USDT</code></td><td>Нет</td></tr><tr><td align="right"><code>10 000 USDT</code></td><td>Да</td></tr><tr><td align="right"><code>15 000 USDT</code></td><td>Да</td></tr></tbody></table>

Укажите положительное значение.

Если поле пустое, равно `0` или заполнено неправильно, проверка по сумме не включается.
{% endstep %}

{% step %}

#### Только для новых клиентов

Проверка требуется клиентам, у которых ещё нет успешно выполненных заявок.

Новым также считается клиент без авторизации.

Пример:

```
Клиент A:
нет выполненных заявок

Клиент B:
есть выполненные заявки
```

Для клиента A KYC потребуется.

Для клиента B это правило не будет применяться.
{% endstep %}

{% step %}

#### Только для клиентов без идентификации

Проверка требуется до тех пор, пока личность клиента не подтверждена.

После успешного прохождения KYC правило перестаёт ограничивать новые заявки пользователя.
{% endstep %}
{% endstepper %}

### Если клиент не прошёл верификацию личности

Поле определяет, на каком этапе клиент должен пройти KYC.

Доступны два варианта:

{% stepper %}
{% step %}

#### Сначала верификация → затем заявка

Неверифицированный клиент не сможет создать заявку.

Порядок работы:

1. Клиент выбирает направление.
2. Система определяет обязательную проверку.
3. Клиент получает предложение пройти KYC.
4. После подтверждения личности возвращается к обмену.
5. Создаёт заявку.

Этот вариант подходит для строгого KYC, когда заявка не должна появляться до подтверждения клиента.

Перед включением убедитесь, что клиент может:

* открыть форму KYC без созданной заявки;
* загрузить документы;
* получить результат;
* вернуться к направлению;
* продолжить обмен.
  {% endstep %}

{% step %}

#### Создать заявку → затем запросить верификацию

Клиент может создать заявку до прохождения проверки.

Порядок работы:

1. Клиент заполняет форму обмена.
2. Создаёт заявку.
3. Заявка получает признак обязательного KYC.
4. Клиент проходит проверку.
5. После подтверждения обработка продолжается.

Этот вариант подходит, если менеджеру необходимо сначала получить заявку, а затем запросить документы.

{% hint style="info" %}
При этом сценарии заявка не должна завершаться до успешного прохождения обязательной проверки личности.
{% endhint %}
{% endstep %}
{% endstepper %}

Оба варианта сохраняются и применяются системой.

После изменения нажмите **«Сохранить»**, обновите страницу и убедитесь, что выбранное значение сохранилось.

### Краткое описание проверки личности

Мультиязычный текст, который выводится на публичной форме, если для клиента требуется KYC.

Пример:

```
Для обмена по этому направлению необходимо подтвердить личность.
```

Кратко укажите:

* почему нужна проверка;
* что должен сделать клиент;
* когда он сможет продолжить обмен.

### Подробная инструкция по верификации личности

Расширенный мультиязычный текст направления.

В нём можно указать:

* допустимые документы;
* требования к фотографии;
* необходимость селфи;
* примерный срок рассмотрения;
* порядок повторной отправки;
* контакт поддержки.

Пример:

```
Загрузите цветную фотографию действующего документа, удостоверяющего личность.

На снимке должны быть видны все края документа. Фотография должна быть чёткой, без бликов, размытия и редактирования.
```

Этот текст дополняет, но не заменяет настройки и инструкции подключённого KYC-сервиса.

Основной процесс отправки и обработки документов должен быть настроен непосредственно в KYC-модуле.

## Связанные настройки

Для полноценной работы проверки карты и личности проверьте следующие разделы.

{% stepper %}
{% step %}

#### Настройки валюты «Отдаю»

Если используется наследование, откройте:

**«Основное» — «Валюты» — «Список валют»**

Выберите валюту **«Отдаю»** и перейдите к её редактированию.

Проверьте:

* **«Верификация» — «Карт»**;
* **«Верификация» — «Личности»**.
  {% endstep %}

{% step %}

#### Проверка карт

Для обработки отправленных клиентами материалов откройте:

**«Заявки» — «Верификация» — «Верификация карт»**

Здесь проверяются фотографии и подтверждения банковских карт.
{% endstep %}

{% step %}

#### KYC-сервисы

Для подключения сервиса проверки личности откройте:

**«Утилиты» — «KYC сервисы»**

Убедитесь, что нужный сервис:

* подключён;
* включён;
* имеет рабочие доступы;
* поддерживает нужный сценарий.
  {% endstep %}

{% step %}

#### Проверка личности

Для общих параметров KYC и обработки проверок откройте:

**«Заявки» — «Верификация» — «Верификация личности»**

Проверьте:

* включена ли общая проверка личности;
* выбран ли KYC-сервис;
* работают ли статусы;
* доступны ли проверки менеджерам.
  {% endstep %}

{% step %}

#### Основные лимиты направления

Если используется индивидуальный конструктор, сравните его лимиты с разделом:

**«Общее» — «Основное»**

Конструктор не должен создавать пустой или недоступный диапазон сумм.
{% endstep %}
{% endstepper %}

***

## Рекомендуемый порядок настройки

### Проверка карты

1. Определите, подходят ли общие правила валюты **«Отдаю»**.
2. Если нужны отдельные условия, выберите **«Из настроек направления»**.
3. Укажите режим проверки.
4. При необходимости заполните минимальную сумму.
5. Добавьте краткий текст.
6. Заполните подробную инструкцию.
7. Настройте все активные языки.
8. Нажмите **«Сохранить»**.
9. Обновите страницу и проверьте сохранённые значения.

### Индивидуальный конструктор

1. Выберите **«Индивидуальный конструктор»**.
2. Укажите вариант по умолчанию.
3. Настройте лимиты без верификации.
4. Настройте лимиты с верификацией.
5. Укажите комиссии.
6. Добавьте понятные описания.
7. Сохраните настройки.
8. Проверьте оба варианта на публичной форме.

### Проверка личности

1. Определите, подходят ли правила валюты **«Отдаю»**.
2. При необходимости выберите отдельные правила.
3. Укажите режим проверки.
4. Заполните минимальную сумму, если используется проверка по объёму.
5. Выберите поведение для неверифицированного клиента.
6. Добавьте краткое описание.
7. Заполните подробную инструкцию.
8. Нажмите **«Сохранить»**.
9. Обновите страницу и проверьте выбранный сценарий.

## Частые ошибки

<details>

<summary>Изменены настройки направления, но продолжает работать правило валюты</summary>

**Что происходит**

Администратор меняет поля проверки карты или личности, но результат на сайте не меняется.

**Почему возникает**

В поле типа верификации выбрано:

```
По умолчанию: из настроек валюты
```

При наследовании отдельные правила направления не применяются.

**Что проверить**

В карточке направления откройте:

* **«Верификация» — «Карт»**;
* **«Верификация» — «Личности»**.

Проверьте выбранный тип.

**Как исправить**

Если нужны отдельные условия, выберите:

```
Из настроек направления
```

или:

```
Отдельные правила для направления
```

После сохранения создайте новую тестовую заявку.

</details>

<details>

<summary>В панели не получается найти поле «Порог»</summary>

**Что происходит**

Администратор ищет отдельное поле с названием **«Порог»**, но его нет.

**Почему возникает**

Для проверки карты порог указывается в поле **«Мин. сумма обмена для Отдаю»**.

Оно появляется только после выбора:

```
Да, если мин. сумма Отдаю больше чем
```

**Как исправить**

Выберите нужный режим, после чего заполните появившееся поле.

Для проверки личности используется поле:

```
Мин. сумма обмена, с которой требуется верификация
```

</details>

<details>

<summary>Проверка по сумме не срабатывает</summary>

**Что происходит**

Сумма достигла ожидаемого значения, но проверка не появляется.

**Почему возникает**

Возможные причины:

* используется наследование;
* значение заполнено не в той валюте;
* сумма сравнивается со стороной **«Отдаю»**, а администратор проверяет **«Получаю»**;
* поле равно `0`;
* значение не сохранилось;
* клиент уже прошёл нужную проверку.

**Что проверить**

Проверьте:

* тип настройки;
* сохранённую сумму;
* валюту **«Отдаю»**;
* фактическую сумму заявки;
* статус клиента;
* наличие подтверждённой карты.

**Как исправить**

Укажите положительное значение в валюте **«Отдаю»** и создайте новые заявки ниже, на уровне и выше порога.

</details>

<details>

<summary>Подтверждённая карта не запрашивается повторно</summary>

**Что происходит**

Администратор ожидал новую проверку, но заявка использует уже подтверждённую карту.

**Почему возникает**

Это штатное поведение.

Система нашла такую же подтверждённую карту:

* у того же клиента;
* для той же валюты **«Отдаю»**;
* с совпадающим номером после удаления форматирующих символов.

**Как проверить повторную верификацию**

Используйте:

* другую карту;
* другой аккаунт;
* другую валюту **«Отдаю»**.

</details>

<details>

<summary>Карта с пробелами считается новой</summary>

**Что происходит**

Номер уже подтверждался, но после ввода с пробелами система снова запрашивает проверку.

**Почему возникает**

Возможна проблема с нормализацией реквизита или в номере присутствуют дополнительные символы.

**Что проверить**

Сравните фактически сохранённые значения карты.

Проверьте ввод:

```
1234 5678 9012 3456
```

и:

```
1234567890123456
```

**Как исправить**

Убедитесь, что перед сравнением удаляются все символы, кроме цифр.

</details>

<details>

<summary>Проверка подозрительного клиента не включается</summary>

**Что происходит**

Выбран режим **«Для клиентов с подозрительной историей»**, но проверка не запрашивается.

**Почему возникает**

У клиента нет заявки, отмеченной системой как мошенническая.

Обычная отменённая, отклонённая или просроченная заявка сама по себе не считается мошеннической.

**Что проверить**

Проверьте историю клиента и статус соответствующей заявки.

**Как исправить**

Используйте режим только при настроенном процессе отметки мошеннических заявок.

</details>

<details>

<summary></summary>

</details>

***

## Рекомендации

Для большинства направлений рекомендуется:

* использовать наследование, если правила одинаковы для одной валюты;
* создавать отдельные правила только для исключений;
* настраивать карту и личность независимо;
* задавать сумму в валюте **«Отдаю»**;
* использовать проверку новых реквизитов вместо проверки каждой заявки;
* не запрашивать секретные данные банковской карты;
* задавать понятные лимиты конструктора;
* проверять комиссию по фактической сумме клиента;
* заполнять тексты для всех активных языков;
* подключать и проверять KYC-сервис до включения обязательной проверки;
* запрещать завершение заявки до обязательного KYC;
* сохранять каждую страницу отдельно;
* создавать новую тестовую заявку после изменения настроек.

## Коротко

Группа **«Верификация»** управляет проверкой карты и личности в конкретном направлении обмена.

Для каждого раздела можно использовать настройки валюты **«Отдаю»** или задать собственные условия направления.

Проверка карты может работать для всех заявок, от определённой суммы, только для новых реквизитов, клиентов без идентификации или клиентов с мошеннической историей.

Индивидуальный конструктор позволяет предложить обмен с проверкой и без неё с разными лимитами и комиссиями.

Проверка личности может выполняться до создания заявки или после неё.

Для работы KYC должна быть включена общая система проверки личности и подключён активный KYC-сервис.

После настройки обязательно сохраните обе страницы, обновите редактор и проверьте каждый сценарий на новой тестовой заявке.


# Обмен

Группа **«Обмен»** содержит настройки, которые определяют курс направления, защищают его от нежелательных значений и задают дополнительные условия обмена.

Здесь можно:

* выбрать основной источник курса;
* подключить ручной или резервный курс;
* использовать формулу, файл или курс конкурента;
* настроить страховку курса;
* связать направление с BestChange API;
* добавить города для наличного обмена;
* ограничить сумму заданной кратностью;
* переключать расчёт на резервный курс при выходе за установленный диапазон.

## Где находятся настройки

В панели управления откройте:

**«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/GOitJJ3eKfwcqstfKT2t" alt=""><figcaption></figcaption></figure>

Выберите нужное направление и перейдите к его редактированию.

<figure><img src="/files/jGnxIE7itWHjFgMJ9239" alt=""><figcaption></figcaption></figure>

Затем раскройте группу **«Обмен»** и выберите необходимый раздел.

Настройки применяются отдельно к каждому направлению. Изменение курса, кратности или ограничений в одной валютной паре не влияет на другие направления.

## Курс обмена

Откройте: **«Обмен» — «Курс обмена»**

<figure><img src="/files/Pjfnenbz0TNT2ro4ngVk" alt=""><figcaption></figcaption></figure>

Раздел определяет, откуда система получает базовый курс направления.

На странице доступны следующие варианты:

* курс из источников;
* ручной курс;
* курс по формуле;
* курс из файла;
* курс конкурента.

Курс BestChange настраивается на соседней странице **«BestChange API»**, но также участвует в общем выборе источника.

### Как система выбирает курс

В одном направлении можно одновременно указать несколько источников.

Система не:

* складывает их значения;
* рассчитывает среднее значение;
* использует все источники одновременно.

Калькулятор последовательно проверяет источники и использует первый доступный согласно установленному приоритету.

Стандартный приоритет:

1. BestChange API.
2. Курс из источников.
3. Курс по формуле.
4. Ручной курс.
5. Курс из файла.
6. Курс конкурента.

Системный администратор может изменить этот порядок в серверной конфигурации. Если порядок не менялся, используется последовательность выше.

Источник считается доступным, если:

* он привязан к направлению;
* его запись включена;
* последнее обновление завершилось без ошибки;
* данные не считаются устаревшими;
* получено корректное положительное значение.

Для ручного курса проверяется только введённое значение. Оно должно быть больше `0`.

{% hint style="warning" %}
Источники с меньшим приоритетом используются только в том случае, если более приоритетный источник недоступен на этапе выбора.

Если уже выбранный источник возвращает неправильное значение непосредственно во время расчёта, система не всегда автоматически переходит к следующему источнику. Поэтому состояние основного курса необходимо регулярно контролировать.
{% endhint %}

### Курс из источников

Поле **«Курс из источников»** позволяет выбрать готовую валютную пару, созданную в модуле внешних источников курсов.

{% content-ref url="/pages/QONjoOQeboeYl0mZtPKO" %}
[Курсы из источников](/guide/kursy/istochniki/kursy-iz-istochnikov)
{% endcontent-ref %}

В списке отображаются доступные группы и пары.

Выбранная пара должна соответствовать порядку валют текущего направления.

Например, для направления:

```
USDT - RUB
```

необходимо выбрать курс, который действительно показывает отношение USDT к RUB.

Одинаковые коды валют не гарантируют правильный порядок расчёта. После сохранения обязательно проверьте, сколько клиент отдаёт и сколько получает.

{% stepper %}
{% step %}

#### Добавить к курсу в процентах

Поле со знаком **`%`** увеличивает числовое значение полученного курса на указанный процент.

Пример:

```
Исходный курс: 100
Добавить к курсу: 2%
```

Результат:

```
102
```

Значение `0` означает, что процентное изменение не применяется.
{% endstep %}

{% step %}

#### Фиксированное добавление к курсу

Поле со знаком **`S`** добавляет к курсу фиксированное числовое значение.

Пример:

```
Исходный курс: 100
Процентное добавление: 2%
Фиксированное добавление: 3 S
```

Расчёт:

```
100 + 2% = 102
102 + 3 = 105
```

Итоговый результат:

```
105
```

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/ZUDJnxZyTxfiXEl68GV4" %}
[Что означают % и S в настройках системы](/help-center/rabota-v-sisteme/sait-i-kontent/chto-oznachayut-i-s-v-nastroikakh-sistemy)
{% endcontent-ref %}

Процент применяется первым, фиксированное значение — вторым.

Знак `S` в этом поле означает фиксированное изменение курса. Это не процент и не отдельная комиссия от суммы заявки.
{% endstep %}
{% endstepper %}

Текущая логика применяет только положительные значения. Нулевые и отрицательные значения не уменьшают курс.

{% hint style="warning" %}
Увеличение числового значения курса не всегда увеличивает прибыль обменника. Результат зависит от порядка валют, отображения курса и последующих комиссий.

Проверяйте итог с позиции клиента — сколько он отдаёт и сколько получает.
{% endhint %}

### Ручной курс обмена

Поле **«Ручной курс обмена»** задаёт курс непосредственно в направлении.

Форма отображается как:

```
1 = значение S
```

Это означает, что одна единица валюты **«Отдаю»** равна указанному количеству единиц валюты **«Получаю»**.

Пример для направления:

```
USDT - RUB
```

Настройка:

```
1 = 90
```

означает:

```
1 USDT = 90 RUB
```

Ручной курс должен быть больше `0`.

Не считаются рабочими:

* пустое поле;
* `0`;
* отрицательное значение;
* текст вместо числа;
* некорректный формат.

Ручной курс не обновляется автоматически. Его необходимо контролировать и изменять самостоятельно.

Если одновременно доступен источник с более высоким приоритетом, ручное значение использоваться не будет.

{% hint style="warning" %}
Не оставляйте ручной курс без контроля в активном направлении. При изменении рынка он может быстро стать невыгодным для обменника.
{% endhint %}

### Курс по формуле

Поле **«Курс по формуле»** позволяет выбрать заранее созданную активную формулу.

{% content-ref url="/pages/WQ7Sr26pHTEFr2jwAscq" %}
[Формулы](/guide/kursy/formuly)
{% endcontent-ref %}

Формула может:

* использовать несколько исходных курсов;
* выполнять арифметические операции;
* рассчитывать кросс-курс;
* добавлять процент;
* применять внутренние коэффициенты.

На странице направления выбирается уже готовая формула. Её создание и настройка выполняются в модуле курсов.

Для использования формулы:

1. Создайте формулу в модуле курсов.
2. Включите её.
3. Убедитесь, что расчёт выполняется без ошибки.
4. Выберите формулу в направлении.
5. Нажмите **«Сохранить»**.
6. Проверьте итоговый курс.

Формула пропускается при выборе источника, если:

* она выключена;
* последнее обновление завершилось ошибкой;
* данные устарели;
* результат равен `0`;
* результат отрицательный;
* отсутствует одно из необходимых исходных значений.

### Курс обмена из файла

Поле **«Курс обмена из файла»** позволяет выбрать пару, загружаемую модулем курсов из файла.

{% content-ref url="/pages/DoE3UmZHRVvH7K1sLZmA" %}
[Курсы из файла](/guide/kursy/istochniki/kursy-iz-faila)
{% endcontent-ref %}

Перед привязкой необходимо отдельно настроить:

* источник файла;
* его формат;
* валютные пары;
* период обновления;
* правила обработки данных.

В направлении выбирается уже созданная пара.

Курс из файла участвует в расчёте, если:

* запись активна;
* последняя загрузка прошла без ошибки;
* данные не устарели;
* получено положительное значение.

Перед включением направления проверьте:

* доступность файла;
* правильность формата;
* наличие нужной пары;
* дату последнего обновления;
* резервный сценарий на случай недоступности файла.

### Курс конкурента

Поле **«Курс конкурента»** позволяет использовать пару, полученную модулем курсов конкурентов.

{% content-ref url="/pages/a4WreDXYppsc97CAPpKW" %}
[Курсы конкурентов](/guide/kursy/istochniki/kursy-konkurentov)
{% endcontent-ref %}

После выбора открываются дополнительные поля:

* **«Мин. курс»**;
* **«Макс. курс»**;
* **«Сбросить на курс»**;
* **«Добавить к курсу»**.

Эти параметры относятся только к выбранному курсу конкурента. Они не заменяют общий раздел **«Ограничение курса»**.

{% stepper %}
{% step %}

#### Мин. курс

Нижняя допустимая граница курса конкурента.

Значение:

```
0
```

отключает нижнюю проверку.

Курс, равный минимальному значению, считается допустимым.
{% endstep %}

{% step %}

#### Макс. курс

Верхняя допустимая граница курса конкурента.

Значение `0` отключает верхнюю проверку.

Курс, равный максимальному значению, считается допустимым.
{% endstep %}

{% step %}

#### Сбросить на курс

Резервный курс из внешних источников.

Он используется, если курс конкурента:

* стал ниже установленного минимума;
* стал выше установленного максимума.

Если резервный источник не выбран, выход за границы сам по себе:

* не отключает направление;
* не блокирует заявку;
* не заменяет курс конкурента.
  {% endstep %}

{% step %}

#### Добавить к курсу

Положительная процентная корректировка резервного курса.

Она применяется только после фактического переключения с курса конкурента на резервный источник.

Значение `0` не изменяет резервный курс.

Отрицательное значение текущей логикой не применяется.
{% endstep %}
{% endstepper %}

#### Пример работы курса конкурента

Настроено:

```
Курс конкурента: 110
Минимальный курс: 95
Максимальный курс: 105
Резервный курс: 98
Добавить к резервному курсу: 1%
```

Курс конкурента `110` выше установленного максимума `105`.

Система переключается на резервный курс:

```
98
```

и увеличивает его на `1%`:

```
98 + 1% = 98,98
```

Итоговый курс:

```
98,98
```

Если конкурент возвращает `100`, значение находится в диапазоне от `95` до `105`, поэтому резервный курс не применяется.

{% hint style="info" %}
Настройки курса конкурента работают только тогда, когда калькулятор действительно выбрал этот источник.

Если раньше сработал BestChange API, внешний источник, формула, ручной или файловый курс, параметры конкурента в расчёте не участвуют.
{% endhint %}

### Как отключить источник курса

Чтобы источник перестал участвовать в расчёте:

* очистите выбранную пару в соответствующем поле;
* для ручного курса очистите значение или установите `0`;
* для BestChange API выключите или удалите связь пары на странице **«BestChange API»**.

После изменения нажмите **«Сохранить»**.

### Как проверить используемый источник

Вернитесь в:

**«Основное» — «Направления обмена» — «Список направлений»**

Найдите нужное направление и откройте действие:

**«Как сформирован курс»**

В окне **«Формирование курса»** можно проверить:

* курс в списке направлений;
* значение, используемое для расчёта;
* выбранный источник;
* приоритет связанных источников;
* причины пропуска других источников;
* время последнего обновления;
* применённые изменения;
* последующие этапы формирования курса.

После этого откройте направление на публичном сайте и проверьте расчёт:

* при вводе суммы **«Отдаю»**;
* при вводе суммы **«Получаю»**.

***

## Страховка курса

Откройте: **«Обмен» — «Страховка курса»**

<figure><img src="/files/iTKe4gpITAjGZiH1g9tz" alt=""><figcaption></figcaption></figure>

Страховка сравнивает сформированный курс направления с отдельным контрольным курсом.

При опасном отклонении система может:

* применить безопасный базовый курс;
* ограничить курс по рассчитанной границе;
* отключить направление.

Страховка поддерживает:

* отдельный контрольный источник;
* верхнюю и нижнюю защиту;
* минимальный абсолютный порог;
* несколько проверок подряд;
* уведомления;
* диагностику;
* историю срабатываний.

{% content-ref url="/pages/B6h1l8tzTs0uYGTlPtaK" %}
[Страховка курса](/guide/kursy/strakhovka-kursa)
{% endcontent-ref %}

***

## BestChange API

Откройте: **«Обмен» — «BestChange API»**

<figure><img src="/files/meWqefuIpQgaWFS3XSI5" alt=""><figcaption></figcaption></figure>

Раздел связывает текущее направление с парой BestChange и позволяет настроить получение курса из мониторинга.

{% content-ref url="/pages/JfPNGdg3CsmBT5tQQCvB" %}
[BestChange](/guide/kursy/bestchange)
{% endcontent-ref %}

## Города

Откройте: **«Обмен» — «Города»**

<figure><img src="/files/sWg2NE3wBtYVhNIqaXXo" alt=""><figcaption></figcaption></figure>

Раздел используется для наличных и других географически зависимых направлений.

{% content-ref url="/pages/bUJL7s0OGLGWd8bYKvCu" %}
[Наличные обмены](/guide/obmen/nalichnye-obmeny)
{% endcontent-ref %}

## Кратность

Откройте: **«Обмен» — «Кратность»**

<figure><img src="/files/aAcyfwpK4BOMgW6Lqak6" alt=""><figcaption></figcaption></figure>

Кратность ограничивает допустимые суммы заданным шагом.

Например, при кратности:

```
100
```

клиент сможет указать:

```
100
200
300
1 000
```

но не сможет указать:

```
150
250
1 050
```

Кратность поддерживает целые и десятичные значения:

```
10
0,5
0,01
```

### Тип суммы обмена

Поле определяет, какую сторону проверяет система.

Доступны два варианта:

* **«Сумма Отдаю»** — проверяется сумма, которую клиент отдаёт;
* **«Сумма Получаю»** — проверяется рассчитанная или введённая сумма получения.

Если тип не выбран, правило кратности отключено.

Сохранённое значение шага и текст ошибки не применяются, пока не выбран тип суммы.

### Кратность суммы обмена

Поле содержит положительный шаг, которому должна соответствовать выбранная сумма.

Значение должно быть больше `0`.

Примеры:

<table><thead><tr><th>Тип суммы</th><th width="102.03125" align="right">Кратность</th><th width="295.3359375">Допустимые значения</th><th>Недопустимые значения</th></tr></thead><tbody><tr><td>Сумма «Отдаю»</td><td align="right"><code>100</code></td><td><code>100</code>, <code>200</code>, <code>1 500</code></td><td><code>150</code>, <code>1 550</code></td></tr><tr><td>Сумма «Получаю»</td><td align="right"><code>0,5</code></td><td><code>0,5</code>, <code>1</code>, <code>2,5</code></td><td><code>0,7</code>, <code>2,75</code></td></tr><tr><td>Сумма «Отдаю»</td><td align="right"><code>0,01</code></td><td><code>0,01</code>, <code>0,10</code>, <code>1,25</code></td><td><code>0,015</code>, <code>1,255</code></td></tr></tbody></table>

Проверка выполняется с точной десятичной арифметикой.

Например, значение:

```
0,3
```

при шаге:

```
0,1
```

будет распознано корректно.

### Сообщение в случае ошибки

Мультиязычный текст, который клиент увидит при вводе неправильной суммы.

Пример:

```
Сумма «Отдаю» должна быть кратна 100 RUB.

Допустимые примеры: 100, 200, 300 или 1 000 RUB.
```

Заполните сообщение для всех языков, доступных клиентам.

{% hint style="warning" %}
Сообщение необходимо заполнять обязательно. Клиент должен понимать, почему сумма не принимается и как её исправить.
{% endhint %}

### Как работает проверка кратности

1. Клиент вводит сумму.
2. Система рассчитывает обе стороны направления.
3. Проверяется сторона, выбранная в поле **«Тип суммы обмена»**.
4. Если сумма делится на шаг без остатка, клиент может продолжить.
5. Если сумма не соответствует кратности, показывается настроенное сообщение.
6. Создание заявки блокируется до исправления суммы.

При выборе **«Сумма Получаю»** проверяется именно сумма получения.

### Как отключить кратность

1. Откройте **«Обмен» — «Кратность»**.
2. Очистите поле **«Тип суммы обмена»**.
3. Нажмите **«Сохранить»**.

Установка шага `0` также делает проверку нерабочей, но правильный способ отключения — очистить тип суммы.

### Как проверить кратность

После сохранения откройте направление на публичном сайте.

Проверьте:

1. Сумму, равную одному шагу.
2. Сумму, равную нескольким шагам.
3. Сумму между допустимыми значениями.

Пример при шаге `100`:

<table><thead><tr><th width="178.953125" align="right">Сумма</th><th>Результат</th></tr></thead><tbody><tr><td align="right"><code>100</code></td><td>Допустима</td></tr><tr><td align="right"><code>200</code></td><td>Допустима</td></tr><tr><td align="right"><code>150</code></td><td>Ошибка</td></tr><tr><td align="right"><code>250</code></td><td>Ошибка</td></tr></tbody></table>

Для недопустимого значения должно появиться настроенное сообщение, а создание заявки должно быть заблокировано.

***

## Ограничение курса

Откройте: **«Обмен» — «Ограничение курса»**

<figure><img src="/files/4R0Ea4cnOlfNDKIdsyAs" alt=""><figcaption></figcaption></figure>

Раздел проверяет диапазон базового курса и при необходимости переключает расчёт на резервный источник.

### Как работает ограничение

Система:

1. Выбирает основной источник согласно приоритету.
2. Получает от него курс.
3. Применяет внутренние корректировки источника.
4. Сравнивает результат с минимальной и максимальной границей.
5. При выходе за диапазон пытается получить резервный курс.
6. Применяет процентное добавление к резервному значению.
7. Передаёт результат на следующие этапы расчёта.

Проверка выполняется до большинства последующих комиссий, скидок и страховки.

Поэтому курс на публичном сайте может отличаться от значения, которое сравнивалось с границами.

### Мин. курс

Нижняя допустимая граница.

* `0` — нижняя проверка отключена;
* значение больше `0` — основной курс должен быть равен минимуму или превышать его.

Если курс равен минимальному значению, он считается допустимым.

Пример:

```
Мин. курс: 90
```

<table><thead><tr><th width="127.58203125" align="right">Курс</th><th>Результат</th></tr></thead><tbody><tr><td align="right"><code>89</code></td><td>Ниже границы</td></tr><tr><td align="right"><code>90</code></td><td>Допустим</td></tr><tr><td align="right"><code>91</code></td><td>Допустим</td></tr></tbody></table>

### Макс. курс

Верхняя допустимая граница.

* `0` — верхняя проверка отключена;
* значение больше `0` — основной курс должен быть равен максимуму или быть ниже него.

Если курс равен максимальному значению, он считается допустимым.

Пример:

```
Макс. курс: 100
```

<table><thead><tr><th width="137.5390625" align="right">Курс</th><th>Результат</th></tr></thead><tbody><tr><td align="right"><code>99</code></td><td>Допустим</td></tr><tr><td align="right"><code>100</code></td><td>Допустим</td></tr><tr><td align="right"><code>101</code></td><td>Выше границы</td></tr></tbody></table>

Можно использовать только одну границу.

Например:

```
Мин. курс: 90
Макс. курс: 0
```

В этом случае контролируется только падение курса.

Или:

```
Мин. курс: 0
Макс. курс: 100
```

В этом случае контролируется только рост.

Если заполнены обе границы, минимум должен быть меньше или равен максимуму.

{% hint style="info" %}
Не устанавливайте минимальный курс выше максимального. В таком диапазоне ни одно значение не сможет считаться допустимым.
{% endhint %}

### Сбросить на курс

Поле выбирает резервную пару из курсов из источников.

Резервный курс применяется при одновременном выполнении двух условий:

1. основной курс находится ниже минимума или выше максимума;
2. выбранный резервный источник возвращает положительное значение.

Если основной курс находится внутри диапазона, резервный источник не используется.

Если основной курс вышел за границы, но резервный источник не выбран, система оставляет исходный курс без изменения.

При этом:

* направление не отключается;
* заявка не блокируется;
* курс не заменяется минимумом или максимумом.

{% hint style="warning" %}
Название **«Ограничение курса»** не означает жёсткий запрет.

Этот раздел переключает расчёт на резервный источник. Для автоматического отключения направления используйте **«Страховку курса»**.
{% endhint %}

### Добавить к курсу

Поле появляется после выбора резервного источника.

Оно увеличивает резервный курс на указанный процент.

* `0` — резервный курс используется без изменения;
* положительное значение — курс увеличивается;
* отрицательное значение — не применяется.

Корректировка используется только при фактическом переходе на резервный источник.

### Пример с двумя границами

Настроено:

```
Минимальный курс: 95
Максимальный курс: 105
Резервный курс: 98
Добавить к курсу: 2%
```

Результат:

<table><thead><tr><th width="170.8359375" align="right">Основной курс</th><th>Состояние</th><th align="right">Применённый результат</th></tr></thead><tbody><tr><td align="right"><code>94</code></td><td>Ниже минимума</td><td align="right"><code>98 + 2% = 99,96</code></td></tr><tr><td align="right"><code>95</code></td><td>Равен минимуму</td><td align="right"><code>95</code></td></tr><tr><td align="right"><code>100</code></td><td>В диапазоне</td><td align="right"><code>100</code></td></tr><tr><td align="right"><code>105</code></td><td>Равен максимуму</td><td align="right"><code>105</code></td></tr><tr><td align="right"><code>106</code></td><td>Выше максимума</td><td align="right"><code>98 + 2% = 99,96</code></td></tr></tbody></table>

### Пример только с минимальной границей

Настроено:

```
Минимальный курс: 90
Максимальный курс: 0
Резервный курс: 92
Добавить к курсу: 0%
```

Результат:

* курс `89` будет заменён на `92`;
* курс `90` останется без изменения;
* курс `150` останется без изменения, потому что верхняя граница выключена.

### Пример без резервного источника

Настроено:

```
Минимальный курс: 95
Максимальный курс: 105
Сбросить на курс: не выбран
```

Если основной курс станет равен `110`, система обнаружит выход за диапазон, но оставит значение `110`.

Заполнение только минимума и максимума без резервного курса не создаёт защитного действия.

### Как отключить ограничение курса

1. Откройте **«Обмен» — «Ограничение курса»**.
2. Установите **«Мин. курс»** равным `0`.
3. Установите **«Макс. курс»** равным `0`.
4. При необходимости очистите поле **«Сбросить на курс»**.
5. Нажмите **«Сохранить»**.

При значениях:

```
0
0
```

любой положительный курс считается допустимым.

### Как проверить ограничение курса

Проверяйте настройку на тестовом направлении.

1. Запомните текущий основной курс.
2. Установите границы так, чтобы курс находился внутри диапазона.
3. Убедитесь, что резервный источник не применился.
4. Измените границу так, чтобы основной курс оказался вне диапазона.
5. Проверьте переход на резервный источник.
6. Проверьте процентное добавление.
7. Верните рабочие границы.
8. Нажмите **«Сохранить»**.
9. Откройте **«Как сформирован курс»**.
10. Проверьте результат на публичном сайте.

***

## Порядок применения настроек

В упрощённом виде курс формируется следующим образом:

1. Система выбирает первый доступный источник по установленному приоритету.
2. Применяются внутренние настройки выбранного источника.
3. **«Ограничение курса»** сравнивает полученный результат с установленными границами.
4. При выходе за диапазон система может перейти на резервный внешний курс.
5. Применяются прибыль, комиссии, скидки и другие расчётные параметры.
6. **«Страховка курса»** проверяет сформированный курс и выполняет защитное действие.
7. **«Кратность»** отдельно проверяет сумму клиента.

BestChange API участвует на первом этапе как один из источников курса.

Настройки городов применяются как отдельные условия наличного направления.

## Частые ошибки

<details>

<summary>Выбран один источник, но используется другой</summary>

**Что происходит**

В направлении выбран ручной курс, формула или файл, но система использует другой источник.

**Почему возникает**

Одновременно доступен источник с более высоким приоритетом.

**Что проверить**

Откройте действие **«Как сформирован курс»** и проверьте:

* выбранный источник;
* приоритет;
* связанные записи;
* причины пропуска остальных источников.

**Как исправить**

Очистите лишние привязки или отключите ненужный источник.

</details>

<details>

<summary>Ручной курс не применяется</summary>

**Что происходит**

Введённое значение не используется в калькуляторе.

**Почему возникает**

Возможные причины:

* курс равен `0`;
* указано отрицательное значение;
* введён неправильный формат;
* доступен более приоритетный источник.

**Как исправить**

Укажите положительное значение и отключите более приоритетные источники, если требуется использовать ручной курс.

</details>

<details>

<summary>Отрицательная корректировка не уменьшает курс</summary>

**Что происходит**

В поле **«Добавить к курсу»** указано отрицательное значение, но курс не изменился.

**Почему возникает**

Текущая логика этих полей применяет только положительные корректировки.

**Как исправить**

Используйте формулу или другой источник, поддерживающий необходимое математическое действие.

</details>

<details>

<summary>Курс вышел за границы, но не изменился</summary>

**Что происходит**

Основной курс ниже минимума или выше максимума, но система продолжает использовать его.

**Почему возникает**

В поле **«Сбросить на курс»** не выбран рабочий резервный источник.

Минимум и максимум сами по себе не заменяют курс.

**Что проверить**

Проверьте:

* выбран ли резервный источник;
* активен ли он;
* возвращает ли он положительный курс;
* актуальны ли его данные.

**Как исправить**

Подключите рабочий резервный источник либо используйте страховку с действием **«Отключить направление»**.

</details>

<details>

<summary>Резервный курс применяется постоянно</summary>

**Что происходит**

Система почти всегда переходит на резервный источник.

**Почему возникает**

Возможные причины:

* минимальная граница слишком высокая;
* максимальная граница слишком низкая;
* минимум больше максимума;
* границы указаны в обратном представлении курса.

**Как исправить**

Проверьте реальный базовый курс через **«Как сформирован курс»** и установите границы в том же формате.

</details>

<details>

<summary></summary>

</details>

<details>

<summary></summary>

</details>

***

## Рекомендации

Для большинства направлений рекомендуется:

* использовать один основной источник и независимый резервный;
* не подключать лишние источники без понимания приоритета;
* регулярно проверять дату последнего обновления;
* контролировать итог через **«Как сформирован курс»**;
* не оставлять ручной курс без наблюдения;
* использовать ограничение курса только вместе с резервным источником;
* использовать страховку для жёсткого отключения направления;
* проверять курс с позиции клиента;
* заполнять сообщение кратности для всех языков;
* тестировать точные границы;
* создавать новую заявку после существенных изменений.

## Коротко

Группа **«Обмен»** отвечает за получение и защиту курса направления.

Раздел **«Курс обмена»** определяет основной источник и его корректировки.

BestChange API, формула, ручной курс, файл и курс конкурента участвуют в расчёте согласно установленному приоритету.

Раздел **«Ограничение курса»** переключает расчёт на резервный источник при выходе основного курса за допустимые границы.

Раздел **«Кратность»** ограничивает допустимые суммы заданным шагом.

Страховка курса используется для более строгой защиты и может автоматически отключить направление.

После настройки обязательно проверьте источник, границы, кратность, итоговый курс и создание тестовой заявки.


# Комиссии

Группа **«Комиссии»** определяет прибыль обменника, изменения курса и отдельные комиссии, которые добавляются к суммам заявки.

Комиссии можно использовать для разных задач:

* добавить основную прибыль обменника;
* подключить общий профиль прибыли;
* применить математическое изменение курса;
* учесть расходы банка, мерчанта или платёжной системы;
* добавить отдельную комиссию к сумме **«Отдаю»**;
* удержать комиссию из суммы **«Получаю»**;
* изменить курс в зависимости от суммы обмена;
* предложить клиенту несколько вариантов комиссии.

Настройки этих разделов решают разные задачи и могут применяться в одной заявке одновременно.

Поэтому итоговый результат нельзя рассчитать простым сложением всех процентов. Каждая комиссия применяется на своём этапе и может использовать другую расчётную базу.

## Где находятся настройки

В панели управления откройте:

**«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/GOitJJ3eKfwcqstfKT2t" alt=""><figcaption></figcaption></figure>

Выберите нужное направление и перейдите к его редактированию.

<figure><img src="/files/jGnxIE7itWHjFgMJ9239" alt=""><figcaption></figcaption></figure>

Затем раскройте группу **«Комиссии»** и откройте нужный раздел.

Все значения применяются только к текущему направлению.

Например, изменение комиссии в направлении:

```
Сбербанк RUB - USDT TRC20
```

не изменяет обратную пару:

```
USDT TRC20 - Сбербанк RUB
```

Обратное направление необходимо настраивать и проверять отдельно.

## Какие настройки изменяют курс, а какие — суммы

Перед началом важно разделять два типа комиссий.

| Раздел                | Что изменяет              | Когда применяется                              |
| --------------------- | ------------------------- | ---------------------------------------------- |
| **«Основная»**        | Курс направления          | Автоматически при формировании курса           |
| **«От суммы обмена»** | Курс направления          | Когда сумма «Отдаю» попала в заданный диапазон |
| **«Выбор комиссии»**  | Курс направления          | После выбора клиентом варианта                 |
| **«Доп. и ПС»**       | Суммы «Отдаю» и «Получаю» | После определения итогового курса              |

Это означает:

* профиль прибыли изменяет курс;
* индивидуальная прибыль изменяет курс;
* групповая комиссия изменяет курс;
* комиссия по диапазону изменяет курс;
* выбранный клиентом вариант изменяет курс;
* дополнительные комиссии и комиссии ПС рассчитываются отдельными денежными компонентами заявки.

Одинаковое значение `1%` в разных разделах может дать разный результат, потому что применяется к разным значениям.

## Что означают `%` и `S`

Значение обозначений зависит от раздела.

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/ZUDJnxZyTxfiXEl68GV4" %}
[Что означают % и S в настройках системы](/help-center/rabota-v-sisteme/sait-i-kontent/chto-oznachayut-i-s-v-nastroikakh-sistemy)
{% endcontent-ref %}

{% stepper %}
{% step %}

### В разделе «Основная»

* **`%`** — процент прибыли, применяемый к курсу;
* **`S`** — фиксированное числовое изменение курса.

Значение `S` в этом разделе не является денежной комиссией в валюте **«Отдаю»** или **«Получаю»**.
{% endstep %}

{% step %}

### В разделе «Доп. и ПС»

* **`%`** — процент от суммы соответствующей стороны;
* **`S`** — фиксированная сумма в валюте соответствующей стороны.

Например, для направления:

```
USDT - RUB
```

фиксированная комиссия:

* на стороне **«Отдаю»** указывается в USDT;
* на стороне **«Получаю»** указывается в RUB.
  {% endstep %}
  {% endstepper %}

## В разделах «От суммы обмена» и «Выбор комиссии»

Поле **«Комиссия»** содержит математическое выражение, которое изменяет курс.

Примеры:

```
-1%
+0.5
*1.02
/1.05
0
```

Знак или математическую операцию необходимо указывать непосредственно в выражении.

***

## Основная комиссия

Откройте: **«Комиссии» — «Основная»**

<figure><img src="/files/lV9EJ8cHnZsbUg0ZAuay" alt=""><figcaption></figcaption></figure>

На странице доступны:

* профиль прибыли;
* индивидуальная прибыль в процентах;
* индивидуальная фиксированная прибыль `S`;
* групповая комиссия.

### Профиль прибыли

Поле **«Профиль прибыли»** позволяет подключить заранее созданный профиль.

{% content-ref url="/pages/GwMvgGd7YV9ObOVDsht4" %}
[Профили прибыли](/guide/obmen/profili-pribyli)
{% endcontent-ref %}

Профили создаются в разделе:

**«Основное» — «Профили прибыли» — «Общие профили»**

Профиль удобно использовать, когда одинаковую прибыль нужно назначить нескольким направлениям.

Например, один профиль можно подключить к направлениям:

```
Сбербанк RUB - USDT TRC20
Т-Банк RUB - USDT TRC20
Альфа-Банк RUB - USDT TRC20
```

После изменения профиля его значения будут использоваться во всех связанных направлениях, если они не переопределены индивидуальными настройками.

В редакторе направления отображаются активные профили:

* предназначенные для направлений;
* имеющие общую область применения.

Чтобы не использовать профиль, выберите:

```
Без профиля
```

### Индивидуальная прибыль в процентах

Поле **«Прибыль, %»** задаёт процент прибыли обменника для текущего направления.

Положительное значение считается именно прибылью обменника.

Система самостоятельно учитывает обычное и обратное представление курса. Поэтому для стандартной прибыли не нужно вручную менять знак только из-за того, что отображаемый курс меньше `1`.

Отрицательное значение работает в противоположную сторону и может улучшить условия для клиента.

Используйте отрицательную прибыль только намеренно и обязательно проверяйте результат на публичном калькуляторе.

### Индивидуальная прибыль S

Поле **«Прибыль, S»** задаёт фиксированное числовое изменение рабочего курса.

Оно применяется после процентной прибыли.

Это не фиксированная денежная комиссия с клиента.

Если нужно:

* добавить фиксированную сумму к стороне **«Отдаю»**;
* удержать фиксированную сумму из стороны **«Получаю»**;

используйте раздел: **«Комиссии» — «Доп. и ПС»**

### Как работает приоритет профиля и направления

Профиль и индивидуальные значения не являются двумя полностью отдельными режимами.

Приоритет определяется отдельно для каждого поля:

1. Если в направлении указано ненулевое значение, используется оно.
2. Если значение направления равно `0` или поле пустое, система использует соответствующее значение профиля.
3. Если профиль не выбран или его значение равно `0`, корректировка не применяется.

Пример:

```
Профиль:
Прибыль — 2%
Прибыль S — 5

Направление:
Прибыль — 1%
Прибыль S — 0
```

Итог:

```
Процент — 1% из направления
Фиксированное значение — 5 S из профиля
```

Другой пример:

```
Профиль:
Прибыль — 1,5%
Прибыль S — 10

Направление:
Прибыль — 0%
Прибыль S — 3
```

Итог:

```
Процент — 1,5% из профиля
Фиксированное значение — 3 S из направления
```

{% hint style="warning" %}
Если выбран профиль, значение `0` в направлении не отключает соответствующее поле профиля.

Чтобы полностью убрать значение, выберите **«Без профиля»** или измените сам профиль.
{% endhint %}

### Пример основной прибыли

Исходный курс:

```
1 USDT = 100 RUB
```

Настройки направления:

```
Прибыль, % — 2
Прибыль, S — 1
```

Расчёт:

```
100 - 2% = 98
98 - 1 = 97
```

Итоговый курс:

```
1 USDT = 97 RUB
```

Для курса меньше `1` система может выполнять расчёт во внутреннем обратном представлении, а затем возвращать публичный курс.

Поэтому проверяйте не только отображаемое число, но и фактический результат:

* сколько клиент отдаёт;
* сколько клиент получает.

### Групповая комиссия

Поле **«Групповая комиссия»** подключает готовое правило математического изменения курса.

{% content-ref url="/pages/bkPuN393k6thpfBR6jWw" %}
[Групповая комиссия](/guide/obmen/napravleniya-obmena/gruppovaya-komissiya)
{% endcontent-ref %}

Групповые комиссии создаются в разделе:

**«Основное» — «Направления обмена» — «Групповые комиссии»**

В текущем редакторе рекомендуется выбирать не более одной групповой комиссии для одного направления.

Групповая комиссия:

* применяется к курсу;
* используется до основной прибыли;
* не заменяет профиль прибыли;
* не является денежной комиссией раздела **«Доп. и ПС»**;
* использует математическое выражение, сохранённое в правиле.

Например:

```
+1%
```

```
*1.02
```

В отличие от поля **«Прибыль, %»**, групповая комиссия не воспринимается системой как бизнес-понятие прибыли.

Её математическая операция напрямую изменяет рабочий курс.

Поэтому одно и то же выражение необходимо отдельно проверять:

* в направлении с курсом больше `1`;
* в направлении с курсом меньше `1`;
* в обратной валютной паре.

Не подключайте групповую комиссию, если такое же изменение уже добавлено:

* в источнике курса;
* в профиле прибыли;
* в индивидуальной прибыли;
* в другом расчётном правиле.

{% hint style="info" %}
Если раздел **«Обмен» — «Ограничение курса»** заменил основной курс резервным, раннее изменение курса может быть заменено вместе с исходным значением. Основная прибыль применяется после проверки ограничения курса.
{% endhint %}

### Как сохранить основную комиссию

1. Откройте **«Комиссии» — «Основная»**.
2. Выберите профиль или вариант **«Без профиля»**.
3. При необходимости укажите индивидуальную прибыль в процентах.
4. При необходимости укажите индивидуальное значение `S`.
5. При необходимости выберите групповую комиссию.
6. Нажмите **«Сохранить»**.
7. Обновите страницу.
8. Убедитесь, что значения сохранились.
9. Проверьте курс на клиентском сайте.

***

## Дополнительная комиссия и комиссия ПС

Откройте: **«Комиссии» — «Доп. и ПС»**

<figure><img src="/files/VrLY29L8xx9nLea0OqlP" alt=""><figcaption></figcaption></figure>

Страница разделена на два блока:

* **«Дополнительная комиссия»**;
* **«Комиссия ПС»**.

Эти блоки рассчитываются независимо друг от друга.

{% stepper %}
{% step %}

### Дополнительная комиссия

Дополнительная комиссия — собственная надбавка текущего направления.

Она может использоваться для:

* отдельного сервисного сбора;
* ручной обработки;
* повышенного риска;
* специальных условий;
* дополнительной услуги;
* покрытия внутренних расходов.

Она изменяет сумму заявки, а не сам курс.
{% endstep %}

{% step %}

### Комиссия ПС

Комиссия ПС отражает расходы внешнего сервиса:

* банка;
* мерчанта;
* платёжного шлюза;
* блокчейн-сети;
* сервиса выплаты;
* другого платёжного провайдера.

Она рассчитывается отдельно от дополнительной комиссии, даже если обе настроены на одной стороне.
{% endstep %}
{% endstepper %}

### Стороны «Отдаю» и «Получаю»

В каждом блоке доступны две стороны.

{% stepper %}
{% step %}

#### Отдаю

Комиссия относится к сумме, которую клиент передаёт обменнику.

Например, для направления:

```
USDT - RUB
```

фиксированная комиссия **«Отдаю»** указывается в USDT.
{% endstep %}

{% step %}

#### Получаю

Комиссия относится к сумме, которую клиент должен получить.

Для направления:

```
USDT - RUB
```

фиксированная комиссия **«Получаю»** указывается в RUB.
{% endstep %}
{% endstepper %}

### Поля комиссии

Для каждого типа комиссии и каждой стороны доступны:

* процент;
* фиксированная сумма;
* минимальная комиссия.

{% stepper %}
{% step %}

#### Процент

Процент рассчитывается от текущей базы соответствующей стороны.

Пример:

```
Сумма: 100 000 RUB
Комиссия: 1%
```

Результат:

```
1 000 RUB
```

{% endstep %}

{% step %}

#### Фиксированная сумма

Постоянная часть комиссии в валюте соответствующей стороны.

Пример:

```
Процент: 1%
Фиксированная сумма: 100 RUB
Сумма: 100 000 RUB
```

Расчёт:

```
100 000 × 1% + 100 = 1 100 RUB
```

{% endstep %}

{% step %}

#### Минимальная комиссия

Устанавливает нижнюю границу положительной комиссии.

Если рассчитанная комиссия меньше установленного минимума, применяется минимальное значение.

Пример:

```
База: 100
Процент: 1%
Фиксированная сумма: 0
Минимальная комиссия: 5
```

Обычный расчёт:

```
100 × 1% = 1
```

Поскольку `1` меньше минимума `5`, применяется:

```
5
```

Минимальная комиссия не работает как отдельное самостоятельное списание.

Она применяется только тогда, когда процент или фиксированная сумма уже сформировали положительную комиссию.

Положительный минимум нельзя сохранить, если:

```
Процент = 0
Фиксированная сумма = 0
```

{% endstep %}
{% endstepper %}

### Формула одного правила

Каждая комиссия рассчитывается по формуле:

```
Комиссия = база × процент / 100 + фиксированная сумма
```

После этого проверяется минимальное значение:

```
Если комиссия больше 0 и меньше минимума,
используется минимальная комиссия
```

### Порядок расчёта «Доп. и ПС»

Четыре правила применяются последовательно.

1. Дополнительная комиссия **«Отдаю»** рассчитывается от исходной суммы **«Отдаю»**.
2. Комиссия ПС **«Отдаю»** рассчитывается с учётом уже рассчитанной дополнительной комиссии.
3. Дополнительная комиссия **«Получаю»** рассчитывается от суммы получения после применения курса.
4. Комиссия ПС **«Получаю»** рассчитывается после вычитания дополнительной комиссии **«Получаю»**.

Поэтому две комиссии по `1%` могут дать другой результат, чем одна комиссия `2%`.

### Пример для стороны «Отдаю»

Исходная сумма клиента:

```
100 USDT
```

Настройки:

```
Дополнительная комиссия:
1% + 1 USDT

Комиссия ПС:
2%
```

Дополнительная комиссия:

```
100 × 1% + 1 = 2 USDT
```

База комиссии ПС:

```
100 + 2 = 102 USDT
```

Комиссия ПС:

```
102 × 2% = 2,04 USDT
```

Полная сумма:

```
100 + 2 + 2,04 = 104,04 USDT
```

Дополнительная комиссия входит в итоговую сумму **«Отдаю»**.

Комиссия ПС сохраняется отдельным компонентом и используется в зависимости от настроек мерчанта или способа оплаты.

### Пример для стороны «Получаю»

После применения курса клиент должен получить:

```
1 000 RUB
```

Настройки:

```
Дополнительная комиссия:
1% + 10 RUB

Комиссия ПС:
2%
```

Дополнительная комиссия:

```
1 000 × 1% + 10 = 20 RUB
```

База комиссии ПС:

```
1 000 - 20 = 980 RUB
```

Комиссия ПС:

```
980 × 2% = 19,60 RUB
```

Итоговая сумма **«Получаю»**:

```
1 000 - 20 - 19,60 = 960,40 RUB
```

### Отрицательные значения

Поля могут принимать отрицательные значения.

Отрицательная комиссия работает в обратную сторону и может:

* уменьшить сумму **«Отдаю»**;
* увеличить сумму **«Получаю»**;
* фактически предоставить клиенту скидку.

Для стандартных комиссий используйте положительные значения или `0`.

Отрицательные значения применяйте только намеренно и обязательно проверяйте на тестовой заявке.

### Как сохранить «Доп. и ПС»

1. Откройте **«Комиссии» — «Доп. и ПС»**.
2. Заполните нужные комиссии сторон **«Отдаю»** и **«Получаю»**.
3. Неиспользуемые поля оставьте равными `0`.
4. Нажмите **«Сохранить»**.
5. Если система показала ошибку, обновите страницу.
6. Проверьте сохранённые значения в обоих блоках.
7. Создайте новую тестовую заявку.
8. Сравните курс, итоговые суммы и отдельные комиссии.

***

## Комиссия от суммы обмена

Откройте: **«Комиссии» — «От суммы обмена»**

<figure><img src="/files/Lrj0iAFXIqPhuvMC8E7Q" alt=""><figcaption></figcaption></figure>

Раздел позволяет изменять курс в зависимости от суммы **«Отдаю»**.

Это не денежная комиссия от суммы заявки.

Значение подходящего диапазона применяется как математическая операция к рассчитанному курсу.

Например:

* для небольшой суммы можно использовать менее выгодный курс;
* для средней суммы — стандартный;
* для крупной суммы — более выгодный.

### Как добавить диапазон

1. Нажмите **«Добавить»**.
2. Система создаст новую строку со значениями `0`.
3. Укажите **«От суммы»**.
4. Укажите **«До суммы»**.
5. Заполните поле **«Комиссия»**.
6. Нажмите **«Сохранить»**.

Кнопка **«Добавить»** только создаёт строку.

Введённые после этого значения применяются только после нажатия **«Сохранить»**.

Удаление строки выполняется отдельной кнопкой с корзиной и применяется сразу.

{% stepper %}
{% step %}

#### От суммы

Нижняя граница диапазона в валюте **«Отдаю»**.
{% endstep %}

{% step %}

#### До суммы

Верхняя граница диапазона в валюте **«Отдаю»**.

Значение `0` не означает бесконечный верхний предел.

Если диапазон должен покрывать все крупные суммы, укажите реальное максимальное значение, которое превышает доступные лимиты направления.
{% endstep %}

{% step %}

#### Комиссия

Математическая операция, которая применяется к рабочему курсу.

Поддерживаемые примеры:

| Выражение | Действие               |
| --------- | ---------------------- |
| `+1%`     | Увеличить курс на 1%   |
| `-1%`     | Уменьшить курс на 1%   |
| `+0.5`    | Прибавить 0.5          |
| `-0.5`    | Вычесть 0.5            |
| `*1.02`   | Умножить курс на 1.02  |
| `/1.05`   | Разделить курс на 1.05 |
| `0`       | Не изменять курс       |

Число без знака трактуется как сложение.

Например:

```
1%
```

работает как:

```
+1%
```

А значение:

```
0.5
```

работает как:

```
+0.5
```

Используйте точку как десятичный разделитель:

```
0.5
```

В одном поле указывайте только одну операцию.

Не используйте составные выражения:

```
1+0.5
10/2
5*2
```

Форма может сохранить такую строку, но расчётный модуль не выполняет цепочку нескольких операций внутри одного выражения.
{% endstep %}
{% endstepper %}

### Как выбирается диапазон

Перед расчётом строки сортируются по полю **«От суммы»** от меньшего значения к большему.

Затем применяется первая строка, для которой выполняются оба условия:

```
Сумма «Отдаю» >= «От суммы»
Сумма «Отдаю» <= «До суммы»
```

Обе границы включаются.

Если сумма не попала ни в один диапазон, комиссия по сумме не применяется.

### Пример диапазонов

<table><thead><tr><th width="166.92578125" align="right">От суммы</th><th width="197.9609375" align="right">До суммы</th><th align="right">Комиссия</th></tr></thead><tbody><tr><td align="right"><code>1</code></td><td align="right"><code>9 999.99</code></td><td align="right"><code>-1%</code></td></tr><tr><td align="right"><code>10 000</code></td><td align="right"><code>49 999.99</code></td><td align="right"><code>-0.5%</code></td></tr><tr><td align="right"><code>50 000</code></td><td align="right"><code>500 000</code></td><td align="right"><code>0</code></td></tr></tbody></table>

Результат:

| Сумма «Отдаю» | Применяемая комиссия |
| ------------: | -------------------: |
|       `5 000` |                `-1%` |
|      `10 000` |              `-0.5%` |
|      `30 000` |              `-0.5%` |
|      `50 000` |                  `0` |
|     `500 000` |                  `0` |

### Пересекающиеся диапазоны

Если сумма попадает в несколько строк, используется первый подходящий диапазон после сортировки.

Не создавайте пересекающиеся интервалы.

Плохой пример:

| От суммы | До суммы | Комиссия |
| -------: | -------: | -------: |
|      `1` | `10 000` |    `-1%` |
| `10 000` | `50 000` |  `-0.5%` |

Сумма `10 000` находится сразу в двух диапазонах и будет рассчитана по первой строке.

Правильный вариант:

| От суммы |    До суммы | Комиссия |
| -------: | ----------: | -------: |
|      `1` |  `9 999.99` |    `-1%` |
| `10 000` | `49 999.99` |  `-0.5%` |
| `50 000` |   `500 000` |      `0` |

### Разрывы между диапазонами

Не оставляйте суммы, которые не входят ни в одну строку, если для них также должна применяться комиссия.

Плохой пример:

```
1 - 9 999
10 001 - 50 000
```

Сумма `10 000` не попадает ни в один диапазон.

### Некорректные границы

Если значение **«От суммы»** больше **«До суммы»**, система сбрасывает обе границы строки в `0`.

Пример неправильной настройки:

```
От суммы: 50 000
До суммы: 10 000
```

После сохранения обязательно обновите страницу и проверьте диапазоны.

### Обычный и обратный курс

В диапазоне используется только одно выражение.

Отдельного поля для обратного курса нет.

Операция применяется к рабочему представлению курса, поэтому одинаковый знак может по-разному влиять на публичный результат:

* при курсе больше `1`;
* при курсе меньше `1`;
* в обратном направлении.

Не копируйте выражения в обратную валютную пару без отдельного теста.

### Метка для клиентов

Параметр **«Метка для клиентов»** управляет предупреждением о зависимости комиссии от суммы.

* **«Включено»** — клиент видит уведомление;
* **«Отключено»** — уведомление скрыто.

Переключатель сохраняется сразу.

Он влияет только на отображение текста и не включает или отключает сами диапазоны.

Даже если метка выключена, корректные диапазоны продолжают применяться.

### Как отключить комиссию от суммы

Удалите все строки диапазонов кнопками с корзиной.

Отключение **«Метки для клиентов»** только скрывает предупреждение и не останавливает расчёт.

***

## Выбор комиссии

Откройте: **«Комиссии» — «Выбор комиссии»**

<figure><img src="/files/ML5T5B8nOYTJTqG4KtIf" alt=""><figcaption></figcaption></figure>

Раздел позволяет создать варианты, которые клиент выбирает на публичной форме.

Например:

* **«Стандартная обработка»**;
* **«Приоритетная обработка»**;
* **«Специальные условия»**.

После выбора связанное выражение изменяет курс заявки.

В публичном списке также доступен вариант **«Без комиссии»**. При его выборе система очищает выбранные варианты и не применяет комиссию выбора.

{% content-ref url="/pages/pcxn36VGkmfNzoOeXONx" %}
[Выбор комиссий](/guide/obmen/napravleniya-obmena/vybor-komissii)
{% endcontent-ref %}

***

## Общий порядок применения комиссий

В упрощённом виде расчёт выполняется следующим образом:

1. Система получает исходный курс направления.
2. Применяется групповая комиссия.
3. Проверяется ограничение курса и при необходимости выполняется переход на резервный источник.
4. Применяется основная прибыль из направления или профиля.
5. Учитываются базовые параметры клиента, включая разрешённую скидку и уровень.
6. Могут применяться комиссии города, верификации карты и другие условия.
7. По сумме **«Отдаю»** выбирается подходящий диапазон **«От суммы обмена»**.
8. Применяются варианты, выбранные клиентом.
9. Страховка курса может проверить уже изменённый результат.
10. По итоговому курсу рассчитываются суммы заявки.
11. К суммам применяются комиссии раздела **«Доп. и ПС»**.

Точный результат может зависеть от:

* суммы;
* направления курса;
* города;
* клиента;
* скидки;
* уровня пользователя;
* выбранных вариантов;
* верификации;
* округления валют.

## Почему курс в списке отличается от калькулятора

В списке направлений система ещё может не знать:

* сумму будущей заявки;
* город;
* выбранный вариант комиссии;
* необходимость проверки карты;
* скидку клиента;
* другие индивидуальные параметры.

Поэтому предварительный курс в панели может не содержать все динамические изменения.

Окончательный результат проверяйте:

* на публичном калькуляторе;
* в новой тестовой заявке.

***

## Рекомендуемые схемы настройки

### Одинаковая прибыль для нескольких направлений

1. Создайте общий профиль прибыли.
2. Подключите его к нужным направлениям.
3. Оставьте индивидуальные поля равными `0`, если они должны наследоваться из профиля.
4. Не добавляйте такую же маржу групповой комиссией.
5. Проверьте несколько связанных направлений.

### Отдельная комиссия платёжной системы

1. Не добавляйте её в основную прибыль.
2. Откройте **«Комиссии» — «Доп. и ПС»**.
3. Найдите блок **«Комиссия ПС»**.
4. Выберите нужную сторону.
5. Укажите процент, фиксированную сумму и минимум.
6. Проверьте, какую сумму использует мерчант или модуль выплаты.

### Разные условия по сумме

1. Откройте **«Комиссии» — «От суммы обмена»**.
2. Создайте непересекающиеся диапазоны.
3. Для каждой строки укажите одну операцию.
4. Включите метку для клиентов, если требуется предупреждение.
5. Проверьте внутренние и граничные значения каждого диапазона.

### Комиссия, которую выбирает клиент

1. Определите, разрешён один или несколько вариантов.
2. Решите, использовать общий или индивидуальный список.
3. Заполните основное выражение.
4. Проверьте необходимость отдельного выражения для обратного курса.
5. Проверьте каждый вариант на публичном сайте.
6. Создайте тестовую заявку и убедитесь, что выбор сохранился.

***

## Рекомендации

Для большинства направлений рекомендуется:

* использовать профиль для одинаковой базовой прибыли;
* задавать индивидуальные значения только для исключений;
* не дублировать одну маржу в нескольких разделах;
* отделять прибыль обменника от расходов платёжной системы;
* использовать **«Доп. и ПС»** для денежных комиссий;
* создавать непересекающиеся диапазоны;
* указывать только одну операцию в выражении;
* проверять прямое и обратное представление курса;
* удалять тестовые индивидуальные варианты;
* заполнять тексты на всех языках;
* проверять граничные суммы;
* тестировать авторизованного и неавторизованного клиента;
* создавать новую заявку после существенных изменений.

## Коротко

Группа **«Комиссии»** управляет прибылью обменника, изменениями курса и денежными комиссиями заявки.

Раздел **«Основная»** используется для профиля прибыли, индивидуальной прибыли и групповой комиссии.

Раздел **«Доп. и ПС»** добавляет отдельные денежные комиссии к сторонам **«Отдаю»** и **«Получаю»**.

Раздел **«От суммы обмена»** изменяет курс в зависимости от суммы клиента.

Раздел **«Выбор комиссии»** позволяет клиенту выбрать один или несколько вариантов изменения курса.

Поскольку комиссии применяются на разных этапах, итоговый результат всегда проверяйте на публичном калькуляторе и в новой тестовой заявке.


# Дополнительное

Группа **«Дополнительное»** содержит настройки, которые влияют на фактическую доступность направления, выдачу платёжных реквизитов, пересчёт открытых заявок, ограничения для клиентов, экспорт курса и партнёрские начисления.

Даже если направление активно и имеет рабочий курс, клиент может не увидеть его или не суметь создать заявку из-за недостаточного резерва, отсутствия доступных реквизитов, ограничений по стране, лимитов заявок или других параметров этой группы.

## Где находятся настройки

В панели управления откройте:

**«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/GOitJJ3eKfwcqstfKT2t" alt=""><figcaption></figcaption></figure>

Выберите нужное направление и перейдите к его редактированию.

<figure><img src="/files/jGnxIE7itWHjFgMJ9239" alt=""><figcaption></figcaption></figure>

Затем раскройте группу **«Дополнительное»** и откройте необходимый раздел.

{% hint style="info" %}
Все изменения применяются только к выбранному направлению. Перед настройкой проверьте валюты **«Отдаю»** и **«Получаю»** в заголовке редактора, чтобы случайно не изменить похожую валютную пару.
{% endhint %}

***

## Резервы

Откройте: **«Дополнительное» — «Резервы»**

{% content-ref url="/pages/djft6e8lg4QtXIhJaE4o" %}
[Резервы для валют](/guide/obmen/rezervy/rezervy-dlya-valyut)
{% endcontent-ref %}

Раздел определяет, откуда система получает доступный резерв для текущего направления.

Резерв используется для:

* проверки возможности создать заявку;
* расчёта максимальной доступной суммы;
* отображения доступного объёма на клиентском сайте;
* формирования данных в файле курсов;
* удержания средств в открытых заявках;
* возврата средств при отмене или отклонении заявки.

### Тип резерва

Доступны два режима:

{% stepper %}
{% step %}

#### По умолчанию

Система использует эффективный резерв валюты **«Получаю»**.

Например, для направления:

```
USDT TRC20 - Сбербанк RUB
```

используется резерв валюты:

```
Сбербанк RUB
```

Если резерв валюты связан с другими источниками, система использует итоговое значение, рассчитанное общей системой резервов.

На него могут влиять:

* объединённые резервы;
* резерв из внешнего файла;
* балансы мерчантов;
* балансы модулей выплат;
* ручные движения;
* удержания открытых заявок;
* другие связанные источники.

Используйте режим **«По умолчанию»**, если:

* одна валюта должна иметь общий остаток во всех направлениях;
* резерв обновляется автоматически;
* нужно учитывать связанные источники;
* открытые заявки должны удерживать средства;
* отменённые заявки должны возвращать удержанный резерв;
* выполненные операции должны отражаться в общем журнале резервов.
  {% endstep %}

{% step %}

#### Индивидуальное поле

После выбора режима появляется поле: **«Поле для резерва»**

Указанное значение становится отдельным резервом только для текущего направления.

Например:

```
Направление: USDT TRC20 - Сбербанк RUB
Индивидуальный резерв: 1 500 000 RUB
```

Это значение используется при:

* проверке новой заявки;
* отображении резерва на сайте;
* расчёте максимальной суммы;
* формировании файла курсов.

Индивидуальный резерв имеет приоритет над общим резервом валюты **«Получаю»**.
{% endstep %}
{% endstepper %}

{% hint style="danger" %}
Индивидуальное поле является статическим значением. При выполнении, отмене или пересчёте заявки система не уменьшает и не пополняет его через общий журнал резервов.

Такой резерв необходимо изменять вручную или обновлять через отдельную интеграцию.
{% endhint %}

### Как резерв проверяется при создании заявки

Система сравнивает сумму **«Получаю»** с доступным резервом.

В режиме **«По умолчанию»** проверяется эффективный резерв валюты **«Получаю»**.

В режиме **«Индивидуальное поле»** проверяется значение, сохранённое в текущем направлении.

Пример:

```
Доступный резерв: 1 500 000 RUB
```

Результат:

<table><thead><tr><th width="206.9375" align="right">Сумма «Получаю»</th><th>Результат</th></tr></thead><tbody><tr><td align="right"><code>100 000 RUB</code></td><td>Заявка может быть создана</td></tr><tr><td align="right"><code>1 500 000 RUB</code></td><td>Зависит от дополнительных удержаний и ограничений</td></tr><tr><td align="right"><code>1 600 000 RUB</code></td><td>Заявка блокируется</td></tr></tbody></table>

Если доступного резерва недостаточно, клиент получает сообщение об ограничении по резерву.

### Как работает общий резерв после создания заявки

При использовании общего резерва система может выполнять автоматические движения.

После перехода заявки в рабочий статус:

1. сумма **«Получаю»** удерживается в резерве;
2. при пересчёте заявки размер удержания корректируется;
3. при отмене, отклонении, заморозке или удалении заявки удержание возвращается;
4. после успешного выполнения сумма **«Отдаю»** может быть добавлена в резерв входящей валюты.

Точное поведение зависит от статусов заявки и общей конфигурации резервов.

Для индивидуального поля эти движения не выполняются.

### Пример индивидуального резерва

Настройки:

```
Направление: USDT TRC20 - Сбербанк RUB
Индивидуальный резерв: 1 500 000 RUB
```

Клиент создаёт заявку на получение:

```
100 000 RUB
```

Заявка проходит проверку.

После её выполнения значение индивидуального поля останется:

```
1 500 000 RUB
```

Оно не изменится автоматически на:

```
1 400 000 RUB
```

***

## Реквизиты

Откройте: **«Дополнительное» — «Реквизиты»**

{% content-ref url="/pages/JMjl3lO9g7QNMtdGmv6J" %}
[Платёжные реквизиты](/guide/obmen/rekvizity/platyozhnye-rekvizity)
{% endcontent-ref %}

Раздел определяет:

* какие ручные реквизиты можно использовать;
* в каком порядке они выбираются;
* выдаются ли они автоматически;
* может ли клиент запросить реквизиты у оператора;
* кто устанавливает сроки;
* когда запускается таймер оплаты;
* какой текст показывается во время ожидания.

Изменение привязанных платёжных реквизитов может относиться к защищённым операциям.

В зависимости от настроек безопасности система может запросить:

* код подтверждения;
* подтверждение второго администратора;
* другое дополнительное согласование.

### Реквизиты

В поле **«Реквизиты»** выберите записи, которые разрешено использовать в текущем направлении.

В список попадают реквизиты:

* предназначенные для направлений;
* не перенесённые в архив;
* доступные для выбора в панели управления.

Неактивный реквизит может оставаться в сохранённой привязке, но не должен выдаваться новой заявке.

Перед выдачей система проверяет:

* активность записи;
* наличие номера карты, счёта или кошелька;
* область использования **«Направление»**;
* одноразовый режим;
* количество предыдущих выдач;
* дневной лимит суммы;
* месячный лимит суммы;
* другие ограничения реквизита.

{% hint style="info" %}
Привязка реквизита к направлению не отключает собственные ограничения этой записи. Неактивный или исчерпавший лимит реквизит выдан не будет.
{% endhint %}

### Тип вывода реквизитов

Определяет, в каком порядке система начинает проверять привязанные записи.

{% stepper %}
{% step %}

#### По умолчанию

Система начинает с первого доступного реквизита в сохранённом порядке.

Если он не подходит, проверяются следующие записи.
{% endstep %}

{% step %}

#### Случайный выбор реквизита при каждой заявке

Перед каждой новой выдачей порядок кандидатов перемешивается.

Режим помогает распределять заявки между несколькими счетами, но не гарантирует строго одинаковое количество операций на каждом реквизите.
{% endstep %}

{% step %}

#### Один реквизит на направление в сутки

В течение одного календарного дня система начинает выбор с одной и той же позиции списка.

После смены дня начальная позиция может измениться.

Если выбранный реквизит недоступен, система продолжит проверку следующих записей.
{% endstep %}

{% step %}

#### Один реквизит на направление в месяц

В течение одного календарного месяца система начинает выбор с одной и той же позиции.

После смены месяца начальная позиция может измениться.

Режим стабилизирует начальный выбор, но не заставляет систему использовать неактивный реквизит или запись с исчерпанным лимитом.
{% endstep %}
{% endstepper %}

### Приоритет источников реквизитов

Для новой заявки источники проверяются в следующем порядке:

1. активный мерчант направления;
2. активный мерчант валюты **«Отдаю»**;
3. реквизиты по запросу, если такой режим сохранён в заявке;
4. ручной реквизит, уже назначенный заявке;
5. реквизиты текущего направления;
6. ручные реквизиты валюты **«Отдаю»**.

{% hint style="warning" %}
Если активный мерчант выбран, но не вернул реквизиты, система не обязана автоматически переходить к ручным реквизитам направления.

Сначала проверьте настройки мерчанта, его журнал и выбранный сценарий обработки ошибок.
{% endhint %}

### Способ выдачи реквизитов

Доступны два режима:

{% stepper %}
{% step %}

#### Стандартный

Система получает заранее настроенные реквизиты и показывает их клиенту после создания заявки.

Оператору не нужно выдавать их вручную.

Режим подходит для:

* обычных ручных реквизитов;
* автоматически выбираемых карт;
* банковских счетов;
* криптовалютных адресов;
* направлений без предварительного согласования.
  {% endstep %}

{% step %}

#### По запросу клиента

Заявка создаётся без платёжных реквизитов.

{% content-ref url="/pages/DJETI2fstUXgKpYX9f28" %}
[Реквизиты по запросу](/guide/obmen/rekvizity/rekvizity-po-zaprosu)
{% endcontent-ref %}

Оператор открывает её в разделе **«Заявки»** и выдаёт реквизиты вручную.

Режим подходит, если:

* реквизит выбирается после проверки заявки;
* сумма требует согласования;
* используются наличные операции;
* платёжные данные часто меняются;
* реквизиты нельзя показывать заранее.

Если режим по запросу включён в направлении, он имеет приоритет над аналогичной настройкой валюты **«Отдаю»**.

Если в направлении выбран стандартный режим, система всё ещё может использовать выдачу по запросу из настроек валюты **«Отдаю»**.
{% endstep %}
{% endstepper %}

***

## Пересчёт заявок

Откройте: **«Дополнительное» — «Пересчёт заявок»**

Раздел настраивает фиксированный и плавающий варианты курса для текущего направления.

Эти параметры не следует путать с:

* ручным пересчётом в карточке заявки;
* общими статусами ручного пересчёта;
* политиками пересчёта валюты;
* страховкой курса;
* обычным обновлением курса направления.

### Тип расчёта ставки

Доступны два режима:

{% stepper %}
{% step %}

#### По умолчанию

Используется один обычный вариант курса.

Клиент не выбирает между фиксированным и плавающим расчётом.
{% endstep %}

{% step %}

#### Фиксированный/Плавающий

На клиентской форме доступны два варианта курса.

При создании заявки сохраняется выбранный клиентом тип.

От него зависят:

* применяемая комиссия;
* правила пересчёта;
* интервалы;
* пороги;
* отображение информации.
  {% endstep %}
  {% endstepper %}

### Тип курса по умолчанию на frontend

Определяет вариант, который используется, если клиентская часть не передала собственный выбор.

Доступны:

* **«Фиксированный»**;
* **«Плавающий»**.

Поле применяется только при выбранном режиме **«Фиксированный/Плавающий»**.

### Описание

Мультиязычный текст, который объясняет разницу между вариантами.

Пример:

```
Фиксированный курс сохраняется на установленный период.

Плавающий курс может быть пересчитан при существенном изменении рынка до завершения заявки.
```

Условия в тексте должны соответствовать фактическим настройкам.

### Комиссия фиксированного и плавающего курса

Для каждого варианта можно задать отдельное математическое выражение.

Примеры:

```
+1
-0.5
+0.25%
-2%
```

Пустое поле не применяет дополнительное изменение.

Одинаковое выражение может по-разному восприниматься клиентом при прямом и обратном отображении курса.

Проверяйте результат на публичном калькуляторе.

### Вывести комиссию на сайте

Параметр управляет только передачей значения на клиентскую часть.

Если отображение отключено, само выражение продолжает применяться к курсу.

{% hint style="warning" %}
Скрытие комиссии на сайте не отключает её расчёт.
{% endhint %}

### Фиксированный курс

{% stepper %}
{% step %}

#### Разрешить пересчёт

Включает пересчёт заявок, созданных с фиксированным типом курса.

Для запуска должны одновременно выполняться условия:

1. в направлении выбран режим **«Фиксированный/Плавающий»**;
2. заявка создана с фиксированным типом;
3. параметр **«Разрешить пересчёт?»** включён;
4. текущий статус заявки выбран для пересчёта;
5. прошёл установленный интервал.

Завершённый статус **«Заявка исполнена»** в список не включается.
{% endstep %}

{% step %}

#### Выполнить пересчёт через

Значение указывается в минутах.

Оно ограничивает частоту повторного пересчёта одной заявки.

{% hint style="info" %}
Для фиксированного типа это минимальная пауза между пересчётами, а не гарантированная задержка первого пересчёта после перехода в статус.

Фиксированная ветка обычно запускается при обработке изменения статуса.
{% endhint %}
{% endstep %}
{% endstepper %}

### Плавающий курс

Для плавающего варианта необходимо настроить:

* статусы заявки;
* интервал;
* порог изменения вверх;
* порог изменения вниз.

Периодический планировщик находит активные незавершённые заявки с плавающим типом и передаёт их в очередь пересчёта.

{% stepper %}
{% step %}

#### Выполнить пересчёт через

Значение указывается в минутах и должно быть больше `0`.

Если указано:

```
0
```

плавающие заявки направления не попадают в периодический пересчёт.
{% endstep %}

{% step %}

#### Порог для пересчёта вверх

Положительное изменение курса, при достижении которого заявка пересчитывается.

Если ввести отрицательное значение, система сохраняет его как положительное.
{% endstep %}

{% step %}

#### Порог для пересчёта вниз

Отрицательное изменение курса.

Если ввести положительное значение, система сохраняет его со знаком минус.
{% endstep %}
{% endstepper %}

### Пример порогов

Настройки:

```
Порог вверх: 1.5%
Порог вниз: -1%
```

Результат:

| Изменение курса | Пересчёт |
| --------------: | -------- |
|           `+1%` | Нет      |
|         `+1.5%` | Да       |
|           `+2%` | Да       |
|         `-0.7%` | Нет      |
|           `-1%` | Да       |
|           `-2%` | Да       |

Достижение точного значения порога допускает пересчёт.

Не оставляйте оба порога равными `0`. В этом случае нейтральная зона исчезает, и заявка может пересчитываться при каждом допустимом запуске.

### Какой процент выводить в файле курсов

Настройка связывает пересчёт заявок с разделом **«Файл курсов»**.

Доступны варианты:

{% stepper %}
{% step %}

#### Не учитывать

В файл передаётся базовый рассчитанный курс без выражений фиксированного или плавающего варианта.
{% endstep %}

{% step %}

#### Фиксированный

К экспортируемому курсу применяется выражение фиксированного варианта.
{% endstep %}

{% step %}

#### Плавающий

К экспортируемому курсу применяется выражение плавающего варианта.

Настройка действует только при выбранном типе **«Фиксированный/Плавающий»**.
{% endstep %}
{% endstepper %}

### Что нужно для автоматического пересчёта

Откройте: **«Настройки» — «Общие настройки» — «Основные» — «Обмен»**

Найдите параметр: **«Способ пересчёта заявок»**

Доступны варианты:

{% stepper %}
{% step %}

#### При изменении статуса

Проверка запускается после перехода заявки в новый статус.
{% endstep %}

{% step %}

#### По cron

Заявки проверяются периодическим планировщиком.
{% endstep %}

{% step %}

#### В обоих случаях

Используются оба способа.

Периодический сканер напрямую обрабатывает плавающие заявки.

Фиксированный пересчёт направления обычно запускается после изменения статуса. При режиме только cron фиксированная заявка может обрабатываться через отдельную общую или валютную политику
{% endstep %}
{% endstepper %}

***

## Ограничения и проверки

Откройте: **«Дополнительное» — «Ограничения и проверки»**

Раздел состоит из двух блоков:

* **«Доступ и проверки»**;
* **«Лимиты»**.

Первый блок определяет, кто может создать заявку.

Второй ограничивает объём операций, количество заявок и использование клиентских реквизитов.

Значение `0` отключает числовое ограничение, если в описании конкретного поля не указано иное.

### Доступ и проверки

{% stepper %}
{% step %}

#### Запрещённые страны

Клиент из выбранной страны не может создать заявку.

Страна определяется по IP-адресу.

Запрещённый список имеет приоритет над разрешённым.

Если одна страна добавлена в оба списка, доступ будет запрещён.
{% endstep %}

{% step %}

#### Разрешённые страны

Если список заполнен, направление доступно только клиентам из выбранных стран.

Пустой список не ограничивает доступ.

Если страну по IP определить не удалось, неизвестная страна сама по себе не блокирует заявку.

Если сервис GeoIP завершился технической ошибкой, система может применить безопасный запрет.

При глобально отключённом GeoIP оба списка не работают.
{% endstep %}
{% endstepper %}

#### Только для верифицированных пользователей

При значении **«Да»** заявку может создать только авторизованный пользователь с подтверждённой личностью.

Неавторизованный или неверифицированный клиент получит сообщение о необходимости пройти проверку.

Эта настройка отличается от раздела **«Верификация»**.

Раздел верификации может предложить клиенту пройти KYC в процессе обмена, а данный параметр требует уже подтверждённого статуса для создания заявки.

#### Разрешить применение пользовательской скидки

**Да**

Активная скидочная программа пользователя может улучшить курс направления.

**Нет**

Пользовательская скидка в этом направлении не применяется.

#### Количество успешных обменов, которое необходимо иметь клиенту

Устанавливает минимальное количество заявок пользователя в статусе **«Заявка исполнена»**.

Учитывается история по всему обменнику, а не только по текущему направлению.

Неавторизованный клиент не проходит эту проверку.

Значение `0` отключает ограничение.

Пример:

```
Необходимо успешных обменов: 3
```

Клиент с двумя выполненными заявками не сможет использовать направление.

#### Максимальная сумма обмена для новичка

Ограничивает сумму **«Отдаю»** для нового клиента.

Положительное значение включает проверку.

Клиент перестаёт считаться новичком, если существует незаблокированный аккаунт и выполняется хотя бы одно условие:

* есть не менее трёх успешных обменов;
* аккаунт создан не менее 48 часов назад;
* найдена предыдущая рабочая заявка с совпадающим email;
* совпадает IP-адрес;
* совпадает счёт **«Отдаю»**;
* совпадает счёт **«Получаю»**.

Если ни одно условие не выполнено, сумма **«Отдаю»** не должна превышать установленный предел.

#### Запрет повторных заявок с одинаковой суммой в поле «Отдаю»

При значении **«Да»** авторизованный пользователь не сможет создать вторую заявку, если одновременно совпадают:

* пользователь;
* направление;
* точная сумма **«Отдаю»**;
* заявка создана в течение последних трёх часов;
* предыдущая заявка имеет статус **«Ожидает обработки»** или **«Оплаченная заявка»**.

Перед сравнением сумма форматируется с учётом точности валюты.

Для неавторизованного пользователя проверка не выполняется.

#### Скрыть форму оплаты заявки

При значении **«Да»** клиентская часть скрывает платёжную форму на странице заявки.

Используйте параметр только вместе с понятным альтернативным процессом.

Настройка:

* не назначает реквизиты;
* не запускает оплату;
* не меняет серверную обработку;
* не заменяет выдачу реквизитов.

#### Профиль лимитов заявок

Позволяет подключить готовый профиль ограничений по частоте и объёму создания заявок.

Порядок выбора профиля:

1. активный профиль направления;
2. активный профиль пользователя;
3. активный профиль по умолчанию.

Если профиль направления выключен или находится вне периода действия, система проверяет следующий уровень.

Профиль может содержать:

* максимальное количество заявок за час;
* максимальное количество заявок за день;
* количество заявок за скользящий период;
* минимальный интервал между заявками;
* ограничение суммы первых заявок.

### Лимиты

#### Лимит резерва для направления

Несмотря на название, поле ограничивает накопленный объём выполненных заявок.

Система:

1. суммирует сумму **«Получаю»** выполненных заявок по всем направлениям с той же валютой **«Получаю»**;
2. добавляет сумму новой заявки;
3. сравнивает результат с лимитом.

Новая заявка разрешается только тогда, когда итог строго меньше установленного значения.

Достижение точного значения лимита также блокирует заявку.

Пример:

```
Лимит: 1 000 000 RUB
Выполнено: 900 000 RUB
Новая заявка: 100 000 RUB
```

Итог:

```
1 000 000 RUB
```

Заявка будет заблокирована, поскольку результат не меньше лимита.

#### Лимит резерва в сутки

Работает по тому же принципу, но учитывает выполненные заявки за текущий день.

#### Лимит резерва в месяц

Учитывает выполненные заявки за текущий календарный месяц.

{% hint style="info" %}
Эти поля ограничивают накопленный объём заявок. Они не заменяют проверку фактического доступного резерва в разделе **«Резервы»**.
{% endhint %}

#### Максимальное количество заявок с одного счёта «Отдаю»

Ограничивает число выполненных заявок с одним и тем же реквизитом клиента **«Отдаю»**.

Доступны два значения:

* за всё время;
* за текущий день.

#### Максимальное количество заявок с одного счёта «Получаю»

Ограничивает число выполненных заявок с одним и тем же реквизитом **«Получаю»**.

Также доступны ограничения:

* за всё время;
* за текущий день.

Для этих проверок:

* учитываются заявки в статусе **«Заявка исполнена»**;
* история проверяется по всему обменнику;
* пробелы из реквизита удаляются перед сравнением;
* если количество уже равно лимиту, следующая заявка блокируется.

***

## Файл курсов

Откройте: **«Дополнительное» — «Файл курсов»**

Раздел определяет, может ли текущее направление публиковаться в экспортных файлах и какие специальные метки передаются мониторингам.

Настройки направления являются только одним уровнем экспорта.

Сам экспортный файл, его формат, исключения и адрес публикации настраиваются отдельно.

### Добавить направление в файл курсов

Доступны три режима.

{% stepper %}
{% step %}

#### Да

Направление разрешено экспортировать без собственного расписания.
{% endstep %}

{% step %}

#### Да только по расписанию

Появляются поля:

* **«От»**;
* **«До»**.

Направление попадает в файл только внутри установленного интервала по времени сервера.

Поддерживаются периоды через полночь.

Пример:

```
22:00 - 06:00
```

Направление будет экспортироваться вечером, ночью и ранним утром.

Если одно из значений:

* отсутствует;
* имеет неправильный формат;

направление не экспортируется.
{% endstep %}

{% step %}

#### Нет

Направление полностью запрещено к экспорту на уровне его карточки.
{% endstep %}
{% endstepper %}

### Режим обмена

Определяет значение XML-метки `param`.

{% stepper %}
{% step %}

#### По умолчанию

Метка выбирается в следующем порядке:

1. метка выбранного города;
2. значения поля **«Метки (param)»**;
3. значение `manual`, если другие метки не заданы.
   {% endstep %}

{% step %}

#### Автоматический — принудительно

Метка `param` не передаётся.

Для мониторинга направление публикуется без признака ручной обработки.
{% endstep %}

{% step %}

#### Ручной — принудительно

В `param` передаётся только:

```
manual
```

Выбранные метки направления и города игнорируются.

Если экспортный файл дополнительно управляет ручными направлениями по статусу оператора, такое направление может быть исключено.

После изменения всегда проверяйте готовый файл.
{% endstep %}
{% endstepper %}

### Метка floating

Можно задать:

* время фиксации курса в минутах;
* допустимое изменение курса в процентах.

В формате BestChange 1.1 значения формируют узел `floating` с параметрами:

* `minutes`;
* `percent`.

Публикуются только положительные значения.

Если оба поля равны `0` или пустые, метка не создаётся.

Эти параметры только сообщают мониторингу правила фиксации.

Они не запускают пересчёт заявки.

Сам пересчёт настраивается в разделе: **«Дополнительное» — «Пересчёт заявок»**

### Метка delay

Передаёт мониторингу заявленную задержку выполнения обмена.

В файл попадает только положительное значение.

Указывайте его в единицах, предусмотренных форматом конкретного мониторинга.

### Метки param

Доступны следующие значения:

| Метка        | Назначение                                        |
| ------------ | ------------------------------------------------- |
| `atm`        | Операция через банкомат                           |
| `card2card`  | Перевод с карты на карту                          |
| `cardverify` | Требуется проверка карты                          |
| `delivery`   | Доставка или выезд                                |
| `juridical`  | Операция с юридическим лицом                      |
| `manual`     | Ручная обработка                                  |
| `otherin`    | Дополнительное условие на стороне приёма          |
| `reg`        | Отображаемое название внутренней метки `otherout` |
| `verifying`  | Дополнительная проверка операции                  |

Выбирайте только метки, которые поддерживает целевой мониторинг.

В интерфейсе значение `reg` сохраняется и экспортируется как:

```
otherout
```

### Какой курс попадает в файл

Базой является положительный рассчитанный курс направления.

Если в разделе **«Пересчёт заявок»** выбран фиксированный или плавающий вариант для экспорта, к базовому курсу применяется соответствующее выражение.

Резерв определяется так же, как на сайте:

* общий резерв валюты **«Получаю»**;
* индивидуальный резерв направления.

Экспортируемая доступная сумма дополнительно ограничивается:

* резервом;
* максимальной суммой направления;
* другими правилами формата.

***

## Партнёрская программа

Откройте: **«Дополнительное» — «Партнёрская программа»**

Раздел определяет, начисляется ли партнёру вознаграждение по текущему направлению и как рассчитывается его сумма.

{% content-ref url="/pages/XBgGc4uYSuRcyGxAnrJs" %}
[Настройка партнёрских программ для отдельных направлений обмена](/guide/marketing/partnyorskaya-programma/nastroika-partnyorskikh-programm-dlya-otdelnykh-napravlenii-obmena)
{% endcontent-ref %}

Для работы должны быть настроены:

* глобальная партнёрская система;
* реферальные программы;
* процент программы;
* основная валюта баланса;
* курсы конвертации;
* связь клиента с партнёром.

***

## Рекомендации

Для большинства направлений рекомендуется:

* использовать общий резерв валюты **«Получаю»**;
* применять индивидуальный резерв только при отдельной логике обновления;
* проверять фактический приоритет мерчантов и ручных реквизитов;
* запускать таймер после выдачи реквизитов при ручной обработке;
* проверять новые настройки на новой заявке;
* не оставлять нулевой интервал плавающего пересчёта;
* задавать нейтральную зону между порогами;
* использовать профили ограничений для повторяющихся правил;
* отличать накопленные лимиты от фактического резерва;
* проверять готовый файл курсов;
* использовать только поддерживаемые мониторингом метки;
* проверять партнёрский расчёт на тестовой заявке;
* временно отключать направление перед серьёзными изменениями.

## Коротко

Группа **«Дополнительное»** содержит настройки фактической работы направления после формирования курса.

В разделе **«Резервы»** выбирается общий или индивидуальный источник доступной суммы.

Раздел **«Реквизиты»** управляет платёжными данными и сценарием их выдачи.

Раздел **«Пересчёт заявок»** настраивает фиксированный и плавающий курс.

Раздел **«Ограничения и проверки»** определяет, кто может создать заявку и какие лимиты применяются.

Раздел **«Файл курсов»** управляет экспортом направления и метками мониторингов.

Раздел **«Партнёрская программа»** задаёт правила расчёта вознаграждений.

После изменения настроек обязательно создайте новую тестовую заявку и проверьте полный процесс обмена.


# Режимы направлений

{% embed url="<https://www.youtube.com/watch?v=5CI8kAhd4hk>" %}


# Сортировка направлений

Раздел **«Сортировка направлений»** используется для настройки порядка валют и направлений в публичной форме обмена.

Здесь можно отдельно определить:

* общий порядок валют на стороне «Отдаю»;
* порядок валют «Получаю» для каждой конкретной валюты «Отдаю»;
* положение сетевых групп среди остальных валют;
* порядок вариантов внутри сетевых групп.

Сортировка является общей для обменного пункта. Она не зависит от администратора, языка сайта или конкретного клиента.

## Где находится раздел

В панели управления откройте: **«Основное» — «Направление обмена» — «Сортировка направлений»**

<figure><img src="/files/jdIJ3oOp7ZA1uY8EXaqZ" alt=""><figcaption></figcaption></figure>

Открыть сортировку также можно из списка направлений.

В панели управления откройте: **«Основное» — «Направление обмена» — «Список направлений»**

Затем откройте **«Ещё»** и выберите **«Сортировка»**.

Для доступа пользователю должно быть разрешено управление направлениями обмена.

## Что можно сортировать

В разделе используются четыре независимых уровня сортировки.

| Уровень                       | Что изменяется                                                 | Где применяется                       |
| ----------------------------- | -------------------------------------------------------------- | ------------------------------------- |
| **«Отдаю»**                   | Общий порядок валют и сетевых групп                            | Для всей формы обмена                 |
| **«Получаю»**                 | Порядок доступных валют после выбора конкретной валюты «Отдаю» | Отдельно для каждой валюты «Отдаю»    |
| **Варианты сети в «Отдаю»**   | Порядок валют внутри сетевой группы                            | Общий для стороны «Отдаю»             |
| **Варианты сети в «Получаю»** | Порядок валют внутри сетевой группы                            | Отдельно для выбранной валюты «Отдаю» |

Порядок **«Получаю»** не является единым для всех направлений.

Например, после выбора Bitcoin клиенту можно показывать сначала СберБанк, затем Tether и Litecoin. Для Litecoin можно настроить совершенно другую последовательность.

Изменение одного списка **«Получаю»** не изменяет остальные.

## Как устроена страница

Раздел состоит из двух рабочих областей.

{% stepper %}
{% step %}

### Отдаю

Левая часть определяет общий порядок валют, доступных клиенту на стороне **«Отдаю»**.

После открытия страницы первая валюта списка выбирается автоматически.

Если нажать другую валюту, справа загрузится соответствующий ей список **«Получаю»**.

Если нужная валюта находится внутри сетевой группы, сначала раскройте группу и выберите конкретный вариант.

Сам заголовок сетевой группы не является отдельной валютой направления.
{% endstep %}

{% step %}

### Получаю для выбранной валюты

Правая часть показывает доступные варианты получения для валюты, выбранной слева.

Заголовок меняется в зависимости от текущего выбора.

Например:

**«Получаю для Bitcoin BTC»**

Порядок справа сохраняется только для текущей валюты **«Отдаю»**.

Чтобы настроить другой список:

1. Выберите следующую валюту слева.
2. Дождитесь загрузки вариантов «Получаю».
3. Настройте их порядок.

На широком экране обе области отображаются рядом. На небольшом экране они располагаются последовательно.
{% endstep %}
{% endstepper %}

## Какие записи отображаются

{% stepper %}
{% step %}

### В колонке «Отдаю»

Показываются активные валюты, у которых существует хотя бы одно включённое исходящее направление.

Не отображаются:

* архивные валюты;
* удалённые валюты;
* валюты без доступных исходящих направлений.
  {% endstep %}

{% step %}

### В колонке «Получаю»

Показываются направления выбранной валюты «Отдаю», если:

* направление не архивировано;
* направление не удалено;
* валюта «Получаю» активна.

Отключённое, но не архивированное направление может оставаться в административной сортировке.

Это позволяет заранее подготовить его положение перед включением.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Наличие направления в «Сортировке направлений» не означает, что оно уже доступно клиентам.

Публичная форма дополнительно проверяет статус направления, активность валют, курс и другие условия доступности.
{% endhint %}

***

## Сортировка валют «Отдаю»

Чтобы изменить общий порядок:

1. Откройте **«Сортировка направлений»**.
2. Дождитесь загрузки списка «Отдаю».
3. Убедитесь, что поиск в этой колонке очищен.
4. Найдите нужную валюту.
5. Используйте маркер перемещения слева от неё.
6. Перетащите валюту на нужную позицию.
7. Отпустите элемент.
8. Дождитесь автоматического сохранения.

Обычная валюта перемещается как самостоятельная строка.

Если перемещается сетевая группа, она переносится целиком вместе со всеми вариантами внутри неё.

Вставить обычную валюту между вариантами одной сетевой группы нельзя.

## Сортировка валют «Получаю»

Чтобы настроить порядок получения:

1. В колонке **«Отдаю»** выберите нужную валюту.
2. Проверьте заголовок правой области.
3. Дождитесь загрузки списка «Получаю».
4. Переместите валюты и сетевые группы в нужном порядке.
5. Дождитесь автоматического сохранения.
6. Выберите следующую валюту «Отдаю».
7. Настройте её список отдельно.

Каждая валюта «Отдаю» имеет собственную последовательность «Получаю».

Например, для Bitcoin можно установить:

```
СберБанк
Tether
Litecoin
```

а для Litecoin:

```
Tether
Bitcoin
СберБанк
```

Эти настройки сохраняются независимо.

Если перед переключением на другую валюту справа ещё есть несохранённое изменение, система сначала пытается сохранить текущий порядок.

Если сохранение завершится ошибкой, переключение не выполняется, чтобы изменения не потерялись.

## Сетевые группы

Если несколько валют объединены в сеть, в сортировке они могут отображаться одним раскрываемым блоком.

В нём показываются:

* название сети;
* иконка;
* количество вариантов;
* кнопка раскрытия;
* маркер перемещения всей группы.

Название, иконка и состав настраиваются отдельно в разделе: **«Основное» — «Валюты» — «Сети для валют»**

{% content-ref url="/pages/32FPsNiQYCybE8LhWn0f" %}
[Сети для валют](/guide/obmen/valyuty/seti-dlya-valyut)
{% endcontent-ref %}

## Перемещение сетевой группы

Чтобы изменить положение всей группы, используйте внешний маркер слева от её заголовка.

Вся группа перемещается среди:

* обычных валют;
* других сетевых групп.

Порядок вариантов внутри неё при этом не меняется.

Например, если группа Tether содержит:

```
Tether TRC20
Tether ERC20
```

перемещение всей группы выше Bitcoin изменит положение Tether среди остальных валют, но TRC20 и ERC20 останутся в прежней последовательности.

## Сортировка внутри сетевой группы

Чтобы изменить порядок отдельных вариантов:

1. Раскройте сетевую группу.
2. Найдите нужную валюту внутри неё.
3. Используйте её внутренний маркер перемещения.
4. Перетащите вариант выше или ниже.
5. Дождитесь сохранения.

Изменяется только последовательность внутри текущей сетевой группы.

Положение самой группы среди других валют остаётся прежним.

Если в конкретном списке доступен только один вариант сети, он может отображаться как обычная валюта без раскрываемого блока.

Состав одной сетевой группы на стороне **«Получаю»** может различаться в зависимости от выбранной валюты **«Отдаю»**.

Для одной входящей валюты группа может содержать несколько вариантов, для другой — один вариант или отсутствовать полностью.

## Управление с клавиатуры

Изменять порядок можно без мыши.

Установите фокус на маркер перемещения и используйте:

```
Alt + ↑
Alt + ↓
```

На macOS используется клавиша `Option`.

Команды работают для:

* обычной валюты;
* всей сетевой группы;
* отдельного варианта внутри раскрытой группы.

После перемещения интерфейс может кратковременно показать, на сколько позиций был перемещён элемент.

***

## Одновременная работа администраторов

Сортировка общая для всех администраторов.

Если два сотрудника одновременно изменяют один список, система проверяет актуальность версии, с которой работает каждый из них.

Если другой администратор уже сохранил более новое изменение:

* устаревшее сохранение отклоняется;
* появляется сообщение об изменении списка;
* загружается актуальный порядок;
* необходимое перемещение нужно выполнить повторно.

Это предотвращает незаметную перезапись более новых изменений.

## Отображение на клиентском сайте

Публичная форма использует:

* общий порядок «Отдаю»;
* отдельный порядок «Получаю»;
* положение сетевых групп;
* порядок вариантов внутри сетей.

Если клиент использует поиск или другие фильтры, часть валют может быть скрыта, но относительная последовательность оставшихся элементов сохраняется.

Изменение в административной панели сохраняется сразу, однако клиентский сайт использует опубликованные данные направлений и курсов.

Поэтому новый порядок может появиться на сайте не мгновенно.

После публикации обновите страницу клиентского сайта и проверьте результат.

## Категории валют и сортировка

Категории валют имеют собственную настройку порядка.

Они настраиваются отдельно: **«Основное» — «Валюты» — «Категории»**

{% content-ref url="/pages/pa7J96g1XSVNfeVSFydz" %}
[Категории валют](/guide/obmen/valyuty/kategorii-valyut)
{% endcontent-ref %}

Если активные категории не используются, порядок стороны **«Отдаю»** напрямую определяется разделом **«Сортировка направлений»**.

Если категории используются:

* порядок самих категорий определяется настройками категорий;
* порядок валют внутри категории определяется настройками этой категории;
* валюты вне категорий используют общий порядок «Отдаю»;
* порядок вариантов внутри сетевой группы продолжает использовать «Сортировку направлений»;
* сторона «Получаю» использует сортировку, заданную для выбранной валюты «Отдаю».

{% hint style="info" %}
Если вы переместили валюту «Отдаю», но на клиентском сайте её положение не изменилось, сначала проверьте, не находится ли она в категории с собственным порядком.
{% endhint %}

## Что сортировка не изменяет

Раздел **«Сортировка направлений»** не управляет:

* созданием валют;
* созданием направлений;
* статусами;
* архивированием;
* курсами;
* резервами;
* лимитами;
* комиссиями;
* категориями;
* составом сетевых групп;
* фильтрами;
* главным направлением обмена.

Перемещение валюты на первое место также не делает её автоматически главной валютой или главным направлением, которое открывается клиенту первым.

Эта настройка выполняется отдельно.

## После создания новой валюты

Новая валюта появится на стороне **«Отдаю»**, когда:

* она активна;
* существует хотя бы одно включённое исходящее направление.

После появления установите для неё нужную позицию.

## После создания нового направления

Новое направление появляется в **«Получаю»** соответствующей валюты «Отдаю».

Перед запуском рекомендуется открыть эту валюту в сортировке и проверить положение нового направления.

## Если направление выключено

Отключённое направление перестаёт показываться клиентам, но может оставаться в административной сортировке, пока оно не архивировано или удалено.

После повторного включения оно возвращается на сохранённую позицию.

## После архивирования

Архивные валюты и направления исчезают из рабочего списка сортировки.

## После изменения сети

Если был изменён состав **«Сети для валют»**, обновите страницу **«Сортировка направлений»**.

Сетевая группа будет сформирована по актуальному составу.

Если состав сети изменился, пока вы работали со старой версией страницы, сохранение устаревшего порядка может быть отклонено.

## Рекомендуемый порядок настройки

Для нового проекта рекомендуется выполнять настройку последовательно:

1. Создайте валюты.
2. Создайте направления обмена.
3. Настройте **«Сети для валют»**.
4. При необходимости создайте категории валют.
5. Настройте порядок внутри категорий.
6. Активируйте нужные валюты и направления.
7. Откройте **«Сортировка направлений»**.
8. Настройте общий порядок **«Отдаю»**.
9. Последовательно настройте **«Получаю»** для каждой входящей валюты.
10. Раскройте сетевые группы и настройте порядок вариантов.
11. Дождитесь завершения автоматического сохранения.
12. Дождитесь публикации данных.
13. Проверьте публичную форму.

На клиентском сайте рекомендуется проверить:

* сторону «Отдаю»;
* сторону «Получаю»;
* переключение разных валют;
* сетевые группы;
* категории;
* поиск.

***

## Пример настройки

Допустим, на стороне **«Отдаю»** используются:

```
Bitcoin
Tether
Litecoin
СберБанк
```

Внутри сетевой группы Tether:

```
Tether TRC20
Tether ERC20
```

Если переместить всю группу Tether выше Bitcoin, результат будет выглядеть так:

```
Tether
Bitcoin
Litecoin
СберБанк
```

Внутри группы порядок останется:

```
Tether TRC20
Tether ERC20
```

Если затем раскрыть Tether и поднять ERC20 выше TRC20, изменится только внутренняя последовательность:

```
Tether ERC20
Tether TRC20
```

После этого для Bitcoin на стороне **«Получаю»** можно независимо настроить:

```
СберБанк
Tether
Litecoin
```

а для Litecoin:

```
Tether
Bitcoin
СберБанк
```

Настройки друг друга не изменят.

## Валюта отсутствует в «Отдаю»

Проверьте:

* активна ли валюта;
* не находится ли она в архиве;
* существует ли хотя бы одно включённое направление, в котором она используется как «Отдаю».

## Направление отсутствует в «Получаю»

Проверьте:

* выбрана ли правильная валюта «Отдаю»;
* существует ли нужное направление;
* не архивировано ли оно;
* не удалено ли оно;
* активна ли валюта «Получаю».

## Направление видно в панели, но нет на сайте

Наличие направления в административной сортировке не гарантирует его отображение клиенту.

Проверьте:

* включено ли направление;
* активны ли обе валюты;
* корректно ли рассчитывается курс;
* выполняются ли остальные условия доступности направления;
* завершилась ли публикация обновлённых данных;
* не скрыто ли направление текущими фильтрами формы.

## Элемент не перемещается

Проверьте:

* очищен ли поиск в текущей колонке;
* закончилась ли загрузка списка;
* не выполняется ли в данный момент сохранение;
* используется ли именно маркер перемещения.

## Сетевая группа не отображается

Сетевая группа появляется только тогда, когда в текущем списке доступны необходимые варианты одного объединения.

Если доступен только один вариант, он может отображаться как обычная валюта.

Проверьте состав:

**«Основное» — «Валюты» — «Сети для валют»**

## Порядок «Отдаю» на сайте отличается

Проверьте использование категорий валют.

Если валюта входит в категорию с собственным порядком, на клиентской стороне применяется сортировка этой категории.

## Изменение не появилось на сайте

Дождитесь обновления опубликованных данных направлений и курсов.

После этого обновите клиентскую страницу.

## После перемещения появился конфликт

Вероятно, список уже был изменён другим администратором или изменился его состав.

Дождитесь загрузки актуальных данных и повторите перемещение.

## При выходе появляется предупреждение

На странице есть ожидающее или неуспешное автоматическое сохранение.

Не закрывайте страницу.

Дождитесь успешного завершения или устраните ошибку, показанную интерфейсом.

## Проверка результата

После настройки:

1. Откройте **«Сортировка направлений»**.
2. Проверьте порядок **«Отдаю»**.
3. Последовательно выберите несколько валют.
4. Проверьте их индивидуальный порядок **«Получаю»**.
5. Раскройте сетевые группы.
6. Проверьте внутренний порядок вариантов.
7. Убедитесь, что автоматическое сохранение завершилось без ошибки.
8. Дождитесь публикации данных.
9. Откройте клиентский сайт.
10. Проверьте форму обмена без поиска и фильтров.
11. Проверьте категории, если они используются.
12. Проверьте сетевые группы.
13. Переключите несколько валют «Отдаю» и сравните порядок «Получаю».

Настройка выполнена правильно, если клиент видит нужный общий порядок валют, отдельную последовательность получения для каждой входящей валюты и правильный порядок вариантов внутри сетевых групп.


# Групповая комиссия

Групповая комиссия позволяет централизованно управлять комиссиями для направлений обмена: назначать одну и ту же комиссию сразу нескольким направлениям и, при необходимости, применять к одному направлению сразу несколько разных групп.

**Что умеет модуль:**

* Привязывать одну группу к любому количеству направлений (без ограничений).
* Привязывать к одному направлению несколько групп — **все они учитываются по порядку.**
* Менять размер комиссии в одном месте и автоматически применять её ко всем привязанным направлениям.

Схема показывает: несколько групп привязываются к одному направлению и последовательно влияют на итоговый курс.

<figure><img src="/files/y9Mae1Xof5m7zS9TYlFa" alt="" width="563"><figcaption></figcaption></figure>

***

## Создание новой группы

В панели управления откройте раздел **«Основное — Направление обмена — Групповая комиссия»**.

<figure><img src="/files/rXdkY5o28XCuJjf0EtHT" alt=""><figcaption></figcaption></figure>

Нажмите кнопку **«Добавить группу».**

<figure><img src="/files/NZGHdUqPww2YfEpKBuCB" alt="" width="563"><figcaption></figcaption></figure>

В открывшемся окне заполните поля:

* **Название группы —** укажите понятное имя, по которому будет легко найти группу.
* **Комиссия —** введите значение комиссии, которая будет применяться к привязанным направлениям.

{% hint style="warning" %}

## Допустимые форматы:

* 1 — фиксированная надбавка;
* -1 — фиксированное уменьшение;
* 1% / -1% — изменение в процентах;
* \*1.02 — умножение;
* /1.02 — деление.
  {% endhint %}

Нажмите **«Добавить»** — группа появится в списке.

{% hint style="danger" %}
На этапе создания задаются **только** название и комиссия. Привязка направлений выполняется при редактировании группы или внутри конкретного направления.
{% endhint %}

***

## Привязка групп к направлениям

{% stepper %}
{% step %}

### Через редактирование группы

<figure><img src="/files/0Kzcrw69eXGrzqfUv9t5" alt="" width="563"><figcaption></figcaption></figure>

В списке групп кликните по **названию группы** — откроется форма редактирования данных.

В разделе **«Привязанные направления**» выберите одно или несколько направлений (ограничений нет).

Нажмите **Сохранить**.
{% endstep %}

{% step %}

### Через редактирование направления

<figure><img src="/files/VLelGNymHslHfQCEPwL6" alt=""><figcaption></figcaption></figure>

1. Перейдите в **«Основное — Направление обмена — Список направлений»**
2. Выберите направление и **откройте его** на редактирование.
3. На вкладке **«Комиссии»** в разделе **«Основная»** найдите поле **«Групповая комиссия».**
4. Выберите одну или несколько групп.
5. Сохраните изменения.
   {% endstep %}
   {% endstepper %}

***

## Как применяются несколько групп (важно)

* Все группы, привязанные к направлению, **применяются последовательно — в том порядке, в котором они были привязаны.**
* Порядок влияет на результат: сначала применяются комиссии из первой привязанной группы, затем из второй, и так далее.
* Чтобы получить предсказуемый результат, добавляйте группы в направлении в нужной последовательности.

**Пример**

Базовый курс = 100. Привязаны две группы:

* Группа A — -1 → становится 99;
* Группа B — -1% → становится **98.01.**

Если поменять порядок (сначала -1%, потом -1), получится 98.

***

### Практические советы

* Храните «постоянные» надбавки/скидки отдельными группами: «Акция -1%», «Банк -1», «Провайдер \*1.02». Это упрощает включение/отключение.
* Согласуйте и зафиксируйте порядок применения групп (например: сначала фиксированные ±N, затем процентные %, затем умножение/деление). Так расчёты будут предсказуемы.
* Если курс меньше 1 (крипта и т. п.), система корректно считает комиссии за счёт внутренней инверсии курса — ничего дополнительно настраивать не нужно.
* При массовых изменениях редактируйте **группу**, а не каждое направление — изменения разойдутся автоматически.

***

## Частые вопросы

<details>

<summary>Можно ли привязать одну группу к многим направлениям?</summary>

Да, без ограничений.

</details>

<details>

<summary>Можно ли привязать к направлению несколько групп?</summary>

Да. Все комиссии будут учтены в расчёте курса **по порядку.**

</details>

<details>

<summary>Что если в группе указано неверное выражение?</summary>

Оно игнорируется и записывается в лог. Остальные группы применятся.

</details>

<details>

<summary>Где менять порядок применения?</summary>

Порядок применения групп определяется очерёдностью **их привязки к направлению.**

Чтобы изменить порядок, отвяжите группы и привяжите их заново в нужной последовательности.

</details>


# Массовый редактор

Массовый редактор направлений используется для быстрого изменения настроек сразу у нескольких направлений обмена.

Он нужен в тех случаях, когда не хочется открывать каждое направление отдельно и вручную менять одинаковые параметры: лимиты, комиссии, тексты, SEO, статусы, сортировку, прибыль и другие настройки.

Например, если у вас 200 направлений и нужно заменить инструкцию по оплате, массовый редактор позволяет отфильтровать нужные направления и применить новый текст сразу ко всей выборке.

## Где находится раздел

В панели управления откройте: **«Основное» — «Направления обмена» — «Массовый редактор»**

<figure><img src="/files/NgGcFlMa7R0gjR1jNGdd" alt=""><figcaption></figcaption></figure>

## Для чего нужен массовый редактор

Через массовый редактор можно:

* изменить одинаковый текст сразу у нескольких направлений;
* обновить лимиты обмена;
* изменить статус направлений;
* настроить сортировку;
* изменить прибыль;
* изменить партнёрскую прибыль;
* обновить комиссии;
* включить или выключить отдельные опции направления;
* изменить SEO-тексты;
* обновить тексты, которые клиент видит на странице заявки.

Главная задача раздела — ускорить однотипные изменения и снизить количество ручной работы.

## Как открыть и подготовить раздел

1. Войдите в панель управления.
2. Откройте **«Основное» — «Направления обмена» — «Массовый редактор».**
3. Настройте фильтры.
4. Выберите шаблон редактирования.
5. Выберите режим работы.
6. Внесите изменения.
7. Сохраните результат.

{% hint style="info" %}
Перед массовым сохранением всегда проверяйте фильтры. Если фильтр задан слишком широко, можно изменить больше направлений, чем планировалось.
{% endhint %}

## Фильтры

Перед редактированием рекомендуется отфильтровать направления, с которыми нужно работать.

<figure><img src="/files/f91QFt0oaMdXm8YO6FVu" alt=""><figcaption></figcaption></figure>

В массовом редакторе доступны фильтры:

* Название валюты Отдаю;
* Название валюты Получаю;
* Техническое название;
* Статус;
* Группы.

Также доступна сортировка по:

* ID;
* техническому названию;
* статусу;
* дате создания;
* дате обновления.

Фильтры особенно важны при использовании режима «Сохранить во всю выборку», потому что действие может примениться не только к направлениям на текущей странице, а ко всем направлениям, которые подходят под выбранный фильтр.

## Выбор шаблона

Вверху страницы есть поле **«Шаблон».**

<figure><img src="/files/Pkiq7Z9Fs6EAySUB2hAz" alt="" width="563"><figcaption></figcaption></figure>

Шаблон определяет, какие именно настройки будут редактироваться.

Например:

<table><thead><tr><th width="252.9140625">Шаблон</th><th>Что будет редактироваться</th></tr></thead><tbody><tr><td>Прибыль</td><td>Значения прибыли направления</td></tr><tr><td>Инструкция по оплате</td><td>Текст инструкции для клиента</td></tr><tr><td>Статус направления</td><td>Включение, выключение или архив</td></tr><tr><td>SEO title</td><td>SEO-заголовок направления</td></tr><tr><td>Сумма обмена</td><td>Минимальные и максимальные суммы обмена</td></tr></tbody></table>

Без выбранного шаблона направления могут отображаться в списке, но редактировать будет нечего. Сначала выберите, какой тип данных нужно изменить.

***

## Основные режимы работы

В массовом редакторе есть два основных режима:

* По направлениям;
* Одно значение для всех.

<figure><img src="/files/2RTSzAXmoSmKGYnpxfnY" alt=""><figcaption></figcaption></figure>

{% stepper %}
{% step %}

### Режим «По направлениям»

Режим «По направлениям» используется, когда у каждого направления должно быть своё значение.

Например:

```
BTC - USDT: минимальная сумма 100 USDT
ETH - USDT: минимальная сумма 200 USDT
LTC - USDT: минимальная сумма 50 USDT
```

В этом режиме каждое направление отображается отдельной карточкой. Вы меняете значения в нужных направлениях и нажимаете «Сохранить».

Изменения применяются к направлениям, которые находятся на текущей странице.
{% endstep %}

{% step %}

### Режим «Одно значение для всех»

Режим «Одно значение для всех» используется, когда одно и то же значение нужно применить сразу ко многим направлениям.

Например:

* всем направлениям поставить статус «Активно»;
* всем направлениям из фильтра поставить прибыль `2%`;
* всем направлениям добавить одинаковую инструкцию;
* всем направлениям отключить партнёрские начисления.

В этом режиме значение указывается один раз.

После этого доступны два действия:

* «Заполнить страницу»;
* «Сохранить во всю выборку».
  {% endstep %}
  {% endstepper %}

### Заполнить страницу

Кнопка «Заполнить страницу» подставляет указанное значение во все направления, которые сейчас видны на странице.

После этого нужно проверить значения и нажать «Сохранить».

Этот вариант удобен, если вы хотите сначала увидеть, как значение применилось к карточкам на странице.

### Сохранить во всю выборку

Кнопка «Сохранить во всю выборку» применяет указанное значение ко всем направлениям, которые подходят под текущий фильтр.

Например:

```
На странице видно: 20 направлений
По фильтру найдено: 350 направлений
```

Если нажать «Заполнить страницу», будут заполнены только 20 видимых направлений.

Если нажать «Сохранить во всю выборку», изменения применятся ко всем 350 направлениям по фильтру.

Перед применением система показывает подтверждение с количеством направлений.

{% hint style=“warning” %}\
Используйте «Сохранить во всю выборку» внимательно. Это действие может изменить большое количество направлений.\
{% endhint %}

***

## Чем отличается «Заполнить страницу» от «Сохранить во всю выборку»

<table><thead><tr><th width="238.65625">Действие</th><th>Что делает</th></tr></thead><tbody><tr><td>Заполнить страницу</td><td>Подставляет значение только в видимые карточки на текущей странице</td></tr><tr><td>Сохранить во всю выборку</td><td>Сохраняет значение во все направления, которые подходят под текущий фильтр</td></tr></tbody></table>

После «Заполнить страницу» нужно дополнительно нажать «Сохранить».

После «Сохранить во всю выборку» значение применяется сразу после подтверждения.

## Какие шаблоны доступны

Шаблоны разделены по группам:

* сумма обмена и комиссии;
* настройки направления;
* информация;
* SEO;
* верификация.

## Сумма обмена и комиссии

{% stepper %}
{% step %}

### Сумма обмена

Шаблон «Сумма обмена» используется для изменения лимитов сумм обмена.

Доступные поля:

* Мин. отдаю;
* Макс. отдаю;
* Мин. получаю;
* Макс. получаю.

Этот шаблон работает отдельно от обычного режима редактирования, потому что лимиты могут зависеть от источника значения: текущая настройка, профиль лимитов, ручное значение или отсутствие ограничения.

Подробнее этот шаблон описан ниже в разделе «Работа с лимитами суммы обмена».
{% endstep %}

{% step %}

### Прибыль

Шаблон «Прибыль» позволяет массово изменить прибыль направления.

Доступные поля:

* прибыль в процентах;
* прибыль фиксированной суммой.

Обозначения:

| Значок | Что означает        |
| ------ | ------------------- |
| `%`    | Процентное значение |
| `S`    | Фиксированная сумма |

Пример:

```
2% — прибыль 2 процента
5 S — фиксированная прибыль 5 единиц
```

{% endstep %}

{% step %}

### Прибыль для партнёров

Шаблон «Прибыль для партнёров» используется для изменения значения прибыли, которое участвует в партнёрских начислениях.

Доступные поля:

* партнёрская прибыль в процентах;
* партнёрская прибыль фиксированной суммой.

Этот шаблон полезен, если нужно быстро изменить партнёрскую логику для группы направлений.
{% endstep %}

{% step %}

### Дополнительная комиссия

Шаблон «Дополнительная комиссия» позволяет менять дополнительные комиссии направления.

Доступные поля:

* комиссия по стороне «Отдаю» в процентах;
* комиссия по стороне «Отдаю» фиксированной суммой;
* комиссия по стороне «Получаю» в процентах;
* комиссия по стороне «Получаю» фиксированной суммой.
  {% endstep %}

{% step %}

### Комиссия платёжной системы

Шаблон «Комиссия платежной системы» позволяет менять комиссии платёжной системы.

Доступные поля:

* комиссия ПС по стороне «Отдаю» в процентах;
* комиссия ПС по стороне «Отдаю» фиксированной суммой;
* комиссия ПС по стороне «Получаю» в процентах;
* комиссия ПС по стороне «Получаю» фиксированной суммой.
  {% endstep %}

{% step %}

### Лимиты резерва

Шаблон «Лимиты резерва» используется для изменения ограничений по резерву направления.

Доступные поля:

* Максимальный резерв;
* Лимит резерва за день;
* Лимит резерва за месяц.
  {% endstep %}

{% step %}

### Ограничения заявок

Шаблон «Ограничения заявок» отвечает за лимиты по созданию заявок.

Доступные поля:

* Макс. заявка с одного IP;
* Макс. заявок с одного IP за день;
* Макс. заявка одного пользователя;
* Макс. заявок пользователя за день;
* Макс. заявка на один email;
* Макс. заявок на email за день;
* Мин. обменов клиента;
* Макс. сумма для новичка.

Эти настройки помогают ограничивать повторные заявки и управлять рисками.
{% endstep %}
{% endstepper %}

## Настройки направления

### Статус направления

Шаблон «Статус направления» позволяет массово изменить статус направлений.

Доступные значения:

<table><thead><tr><th width="198.51171875">Статус</th><th>Что означает</th></tr></thead><tbody><tr><td>Выключено</td><td>Направление не доступно клиентам</td></tr><tr><td>Активно</td><td>Направление работает</td></tr><tr><td>Архив</td><td>Направление убрано в архив</td></tr></tbody></table>

Используйте этот шаблон осторожно, особенно при действии «Сохранить во всю выборку».

### Сортировка

Шаблон «Сортировка» позволяет изменить порядок отображения направлений.

Доступные поля:

* Сортировка отдаю;
* Сортировка получаю.

Сортировка влияет на порядок отображения направлений в списках. Конкретная логика отображения зависит от интерфейса, но смысл настройки один — управлять порядком направлений.

### Основные переключатели

Шаблон «Основные переключатели» позволяет массово включать или отключать отдельные опции направления.

Доступные параметры:

* Отключить авто-регистрацию;
* Заморозить направление;
* Включить расписание;
* Уникальная сумма отдаю;
* Скрыть оплату заявки;
* Разрешить скидку пользователя;
* Уведомлять о сумме обмена;
* Разрешить Telegram-бот;
* Не учитывать партнёров.

Для каждого параметра можно выбрать:

```
Да
```

или

```
Нет
```

### Кратность суммы

Шаблон «Кратность суммы» позволяет задать шаг кратности суммы.

Например, если указать:

```
100
```

клиент должен будет вводить сумму, кратную `100`.

## Информация

В этой группе находятся тексты, которые отображаются клиенту на сайте или на странице заявки.

Доступные шаблоны:

* Срок выполнения обмена;
* Инструкция по оплате;
* Описание обмена;
* Дополнительное описание обмена;
* Формальное описание перед вводом данных;
* Текст запроса реквизитов;
* Дополнительный текст в процессе оплаты;
* Предупреждение при обмене;
* Текст для статуса «Заявка выполнена»;
* Текст для статуса «Заявка отклонена»;
* Текст для окна подтверждения обмена;
* Название кнопки «Я оплатил»;
* Описание над кнопкой «Я оплатил»;
* Название кнопки «Подтвердить и обменять»;
* Текст при создании заявки на почту;
* Описание типа курса;
* Комментарий к кратности;
* Заголовок селектора комиссии;
* Текст селектора комиссии.

Большинство этих полей мультиязычные. Если сайт работает на нескольких языках, текст нужно заполнить для нужных языковых вкладок.

## SEO

Группа SEO используется для массового изменения SEO-данных направлений.

Доступные шаблоны:

* SEO title;
* SEO description;
* SEO keywords.

Эти поля используются для поисковых систем и мета-информации страниц направлений.

## Верификация

Группа Верификация используется для текстов, связанных с правилами проверки клиента или направления.

Доступные шаблоны:

* Описание без верификации;
* Описание верификации;
* Текст верификации направления;
* Информация о верификации направления.

Эти тексты помогают объяснить клиенту, когда нужна верификация, что нужно сделать и почему обмен может требовать дополнительной проверки.

## Работа с лимитами суммы обмена

Шаблон «Сумма обмена» отличается от остальных шаблонов.

Для него используется отдельный безопасный процесс:

1. выбрать источники лимитов;
2. нажать «Предпросмотр»;
3. проверить результат;
4. нажать «Применить пакетно».

Это сделано специально, чтобы администратор заранее видел, какие лимиты будут изменены.

{% stepper %}
{% step %}

### Поля лимитов

Доступны поля:

* Мин. отдаю;
* Макс. отдаю;
* Мин. получаю;
* Макс. получаю.

Для каждого поля можно выбрать источник значения:

* Оставить как сейчас;
* Взять из профиля;
* Задать вручную;
* Без ограничения.
  {% endstep %}

{% step %}

### Оставить как сейчас

Система не меняет выбранный лимит.

Используйте этот вариант, если нужно изменить только часть лимитов, а остальные оставить без изменений.
{% endstep %}

{% step %}

### Взять из профиля

Лимит будет браться из выбранного профиля лимитов.

Перед применением выберите профиль в поле «Профиль лимитов».
{% endstep %}

{% step %}

### Задать вручную

Вы вручную указываете значение лимита.

В этом случае поле значения становится активным, и можно ввести нужную сумму.
{% endstep %}

{% step %}

### Без ограничения

Для выбранного лимита будет установлен режим без ограничения.

Используйте этот вариант только там, где это действительно допустимо по правилам обменника.
{% endstep %}
{% endstepper %}

## Предпросмотр лимитов

Перед применением лимитов нужно нажать «Предпросмотр».

Предпросмотр показывает:

* сколько направлений найдено;
* сколько будет изменено;
* сколько будет пропущено;
* какие значения были до изменения;
* какие значения будут после изменения;
* причину пропуска, если направление не будет изменено.

Это важный этап. Он помогает понять результат до реального сохранения.

## Применение лимитов

После предпросмотра становится доступна кнопка «Применить пакетно».

Нажимайте её только после проверки результатов предпросмотра.

После применения система обновит лимиты у направлений, которые подходят под текущий фильтр и не были пропущены.

## Что важно знать про лимиты

Лимиты в системе могут быть не просто числом в направлении.

Они могут зависеть от источника:

* стандартное значение направления;
* профиль лимитов;
* ручное значение;
* отсутствие ограничения.

Если в массовом редакторе вы вручную меняете лимит у конкретного направления, это считается ручной правкой. Такой лимит не должен случайно перезаписываться автоматическими источниками.

***

## Как изменить одно значение у всех направлений

<figure><img src="/files/fD9IaEzgDcRqNTKi5lMn" alt=""><figcaption></figcaption></figure>

1. Откройте **«Основное» — «Направления обмена» — «Массовый редактор».**
2. Настройте фильтры.
3. Выберите нужный шаблон.
4. Переключитесь в режим «Одно значение для всех».
5. Укажите значение.
6. Если нужно изменить только текущую страницу, нажмите «Заполнить страницу».
7. Если нужно изменить все направления по фильтру, нажмите «Сохранить во всю выборку».
8. Подтвердите действие.

## Как изменить разные значения по направлениям

1. Откройте **«Массовый редактор».**
2. Настройте фильтры.
3. Выберите шаблон.
4. Оставьте режим **«По направлениям».**
5. В карточках направлений измените нужные значения.
6. Нажмите «Сохранить».

Этот способ удобен, если значения должны отличаться у разных направлений.

***

## Что нельзя применить через «Сохранить во всю выборку»

Шаблон «Сумма обмена» не использует обычный режим «Сохранить во всю выборку».

Для лимитов суммы используется отдельный процесс:

1. выбрать источники лимитов;
2. нажать «Предпросмотр»;
3. проверить результат;
4. нажать «Применить пакетно».

## Что означает % и S

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/ZUDJnxZyTxfiXEl68GV4" %}
[Что означают % и S в настройках системы](/help-center/rabota-v-sisteme/sait-i-kontent/chto-oznachayut-i-s-v-nastroikakh-sistemy)
{% endcontent-ref %}

## Рекомендации перед массовым изменением

Перед сохранением всегда проверяйте фильтр.

Особенно важно проверить:

* валюту «Отдаю»;
* валюту «Получаю»;
* статус направлений;
* группы направлений;
* техническое название.

Если фильтр задан слишком широко, можно случайно изменить больше направлений, чем планировалось.

## Безопасный порядок работы

Рекомендуемый порядок:

1. Сначала отфильтруйте направления.
2. Убедитесь, что в списке только нужные направления.
3. Выберите шаблон.
4. Если меняете лимиты, обязательно используйте предпросмотр.
5. Если применяете одно значение ко всем, проверьте количество направлений по фильтру.
6. Сохраните изменения.
7. После сохранения откройте несколько направлений вручную и проверьте результат.

## Частые ситуации

<details>

<summary>Нужно отключить много направлений</summary>

* Отфильтруйте нужные направления.
* Выберите шаблон «Статус направления».
* Включите режим «Одно значение для всех».
* Выберите «Выключено».
* Нажмите «Сохранить во всю выборку».
* Подтвердите действие.

</details>

<details>

<summary>Нужно изменить инструкцию по оплате</summary>

* Отфильтруйте нужные направления.
* Выберите шаблон «Инструкция по оплате».
* Переключитесь в режим «Одно значение для всех», если текст одинаковый для всех.
* Введите новый текст инструкции.
* Сохраните изменения.

</details>

<details>

<summary>Нужно изменить минимальную сумму обмена</summary>

* Выберите шаблон «Сумма обмена».
* Для поля «Мин. отдаю» выберите «Задать вручную».
* Введите сумму.
* Нажмите «Предпросмотр».
* Проверьте количество изменений.
* Нажмите «Применить пакетно».

</details>

<details>

<summary>Нужно поменять прибыль по группе направлений</summary>

* В фильтре выберите нужную группу.
* Выберите шаблон «Прибыль».
* Переключитесь в режим «Одно значение для всех».
* Укажите процент или фиксированную сумму.
* Нажмите «Сохранить во всю выборку».
* Подтвердите действие.

</details>

<details>

<summary>Нужно поменять прибыль по группе направлений</summary>

* В фильтре выберите нужную группу.
* Выберите шаблон «Прибыль».
* Переключитесь в режим «Одно значение для всех».
* Укажите процент или фиксированную сумму.
* Нажмите «Сохранить во всю выборку».
* Подтвердите действие.

</details>

## Если список пустой

Если в редакторе отображается «Список пуст», проверьте:

* не слишком ли строгие фильтры;
* выбран ли правильный статус;
* не находятся ли нужные направления в архиве;
* правильно ли выбраны валюты;
* есть ли направления в выбранной группе.

***

## Если изменения не применились

Проверьте:

* выбран ли шаблон;
* нажата ли кнопка «Сохранить» или «Применить пакетно»;
* не применяли ли вы только «Заполнить страницу» без последующего сохранения;
* не выбрали ли вы фильтр, где нет направлений;
* не были ли строки пропущены в предпросмотре лимитов;
* есть ли права доступа у администратора на изменение направлений.

{% hint style="info" %}

## Важные предупреждения

Массовый редактор может изменить сразу большое количество направлений.

Перед применением действия ко всей выборке всегда проверяйте количество направлений.

Особенно внимательно используйте массовые изменения для:

* статуса направлений;
* лимитов;
* прибыли;
* комиссий;
* партнёрских настроек;
* текстов инструкций;
* SEO.

Если вы не уверены, лучше сначала применить значение только к текущей странице и проверить результат.
{% endhint %}

***

## Коротко

Массовый редактор направлений — это инструмент для быстрого изменения настроек многих направлений обмена.

Он поддерживает два подхода:

* редактирование каждого направления отдельно;
* применение одного значения ко всей текущей выборке.

Для лимитов суммы обмена используется отдельный безопасный процесс с предпросмотром и пакетным применением.

Главное правило работы с массовым редактором: сначала правильно настроить фильтр, затем выбрать шаблон, проверить количество направлений и только после этого сохранять изменения.


# Сумма обмена

Раздел **«Суммы обмена»** отвечает за минимальные и максимальные суммы, с которыми клиент может создать заявку по конкретному направлению обмена.

С помощью этого раздела можно настроить:

* минимальную сумму, которую клиент отдаёт;
* максимальную сумму, которую клиент отдаёт;
* минимальную сумму, которую клиент получает;
* максимальную сумму, которую клиент получает;
* профили лимитов для быстрого применения одинаковых правил;
* массовую настройку лимитов сразу для нескольких направлений;
* автоматический пересчёт лимитов по текущим курсам;
* корректировку лимитов по валютам.

Если клиент введёт сумму меньше или больше разрешённого значения, система не позволит создать заявку и покажет соответствующее сообщение.

## Где находятся настройки сумм обмена

Настройки сумм обмена доступны в двух местах.

{% stepper %}
{% step %}

### Внутри направления обмена

Перейдите в раздел: **«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/DyEpYnsVW8M4n16uAPzh" alt=""><figcaption></figcaption></figure>

Откройте нужное направление и перейдите в блок: **«Общее» — «Основное»**

<figure><img src="/files/OlfzM5P0V53dHgdfiTMR" alt=""><figcaption></figcaption></figure>

Здесь находится настройка сумм обмена для конкретного направления.

Этот способ используется, когда нужно настроить лимиты только для одного направления.
{% endstep %}

{% step %}

### Массовая настройка сумм обмена

Перейдите в раздел: **«Основное» — «Направления обмена» — «Список направлений»**

<figure><img src="/files/Mzx9ONvqFkiYkm7s3PMM" alt=""><figcaption></figcaption></figure>

В правой верхней части страницы откройте кнопку **«Суммы обмена».**

Этот раздел используется, когда нужно быстро настроить лимиты сразу для нескольких направлений, создать профиль лимитов, выполнить корректировку по валютам или запустить автогенерацию.
{% endstep %}
{% endstepper %}

## Какие лимиты используются

В системе есть четыре основных значения.

<table><thead><tr><th width="157.2734375">Поле</th><th>Что означает</th></tr></thead><tbody><tr><td>Мин. отдаю</td><td>Минимальная сумма, которую клиент может отправить</td></tr><tr><td>Макс. отдаю</td><td>Максимальная сумма, которую клиент может отправить</td></tr><tr><td>Мин. получаю</td><td>Минимальная сумма, которую клиент может получить</td></tr><tr><td>Макс. получаю</td><td>Максимальная сумма, которую клиент может получить</td></tr></tbody></table>

Пример:

| Направление   | BTC → USDT |
| ------------- | ---------- |
| Мин. отдаю    | 0.001 BTC  |
| Макс. отдаю   | 10 BTC     |
| Мин. получаю  | 100 USDT   |
| Макс. получаю | 50000 USDT |

Если клиент попытается создать заявку на сумму ниже минимума или выше максимума, система остановит создание заявки.

## Блок «Клиент отдаёт»

Блок «Клиент отдаёт» управляет ограничениями по входящей сумме, то есть по той валюте, которую клиент отправляет обменнику.

В этом блоке настраиваются:

| Поле     | Назначение                |
| -------- | ------------------------- |
| Минимум  | Минимальная сумма отдачи  |
| Максимум | Максимальная сумма отдачи |

Пример:

Если направление **Bitcoin BTC → Tether TRC20 USDT**, то блок **«Клиент отдаёт»** отвечает за ограничения по BTC.

## Блок «Клиент получает»

Блок «Клиент получает» управляет ограничениями по выходящей сумме, то есть по той валюте, которую клиент получает после обмена.

В этом блоке настраиваются:

<table><thead><tr><th width="193.48046875">Поле</th><th>Назначение</th></tr></thead><tbody><tr><td>Минимум</td><td>Минимальная сумма получения</td></tr><tr><td>Максимум</td><td>Максимальная сумма получения</td></tr></tbody></table>

Пример:

Если направление **Bitcoin BTC → Tether TRC20 USDT**, то блок **«Клиент получает»** отвечает за ограничения по USDT.

## Режимы значений лимитов

Для каждого лимита можно выбрать режим работы.

<table><thead><tr><th width="240.453125">Режим</th><th>Описание</th></tr></thead><tbody><tr><td>Оставить как есть</td><td>Значение не изменяется</td></tr><tr><td>Сумма направления</td><td>Используется значение, заданное в самом направлении</td></tr><tr><td>Профиль</td><td>Значение берётся из выбранного профиля лимитов</td></tr><tr><td>Вручную</td><td>Значение задаётся вручную</td></tr><tr><td>Без лимита</td><td>Ограничение отключается</td></tr></tbody></table>

{% stepper %}
{% step %}

### Оставить как есть

Этот режим используется при массовой настройке.

Если выбрать **«Оставить как есть»**, система не будет менять текущее значение лимита.

Используйте этот вариант, если нужно изменить только часть полей, а остальные оставить без изменений.
{% endstep %}

{% step %}

### Сумма направления

Этот режим означает, что лимит берётся из самого направления обмена.

Например, если внутри направления указано:  **Мин. отдаю: 0.001** то система будет использовать именно это значение.
{% endstep %}

{% step %}

### Профиль

Режим «Профиль» позволяет брать значение из заранее созданного профиля лимитов.

Это удобно, если у вас много направлений с одинаковыми правилами.

Например, можно создать профили:

<table><thead><tr><th width="219.56640625">Профиль</th><th>Для чего использовать</th></tr></thead><tbody><tr><td>Криптовалюты</td><td>Для криптовалютных направлений</td></tr><tr><td>Банки</td><td>Для банковских направлений</td></tr><tr><td>Наличные</td><td>Для наличных обменов</td></tr><tr><td>VIP</td><td>Для крупных клиентов</td></tr><tr><td>Малые суммы</td><td>Для направлений с небольшими лимитами</td></tr></tbody></table>
{% endstep %}

{% step %}

### Вручную

Режим «Вручную» позволяет задать конкретное значение только для выбранного поля.

Пример:

<table><thead><tr><th width="198.21484375">Поле</th><th>Режим</th><th>Значение</th></tr></thead><tbody><tr><td>Мин. отдаю</td><td>Профиль</td><td>Из профиля</td></tr><tr><td>Макс. отдаю</td><td>Вручную</td><td>5 BTC</td></tr><tr><td>Мин. получаю</td><td>Профиль</td><td>Из профиля</td></tr><tr><td>Макс. получаю</td><td>Без лимита</td><td>Без ограничения</td></tr></tbody></table>

Так можно комбинировать автоматические и ручные значения.
{% endstep %}

{% step %}

### Без лимита

Режим «Без лимита» отключает ограничение по выбранному полю.

Например, если для поля «Макс. получаю» выбрать «Без лимита», система не будет ограничивать максимальную сумму получения.
{% endstep %}
{% endstepper %}

***

## Значение 0

Если в лимите указано значение: **0** это означает, что ограничение фактически не задано.

Например:

<table><thead><tr><th width="179.42578125">Поле</th><th width="149.23046875">Значение</th><th>Что означает</th></tr></thead><tbody><tr><td>Мин. отдаю</td><td>0</td><td>Минимальный лимит не задан</td></tr><tr><td>Макс. отдаю</td><td>0</td><td>Максимальный лимит не задан</td></tr><tr><td>Мин. получаю</td><td>0</td><td>Минимальный лимит не задан</td></tr><tr><td>Макс. получаю</td><td>0</td><td>Максимальный лимит не задан</td></tr></tbody></table>

Для точного управления лучше использовать режим «Без лимита», если ограничение действительно не требуется.

## Профили лимитов

Профиль лимитов — это готовый шаблон с минимальными и максимальными суммами обмена.

Он нужен, чтобы не настраивать одинаковые значения вручную в каждом направлении.

Профиль может содержать:

| Поле          |
| ------------- |
| Мин. отдаю    |
| Макс. отдаю   |
| Мин. получаю  |
| Макс. получаю |

### Создание нового профиля

Перейдите в раздел: **«Основное» — «Направления обмена» — «Список направлений»**

Нажмите кнопку **«Еще» —** **«Суммы обмена»** в правой верхней части страницы.

Затем нажмите: **«Новый профиль»**

<figure><img src="/files/o5cRQ4I9b2RK6DTIARWw" alt=""><figcaption></figcaption></figure>

В открывшемся окне заполните:

<table><thead><tr><th width="219.2265625">Поле</th><th>Описание</th></tr></thead><tbody><tr><td>Название профиля</td><td>Понятное название профиля</td></tr><tr><td>Мин. отдаю</td><td>Минимальная сумма, которую клиент отдаёт</td></tr><tr><td>Макс. отдаю</td><td>Максимальная сумма, которую клиент отдаёт</td></tr><tr><td>Мин. получаю</td><td>Минимальная сумма, которую клиент получает</td></tr><tr><td>Макс. получаю</td><td>Максимальная сумма, которую клиент получает</td></tr></tbody></table>

После сохранения профиль можно назначать направлениям.

## Примеры профилей лимитов

{% stepper %}
{% step %}

### Профиль «Криптовалюты»

<table><thead><tr><th width="183.5390625">Поле</th><th>Значение</th></tr></thead><tbody><tr><td>Мин. отдаю</td><td>0.001</td></tr><tr><td>Макс. отдаю</td><td>10</td></tr><tr><td>Мин. получаю</td><td>100</td></tr><tr><td>Макс. получаю</td><td>100000</td></tr></tbody></table>

Подходит для стандартных криптовалютных направлений.
{% endstep %}

{% step %}

### Профиль «Банки»

<table><thead><tr><th width="187.09765625">Поле</th><th>Значение</th></tr></thead><tbody><tr><td>Мин. отдаю</td><td>5000</td></tr><tr><td>Макс. отдаю</td><td>300000</td></tr><tr><td>Мин. получаю</td><td>5000</td></tr><tr><td>Макс. получаю</td><td>300000</td></tr></tbody></table>

Подходит для банковских карт и платёжных систем.
{% endstep %}

{% step %}

### Профиль «VIP»

<table><thead><tr><th width="202.20703125">Поле</th><th>Значение</th></tr></thead><tbody><tr><td>Мин. отдаю</td><td>100000</td></tr><tr><td>Макс. отдаю</td><td>10000000</td></tr><tr><td>Мин. получаю</td><td>100000</td></tr><tr><td>Макс. получаю</td><td>10000000</td></tr></tbody></table>

Подходит для крупных обменов и отдельных клиентов.
{% endstep %}
{% endstepper %}

***

## Назначение профиля направлению

Чтобы назначить профиль конкретному направлению:

1. Перейдите в раздел **«Основное» — «Направления обмена» — «Список направлений»**.
2. Откройте нужное направление.
3. Перейдите в **«Общее» — «Основное».**
4. В блоке сумм обмена выберите нужный профиль лимитов.
5. Нажмите **«Сохранить».**

После этого направление начнёт использовать значения из выбранного профиля.

## Массовая настройка сумм обмена

Массовая настройка нужна, когда необходимо изменить лимиты сразу у нескольких направлений.

Перейдите в раздел: **«Основное» — «Направления обмена» — «Список направлений»**

В правой верхней части страницы нажмите **«Еще» — «Суммы обмена»**.

## Массовое изменение лимитов

В массовой настройке можно изменить:

<table><thead><tr><th width="212.3515625">Группа</th><th>Поля</th></tr></thead><tbody><tr><td>Клиент отдаёт</td><td>Мин. отдаю, Макс. отдаю</td></tr><tr><td>Клиент получает</td><td>Мин. получаю, Макс. получаю</td></tr></tbody></table>

Для каждого поля можно выбрать действие:

<table><thead><tr><th width="194.64453125">Действие</th><th>Что произойдёт</th></tr></thead><tbody><tr><td>Не менять</td><td>Поле останется без изменений</td></tr><tr><td>Из профиля</td><td>Значение будет взято из профиля</td></tr><tr><td>Вручную</td><td>Будет установлено указанное значение</td></tr><tr><td>Без лимита</td><td>Ограничение будет отключено</td></tr></tbody></table>

## Предпросмотр изменений

Перед сохранением система показывает предварительный результат.

В предпросмотре можно увидеть:

* какие направления найдены;
* какие значения сейчас установлены;
* какие значения будут после изменения;
* какие направления будут изменены;
* какие направления будут пропущены;
* какие поля защищены от изменения;
* где есть ошибки или невозможность пересчёта.

Это защищает от случайного массового изменения лимитов.

## Корректировка по валютам

Кнопка  **«Еще» — «Корректировка по валютам»** находится в разделе массовой настройки сумм обмена.

<figure><img src="/files/rAyAKfHbCWMjv2eqkHxX" alt=""><figcaption></figcaption></figure>

Она позволяет задать лимиты по валюте **«Получаю».**

Например, можно указать:

<table><thead><tr><th width="157.08984375">Валюта</th><th width="191.4765625">Мин. получаю</th><th>Макс. получаю</th></tr></thead><tbody><tr><td>USDT</td><td>100</td><td>100000</td></tr><tr><td>RUB</td><td>5000</td><td>300000</td></tr><tr><td>BTC</td><td>0.001</td><td>5</td></tr></tbody></table>

После этого система найдёт направления, где эта валюта используется на стороне «Получаю», и покажет, какие значения будут изменены.

## Расчёт стороны «Отдаю» по курсу

Если вы задаёте лимит по стороне «Получаю», система может рассчитать соответствующую сумму по стороне «Отдаю».

Формула:

```
Сумма отдаю = Сумма получаю / Курс направления
```

Пример:

| Параметр     | Значение            |
| ------------ | ------------------- |
| Направление  | BTC → USDT          |
| Курс         | 1 BTC = 100000 USDT |
| Мин. получаю | 100 USDT            |
| Мин. отдаю   | 0.001 BTC           |

Система рассчитает значение автоматически.

## Автогенерация лимитов

Кнопка «Автогенерация» пересчитывает лимиты по текущим правилам и курсам.

Она полезна после:

* изменения курсов;
* массового добавления направлений;
* изменения профилей;
* изменения минимальных и максимальных сумм по валютам;
* перенастройки направлений обмена.

Система проходит по направлениям и обновляет только те значения, которые можно безопасно пересчитать.

## Когда направление не изменяется

Система может пропустить направление, если:

<table><thead><tr><th width="269.49609375">Причина</th><th>Что означает</th></tr></thead><tbody><tr><td>Значение защищено</td><td>Поле закреплено и не должно меняться автоматически</td></tr><tr><td>Используется профиль</td><td>Значение берётся из профиля</td></tr><tr><td>Установлено вручную</td><td>Поле настроено вручную</td></tr><tr><td>Без лимита</td><td>Ограничение отключено</td></tr><tr><td>Нет курса</td><td>Невозможно рассчитать значение</td></tr><tr><td>Направление отключено</td><td>Направление не участвует в обработке</td></tr><tr><td>Ошибка расчёта</td><td>Недостаточно данных для пересчёта</td></tr></tbody></table>

## Действия с направлением в массовой настройке

В предпросмотре направления можно выполнить дополнительные действия.

<table><thead><tr><th width="179.8828125">Действие</th><th>Описание</th></tr></thead><tbody><tr><td>Пропустить</td><td>Не применять изменения к этому направлению</td></tr><tr><td>Закрепить</td><td>Защитить значения от автоматического изменения</td></tr><tr><td>Настроить</td><td>Открыть настройку лимитов конкретного направления</td></tr></tbody></table>

## Как лимиты влияют на клиента

Когда клиент создаёт заявку, система проверяет введённую сумму.

Если сумма корректная — заявка создаётся.

Если сумма меньше минимума или больше максимума — система покажет ошибку.

Примеры сообщений:

* Минимальная сумма, доступная для отправки: 0.001 BTC
* Максимальная сумма, которую вы можете получить за один обмен: 50000 USDT
* В настоящее время мы не принимаем сумму более 300000 RUB

## Дополнительные проверки

Кроме обычных лимитов направления, система может учитывать дополнительные ограничения:

<table><thead><tr><th width="201.890625">Проверка</th><th>Что делает</th></tr></thead><tbody><tr><td>Резерв валюты</td><td>Проверяет, достаточно ли средств для выплаты</td></tr><tr><td>Город</td><td>Учитывает ограничения для наличных направлений</td></tr><tr><td>Верификация</td><td>Может ограничивать обмен до прохождения проверки</td></tr><tr><td>Профили лимитов клиента</td><td>Ограничивают частоту и количество заявок</td></tr><tr><td>Правила безопасности</td><td>Защищают от обхода лимитов</td></tr></tbody></table>

## Важное отличие от профилей лимитов в настройках

Не путайте два разных механизма.

{% stepper %}
{% step %}

### Суммы обмена

Находятся в направлениях обмена.

Отвечают за размер одной заявки:

| Пример              |
| ------------------- |
| Минимум 100 USDT    |
| Максимум 50000 USDT |
| Минимум 5000 RUB    |
| Максимум 300000 RUB |
| {% endstep %}       |

{% step %}

### Профили лимитов в настройках

Находятся отдельно в настройках системы.

Они отвечают не за сумму направления, а за поведение клиента:

| Ограничение                          |
| ------------------------------------ |
| Сколько заявок можно создать в час   |
| Сколько заявок можно создать в сутки |
| Минимальный интервал между заявками  |
| Ограничение для первых заявок        |
| Проверка по IP                       |
| Проверка по устройству               |
| Проверка по email                    |
| Проверка по реквизитам               |

Это отдельная система защиты и контроля.
{% endstep %}
{% endstepper %}

## Когда что использовать

<table><thead><tr><th width="346.44140625">Задача</th><th>Что использовать</th></tr></thead><tbody><tr><td>Настроить лимиты одного направления</td><td>Настройка внутри направления</td></tr><tr><td>Массово изменить лимиты</td><td>Кнопка «Суммы обмена» в списке направлений</td></tr><tr><td>Сделать одинаковые лимиты для группы направлений</td><td>Профиль лимитов</td></tr><tr><td>Настроить лимиты по валюте получения</td><td>Корректировка по валютам</td></tr><tr><td>Пересчитать лимиты по курсам</td><td>Автогенерация</td></tr><tr><td>Ограничить количество заявок клиента</td><td>Профили лимитов в настройках</td></tr></tbody></table>

## Рекомендуемый порядок настройки

1. Откройте **«Основное» — «Направления обмена» — «Список направлений».**
2. Настройте лимиты у одного направления вручную, чтобы проверить логику.
3. Создайте несколько профилей лимитов.
4. Через кнопку **«Суммы обмена»** выполните массовую настройку.
5. Проверьте предпросмотр изменений.
6. Сохраните изменения.
7. При необходимости выполните **«Корректировку по валютам».**
8. После изменения курсов используйте **«Автогенерацию».**
9. Проверьте создание тестовой заявки на сайте.

## Практические рекомендации

| Ситуация                                     | Рекомендация                           |
| -------------------------------------------- | -------------------------------------- |
| Много направлений с одинаковыми лимитами     | Используйте профили                    |
| Часто меняются курсы                         | Используйте автогенерацию              |
| Нужно ограничить конкретную валюту           | Используйте корректировку по валютам   |
| Нужны индивидуальные условия                 | Настраивайте лимиты внутри направления |
| Нужно защитить поле от массового изменения   | Закрепите значение                     |
| Не нужен максимум                            | Используйте «Без лимита»               |
| Не хотите менять поле при массовой настройке | Выберите «Не менять»                   |


# Выбор комиссий

«Выбор комиссий» позволяет подготовить несколько вариантов условий, из которых клиент самостоятельно выбирает подходящий при оформлении заявки. Выбранный вариант изменяет рабочий курс по заданной формуле либо добавляет прибыль обменника.

Эта настройка не заменяет основную, групповую, дополнительную комиссию, комиссию платёжной системы и комиссию, зависящую от суммы обмена. Все действующие настройки направления участвуют в итоговом расчёте совместно.

Если для направления нет доступных вариантов, блок выбора комиссий на клиентском сайте не отображается.

## Доступ к настройкам

Для работы требуется право «Разрешить доступ к направлениям в админпанели» из блока «Базовое управление».

В панели управления откройте: **«Пользователи» — «Список групп пользователей»**

{% content-ref url="/pages/3OPChZoOwE8CnKr6Icyq" %}
[Группы прав пользователей](/guide/polzovateli/gruppy-prav-polzovatelei)
{% endcontent-ref %}

Откройте нужную группу пользователей и проверьте выданные права.

Общий список комиссий находится по пути: **«Основное» — «Направление обмена» — «Выбор комиссий»**

<figure><img src="/files/BeIt39efoSHCNhKP6DX3" alt=""><figcaption></figcaption></figure>

Индивидуальные комиссии настраиваются в конкретном направлении.

В панели управления откройте:

**«Основное» — «Направление обмена» — «Список направлений»**

Откройте нужное направление. Затем перейдите в «Комиссии» и выберите «Выбор комиссии».

<figure><img src="/files/EwaIPPIOhjeJOXHVm8VN" alt=""><figcaption></figcaption></figure>

## Общие и индивидуальные комиссии

Для одного направления могут использоваться общие либо индивидуальные варианты.

| Источник                    | Где настраивается                | Что получает клиент                                       |
| --------------------------- | -------------------------------- | --------------------------------------------------------- |
| **Общие комиссии**          | «Выбор комиссий»                 | Все включённые варианты, подходящие по области применения |
| **Индивидуальные комиссии** | Карточка конкретного направления | Только варианты, созданные внутри этого направления       |

Если в направлении есть хотя бы одна правильно заполненная индивидуальная комиссия, общие комиссии для него не показываются.

Общие и индивидуальные варианты не объединяются. Индивидуальные комиссии полностью заменяют общий список только для своего направления.

Пустая индивидуальная строка со значением `0` не отключает общие комиссии. Приоритет индивидуальных вариантов начинает действовать после сохранения хотя бы одной комиссии с названием и допустимой ненулевой формулой.

## Настройки клиентского выбора

В панели управления откройте: **«Основное» — «Направление обмена» — «Выбор комиссий»**

Нажмите кнопку с шестерёнкой «Настройки выбора комиссий».

<figure><img src="/files/pduXQtIBJG0xsPW7fvze" alt=""><figcaption></figcaption></figure>

Количество выбираемых комиссий и способ их отображения настраиваются независимо. Можно использовать любую комбинацию этих параметров.

### Сколько комиссий может выбрать клиент

{% stepper %}
{% step %}

#### Одна комиссия

Клиент может выбрать только один вариант. При выборе другой комиссии предыдущий вариант снимается автоматически.

Если настройка ранее не изменялась, используется «Одна комиссия».
{% endstep %}

{% step %}

#### Несколько комиссий

Клиент может отметить несколько вариантов. Все выбранные формулы применяются последовательно.
{% endstep %}
{% endstepper %}

### Как показывать комиссии клиенту

{% stepper %}
{% step %}

#### Выпадающий список

В форме отображается компактная строка. После нажатия открывается список доступных вариантов с поиском.

Если настройка ранее не изменялась, используется «Выпадающий список».
{% endstep %}

{% step %}

#### Все варианты сразу

Все доступные варианты постоянно отображаются непосредственно в форме обмена.

В окне «Настройки выбора комиссий» нет отдельной кнопки сохранения. Каждый выбор сохраняется сразу.
{% endstep %}
{% endstepper %}

После изменения параметра дождитесь сообщения «Настройки сохранены».

## Создание общей комиссии

В панели управления откройте: **«Основное» — «Направление обмена» — «Выбор комиссий»**

Нажмите «Добавить комиссию».

<figure><img src="/files/3VWfjpT1sWmOnF16goZb" alt=""><figcaption></figcaption></figure>

1. Заполните «Название комиссии».
2. При необходимости заполните «Описание».
3. В «Тип комиссии» выберите «Динамическая» или «Прибыль».
4. Укажите значение комиссии.
5. Для типа «Динамическая» при необходимости заполните «Комиссия для обратного курса».
6. Нажмите «Добавить комиссию».
7. Откройте созданную запись по её названию.
8. Настройте область применения.
9. Включите «Статус».
10. Нажмите «Сохранить комиссию».

При открытии формы создания изначально выбрана «Динамическая». До создания можно переключить «Тип комиссии» на «Прибыль».

Новая комиссия создаётся с выбранным типом, в выключенном состоянии, с областью применения «Все направления» и добавляется в конец общего списка.

Пока «Статус» выключен, комиссия хранится в настройках, но клиентам не показывается.

### Название комиссии

«Название комиссии» — основное название варианта, которое видит клиент.

Оно должно понятно объяснять, какой вариант выбирается. Например, это может быть вариант с другим порядком обработки или дополнительной услугой, если такое различие действительно существует в работе обменного пункта.

Название на основном языке обязательно.

Если сайт работает на нескольких языках, заполните переводы для всех языков, доступных клиентам.

### Описание

«Описание» отображается под названием комиссии.

Используйте его, если клиенту нужно объяснить, чем вариант отличается от остальных, какие условия с ним связаны или что именно изменится при выборе.

Не указывайте преимущество или услугу, которых нет в реальном процессе обмена.

## Тип «Динамическая»

«Динамическая» изменяет рабочий курс по указанной формуле.

Для этого типа используются два значения.

**«Основная комиссия»** применяется, когда курс на сайте отображается в виде, где слева условно находится `1`, а справа — `100 000`.

**«Комиссия для обратного курса»** применяется при обратном виде, когда слева условно находится `100 000`, а справа — `1`.

Если «Комиссия для обратного курса» не заполнена, для обратного вида используется значение из «Основная комиссия».

### Поддерживаемые формулы

Формула изменяет рабочий курс. Она не прибавляется напрямую к сумме «Отдаю» или «Получаю».

| Значение       | Действие                 | Результат при курсе `100` |
| -------------- | ------------------------ | ------------------------- |
| `1` или `+1`   | Прибавить `1`            | `101`                     |
| `-1`           | Вычесть `1`              | `99`                      |
| `1%` или `+1%` | Увеличить курс на `1%`   | `101`                     |
| `-1%`          | Уменьшить курс на `1%`   | `99`                      |
| `*1.02`        | Умножить курс на `1.02`  | `102`                     |
| `/1.05`        | Разделить курс на `1.05` | Приблизительно `95.2381`  |

Если знак не указан, значение воспринимается как прибавление. Поэтому `1%` работает так же, как `+1%`.

Для десятичных значений используйте точку:

```
0.5
1.25%
*1.02
```

Не используйте нулевые значения `0` и `0%`.

В одном поле должна находиться только одна операция. Не добавляйте обозначение валюты, текст или процент после операции умножения и деления.

{% hint style="warning" %}
Знак формулы показывает изменение рабочего курса, но не всегда напрямую показывает выгоду или доплату клиента. Результат зависит от обычного или обратного вида курса. Проверяйте каждую формулу на клиентском сайте в обоих вариантах отображения курса.
{% endhint %}

## Тип «Прибыль»

«Прибыль» позволяет указать положительное значение, которое система учитывает как прибыль обменника при обычном и обратном виде курса.

После выбора этого типа используется «Размер комиссии». Поле «Комиссия для обратного курса» скрывается и не применяется.

Поддерживаются два формата:

* `2%` — процентное значение прибыли;
* `5` — фиксированное изменение рабочего курса на пять единиц.

Фиксированное число изменяет курс. Оно не добавляет указанную сумму непосредственно к заявке.

Для типа «Прибыль» используйте только положительное число или процент.

Не используйте минус, умножение или деление. Направление изменения курса система определяет самостоятельно, чтобы указанное значение учитывалось как прибыль при обоих видах курса.

## Область применения общей комиссии

После создания откройте комиссию и найдите блок «Где применять комиссию».

| Настройка                             | Где доступна                                     | Пустой список     |
| ------------------------------------- | ------------------------------------------------ | ----------------- |
| **«Все направления»**                 | Во всех направлениях без индивидуальных комиссий | Доступна везде    |
| **«Только выбранные направления»**    | Только в выбранных направлениях                  | Не доступна нигде |
| **«Исключить выбранные направления»** | Везде, кроме выбранных направлений               | Доступна везде    |
| **«Только группы направлений»**       | В направлениях выбранных групп                   | Не доступна нигде |
| **«Исключить группы направлений»**    | Везде, кроме направлений выбранных групп         | Доступна везде    |
| **«Направления + группы»**            | В выбранном направлении или выбранной группе     | Не доступна нигде |

Для режима «Направления + группы» достаточно выполнения одного из условий. Направление не обязано одновременно находиться в списке «Направления» и в выбранной группе.

### Группы направлений

Группы настраиваются отдельно.

В панели управления откройте:

**«Основное» — «Направление обмена» — «Группы»**

Страница имеет название «Группы направлений».

Если состав группы изменяется, область доступности комиссии также меняется для направлений этой группы.

После редактирования группы повторно проверьте нужное направление на клиентском сайте.

В общем списке комиссий используются сокращённые подписи:

* «Исключить направления» соответствует «Исключить выбранные направления»;
* «Направления и группы» соответствует «Направления + группы».

## Статус и порядок общих комиссий

В общем списке для каждой комиссии отображаются её название, тип, область применения, основное и обратное значения, а также текущее состояние.

Для обратного значения может отображаться «Не задана».

«Статус» можно изменить непосредственно в общем списке. Такое изменение сохраняется сразу.

Если статус меняется внутри окна редактирования, после изменения нажмите «Сохранить комиссию».

### Порядок комиссий

Порядок общих вариантов изменяется перетаскиванием за элемент «Перетащить».

<figure><img src="/files/wQNoZM1QXR8Z0E1YEQKi" alt=""><figcaption></figcaption></figure>

После успешного изменения появляется сообщение:

> Сортировка сохранена

В этом же порядке общие комиссии отображаются клиенту.

Для редактирования нажмите на название комиссии.

Для удаления используйте кнопку удаления и подтвердите действие.

Удаление убирает комиссию из будущих расчётов, но не изменяет условия уже созданных заявок.

## Индивидуальные комиссии направления

В панели управления откройте: **«Основное» — «Направление обмена» — «Список направлений»**

Откройте нужное направление. Затем перейдите в «Комиссии» и выберите «Выбор комиссии».

Страница имеет название «Комиссия по выбору клиента».

Индивидуальные варианты действуют только для выбранного направления и при наличии хотя бы одного правильно заполненного варианта заменяют для него общие комиссии.

### Настройки всего списка

**«Название списка комиссий»**

Определяет заголовок, который клиент увидит над вариантами.

Если поле не заполнено, используется стандартный заголовок «Выбор комиссий».

**«Описание списка комиссий»**

Определяет пояснение под блоком выбора.

Если оно не заполнено, отдельный текст под блоком не отображается.

«Название списка комиссий» и «Описание списка комиссий» относятся ко всему направлению, а не к отдельной комиссии.

### Добавление индивидуального варианта

Нажмите «Добавить».

Система сразу создаст новую строку со значением `0`.

1. Заполните «Название».
2. При необходимости заполните «Описание».
3. Укажите «Основная комиссия».
4. При необходимости заполните «Комиссия для обратного курса».
5. Нажмите «Сохранить».

Пока название не заполнено или основная формула имеет недопустимое либо нулевое значение, вариант клиенту не показывается.

В индивидуальной форме нет поля «Тип комиссии». «Основная комиссия» и «Комиссия для обратного курса» работают по правилам типа «Динамическая».

Для индивидуальных вариантов также отсутствуют:

* отдельный статус;
* область применения;
* тип «Прибыль»;
* ручная сортировка.

Все корректно заполненные варианты доступны только в текущем направлении.

Порядок соответствует порядку их добавления.

### Десятичные значения

В индивидуальной форме десятичную часть указывайте только через точку.

Правильно:

```
0.5%
```

Неправильно:

```
0,5%
```

Недопустимое значение «Основная комиссия» сохраняется как `0`.

Недопустимое значение «Комиссия для обратного курса» очищается.

Такой вариант не становится доступным клиенту.

### Удаление индивидуального варианта

Кнопка с корзиной удаляет вариант сразу.

Отдельного переключателя для временного отключения индивидуальной комиссии нет.

## Возврат к общим комиссиям

Чтобы направление снова использовало общие комиссии, удалите все индивидуальные варианты.

После удаления последнего корректного индивидуального варианта к направлению снова применяются общие правила.

«Название списка комиссий» и «Описание списка комиссий» хранятся в самом направлении.

Если после возврата к общим комиссиям нужен стандартный заголовок, сначала очистите эти поля и нажмите «Сохранить». Только после этого удалите последний индивидуальный вариант.

{% hint style="warning" %}
После удаления последнего индивидуального варианта кнопка «Сохранить» становится недоступна. Поэтому «Название списка комиссий» и «Описание списка комиссий» при необходимости нужно очистить заранее.
{% endhint %}

## Что видит клиент

Если для выбранного направления доступны комиссии, в форме обмена появляется блок выбора.

Клиент может видеть:

* заголовок блока;
* описание блока, если оно заполнено;
* вариант «Без комиссии» со значением `0%`;
* название каждой доступной комиссии;
* описание каждой комиссии;
* значение комиссии без технических обозначений формулы.

Служебные операции формулы клиенту не показываются.

Например:

| Формула | Отображение              |
| ------- | ------------------------ |
| `-1%`   | `1%`                     |
| `+0.5`  | `0.5`                    |
| `*1.02` | `2%`                     |
| `/1.05` | Приблизительно `4.7619%` |

Для «Динамической» рядом с вариантом может отображаться метка «Доплата».

Она определяется по фактическому влиянию формулы при текущем виде курса, а не только по знаку, указанному администратором.

Для типа «Прибыль» метка «Доплата» не используется.

Отсутствие этой метки не означает, что прибыль не участвует в расчёте.

## Выпадающий список

При режиме «Выпадающий список» клиент открывает список доступных вариантов из компактного элемента формы.

Внутри доступно поле «Поиск по названию или проценту».

При выборе одной комиссии список закрывается автоматически.

Если разрешён выбор нескольких комиссий, клиент может отметить необходимые варианты и нажать «Готово», чтобы закрыть список.

Кнопка «Сброс» возвращает выбор к варианту «Без комиссии».

Пересчёт курса выполняется непосредственно при выборе или снятии комиссии. «Готово» только закрывает список.

## Все варианты сразу

При режиме «Все варианты сразу» комиссии и «Без комиссии» постоянно отображаются в форме обмена.

Отдельное окно и строка поиска не используются.

Если разрешена только одна комиссия, варианты работают как одиночный выбор.

Если включено «Несколько комиссий», каждый вариант можно отметить отдельно.

## Отображение выбранного варианта

Если клиент ничего не выбрал, отображаются:

**«Без комиссии»** и `0%`.

Если выбрана одна комиссия, показываются её название и значение.

Если выбрано две или более комиссии, их названия отображаются через запятую. Общее или повторяющееся значение рядом с названиями не выводится.

Выбор «Без комиссии» снимает все ранее выбранные варианты.

После изменения выбора курс и суммы «Отдаю» и «Получаю» пересчитываются сразу.

## Как выполняется расчёт

Каждая выбранная комиссия применяется к рабочему курсу.

При выборе нескольких комиссий формулы применяются последовательно в порядке, в котором клиент выбирал варианты.

Поэтому итог нельзя рассчитывать простым сложением процентов.

Например, при рабочем курсе `100`:

1. Формула `+10%` изменяет курс до `110`.
2. Следующая формула `-10%` применяется уже к `110`.
3. Новый курс становится `99`.

Результат равен `99`, а не `100`.

Если клиент снимет выбранный вариант, а затем выберет его снова, он переместится в конец последовательности.

Выбранные комиссии учитываются после комиссии, зависящей от суммы обмена. После них могут применяться дальнейшие настройки курса и итоговые корректировки направления.

Поэтому расчёт одной формулы отдельно не заменяет проверку полной итоговой суммы на клиентском сайте.

Перед созданием заявки система повторно получает доступные для текущего направления варианты и использует сохранённые администратором значения.

Недоступная для направления или подменённая на стороне клиента комиссия не должна участвовать в расчёте.

## Выбранные комиссии в заявке

После создания заявки выбранные условия сохраняются вместе с её данными.

В списке заявок при одной выбранной комиссии отображается её название.

Если выбрано несколько вариантов, показывается название первой комиссии и количество остальных. По нажатию открывается окно «Выбранные комиссии».

В карточке заявки блок «Выбранные комиссии» показывает:

* название;
* описание;
* применённое значение;
* тип «Динамическая» или «Прибыль»;
* область «Общая» или «Для направления»;
* значение «Обратный курс», если оно отличается от основного.

Данные сохраняются как снимок условий на момент создания заявки.

Последующее переименование, изменение или удаление комиссии не переписывает уже созданную заявку.

Сообщение «Комиссия больше не найдена» может отображаться у старой заявки, если в ней осталась только ссылка на удалённую комиссию без сохранённых подробностей.

## Примеры настройки

{% hint style="info" %}
Значения ниже используются только для демонстрации работы настройки. Перед использованием рассчитайте собственные условия и проверьте итоговый курс в обоих вариантах его отображения.
{% endhint %}

### Общая комиссия типа «Динамическая»

Создадим вариант с отдельными значениями для обычного и обратного курса.

1. Нажмите «Добавить комиссию».
2. В «Название комиссии» укажите «Ускоренная обработка».
3. В «Описание» укажите «Обработка заявки в приоритетной очереди».
4. В «Тип комиссии» выберите «Динамическая».
5. В «Основная комиссия» укажите `-1%`.
6. В «Комиссия для обратного курса» укажите `+1%`.
7. Нажмите «Добавить комиссию».
8. Откройте созданную запись.
9. В «Где применять комиссию» выберите «Только выбранные направления».
10. Выберите необходимые направления.
11. Включите «Статус».
12. Нажмите «Сохранить комиссию».

При такой паре формул клиентский интерфейс сможет показывать значение `1%` и метку «Доплата» при обычном и обратном виде курса.

### Общая комиссия типа «Прибыль»

Создадим вариант, который система должна учитывать как прибыль обменника.

1. Нажмите «Добавить комиссию».
2. В «Название комиссии» укажите «Комиссия сервиса».
3. В «Описание» укажите «Вариант включает дополнительную обработку заявки».
4. В «Тип комиссии» выберите «Прибыль».
5. В «Размер комиссии» укажите `1.5%`.
6. Нажмите «Добавить комиссию».
7. Откройте созданную запись.
8. В «Где применять комиссию» выберите «Все направления».
9. Включите «Статус».
10. Нажмите «Сохранить комиссию».

Система самостоятельно применит `1.5%` как прибыль для обычного и обратного вида курса. Отдельное значение для обратного курса не требуется.

### Индивидуальная комиссия

Индивидуальный вариант создаётся непосредственно в одном направлении.

В панели управления откройте: **«Основное» — «Направление обмена» — «Список направлений»**

Откройте нужное направление, перейдите в «Комиссии» и выберите «Выбор комиссии».

1. Нажмите «Добавить».
2. В «Название списка комиссий» укажите «Выберите скорость обработки».
3. В «Описание списка комиссий» укажите «Выбор влияет на итоговый курс и порядок обработки заявки».
4. В «Название» укажите «Приоритетная обработка».
5. В «Описание» укажите «Заявка передаётся оператору в приоритетном порядке».
6. В «Основная комиссия» укажите `-0.5%`.
7. В «Комиссия для обратного курса» укажите `+0.5%`.
8. Нажмите «Сохранить».

После сохранения корректно заполненный индивидуальный вариант заменит общие комиссии только в этом направлении.

## Проверка перед использованием

После создания или изменения комиссии проверьте её на клиентском сайте до использования в рабочих направлениях.

1. Создайте общую комиссию в выключенном состоянии.
2. Проверьте название и описание на всех языках сайта.
3. Проверьте «Тип комиссии».
4. Убедитесь, что указана допустимая ненулевая формула.
5. Проверьте обычный и обратный вид курса.
6. Проверьте «Где применять комиссию».
7. Включите «Статус».
8. Откройте подходящее направление на `https://ваш_домен`.
9. Проверьте направление, которое не должно получать эту комиссию.
10. Сравните «Без комиссии» с каждым доступным вариантом.
11. Если используется «Несколько комиссий», проверьте последовательность выбора.
12. Проверьте название, описание, отображаемое значение и метку «Доплата».
13. Проверьте форму на компьютере и телефоне.
14. Создайте тестовую заявку.
15. Откройте её в административной панели.
16. Проверьте блок «Выбранные комиссии».
17. Сравните клиентский курс, суммы заявки и сохранённые условия.

Настройка работает правильно, если клиент видит только предназначенные для направления варианты, выбор корректно изменяет курс и суммы, а созданная заявка сохраняет применённые условия.

## Если комиссия не показывается

Если ожидаемый вариант отсутствует в клиентской форме, проверьте настройки последовательно.

1. Убедитесь, что общая комиссия включена.
2. Проверьте название на основном языке.
3. Убедитесь, что значение допустимое и ненулевое.
4. Проверьте «Где применять комиссию».
5. Если используются группы, убедитесь, что направление входит в нужную группу.
6. Проверьте, нет ли в направлении корректных индивидуальных вариантов, которые заменяют общие комиссии.
7. Для индивидуальной формулы убедитесь, что десятичное значение указано через точку.
8. Для обратного вида курса проверьте «Комиссия для обратного курса».
9. После изменения состава группы повторно откройте или обновите направление на клиентском сайте.

## Если итоговая сумма отличается от ожидаемой

При неожиданном результате проверьте не только выбранную комиссию, но и остальные настройки расчёта направления.

1. Проверьте, какой тип используется — «Динамическая» или «Прибыль».
2. Определите текущий вид курса — обычный или обратный.
3. Проверьте «Комиссия для обратного курса».
4. Если выбрано несколько вариантов, проверьте порядок их выбора.
5. Проверьте другие действующие комиссии направления.
6. Проверьте комиссию, зависящую от суммы обмена.
7. Проверьте остальные корректировки курса направления.
8. Сравните результат с вариантом «Без комиссии».
9. Создайте тестовую заявку и проверьте фактически сохранённые значения в блоке «Выбранные комиссии».


# Автоудаление неоплаченных заявок

Раздел «Автоудаление неоплаченных заявок» нужен для автоматической очистки старых неоплаченных заявок из рабочего потока операторов.

Важно: заявка не удаляется физически из базы данных. Система переводит её в статус «Заявка удалена». Такая заявка остаётся в истории, но больше не мешает операторам в активной работе.

Путь в панели управления: **«Основное» — «Направление обмена» — «Автоудаление неоплаченных заявок»**

<figure><img src="/files/cVZJSqag6Amk81npRXEP" alt=""><figcaption></figcaption></figure>

### Для чего нужен раздел

Автоудаление помогает:

<table><thead><tr><th width="307.0703125">Задача</th><th>Что даёт</th></tr></thead><tbody><tr><td>Убрать старые неоплаченные заявки</td><td>Операторы не видят лишние заявки в работе</td></tr><tr><td>Автоматизировать очистку</td><td>Не нужно вручную закрывать старые заявки</td></tr><tr><td>Настроить разные сроки ожидания</td><td>Для разных направлений можно задать разные правила</td></tr><tr><td>Сохранить историю</td><td>Заявка остаётся в системе со статусом «Заявка удалена»</td></tr><tr><td>Защититься от массовых ошибок</td><td>Есть лимиты безопасности, предпросмотр и Dry-run</td></tr></tbody></table>

### Как работает автоудаление

Система периодически проверяет заявки и ищет те, которые подходят под активные правила.

Заявка может быть автоматически переведена в статус «Заявка удалена», если она:

<table><thead><tr><th width="313.66015625">Условие</th><th>Описание</th></tr></thead><tbody><tr><td>Находится в выбранном статусе</td><td>Например, «Ожидается оплата»</td></tr><tr><td>Создана достаточно давно</td><td>Прошло время, указанное в правиле</td></tr><tr><td>Подходит под область действия</td><td>Глобальное правило или правило конкретного направления</td></tr><tr><td>Не была удалена ранее</td><td>Система не обрабатывает уже удалённые заявки</td></tr><tr><td>Не исключена другим правилом</td><td>Например, для направления отключено глобальное правило</td></tr></tbody></table>

### Как часто выполняется проверка

Фоновая проверка запускается автоматически примерно каждые 10 минут.

Пример:

<table><thead><tr><th width="312.12890625">Событие</th><th>Время</th></tr></thead><tbody><tr><td>Заявка создана</td><td>12:00</td></tr><tr><td>В правиле указано удаление через</td><td>30 минут</td></tr><tr><td>Заявка подходит под правило</td><td>12:30</td></tr><tr><td>Фоновая задача обработает заявку</td><td>примерно в ближайший запуск после 12:30</td></tr></tbody></table>

То есть автоудаление не всегда происходит ровно в секунду окончания срока. Небольшая задержка до следующего запуска фоновой задачи — нормальная работа системы.

## Создание правила

Чтобы создать правило:

1. Откройте раздел **«Основное» — «Направление обмена» — «Автоудаление неоплаченных заявок».**
2. Нажмите «Добавить правило».
3. Укажите название правила.
4. Настройте область действия.
5. Выберите режим правила.
6. Укажите статусы заявок.
7. Задайте время ожидания.
8. При необходимости настройте лимиты безопасности.
9. Нажмите «Проверить правило» или Dry-run.
10. После проверки сохраните правило.

## Поля правила

<figure><img src="/files/8d2zb5aYph7kQyRb4KgV" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="318.6796875">Поле</th><th>Описание</th></tr></thead><tbody><tr><td>Название правила</td><td>Удобное название для администратора</td></tr><tr><td>Приоритет</td><td>Порядок обработки правил</td></tr><tr><td>Область действия</td><td>Где действует правило: глобально или по направлениям</td></tr><tr><td>Режим правила</td><td>Как правило работает относительно других правил</td></tr><tr><td>Статусы заявок</td><td>Из каких статусов можно автоматически удалять заявки</td></tr><tr><td>Количество</td><td>Число времени ожидания</td></tr><tr><td>Единица времени</td><td>Минуты, часы или дни</td></tr><tr><td>Итоговое время</td><td>Итоговый срок в понятном виде</td></tr><tr><td>Максимум заявок за один запуск</td><td>Ограничение безопасности</td></tr><tr><td>Останавливать правило при превышении лимита</td><td>Защита от массового срабатывания</td></tr><tr><td>Статус правила</td><td>Включено или выключено</td></tr></tbody></table>

{% stepper %}
{% step %}

### Название правила

Название используется только для удобства управления.

Примеры хороших названий:

| Название                            | Когда использовать                |
| ----------------------------------- | --------------------------------- |
| Удалять неоплаченные через 30 минут | Общее правило                     |
| Наличные — ждать 2 часа             | Для наличных направлений          |
| VIP — не применять автоудаление     | Для исключения                    |
| Банки — удаление через 45 минут     | Для группы банковских направлений |
| {% endstep %}                       |                                   |

{% step %}

### Приоритет

Приоритет определяет порядок обработки правил.

Чем меньше число, тем выше приоритет.

<table><thead><tr><th width="174.38671875">Приоритет</th><th>Значение</th></tr></thead><tbody><tr><td>10</td><td>Высокий приоритет</td></tr><tr><td>100</td><td>Обычный приоритет</td></tr><tr><td>500</td><td>Низкий приоритет</td></tr></tbody></table>

Если правил немного, можно оставить значение по умолчанию
{% endstep %}
{% endstepper %}

## Область действия

Область действия определяет, где будет работать правило.

<table><thead><tr><th width="233.8125">Область</th><th>Описание</th></tr></thead><tbody><tr><td>Глобальное</td><td>Правило действует как общий шаблон по системе</td></tr><tr><td>Для направлений</td><td>Правило действует только для выбранных направлений</td></tr></tbody></table>

{% stepper %}
{% step %}

### Глобальное правило

Глобальное правило применяется ко всем направлениям, если для конкретного направления не настроено переопределение или отключение.

Пример:

<table><thead><tr><th width="230.56640625">Поле</th><th>Значение</th></tr></thead><tbody><tr><td>Название</td><td>Удалять неоплаченные через 30 минут</td></tr><tr><td>Область действия</td><td>Глобальное</td></tr><tr><td>Статус заявки</td><td>Ожидается оплата</td></tr><tr><td>Время</td><td>30 минут</td></tr></tbody></table>

Такое правило будет работать для всех направлений.
{% endstep %}

{% step %}

### Правило для направлений

Правило для направлений используется, когда для одного или нескольких направлений нужна отдельная логика.

Пример:

<table><thead><tr><th width="257.12109375">Направление</th><th>Правило</th></tr></thead><tbody><tr><td>Обычные направления</td><td>Удалять через 30 минут</td></tr><tr><td>Наличные направления</td><td>Удалять через 2 часа</td></tr><tr><td>VIP-направление</td><td>Не удалять автоматически</td></tr></tbody></table>

При создании можно выбрать несколько направлений. Система создаст отдельные правила для выбранных направлений.
{% endstep %}
{% endstepper %}

## Режим правила

В системе есть три режима.

<table><thead><tr><th width="292.984375">Режим</th><th>Для чего нужен</th></tr></thead><tbody><tr><td>Самостоятельное правило</td><td>Обычное отдельное правило</td></tr><tr><td>Переопределить глобальное правило</td><td>Заменить глобальное правило для направления</td></tr><tr><td>Отключить глобальное правило</td><td>Полностью отключить глобальное правило для направления</td></tr></tbody></table>

{% stepper %}
{% step %}

### Самостоятельное правило

Это обычный режим работы.

Если правило глобальное — оно работает по всей системе.\
Если правило создано для направления — оно работает только в выбранном направлении.

Пример:

<table><thead><tr><th width="202.30078125">Поле</th><th>Значение</th></tr></thead><tbody><tr><td>Направление</td><td>USDT → RUB</td></tr><tr><td>Статус</td><td>Ожидается оплата</td></tr><tr><td>Время</td><td>45 минут</td></tr><tr><td>Режим</td><td>Самостоятельное правило</td></tr></tbody></table>

Заявки по этому направлению будут удаляться через 45 минут, если останутся в выбранном статусе.
{% endstep %}

{% step %}

### Переопределить глобальное правило

Этот режим используется, если глобальное правило есть, но для конкретного направления нужен другой срок.

Пример:

<table><thead><tr><th width="295.37109375">Правило</th><th>Значение</th></tr></thead><tbody><tr><td>Глобальное правило</td><td>Удалять через 30 минут</td></tr><tr><td>Направление Cash USD → USDT</td><td>Ждать 3 часа</td></tr><tr><td>Режим</td><td>Переопределить глобальное правило</td></tr></tbody></table>

Итог:

<table><thead><tr><th width="268.7734375">Направления</th><th>Как работает</th></tr></thead><tbody><tr><td>Все обычные направления</td><td>Удаляются через 30 минут</td></tr><tr><td>Cash USD → USDT</td><td>Удаляется через 3 часа</td></tr></tbody></table>
{% endstep %}

{% step %}

### Отключить глобальное правило

Этот режим нужен, чтобы глобальное правило вообще не применялось к выбранному направлению.

Пример:

| Правило            | Значение                     |
| ------------------ | ---------------------------- |
| Глобальное правило | Удалять через 30 минут       |
| Направление        | Наличные USD → USDT          |
| Режим              | Отключить глобальное правило |

Итог: глобальное правило работает для всех направлений, кроме выбранного.

В этом режиме правило само ничего не удаляет. Оно только отключает действие выбранного глобального правила для направления.
{% endstep %}
{% endstepper %}

## Статусы заявок

В поле «Статусы заявок» выбираются статусы, из которых разрешено автоматически удалять заявки.

Обычно используются статусы:

<table><thead><tr><th width="290.203125">Статус</th><th>Когда использовать</th></tr></thead><tbody><tr><td>Ожидается оплата</td><td>Клиент создал заявку, но не оплатил</td></tr><tr><td>Время истекло</td><td>Срок оплаты уже закончился</td></tr><tr><td>Заявка отменена пользователем</td><td>Клиент сам отменил заявку</td></tr><tr><td>Заявка отклонена</td><td>Нужно архивировать старые отклонённые заявки</td></tr></tbody></table>

Система не даёт выбрать любые статусы подряд, чтобы случайно не удалить важные рабочие или оплаченные заявки.

## Время ожидания

Время ожидания задаётся двумя полями:

<table><thead><tr><th width="230.45703125">Поле</th><th>Пример</th></tr></thead><tbody><tr><td>Количество</td><td>30</td></tr><tr><td>Единица времени</td><td>Минуты</td></tr></tbody></table>

Доступные единицы времени:

<table><thead><tr><th width="194.5859375">Единица</th><th>Пример</th></tr></thead><tbody><tr><td>Минуты</td><td>30 минут</td></tr><tr><td>Часы</td><td>2 часа</td></tr><tr><td>Дни</td><td>1 день</td></tr></tbody></table>

Система дополнительно показывает итоговое время, чтобы было понятно, какой срок получится после настройки.

## От какой даты считается время

Время считается от даты создания заявки.

Пример:

<table><thead><tr><th width="270.4375">Событие</th><th>Значение</th></tr></thead><tbody><tr><td>Заявка создана</td><td>10:00</td></tr><tr><td>В правиле указано</td><td>60 минут</td></tr><tr><td>Заявка станет подходящей</td><td>после 11:00</td></tr></tbody></table>

Если после 11:00 заявка всё ещё находится в выбранном статусе, она может быть переведена в статус **«Заявка удалена».**

## Лимиты безопасности

Блок «Лимиты безопасности» защищает от случайного массового удаления заявок.

<table><thead><tr><th width="323.73046875">Поле</th><th>Описание</th></tr></thead><tbody><tr><td>Максимум заявок за один запуск</td><td>Сколько заявок можно обработать за один запуск</td></tr><tr><td>Останавливать правило при превышении лимита</td><td>Полностью остановить правило, если заявок найдено слишком много</td></tr></tbody></table>

Пример:

<table><thead><tr><th width="291.1796875">Настройка</th><th>Значение</th></tr></thead><tbody><tr><td>Максимум заявок</td><td>100</td></tr><tr><td>Найдено заявок</td><td>350</td></tr><tr><td>Останавливать при превышении</td><td>Включено</td></tr></tbody></table>

Результат: система не удалит заявки и заблокирует выполнение правила до ручной проверки.

## Проверить правило

Кнопка «Проверить правило» показывает, что произойдёт, если правило будет запущено.

Проверка может показать:

<table><thead><tr><th width="267.796875">Данные</th><th>Описание</th></tr></thead><tbody><tr><td>Количество подходящих заявок</td><td>Сколько заявок сейчас подходит под правило</td></tr><tr><td>Примеры заявок</td><td>Какие заявки могут быть обработаны</td></tr><tr><td>Статусы</td><td>Из каких статусов будут удаляться заявки</td></tr><tr><td>Направления</td><td>Какие направления затрагиваются</td></tr><tr><td>Конфликты</td><td>Есть ли пересечение с другими правилами</td></tr><tr><td>Лимит безопасности</td><td>Сработает ли ограничение</td></tr></tbody></table>

Проверка ничего не меняет в заявках. Это безопасный предпросмотр.

## Что происходит при срабатывании правила

Когда правило реально срабатывает, система:

1. Находит подходящую заявку.
2. Проверяет её статус.
3. Проверяет направление.
4. Проверяет, не удалена ли она уже.
5. Проверяет исключения и переопределения.
6. Переводит заявку в статус «Заявка удалена».
7. Записывает лог действия.
8. Сохраняет старый и новый статус.

## Почему заявка может быть пропущена

Заявка может не удалиться, если:

<table><thead><tr><th width="317.26171875">Причина</th><th>Пояснение</th></tr></thead><tbody><tr><td>Статус уже изменился</td><td>Клиент оплатил или оператор обработал заявку</td></tr><tr><td>Заявка создана позже порога</td><td>Ещё не прошло нужное время</td></tr><tr><td>Направление не подходит</td><td>Правило действует на другое направление</td></tr><tr><td>Правило выключено</td><td>Неактивные правила не выполняются</td></tr><tr><td>Глобальное правило отключено для направления</td><td>Есть исключение</td></tr><tr><td>Сработал лимит безопасности</td><td>Система остановила массовую обработку</td></tr><tr><td>Заявка уже удалена</td><td>Повторная обработка не нужна</td></tr></tbody></table>

## Конфликты правил

Конфликт возникает, когда два активных правила претендуют на одни и те же заявки.

Пример конфликта:

<table><thead><tr><th width="154.984375">Правило</th><th>Настройка</th></tr></thead><tbody><tr><td>Правило 1</td><td>Ожидается оплата → удалить через 30 минут</td></tr><tr><td>Правило 2</td><td>Ожидается оплата → удалить через 1 час</td></tr></tbody></table>

Если оба правила глобальные и работают с одним статусом, система покажет конфликт.

Правила в режиме **«Отключить глобальное правило»** не считаются конфликтом, потому что они специально нужны для исключения.

## Как работает глобальное правило с исключениями

Пример 1. Переопределение

<table><thead><tr><th width="197.17578125">Правило</th><th>Настройка</th></tr></thead><tbody><tr><td>Глобальное</td><td>Удалять через 30 минут</td></tr><tr><td>Для BTC → RUB</td><td>Переопределить и удалять через 90 минут</td></tr></tbody></table>

Результат:

<table><thead><tr><th width="221.58203125">Направление</th><th>Время удаления</th></tr></thead><tbody><tr><td>Все направления</td><td>30 минут</td></tr><tr><td>BTC → RUB</td><td>90 минут</td></tr></tbody></table>

Пример 2. Отключение

<table><thead><tr><th width="212.91796875">Правило</th><th>Настройка</th></tr></thead><tbody><tr><td>Глобальное</td><td>Удалять через 30 минут</td></tr><tr><td>Для Cash → USDT</td><td>Отключить глобальное правило</td></tr></tbody></table>

Результат:

<table><thead><tr><th width="203.59375">Направление</th><th>Как работает</th></tr></thead><tbody><tr><td>Все направления</td><td>Удаляются через 30 минут</td></tr><tr><td>Cash → USDT</td><td>Не удаляется этим глобальным правилом</td></tr></tbody></table>

## Рекомендуемые сценарии настройки

{% stepper %}
{% step %}

### Обычное правило для всех направлений

<table><thead><tr><th width="224.57421875">Поле</th><th>Значение</th></tr></thead><tbody><tr><td>Название</td><td>Удалять неоплаченные через 30 минут</td></tr><tr><td>Область действия</td><td>Глобальное</td></tr><tr><td>Режим</td><td>Самостоятельное правило</td></tr><tr><td>Статусы</td><td>Ожидается оплата</td></tr><tr><td>Время</td><td>30 минут</td></tr><tr><td>Статус правила</td><td>Включено</td></tr></tbody></table>
{% endstep %}

{% step %}

### Увеличенный срок для наличных

<table><thead><tr><th width="229.7578125">Поле</th><th>Значение</th></tr></thead><tbody><tr><td>Название</td><td>Наличные — ждать 2 часа</td></tr><tr><td>Область действия</td><td>Для направлений</td></tr><tr><td>Режим</td><td>Переопределить глобальное правило</td></tr><tr><td>Направление</td><td>Наличное направление</td></tr><tr><td>Время</td><td>2 часа</td></tr></tbody></table>
{% endstep %}
{% endstepper %}

## Рекомендации

| Ситуация                                      | Рекомендация                                      |
| --------------------------------------------- | ------------------------------------------------- |
| Большинство заявок должны удаляться одинаково | Создайте глобальное правило                       |
| Для направления нужен другой срок             | Используйте переопределение                       |
| Для направления автоудаление не нужно         | Используйте отключение глобального правила        |
| Не уверены в результате                       | Сначала используйте «Проверить правило» и Dry-run |
| Правило может затронуть много заявок          | Настройте лимит безопасности                      |
| Есть несколько похожих правил                 | Проверьте конфликты                               |
| Направления с наличными                       | Обычно лучше ставить больший срок ожидания        |
| Автоматические направления                    | Можно использовать более короткий срок            |

## Частые вопросы

<details>

<summary>Заявка удаляется из базы?</summary>

Нет. Она переводится в статус «Заявка удалена» и остаётся в истории.

</details>

<details>

<summary>Можно ли восстановить такую заявку?</summary>

Это зависит от логики обработки заявок и доступных действий в карточке. Но сама запись сохраняется.

</details>

<details>

<summary>Почему заявка не удалилась ровно через 30 минут?</summary>

Проверка выполняется фоново примерно каждые 10 минут. Поэтому возможна небольшая задержка.

</details>

<details>

<summary>Можно ли сделать разные сроки для разных направлений?</summary>

Да. Для этого используйте правила с областью действия «Для направлений».

</details>

<details>

<summary>Что лучше: удалить через 30 минут или через 1 час?</summary>

Для автоматических онлайн-направлений обычно достаточно 30–60 минут. Для наличных и ручных направлений лучше ставить больше времени.

</details>

<details>

<summary>Зачем нужен Dry-run?</summary>

Чтобы проверить правило без реального изменения заявок.

</details>


# Группы

**Группа направлений** — это папка, в которую вы складываете отдельные направления обмена. Зачем это удобно:

* Легче навести порядок: разбить направления по тематикам (например, «Крипто», «Банк РФ», «USD» и т. д.).
* Массовые изменения за один раз: поменяли прибыль, комиссии или тексты в **группе** — изменения применились ко **всем** направлениям внутри.
* Быстрее работать: искать, сортировать, открывать сразу «пакет» направлений, а не по одному.

***

## Быстрый старт (3 шага)

<figure><img src="/files/8K3Xc0z8IyOWfVoZ56jB" alt="" width="563"><figcaption></figcaption></figure>

1. **Создайте группу.** В разделе **«Основное — Направление обмена** — **Группы»,**  нажмите **«Добавить группу»**, укажите название (например, «Крипто»), сохраните.
2. **Откройте группу** → нажмите карандаш → в поле **«Разрешённые направления»** выберите нужные направления из списка (поиск по названию есть).
3. **Отсортируйте группы** простым перетягиванием — порядок сохранится автоматически.

Готово. Теперь можно использовать **Групповое редактирование** для быстрых изменений.

***

### Подробная инструкция

{% stepper %}
{% step %}

### Создание группы

<figure><img src="/files/XVDlag3xUgCytjedqYQ3" alt=""><figcaption></figcaption></figure>

1. Зайдите: **«Основное — Направление обмена** — **Группы»**.
2. Нажмите **«Добавить группу»** (в правом верхнем углу списка).
3. Введите **Название группы** — коротко и понятно (например, «RUB‑банки»).
4. Нажмите **«Добавить»** — группа появится в списке.
   {% endstep %}

{% step %}

### Переименование и разрешённые направления

<figure><img src="/files/PbdBvrTS1BigAnQGFaru" alt=""><figcaption></figcaption></figure>

1. В списке групп нажмите на **синее название** или иконку карандаша — откроется окно **«Изменить группу»**.
2. Поле **«Название группы»** — поменяйте текст при необходимости.
3. Блок **«Разрешённые направления»** — это список направлений, которые будут привязаны к этой группе.
   * Нажмите в поле — откроется выпадающее окно выбора.
   * Воспользуйтесь **поиском** (начните вводить название).
   * Отмечайте нужные направления (можно несколько). Выбранные отображаются чипами (маленькими метками).
   * Кнопка **«Сбросить»** очистит выбор мгновенно.
4. Нажмите **«Сохранить»**.

{% hint style="info" %}
Подсказка: если список большой, сперва напишите 2–3 буквы из названия направления — система быстро сузит выбор.
{% endhint %}
{% endstep %}

{% step %}

### Массовое редактирование группы

<figure><img src="/files/ZeJfKUqWBg0ZhaeCocQ3" alt=""><figcaption></figcaption></figure>

**Задача:** быстро обновить параметры сразу у **всех направлений** внутри группы.

1. В строке нужной группы нажмите кнопку **«Массово»**.
2. Откроется окно **«Групповое редактирование — \[название группы]»**.
3. В поле **«Шаблон»** выберите, что будем менять.
4. Внизу нажмите **«Сохранить»** → появится **подтверждение** с:
   * предупреждением о массовом применении,
   * **предпросмотром данных** (что именно изменится),
   * свернутым блоком **«Направления»** со счётчиком (можно раскрыть: там поиск и навигация по списку),
   * галочкой **«Больше не показывать 24 часа»** (если уверены в действиях).
5. Нажмите **«Применить изменения»** — настройки обновятся **во всех** направлениях группы.

<figure><img src="/files/CpjmRTUFANCyQqDmzn85" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

## Сортировка групп (перетягивание мышкой)

<figure><img src="/files/PepQ2bsv1ymOtPNe3qPP" alt=""><figcaption></figcaption></figure>

* Наведите на «ручку» **⋮⋮** слева от названия группы и **перетащите** её вверх/вниз.
* Порядок сохраняется **автоматически** сразу после отпускания.
* При успешном сохранении вы увидите уведомление **«Порядок обновлён»**.

***

### Если что-то пошло не так

* Обновите страницу. Убедитесь, что порядок и привязки подтянулись.
* Проверьте права доступа (иногда кнопки выглядят активными, но права ограничены).
* Если при сохранении вы увидели ошибку — попробуйте повторить через 10–20 секунд: возможно, было кратковременное соединение.
* Сообщите техподдержке: скриншот, время, что делали.


# Уведомления

Раздел **«Уведомления»** используется для размещения информационных сообщений на клиентском сайте. Администратор может показать сообщение всем клиентам, связать его с определённой валютой или ограничить конкретным направлением обмена.

Уведомления могут отображаться на главной странице обмена и на странице оплаты заявки. Для каждой записи отдельно настраиваются аудитория, место и способ показа, текст, оформление, расписание, языковые версии и порядок среди других уведомлений.

{% hint style="warning" %}
Раздел «Уведомления» не отправляет сообщения по E-mail, в Telegram или по SMS и не создаёт уведомления для операторов в административной панели. Здесь настраиваются только сообщения, которые клиент видит непосредственно на сайте.
{% endhint %}

### Где находится раздел

В панели управления откройте: **«Основное» — «Уведомления»**

<figure><img src="/files/YhlCeXA0CVvPWG9Yk7zc" alt=""><figcaption></figcaption></figure>

### Права доступа

Права настраиваются в разделе:

**«Пользователи» — «Список групп пользователей»**

Откройте нужную группу и найдите разрешения в блоке **«Базовое управление»**.

**«Просмотр уведомлений клиентов»** позволяет открыть раздел и просматривать созданные уведомления. Без права управления сотрудник не сможет изменять их.

**«Управление уведомлениями клиентов»** позволяет создавать, редактировать, включать, отключать, удалять и сортировать уведомления.

После изменения прав сохраните группу и проверьте доступ под учётной записью сотрудника. При праве просмотра должен быть доступен список уведомлений. При праве управления дополнительно должны быть доступны создание, изменение статуса, редактирование, удаление и сортировка.

### Как определяется показ уведомления

Уведомление показывается клиенту, если одновременно выполняются его условия:

* включён **«Статус»**;
* текущая дата входит в установленный период показа;
* открытая страница выбрана в **«Где показывать»**;
* текущая валюта или направление соответствует аудитории уведомления.

Если подходят несколько уведомлений, они не заменяют друг друга. Клиент может одновременно увидеть общее сообщение, уведомление для отдаваемой или получаемой валюты и отдельное сообщение для конкретного направления.

На главной странице условия пересчитываются по выбранному в форме направлению. При смене валютной пары набор подходящих сообщений обновляется.

На странице оплаты используются валюты и направление уже созданной заявки.

### Список уведомлений

В верхней части страницы доступны вкладки:

* **«Все уведомления»**;
* **«Для всех»**;
* **«Валюта»**;
* **«Направление»**.

Рядом с названием вкладки показывается количество относящихся к ней записей.

В таблице используются столбцы **«Аудитория»**, **«Показ»**, **«Текст»**, **«Расписание»** и **«Статус»**.

**«Аудитория»** показывает, относится ли запись ко всем клиентам, валюте или направлению.

**«Показ»** содержит выбранные страницы, способ показа и, когда это применимо, расположение на главной странице.

**«Текст»** показывает тип уведомления, заголовок и часть основного текста.

**«Расписание»** показывает период, в течение которого уведомление может отображаться.

**«Статус»** позволяет определить, включена запись или отключена.

Пользователь с правом управления может открыть уведомление нажатием на название аудитории, быстро изменить его статус, переместить запись или удалить её.

Если записей нет, отображается сообщение **«Уведомления пока не добавлены»**.

***

## Создание уведомления

Нажмите **«Добавить уведомление»**.

<figure><img src="/files/nilpeYLKMuZF2AqwYEbR" alt=""><figcaption></figcaption></figure>

Затем:

1. Выберите аудиторию: **«Для всех»**, **«Валюта»** или **«Направление»**.
2. Для аудитории **«Валюта»** или **«Направление»** выберите соответствующий объект.
3. Для валюты настройте **«Сторона валюты»**.
4. В **«Где показывать»** выберите клиентские страницы.
5. Выберите **«Способ показа»**.
6. Для сообщения в блоке главной страницы выберите расположение.
7. Укажите **«Тип уведомления»**.
8. При необходимости настройте собственные цвета.
9. Установите расписание.
10. Заполните заголовок и **«Текст уведомления»** на нужных языках.
11. Проверьте **«Статус»**.
12. Нажмите **«Сохранить»**.

Для аудитории **«Валюта»** необходимо выбрать валюту, а для **«Направление»** — направление обмена. В **«Где показывать»** должна быть выбрана хотя бы одна страница.

#### Начальные значения новой записи

При создании нового уведомления используются следующие значения:

* аудитория — **«Валюта»**;
* **«Сторона валюты»** — **«Отдаю и получаю»**;
* **«Способ показа»** — **«В блоке страницы»**;
* **«Тип уведомления»** — **«Информация»**;
* расположение на главной — **«Вверху страницы»**;
* место показа — **«Главная»**;
* индивидуальные цвета не заданы;
* расписание не ограничено;
* **«Статус»** включён.

Новая запись добавляется в конец списка.

## Аудитория уведомления

Тип аудитории определяет, для каких валют и направлений сообщение может быть показано.

После создания изменить сам тип аудитории нельзя.

{% stepper %}
{% step %}

### Для всех

Аудитория **«Для всех»** показывает сообщение независимо от выбранной валюты или направления.

Этот вариант подходит для информации, относящейся ко всему обменному пункту, например технических работ, изменения режима работы или общего предупреждения.

Выбирать валюту или направление не требуется.
{% endstep %}

{% step %}

### Валюта

Аудитория **«Валюта»** связывает уведомление с конкретной валютой.

После выбора валюты используется поле **«Сторона валюты»**:

* **«Отдаю»** — сообщение показывается, когда клиент отдаёт выбранную валюту;
* **«Получаю»** — сообщение показывается, когда клиент получает выбранную валюту;
* **«Отдаю и получаю»** — достаточно участия валюты с любой стороны обмена.

Например, если для USDT TRC20 выбрано **«Отдаю»**, такое уведомление не применяется к направлению, в котором клиент получает USDT TRC20.

**«Сторона валюты»** определяет условие показа, а не визуальное расположение сообщения. Уведомление для стороны **«Отдаю»** технически можно разместить в другом блоке формы, но это не меняет правило отбора.

При создании новой записи доступны действующие валюты. Архивные валюты не предлагаются для новой привязки.

Если уже привязанная валюта позже архивирована, уведомление сохраняется. После возвращения валюты и связанных направлений в работу оно снова сможет применяться.
{% endstep %}

{% step %}

### Направление

Аудитория **«Направление»** ограничивает сообщение одной конкретной валютной парой.

Последовательность валют имеет значение.&#x20;

Например: `USDT - Сбербанк` и `Сбербанк - USDT` являются разными направлениями.

Если сообщение должно использоваться и для обратной пары, создайте отдельное уведомление либо используйте аудиторию **«Валюта»**, если она подходит по смыслу.

Удалённые направления и направления, связанные с архивными валютами, для новой привязки не предлагаются.

{% hint style="warning" %}
При удалении направления обмена связанные с ним уведомления также удаляются. Перед удалением направления проверьте, нет ли у него текста, который необходимо сохранить или перенести.
{% endhint %}
{% endstep %}
{% endstepper %}

### Изменение аудитории после создания

Для записи с аудиторией **«Валюта»** можно выбрать другую валюту и изменить **«Сторона валюты»**.

Для записи **«Направление»** можно выбрать другое направление.

Преобразовать существующее уведомление **«Валюта»** в **«Для всех»** или **«Направление»** нельзя. Для другого типа аудитории создайте новую запись.

## Где показывать уведомление

В блоке **«Где показывать»** доступны:

* **«Главная»**;
* **«Оплата заявки»**.

Можно выбрать одну страницу или обе.

Если одна запись используется сразу на двух страницах, у неё остаются общими аудитория, текст, тип, способ показа, цвета, расписание и статус.

Если для главной страницы и оплаты нужны разные тексты, способы показа, цвета или расписание, создайте отдельные уведомления.

{% stepper %}
{% step %}

### Главная

На главной странице уведомление определяется по направлению, выбранному клиентом.

Для **«В блоке страницы»** доступны следующие расположения.

**«Вверху страницы»** — над всей формой обмена.

**«В блоке Отдаёте»** — в области выбора отдаваемой валюты перед поиском и списком валют.

**«В блоке Получаете»** — в области выбора получаемой валюты перед поиском и списком валют.

**«В блоке ввода данных»** — перед полями данных клиента и платёжных реквизитов.

**«Под формой обмена»** — после формы обмена.

В компактном интерфейсе сообщения в блоках **«Отдаёте»** и **«Получаете»** могут становиться видимыми только после открытия соответствующего списка валют.

Если перед вводом данных используется **«Формальное описание перед вводом данных»**, уведомление в блоке ввода данных появится после перехода клиента к этому этапу.

Расположение используется только для способа **«В блоке страницы»**. Для всплывающего окна оно не применяется.
{% endstep %}

{% step %}

### Оплата заявки

На странице оплаты аудитория определяется по данным созданной заявки.

При способе **«В блоке страницы»** сообщение выводится в основной области страницы после платёжной информации и связанных с оплатой блоков.

Отдельного расположения для страницы оплаты нет.
{% endstep %}
{% endstepper %}

## Способ показа

В поле **«Способ показа»** доступны два варианта:

{% stepper %}
{% step %}

### В блоке страницы

Сообщение постоянно находится в выбранном месте, пока выполняются его условия.

Если подходят несколько уведомлений, они отображаются одновременно.

Клиент не может закрыть отдельное уведомление этого типа.

Этот режим подходит для инструкции или предупреждения, которое должно оставаться видимым во время работы со страницей.

Настройка **«Показывать всплывающее окно один раз за сессию»** для него не используется.
{% endstep %}

{% step %}

### Всплывающее окно

Сообщение открывается поверх страницы.

Если подходят несколько всплывающих уведомлений, они показываются последовательно в настроенном порядке. Клиент видит номер текущего сообщения, например **«1 из 3»**.

Для перехода используются **«Далее»** и **«Понятно»**.

Закрытие крестиком, клавишей `Escape` или нажатием за пределами окна также закрывает текущее уведомление и переводит клиента к следующему.

Пока окно открыто, взаимодействие с основной страницей ограничено.

{% hint style="warning" %}
Закрытие всплывающего окна не является подтверждением согласия клиента и не изменяет заявку.

Если требуется обязательное ознакомление перед заполнением формы, используйте «Формальное описание перед вводом данных» в информации валюты или направления.
{% endhint %}
{% endstep %}
{% endstepper %}

### Показывать всплывающее окно один раз за сессию

Поле **«Показывать всплывающее окно один раз за сессию»** доступно только для всплывающего способа.

Если настройка выключена, закрытое сообщение может появиться снова после обновления страницы, её повторного открытия или смены направления.

Если настройка включена, после закрытия это уведомление больше не показывается в текущей сессии вкладки браузера.

Правило относится ко всему уведомлению. Если одна запись выбрана одновременно для **«Главная»** и **«Оплата заявки»**, закрытие на главной странице может скрыть её и на странице оплаты в той же сессии.

При новой сессии сообщение снова может появиться.

После сохранения изменений самого уведомления оно считается обновлённой версией и может снова показываться клиенту, который уже закрывал предыдущую.

Изменение только значения пользовательского шорткода версию уведомления не меняет.

## Оформление и расписание

### Тип уведомления

В поле **«Тип уведомления»** доступны:

* **«Информация»**;
* **«Успешно»**;
* **«Предупреждение»**;
* **«Ошибка»**.

Тип определяет стандартное визуальное оформление: цвета, значок и акцент сообщения.

Он не изменяет логику заявки. Например, тип **«Ошибка»** сам по себе не блокирует создание заявки, не останавливает оплату и не меняет её статус.

### Цвета уведомления

В блоке **«Цвета уведомления»** можно переопределить стандартные цвета.

Для **«Светлая тема»** настраиваются **«Фон»** и **«Текст»**.

Для **«Тёмная тема»** также настраиваются **«Фон»** и **«Текст»**.

Цвет можно выбрать через палитру или указать полное шестизначное HEX-значение:

`#EFF6FF`

Если отдельное поле оставить пустым, используется стандартный цвет выбранного **«Тип уведомления»**.

Собственные цвета меняют фон и текст. Значок, рамка и другие визуальные элементы продолжают зависеть от типа.

После сохранения отдельно проверьте светлую и тёмную тему на клиентском сайте.

### Расписание показа

Период задаётся в поле **«Начало показа — Окончание показа»**.

Если даты не выбраны, в списке отображается **«Без расписания»**.

Можно указать обе даты, только дату начала либо один календарный день.

Дата начала входит в период полностью. Показ начинается с начала выбранного дня.

Дата окончания также включается полностью, поэтому сообщение остаётся доступным до конца этого дня.

Если указана только дата начала, показ не ограничивается конечной датой.

Дата окончания не может быть раньше даты начала.

Отдельные часы, дни недели и повторяющиеся периоды в этой настройке не задаются.

### Статус

Поле **«Статус»** разрешает или запрещает показ записи.

Включённое уведомление участвует в подборе, если выполняются аудитория, место показа и расписание.

Отключённое уведомление клиентам не показывается.

Если сообщение должно начать показываться в будущем, его можно оставить включённым и задать дату начала.

Статус можно изменить в форме редактирования или непосредственно в списке.

## Проверка результата

После сохранения проверьте уведомление в том же сценарии, для которого оно создано.

1. Убедитесь, что **«Статус»** включён.
2. Проверьте **«Начало показа — Окончание показа»**.
3. Откройте `https://ваш_домен`.
4. Для **«Главная»** выберите подходящее направление.
5. Для аудитории **«Валюта»** проверьте правильную **«Сторона валюты»**.
6. Для аудитории **«Направление»** откройте именно выбранную валютную пару.
7. Проверьте место отображения сообщения.
8. Переключите светлую и тёмную тему, если изменялись цвета.
9. Переключите языки сайта и проверьте тексты.
10. Для **«Оплата заявки»** откройте безопасную тестовую заявку.
11. Проверьте замену шорткодов.
12. Для всплывающих уведомлений проверьте их порядок и поведение после закрытия.

Если уведомление размещено **«В блоке „Отдаёте“»** или **«В блоке „Получаете“»**, дополнительно проверьте компактное отображение, открыв соответствующий список валют.

При включённом **«Показывать всплывающее окно один раз за сессию»** повторный тест выполняйте в новой сессии вкладки браузера.

Настройка работает правильно, если сообщение появляется только для выбранной аудитории, на нужной странице, в заданный период и с ожидаемым содержанием.

***

<details>

<summary>Если уведомление не показывается</summary>

Сначала сравните текущий клиентский сценарий с условиями самой записи.

Проверьте **«Статус»**, расписание, **«Где показывать»**, выбранную валюту или направление и **«Сторона валюты»**.

Для аудитории **«Направление»** убедитесь, что клиент открыл именно настроенную пару, а не обратное направление.

Если уведомление расположено в **«В блоке „Отдаёте“»** или **«В блоке „Получаете“»**, в компактном интерфейсе откройте соответствующий список валют.

Для всплывающего сообщения с включённым показом один раз за сессию проверьте его в новой сессии вкладки.

После исправления повторите тот же клиентский сценарий. Уведомление должно появиться в выбранном месте.

</details>

<details>

<summary>Если «Сохранить» недоступно</summary>

Для аудитории **«Валюта»** должна быть выбрана валюта.

Для **«Направление»** необходимо выбрать направление.

Также в **«Где показывать»** должна быть отмечена хотя бы одна страница.

После заполнения этих обязательных параметров повторно проверьте возможность сохранения.

</details>

<details>

<summary>Если уведомление не сохраняется</summary>

Проверьте обязательный **«Текст уведомления»** на основном языке сайта.

Если используются собственные цвета, убедитесь, что они указаны в поддерживаемом формате.

Проверьте также даты: окончание периода не может быть раньше начала.

Для аудитории **«Валюта»** или **«Направление»** выбранный объект должен быть доступен для привязки.

После исправления нажмите **«Сохранить»** и убедитесь, что запись отображается в списке.

</details>

<details>

<summary>Если показывается слишком много всплывающих окон</summary>

На одной странице могут одновременно подходить уведомления **«Для всех»**, **«Валюта»** и **«Направление»**.

Откройте вкладку **«Все уведомления»** и проверьте активные записи для текущей аудитории, страницы и расписания.

Все подходящие всплывающие сообщения объединяются в одну последовательность и показываются в настроенном порядке.

</details>


# Резервы




---

[Next Page](/llms-full.txt/1)

