Интеграция с ЕГИС ОТБ Минтранса: передача ПД пассажиров в АЦБПДП с задержкой ≤30 мин
Услуги
- legacy-modernization
- complex-systems
- cybersecurity
Стек
- КриптоПро CSP в Docker
- Deno FTP-клиент
- TypeScript
- Supabase Edge Functions
- Cron каждый час
- HMAC SHA256
- Supabase Vault
- GOST 28147-89
Крупный речной оператор — туризм и транспортная безопасность. Интеграция с ЕГИС ОТБ Минтранса: 16 типов АЦБПДП документов, 100% успешных приёмок, регламентная задержка ПД→АЦБПДП ≤30 мин. 2025-09 — 2026-05. Предотвращён штраф до 20 млн ₽ и исключение из реестра перевозчиков.
Важная терминология. ЕГИС ОТБ — Единая Государственная Информационная Система Обеспечения Транспортной Безопасности. Хранилище ПД пассажиров — АЦБПДП (Автоматизированные централизованные базы персональных данных о пассажирах и персонале). Регулируется Постановлением Правительства РФ № 1208. НЕ путать с ГИС ЭП Электронная Путёвка (отдельный кейс) — это другая система (Минэкономразвития, не Минтранс) для туристических путёвок.
Каждый пассажир должен попасть в АЦБПДП Минтранса не позже 30 минут от изменения данных в системе бронирования — таково требование ПП РФ № 1208. Реализовали оба уровня интеграции (отправка пакетов А+Б и дайджест квитанций об ошибках), прошли E2E-приёмку Минтрансом 1 мая 2026 года.
Контекст
Постановление Правительства № 1208 обязывает всех операторов пассажирских перевозок — водных, железнодорожных, авиа, автомобильных — передавать персональные данные пассажиров в централизованное хранилище АЦБПДП. С 1 ноября 2024 года неаттестованные автоматизированные рабочие места отключаются автоматически. Штраф за систематическую непередачу данных — до 20 млн ₽, плюс риск исключения из реестра допущенных перевозчиков.
Legacy-стек оператора (PHP 5.4) уже умел формировать XML по нужным форматам, однако всё, что касается FTP-транспорта с TLS, подписи через КриптоПро и разбора XML-квитанций об ошибках, требовало полной перестройки. Параллельно шла миграция на Supabase — перенос канала «как есть» в новый стек без потери production-функциональности стал критическим требованием.
Какие вызовы решены
Как подписывать XML через КриптоПро под Linux? КриптоПро CSP запущен в отдельном Docker-контейнере с поддержкой GOST 28147-89 и ГОСТ Р 34.10-2012 для XML-подписи. Сертификаты УКЭП хранятся в Supabase Vault — приватные ключи не попадают ни в переменные среды, ни в логи.
Как реализовать FTP-клиент с TLS на Deno? Supabase Edge Function выстраивает прямое TCP-соединение с поддержкой AUTH TLS и PROT P (зашифрованный data-канал). Параллельные загрузки ограничены тремя потоками — эмпирически найденный предел шлюза Минтранса, при превышении которого шлюз начинает отклонять соединения.
Как парсить XML-квитанции с classifyFault?
TypeScript-парсер classifyFault разбивает ответы Минтранса на три категории: personal — ошибки в данных конкретного пассажира (неверный формат паспорта, несоответствие ФИО), reference — несоответствие справочникам АЦБПДП (маршрут, тип транспортного средства), system — ошибки на стороне Минтранса (недоступность сервиса, временный отказ). Категория определяет маршрут уведомления и приоритет переотправки.
Как маршрутизировать ошибки автоматически?
Ошибки категории personal уходят менеджеру тура (Telegram + ICQ-уведомление с расшифровкой поля и инструкцией по исправлению); reference — в справочный отдел для актуализации классификаторов; system — в ИТ. Порядок regex-категорий в pipeline фиксирован: reference проверяется перед personal, иначе часть ошибок ссылочных данных ложно попадает в персональные.
Как обеспечить идемпотентность переотправки без таблицы токенов? HMAC SHA256 от содержимого пакета с TTL 7 дней. Минтранс отклоняет повторную отправку пакета с тем же хешем в пределах окна — дублей не возникает, отдельная таблица токенов не нужна.
Как гарантировать, что cron не накапливает параллельные запуски?
Distributed lock через Postgres advisory lock на именованном ресурсе mintrans_pull_lock. Если предыдущий запуск ещё обрабатывает квитанции — новый cron-тик пропускается полностью, без ошибки и без дублирования.
Как гарантировать корректность признака успешной переотправки?
Критическое правило: признак success=2 ставится только при подтверждённой успешной переотправке от шлюза Минтранса. Автоматическое выставление по таймауту или отсутствию ошибок — запрещено. Нарушение этого правила приводит к тому, что система считает пакет доставленным, хотя он не прошёл, — это прямой путь к штрафу по ПП 1208.
Как поддерживать все 16 типов АЦБПДП документов? Generic XML-builder с 16 type-specific mappers. Для каждого типа — отдельный набор обязательных полей плюс legacy hard-rule: дата рождения пассажира присутствует во всех 16 типах без исключения, независимо от того, входит ли она в минимально необходимый набор по спецификации. Это правило выведено из реальных отказов на тестовом контуре и закреплено как инвариант.
Подход
- Edge Function
mintrans-build-packформирует АЦБПДП XML под каждый из 16 типов документов, применяет GOST 28147-89 шифрование содержимого пакета перед отправкой и передаёт на FTP-шлюз. - Edge Function
mintrans-pull-quittancesпо cron каждый час забирает XML-квитанции с FTP, вызывает pipelineparseAckXml → classifyFault → groupFaults → mapLineToTouristи записывает результат в БД. - TypeScript pipeline разбора (
parseAckXml/classifyFault/groupFaults/mapLineToTourist) — четыре чётко разделённых шага, каждый покрыт unit-тестами на реальных примерах ответов Минтранса. - API route
/api/mintrans/closeпринимает запрос на закрытие пакета, проверяет HMAC с TTL 7 дней и инициирует переотправку. Хранение токенов в отдельной таблице не требуется. - Supabase Vault хранит FTP-credentials, приватные ключи УКЭП и SSL-сертификаты. Ни одно из этих значений не попадает в переменные среды контейнера или в логи.
- Legacy hard-rules сохранены в полном объёме: обязательность даты рождения, формат имён файлов (включая суффикс типа документа и временну́ю метку), порядок отправки пакета A перед пакетом Б.
Результат
- 100% успешных приёмок production-Минтрансом за сезон 2026 года.
- E2E-тест принят Минтрансом в мае 2026 года на production-контуре.
- Регламентная задержка ≤30 минут соблюдается в штатном режиме.
- Все 16 типов АЦБПДП документов поддержаны, включая редкие типы для нестандартных категорий пассажиров.
- Автоматический дайджест ошибок устранил ручной разбор XML-квитанций.
Эффект для бизнеса
- Штраф по ПП 1208 предотвращён. Без работающей интеграции оператор получает автоматическое отключение от АЦБПДП и риск исключения из реестра перевозчиков.
- −1–2 ч/день — столько занимал ручной разбор XML-квитанций у менеджера. После внедрения дайджеста этот процесс полностью автоматизирован.
- Gov-compliance сертифицирован — оператор подтверждён в реестре допущенных к перевозкам, аттестация АРМ в силе.
- Стек готов к миграции в Supabase без потери production-функциональности: Edge Functions работают параллельно с legacy PHP, переключение прозрачное.
Что использовали
КриптоПро CSP в Docker (GOST 28147-89, ГОСТ Р 34.10-2012), Deno Edge Functions для FTP с TLS (AUTH TLS + PROT P), TypeScript pipeline (parseAckXml / classifyFault / groupFaults / mapLineToTourist), HMAC SHA256 для идемпотентности без хранения токенов, Supabase Vault для криптосредств и FTP-credentials, Postgres advisory locks для распределённых cron-локов, GOST 28147-89 для шифрования содержимого пакетов перед отправкой.
Что мы можем сделать у вас
Если у вашего бизнеса (водные, железнодорожные, авиа или автоперевозки) обязательная передача ПД в АЦБПДП — мы делаем интеграцию с ЕГИС ОТБ за 4–8 недель. Включая аттестацию АРМ силами лицензиата ФСТЭК + ФСБ. Написать нам
Часто задаваемые вопросы
Что такое ЕГИС ОТБ и зачем туда передаются данные?
Сколько занимает интеграция для речного оператора?
Можно ли использовать агрегатор вместо прямой интеграции?
Какие риски проекта?
Похожая задача?
Расскажите контекст — подскажу, что и как делать.
Обсудить похожий проект →