{{define "content"}}

← все инструкции

Как разместить кабинет клиента на хостинге

Речь о нашем модуле bj-lk — кабинете, который клиенты открывают в браузере. Он ставится отдельно от ядра: на веб-сервер депозитария или на обычный хостинг с выделенным именем. Своей базы у кабинета нет, данные клиентов он не хранит — берёт у ядра на время запроса.

Два варианта размещения

ГдеЧто скачатьКак работает
Обычный хостинг с PHP («папка сайта»)«Скачать для PHP-хостинга» — index.php и .htaccessСтраницы собирает ядро. На хостинге лежит ретранслятор: он передаёт запросы браузера ядру и отдаёт ответы. Ни базы, ни данных клиентов на хостинге нет. Нужны PHP 8.1+, curl, sqlite.
Свой сервер или VPS с Linux«Скачать для своего сервера» — программа bj-lkУстановщик спросит, где собирать страницы: в ядре (программа — такой же ретранслятор) или на месте (программа рисует страницы сама из данных ядра).

В обоих случаях ключа в архиве нет — его вводят в установщике, открыв адрес кабинета в браузере. Способы связи с ядром (кабинет → ядро или ядро → кабинет) одинаковы для всех вариантов.

Шаг 1. Ключ и архив

Настройки → «Кабинет клиента» → «Кабинет клиента на своём сервере»: создайте ключ доступа (он показан на странице целиком — его нужно ввести в установщике) и скачайте архив. В архиве — исполняемый файл, служба systemd, файл настроек службы, установщик и README. Ключа в архиве нет.

Шаг 2а. PHP-хостинг: файлы в каталог сайта

Создайте в панели хостинга домен (например, lk.депозитарий.ru) с сертификатом, скопируйте index.php и .htaccess в его каталог и откройте адрес в браузере — запустится установщик (шаг 3). Настройки ретранслятор положит в каталог bj-lk-data рядом с сайтом, если хостинг разрешает туда писать, иначе — в data внутри сайта, закрытый правилами .htaccess. Если у хостинга nginx без .htaccess — правила из README архива.

Шаг 2б. Свой сервер: файлы на сервер и запуск

tar xzf bj-lk-ГГГГ-ММ-ДД.tar.gz
cd bj-lk
sudo ./install.sh          # на своём сервере: заводит службу bj-lk
# или на хостинге, где можно держать программу запущенной:
LISTEN=127.0.0.1:8099 ./bj-lk

install.sh заводит системного пользователя bjlk, кладёт программу в /opt/bj-lk, каталог данных — /var/lib/bj-lk, и включает службу. Сам кабинет слушает только 127.0.0.1:8099.

Шаг 3. Установщик в браузере

Откройте адрес кабинета — до настройки любая страница ведёт в установщик, как у обычных веб-приложений. Он делает три шага:

  1. Проверка сервера: каталог данных доступен для записи, соединение защищено (https), адрес кабинета.
  2. Связь с ядром: способ связи (кабинет обращается к ядру / ядро подключается к кабинету), адрес ядра и ключ доступа. В прямом режиме связь проверяется до сохранения; в режиме ожидания страница ждёт, пока ядро подключится.
  3. Администратор кабинета: логин и пароль сотрудника, который будет видеть список клиентов. Учётная запись заводится в ядре; если администратор уже есть, шаг пропускается.

Настройки сохраняются в lk.json (каталог данных, права 0600), после чего установщик закрывается. Чтобы пройти его заново — удалите этот файл. Установка без браузера: заполните lk.env — окружение перекрывает файл установщика.

Шаг 4. Публикация наружу

Перед кабинетом ставится nginx с сертификатом TLS — пример конфигурации есть в README архива. Наружу открыт только 443 порт сервера кабинета.

Связь с ядром — два способа

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

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

Включается в настройках ядра: «Кабинет клиента» → «Как кабинет и ядро находят друг друга» → «Ядро подключается к кабинету», рядом — адрес кабинета. В файле кабинета при этом стоит BJ_MODE=agent, а BJ_URL не задан. Состояние связи видно там же: подключено ли ядро, когда был последний обмен, сколько запросов обслужено.

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

Что с данными

