Первичная настройка, повторная проверка: копии без ключевых носителей СКЗИ (--one-file-system, без keymedia), без отпечатка железа и списка компонентов; восстановление на новый сервер — пароль базы bj из копии, база и пользователь ИШ; ключ для контура без канала запоминается и подключается при настройке канала; первый настроенный канал становится рабочим контуром; справочник сертификатов перечитывается после ключа и смены контура; шлюз НРД — шаг 7, ключ — шаг 8 (ключ ставится в профиль ИШ); подсказка контура ключа по сертификату; ИШ: параметры работающего шлюза не перезаписываются; без чужого кода отправителя и получателя по умолчанию; прокси для выхода в интернет; установка с образа без интернета; HTTPS — новый сертификат при смене адреса; bj-network — без cloud-init; проверка готовности: справочник участников, сетевые доступы, учётные записи, последний обмен с НРД

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-05 17:33:10 +03:00
parent 765d7b5994
commit 10305a095e
25 changed files with 634 additions and 95 deletions
+16
View File
@@ -82,12 +82,19 @@ func (s *Service) CreateClaim(ctx context.Context, in CreateClaimRequest) (Creat
// ReferenceID, реквизиты) БЕЗ отправки и без создания заявки. Нужно, чтобы
// сначала положить запрос в БД Fancy на проверку, а отправить позже.
func (s *Service) BuildRequest(ctx context.Context, in CreateClaimRequest) (*m2m.M2MTransferRequest, error) {
if s.defaultSender == "" {
return nil, errors.New("организация не задана: укажите код участника НРД (мастер настройки, шаг «Организация») — без него перевод не сформировать")
}
in = withNSDSecCodes(in)
domainClaim, err := dtoToClaim(in)
if err != nil {
return nil, fmt.Errorf("lkgateway: dtoToClaim: %w", err)
}
receiver := s.receiverFor(in)
if in.ReceiverCodeOverride == "" && handbookCodeByINN(in.ReceivingDepositoryINN) == "" && handbookLoaded() && !devMode(globalRC) {
// запасной код получателя из настроек — чужой участник: НРД отклонит перевод (M2M15). Лучше сказать сразу.
return nil, fmt.Errorf("%w: ИНН %s", errReceiverUnknown, in.ReceivingDepositoryINN)
}
req, err := m2mcore.EnrichRequest(ctx, s.store, domainClaim, m2mcore.SenderReceiver{
SenderCode: s.defaultSender,
ReceiverCode: receiver,
@@ -98,6 +105,15 @@ func (s *Service) BuildRequest(ctx context.Context, in CreateClaimRequest) (*m2m
return req, nil
}
// errReceiverUnknown — депозитария получателя нет в справочнике участников M2M НРД.
var errReceiverUnknown = errors.New("депозитарий получателя не найден в справочнике участников M2M НРД")
// handbookLoaded — справочник участников M2M получен (без него получателя не определить ни для кого).
func handbookLoaded() bool {
raw, err := readHandbook()
return err == nil && len(raw) > 200
}
// receiverFor — код получателя (зачисляющего депозитария) в заголовке запроса: явный (робот НРД,
// тест-кейсы) → по ИНН зачисляющего депозитария из справочника участников M2M → из настроек.
// Без справочника заявки ЛК уходили с кодом из настроек, и НРД отвечал M2M15 (29.09.2026).