Открытая замена «КиберДиплома»: архитектура, которую задала Windows 7
Черновик архитектуры открытой системы для подготовки, проверки и печати дипломов. Почему требования к платформам отсеяли почти все технологии, как одна сборка работает и на компьютере без сети, и на сервере вуза, почему импорт идёт через промежуточную зону, а печать — через PDF в миллиметрах. Стек выбран, проверка на целевых платформах ещё впереди.
Предыдущие разборы касались текущего сервиса — связки из трёх сервисов, которая превращает деканатские ведомости в XML для «КиберДиплома». Этот — о том, что может прийти ей на смену. Параллельно ревизии подготовлен черновик архитектуры открытой системы для подготовки, проверки, печати и учёта дипломов и приложений к ним.
Это документ для обсуждения, а не работающий код. Но именно на этапе черновика принимается большая часть решений, которые потом труднее всего изменить.
Зачем замена
Сейчас процесс устроен так. Ведомости и учебный план обрабатываются текущим сервисом в сводную таблицу и XML формата 3.5.1. XML импортируется в «КиберДиплом», там вручную добавляются регистрационный номер, дата выдачи, бланк и данные организации, после чего документы печатаются по шаблонам FastReport на бланках типографии.
Недостатков у этой схемы три. «КиберДиплом» — закрытая платная программа с USB-ключом и зашифрованной базой. Между системами остаются ручные шаги, а на стыках возникают ошибки, которые не ловит ни одна из сторон. И наконец — неудобное признание — сам текущий сервис из трёх рантаймов в Docker на рабочие места вуза не устанавливается.
Требования, которые отсеивают технологии
Черновик начинается с десяти требований, и три из них определяют почти всё остальное:
- одна сборка, два режима — одиночный компьютер без сети и сервер вуза для многих пользователей;
- платформы — Windows 7 и 8.1, в том числе 32-битные, Windows 10 и 11, Astra Linux, РЕД ОС и Альт;
- без Docker и без предустановленных рантаймов — прямое следствие предыдущего пункта.
Причина в том, что в вузах одновременно работают компьютеры всех этих поколений. На старых и 32-битных Windows Docker не работает, а в закрытых контурах Astra Linux при замкнутой программной среде (ЗПС) запускаются только подписанные исполняемые файлы.
Среди остальных требований два заслуживают отдельного упоминания. Первое прямо вытекает из ревизии: ни одна запись не теряется молча, каждое расхождение показывается пользователю. Второе — персональные данные хранятся только в инсталляции вуза, а в открытом репозитории допустимы лишь синтетические данные.
Один файл, два режима
Ответ на первое требование — модульный монолит со встроенным веб-сервером и интерфейсом в браузере. В настольном режиме сервер слушает 127.0.0.1, данные лежат в файле SQLite, при запуске открывается браузер. В серверном режиме тот же исполняемый файл слушает сеть, данные хранятся в PostgreSQL, включаются учётные записи и роли.
Различие между компьютером на кафедре и сервером вуза сведено, таким образом, к адресу прослушивания и СУБД. Установка — распаковать и запустить; обновление — заменить один файл; резервная копия в настольном режиме — копия файла базы.
Модули — справочники, учебные планы, импорт, картотека, проверка, печать, экспорт, аудит и доступ — разделены явными границами и не обращаются к таблицам друг друга напрямую. Интерфейс собирается на сервере с минимумом JavaScript и должен работать в Chrome 109 и Firefox ESR 115 — последних версиях этих браузеров для Windows 7.
У двух СУБД есть цена: код ограничен подмножеством SQL, одинаково работающим в обеих, схема меняется только нумерованными миграциями, а тесты слоя данных прогоняются дважды. Отвергнуты три альтернативы: микросервисы в Docker (как сейчас), нативное настольное приложение, которому серверный режим не достаётся бесплатно, и чисто серверный веб, не покрывающий компьютер без сети.
Импорт, в котором нельзя потерять запись
Главный урок ревизии — студент, который молча выпадал из XML, — в новой системе закрыт не проверкой, а устройством процесса. Импорт никогда не пишет данные сразу в картотеку. Загруженные файлы попадают в промежуточную зону и проходят этапы: распознавание макета, нормализация (пробелы, латинские двойники, даты, коды оценок), сопоставление, отчёт, подтверждение пользователем и только затем запись в картотеку и журнал аудита.
Отчёт делит записи на четыре группы: «совпало», «нет в ведомостях», «нет в сведениях», «неоднозначно». Пока есть несовпадения, подтвердить импорт нельзя: пользователь исправляет файл или связывает записи вручную. Каждое значение хранит ссылку на источник — файл, лист и строку, — поэтому для любого поля документа видно, откуда оно пришло.
Молчаливая потеря записи становится невозможной по построению. Цена — на один шаг больше: отчёт нужно просмотреть.
Здесь же сделан вывод о текущем парсере. Он держит данные в строке индекса вида «Название_тип_з.е.», сопоставляет подстроками и меняет индекс таблицы на ходу — отсюда и дефект с многосеместровыми дисциплинами. Такой код решено не рефакторить, а один раз переписать как модуль импорта новой системы: с явной моделью строки ведомости (дисциплина, семестр, часы, форма контроля, оценка), сложением семестров и сопоставлением с учебным планом. Существующие тесты при этом становятся спецификацией поведения.
Печать в миллиметрах
Дипломы печатаются на защищённых бланках типографий: титул — лист A4 альбомной ориентации, приложение — четыре страницы A3. Шаблоны «КиберДиплома» — файлы FastReport 4 (.fr3, сжатый XML) с координатами полей в пикселях при 96 dpi. Принтеры сдвигают печать каждый по-своему, а браузеры могут масштабировать PDF.
Решение складывается из нескольких частей:
- собственный формат шаблона, где страницы и поля заданы в миллиметрах — координаты, шрифт, выравнивание, перенос, ужатие и перетекание таблицы дисциплин между страницами приложения;
- выход — PDF в масштабе 1:1 со встроенными шрифтами; изображение бланка используется только в предпросмотре;
- калибровка на каждый принтер — смещения dx и dy в миллиметрах, подобранные по тестовому листу;
- импорт существующих шаблонов
.fr3с пересчётом координат: 1 мм = 3,7795 пикселя при 96 dpi.
Шрифт по умолчанию — PT Astra Serif: открытая лицензия и метрическая совместимость с Times New Roman. Шаблоны типографий в открытый репозиторий не попадают, пока не проверены их лицензии, — каждый вуз импортирует свои. Целевая точность — отклонение текста от поля бланка не более 0,5 мм после калибровки.
Черновик честно называет самую сложную часть MVP: собственный движок раскладки текста. Отвергнутые варианты показывают, почему без него не обойтись: печать HTML из браузера зависит от браузера и его настроек, FastReport — проприетарный компонент под Windows, а прямая печать в драйвер принтера требует своей реализации для каждой ОС и не работает в серверном режиме.
Совместимость без взлома
На переходный период вуз продолжает печатать в «КиберДипломе». Его база и карточки — зашифрованный контейнер закрытого формата. Открытый путь обмена один: XML «ФайлОбменаКиберДиплом» 3.5.1, который программа импортирует и который текущий сервис уже умеет генерировать.
Поэтому экспорт в XML 3.5.1 входит в MVP, импорт того же XML идёт через промежуточную зону, а закрытые файлы не разбираются и не расшифровываются. Решение снимает юридические риски, связанные с обходом защиты чужого формата, но имеет понятную цену: историю выдачи из «КиберДиплома» автоматически не перенести. Отвергнута и автоматизация интерфейса программы, применявшаяся в 2025 году: она хрупка и зависит от версии программы и разрешения экрана.
Стек: Java 11
Три требования отсеивают большинство кандидатов ещё до сравнения удобства. Нужен инструмент, который получает обновления безопасности и собирает под Windows 7 x86; работает на Astra Linux 1.7 со старой glibc 2.28 и, возможно, с ЗПС; не требует установки рантайма и при этом читает .xls и .xlsx и формирует PDF с точностью до миллиметра.
Сразу отклонены современный .NET (не работает на Windows 7), Node.js и Electron (для Windows 7 давно без обновлений) и Rust (Windows 7 осталась лишь в целях третьего уровня поддержки). Всерьёз сравнивались четыре варианта:
- Python 3.8 с PyInstaller — прямое переиспользование кода, но это последняя версия с Windows 7, и её поддержка закончилась в октябре 2024 года; сборка с pandas превышает 100 МБ, а однофайловые сборки часто не нравятся антивирусам;
- Go — один статический файл без зависимости от glibc, лучший вариант для Linux; однако официально Windows 7 поддерживает только Go 1.20, а дальше — форк сообщества с одним сопровождающим, и чтение
.xlsв Go слабое; - Free Pascal / Lazarus — отличная переносимость, но узкое сообщество и нет опыта в команде;
- Java 11 LTS с рантаймом в поставке — сборка Liberica JDK 11 официально поддерживает Windows 7 32 и 64 бит и продолжает получать обновления, для российских Linux есть сертифицированная отечественная сборка, Apache POI — лучшая библиотека для обоих форматов Excel, а шлюз текущего сервиса уже написан на Java.
Выбор сделан в пользу Java 11: это единственный кандидат, у которого все обязательные требования закрываются компонентами с обновлениями безопасности. Состав — урезанный через jlink рантайм, встроенный веб-сервер, HTML на сервере с htmx, JDBC и миграции Flyway, Apache POI, OpenPDF или PDFBox для печати по координатам.
Цена записана тут же. Поставка и потребление памяти (ожидается 150–250 МБ) больше, чем у Go. У Java 11 есть «потолок»: новые ветки части библиотек требуют Java 17, поэтому их версии фиксируются. Если прототип покажет, что рантайм 17 работает на 32-битной Windows 7, базой станет Java 17. Запасной вариант — Go на форке для Windows 7, если Java не уложится в память и время запуска.
Что ещё не проверено
Черновик остаётся черновиком. Шесть из семи архитектурных решений имеют статус «предложено»; выбор стека принят владельцем проекта, но с оговоркой — до проверки прототипом.
Прототип задуман одинаковым для всех платформ: HTTP-сервер со страницей, запись и чтение SQLite, чтение .xls и .xlsx в макете деканатских ведомостей, PDF с полем в заданных миллиметрах и кириллическим шрифтом, печать тестового листа. Критерии тоже заданы заранее: запуск без установки чего-либо, старт быстрее пяти секунд, память меньше 300 МБ, отклонение на отпечатке не больше 0,5 мм. Стенды — 32-битная Windows 7 с 2 ГБ памяти, Astra Linux 1.7 с ЗПС и без неё, Windows 11. Эти проверки пока отложены, и до их прохождения выбор стека — обоснованная гипотеза с названным запасным вариантом.
Переход тоже расписан поэтапно. Текущий сервис продолжает работать. MVP новой системы — справочники, учебные планы, импорт, картотека, проверка и экспорт XML, — пока печать остаётся за «КиберДипломом». Затем печать: один выпуск печатается параллельно в обеих системах, и отпечатки сравниваются. После MVP — выгрузка в ФИС ФРДО и шаблоны других типографий.
Выводы
- Требования к платформам сильнее предпочтений: Windows 7 x86 и замкнутая среда Astra Linux отсеяли почти все современные стеки ещё до сравнения их удобства.
- Одна сборка на два режима дешевле двух продуктов: различие между компьютером без сети и сервером вуза сведено к адресу прослушивания и СУБД.
- Молчаливую потерю записи надёжнее исключить устройством процесса, чем проверками поверх него: промежуточная зона не даёт подтвердить импорт, пока есть расхождения.
- Точность печати — свойство всей цепочки, а не шаблона: миллиметры в шаблоне, PDF в масштабе 1:1, калибровка принтера и печать без масштабирования.
- Выбор стека до прототипа — гипотеза. Честнее записать критерии проверки и запасной вариант, чем объявить решение окончательным.
Доступность
Черновик архитектуры и семь записей архитектурных решений находятся в каталоге docs/architecture/ репозитория; проект открыт под лицензией MIT.
- Исходный код и документация: github.com/nikita-konkin/diploma_supplement_service
Теги
Другие обновления по проекту
Сервис дипломов: 27 дефектов после ревизии и почему худшие из них молчали
Ревизия кода и сверка с реальными входными данными дали 27 дефектов. Худший класс — молчаливые: студент выпадал из XML без ошибки. Разбор того, как тихие пропуски стали явными о...
Ошибка вместо «500»: как сервис научился объяснять, что пошло не так
Обновление про диагностику: сквозная передача ошибок между сервисами, журнал каждого запроса, логи, переживающие перезапуск контейнера, и первый автоматический тест-раннер.