Какой хостинг подходит

Кабинет — одна программа (Linux, x86-64), которая должна быть постоянно запущена и слушать порт. Подходят: свой сервер или VPS, хостинг с поддержкой собственных приложений (Node/Go/Python через SSH или панель). Обычный PHP-хостинг «папка с файлами» программу запустить не сможет — там нужен либо тариф с приложениями, либо VPS у того же хостера.

API личного кабинета (ESIA Finance V1)

Bridge-and-Join-s реализует контракт ESIA Finance V1 на стороне back-office. ЛК клиента отправляет нам заявку, мы возвращаем подтверждение и потом колбэк со статусом. Полная спецификация: docs/lk-contract/v1/openapi.yaml.

1. Аутентификация

HTTP Basic. Учётные записи и пароли согласуются с командой ЛК.

curl -u "lk-user:lk-password" \
  -H "Content-Type: application/json" \
  http://10.10.10.22:8080/api/v1/back_office/claims/
{{if devOn}}

На M2 (дев-стенд) аутентификация отключена; включится на M3 — параллельно с подключением реального ЛК.

{{end}}

2. Создание заявки M2M

POST /api/v1/back_office/claims/

Тело — JSON, кодировка UTF-8. Минимально нужно: анкета инвестора, ИНН передающего и принимающего депозитария, информация о стоимости, массив ценных бумаг с количеством и счетами, подписанный XML заявления (base64).

curl -X POST http://10.10.10.22:8080/api/v1/back_office/claims/ \
  -H "Content-Type: application/json" \
  -d @docs/lk-contract/v1/examples/claim-request.json

Ответ 201 Created:

{
  "id": "c02a1d5e-c2af-4799-bab4-953f133c5133",
  "status": "submitted_to_nsd",
  "created_at": "2026-03-02T14:30:45Z",
  "success": true
}

3. Получение заявки и её статуса

GET /api/v1/back_office/claims/{id}

curl http://10.10.10.22:8080/api/v1/back_office/claims/c02a1d5e-c2af-4799-bab4-953f133c5133

Возвращает полную карточку с историей FSM, ответом НРД и решением принимающей стороны (когда оно пришло).

4. Список заявок

GET /api/v1/back_office/claims с query-фильтрами: status, investor_id, created_from, created_to, limit, offset.

curl "http://10.10.10.22:8080/api/v1/back_office/claims?status=confirmed&limit=20"

5. Callback статуса (мы → ЛК)

Когда сделка меняет статус (подтверждена принимающей стороной, отклонена, или произошёл таймаут), bj-server делает PATCH {LK_BASE}/api/v1/back_office/claims/{id}:

{
  "claim_id": "c02a1d5e-c2af-4799-bab4-953f133c5133",
  "new_status": "confirmed",
  "updated_at": "2026-03-02T14:38:12Z",
  "nsd_response": {
    "guid": "...",
    "status_code": "INFO",
    "responses": [{"reference_id": "M2M2026...", "code": "01", "text": "..."}]
  }
}

Адрес ЛК указывается в Настройка → Callback в ЛК или через переменную BJ_LK_CALLBACK_URL.

6. Формат ошибок

Любая ошибка возвращается в формате, идентичном ESIA Finance V1:

{
  "error": true,
  "status": 422,
  "code": "invalid_signature",
  "title": "Подпись заявления не прошла проверку",
  "meta": {
    "message": "Сертификат подписанта недействителен или цепочка доверия не построена.",
    "errors": [{"field": "signed_document", "message": "..."}]
  }
}
{{if devOn}}

7. Эмулятор ЛК для тестов

На дев-стенде доступен lk-emulator на порту 8083 — имитация ЛК. Он сам регистрирует свой URL в bj-server как callback-приёмник.

{{end}}

{{if devOn}}8{{else}}7{{end}}. Подписание заявления

ЛК должен подписать заявление XMLDSig (ГОСТ или RSA) и положить в поле signed_document (base64). Мы проверяем подпись через crypto-service — см. инструкцию по криптографии.

{{if devOn}}

На M2 проверка подписи отключена (stub). На M3-M4 включится после подключения СКЗИ.

{{end}}
{{end}}