bb103e9f98
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
173 lines
12 KiB
Markdown
173 lines
12 KiB
Markdown
# Bridge-and-Join-s — гайд для агента Claude Code
|
||
|
||
Этот файл читается автоматически при старте `claude` в репозитории. Здесь — сжатый
|
||
контекст проекта, чтобы агент не вычислял всё заново. **Держим его в актуальном
|
||
состоянии** — это точка входа для любого нового агента.
|
||
|
||
## Что это за проект
|
||
|
||
Bridge-and-Join-s (bj) — шлюз для переводов ценных бумаг физлица «самому себе» (M2M)
|
||
между депозитариями через сервис НРД **MOEX МОСТ**. Регулируемая операция
|
||
(ФЗ № 124-ФЗ от 23.05.2025, Указание Банка России № 7317-У, в силе с 01.09.2026):
|
||
депозитарий зачисляет бумаги клиенту в другом депозитарии без встречного поручения.
|
||
|
||
Роль bj — **протокольное плечо НРД/MOEX МОСТ**: собрать `M2MTransferRequest`,
|
||
отправить через Интеграционный шлюз НРД (ИШ сам подписывает ГОСТ-ЭП), принять
|
||
`M2MTransferDecision`/`M2MTransferResponse`, вернуть исход в вызвавшую систему.
|
||
Переводятся только российские бумаги (ISIN `RU…`) с торгового счёта депо.
|
||
|
||
Продукт поставляется клиентам как установщик «одной командой»; лицензии и обновления
|
||
раздаёт отдельный сервер лицензий (репозиторий `lic_Bridge-and-Join-s`, см. ниже).
|
||
|
||
### Пакеты (`internal/`)
|
||
|
||
- `m2m` — XSD-модели сообщений (M2MTransferRequest/Decision/Response/Handbook/…)
|
||
- `m2mcore` — стейт-машина заявок, репозиторий (memory + pgx)
|
||
- `lkgateway` — REST API, веб-админка, мастер настройки, dev-страница «Эмуляторы»
|
||
- `nsdadapter` — два режима: `mock` (внутренний робот-эмулятор НРД) и `igw` (REST-клиент ИШ)
|
||
- `cryptocli` — PKCS#11 клиент к СКЗИ (КриптоПро CSP / Рутокен / Валидата)
|
||
- `nsdxml` — XML-кодек с CP-1251
|
||
- `fansystore` — чтение портфелей из учётной системы (Fansy/DEPO)
|
||
- `license`, `hwid` — лицензионный токен (Ed25519) и отпечаток сервера
|
||
- `release` — модель компонентов релиза и манифест (`components.go` — источник правды)
|
||
- `notify`, `lkemulator` — уведомления и эмулятор ЛК ESIA для разработки
|
||
|
||
### Модули (`modules/`) — отдельные бинарники, обновляются независимо
|
||
|
||
- `lk` → `bj-lk` — личный кабинет клиента (для брокеров без платформы Финансы)
|
||
- `npr` → `bj-npr` — риск-монитор «НПР / УДС» по данным QUIK
|
||
- `quikexport` → `bj-quikexport` — экспорт биржевой информации (ARQA quikexport)
|
||
- `modkit` — общий каркас модулей
|
||
|
||
## Текущее состояние (актуально на 2026-10-12)
|
||
|
||
**Полный статус с процентами — в `REPORT.md` в корне.** Кратко:
|
||
|
||
- Активная ветка разработки — **`feature/keywizard-m2m-live`** (не `main`; `main`
|
||
сильно отстаёт). Последний выпуск — `2026.10.08.2`.
|
||
- Готово и работает: ядро M2M (контракты/FSM/журнал — 100%), веб-админка и мастер
|
||
настройки, REST-клиент ИШ, эмулятор робота НРД, установщик одной командой,
|
||
модули ЛК / НПР / QUIK-экспорт, сервер лицензий и портал, dev-страница
|
||
«Эмуляторы» (имитация НРД и МНП QUIK в режиме разработки).
|
||
- Заблокировано на внешнем: СКЗИ «Валидата CSP» для Linux, сертификат УЦ МБ,
|
||
реальное подключение к роботу TEST3 НРД (REST-клиент готов, ждём сам ИШ + серт).
|
||
|
||
## Архитектура обмена с НРД (кратко)
|
||
|
||
```
|
||
bj-server (наше Go-приложение)
|
||
│ REST: POST /api/package/{channel}/file (ZIP в base64)
|
||
▼
|
||
ИШ / igate (ставится на Astra Linux рядом)
|
||
│ ИШ САМ: подписывает, упаковывает, отправляет (Валидата CSP + серт УЦ МБ)
|
||
▼
|
||
Web-сервис ONYX (НРД, https://gost.nsd.ru/onyxt3/WslService)
|
||
```
|
||
|
||
Подробная схема и FAQ — в `/admin/help/architecture` (когда сервис запущен) и в
|
||
`DOC/ruk_install_ish_2025_11_10.pdf`.
|
||
|
||
## Где что лежит
|
||
|
||
| Каталог | Что |
|
||
|---|---|
|
||
| `cmd/bj-server/` | главный бинарник (ядро) |
|
||
| `cmd/bj-lk/`, `cmd/bj-npr/`, `cmd/bj-quikexport/` | модули-бинарники |
|
||
| `cmd/bj-installer/`, `cmd/bj-component-install/` | установщик и root-установщик обновлений |
|
||
| `cmd/bj-release/` | сборка и публикация релиза (манифест, подпись) |
|
||
| `cmd/lk-emulator/` | эмулятор ЛК ESIA для разработки |
|
||
| `internal/`, `modules/` | бизнес-логика (см. выше) |
|
||
| `services/crypto-service/` | Java-сервис подписи/проверки (служба `bj-crypto`) |
|
||
| `migrations/` | SQL: `fansy-store/` (вход от Fansy) и `m2m-core/` (журнал сделок) |
|
||
| `deploy/` | установщик, systemd-юниты, healthcheck |
|
||
| `DOC/` | документация НРД (PDF, ~15 файлов) |
|
||
| `docs/` | внутренние контракты (Fansy, ЛК ESIA — OpenAPI) |
|
||
| `REPORT.md` | отчёт для руководства — **держим в актуальном виде** |
|
||
| `PRODUCT.md` | назначение, роли пользователей, профили (Финансы / автомат / полуавтомат) |
|
||
|
||
## Стенды и инфраструктура
|
||
|
||
> Пароли/ключи здесь НЕ храним — получить у владельца проекта (вне репозитория).
|
||
|
||
| Стенд | Адрес | Роль |
|
||
|---|---|---|
|
||
| **astramost** | `195.239.71.22:22451` (внутр. `10.10.10.28`), Astra Linux, юзер `fontvielle` | Основной стенд: живой код в `/opt/bj/src`, сборка, релизы, все службы bj. `sudo` без пароля. Доступ по SSH ограничен по IP. |
|
||
| Тестовый | `10.10.10.29` (из сети стенда) | Отдельный тестовый стенд, что-то проверяли. SSH-пароль/ключ — отдельные, уточнять у владельца. |
|
||
| Сервер лицензий (ПРОД) | `46.173.19.220` = `lic.zetit.ru` | `bj-license-server` за nginx (127.0.0.1:8091). Деплой — `lic_Bridge-and-Join-s/deploy/deploy.sh` (root по SSH-ключу с astramost). |
|
||
|
||
Службы на astramost (все под systemd): `bj-server`, `bj-lk`, `bj-npr`,
|
||
`bj-quikexport`, `bj-crypto`, `bj-keymedia`, `igate` (ИШ), `postgresql@11-main`.
|
||
Бинарники — в `/opt/bj/`.
|
||
|
||
### Git
|
||
|
||
- Продукт: `ssh://git@git.zetit.ru:32774/zuevav/Bridge-and-Join-s.git` (ветка
|
||
`feature/keywizard-m2m-live`).
|
||
- Сервер лицензий: `ssh://git@git.zetit.ru:32774/zuevav/lic_Bridge-and-Join-s.git`
|
||
(ветка `master`), чекаут на astramost в `~/lic_Bridge-and-Join-s`. Это **внутренняя**
|
||
инфраструктура, клиентам не поставляется.
|
||
- Push с astramost настроен (ключ `~/.ssh/id_ed25519`, хост `git.zetit.ru` в
|
||
`~/.ssh/config`).
|
||
|
||
### ⚠️ Два чекаута продукта на astramost — не перепутать
|
||
|
||
- `/opt/bj/src` — **живой код, здесь работаем** (ветка `feature/keywizard-m2m-live`).
|
||
- `~/Bridge-and-Join-s` — **старая копия от мая 2026, НЕ трогать для разработки**
|
||
(помечена своим README). Единственное ценное в ней — несколько незакоммиченных
|
||
заметок в `DOC/*.txt`.
|
||
|
||
## Как собирать и выкатывать
|
||
|
||
```bash
|
||
cd /opt/bj/src
|
||
# сборка без прокси (go-модули идут напрямую, не через zetit-прокси)
|
||
env -u HTTPS_PROXY -u HTTP_PROXY -u https_proxy -u http_proxy go build -o ./bin/bj-server ./cmd/bj-server
|
||
go test ./...
|
||
```
|
||
|
||
Запуск вручную (путь к libs нужен только при наличии КриптоПро):
|
||
|
||
```bash
|
||
LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64 setsid ./bin/bj-server > /tmp/bj.log 2>&1 < /dev/null & disown
|
||
systemctl status bj-server ; journalctl -u bj-server -f
|
||
```
|
||
|
||
Релиз (подпись закрытым ключом — только на доверенной машине, на сервер не попадает):
|
||
|
||
```bash
|
||
# cmd/bj-release собирает манифест и подписывает; логи выкладок — ~/rel-*.log
|
||
# релиз раздаётся сервером лицензий: https://lic.zetit.ru/updates/v1/<канал>/manifest.json
|
||
```
|
||
|
||
Деплой сервера лицензий — `cd ~/lic_Bridge-and-Join-s && ./deploy/deploy.sh`
|
||
(по умолчанию `HOST=root@46.173.19.220`).
|
||
|
||
## Решения, которые мы приняли (не очевидные)
|
||
|
||
- **КриптоПро CSP**, а не JCP — экономия лицензии. Для отправки в НРД подпись делает
|
||
ИШ (своей Валидатой), bj-server для этого не нужен.
|
||
- **PKCS#11 как единый интерфейс** к разным СКЗИ — `internal/cryptocli` через `github.com/miekg/pkcs11`.
|
||
- **Модули как отдельные бинарники** (bj-lk/npr/quikexport) с независимым обновлением;
|
||
выдаются только если входят в лицензию (`internal/release/components.go`).
|
||
- **Mock-робот внутри bj-server** — тест логики без живого НРД. Код `MC0012500000`
|
||
в `ReceiverCode` + `DocumentSeries` 1111/2001/2002/3333.
|
||
- **Astra Linux для ИШ** — единственная поддерживаемая НРД ОС (РЕД ОС не пойдёт).
|
||
- **Отпечаток сервера (hwid)** привязывает лицензию к машине; перенос — только через
|
||
деактивацию на сервере лицензий.
|
||
- **doc-watcher с явным `noProxyClient`** — игнорирует ENV-прокси (zetit блокирует nsd.ru).
|
||
|
||
## Что делать НЕ надо
|
||
|
||
- Не ставить ИШ на РЕД ОС — он только под Astra (.deb).
|
||
- Не предлагать переход на КриптоПро JCP — отвергнут по цене.
|
||
- Не выпускать новые сертификаты — у организации они есть, наша задача только импортировать.
|
||
- Не убирать UI-баннер «РЕЖИМ ЭМУЛЯЦИИ» — защита от случайной отправки в прод.
|
||
- Не гонять go-модули и запросы к nsd.ru через прокси zetit — будет 403.
|
||
- Не путать `/opt/bj/src` (живой) и `~/Bridge-and-Join-s` (старый).
|
||
- Закрытый ключ релиза (`~/keys/release-signing.priv`) на сервер не выкладывать.
|
||
|
||
## Контакты НРД
|
||
|
||
- `M2MOST@nsd.ru` — форматы M2M · `soed@nsd.ru` — дистрибутивы (Валидата, ИШ) ·
|
||
`pki@moex.com` — УЦ МБ, сертификаты
|