В этой статье я рассказываю, как мы за 3 месяца собрали кастомную СЭД для поликлиники на базе трёх open-source компонентов: Mayan EDMS (хранилище), Camunda (workflow) и NiceGUI (фронтенд). Система закрыла ключевые потребности: электронные подписи для внутренних документов, сквозная LDAP-аутентификация и контроль исполнения задач — без единой коммерческой лицензии.
Технологический стек:
Фронтенд: NiceGUI (Python)
Бэкенд: Mayan EDMS (Django), Camunda (Java)
Базы: PostgreSQL, Redis, MinIO
Развёртывание: Docker Compose
Думаю у многих организаций рано или поздно возникает потребность внедрения электронного документооборота. Причем хочется с одной стороны какого-то не очень сложного инструмента, но достаточно функционального, чтобы этот продукт мог не только документы пересылать но и элементы workflow, чтобы можно было отследить путь задачи, кто и над чем сейчас работает. Вот и мы столкнулись с такой задачей. Так как носить договоры из кабинета в кабинет, чтобы поставить подпись в листе согласований в 21 веке - устаревшая практика, решили внедрить в нашей небольшой поликлинике систему электронного документооборота. Требования к системе были сформулированы следующие:
Self-hosted решение, никаких SaaS и подписок.
Надежное хранение документов.
Полнотекстовый поиск по базе документов, чтобы можно было искать не только по названию или дате документа но и по тексту внутри документа.
Система для назначения задач и механизм для отслеживания их исполнения.
Сквозная система авторизации с существующей базой пользователей.
Работа с электронными подписями.
Работа с электронной почтой.
Ранее, несколько лет назад у нас уже был подход к решению этой задачи, мы даже попытались настроить ELMA когда они были еще только системой документооборота. Но тогда не сложилось по нескольким причинам, во-первых сервер был только на Windows, во-вторых там была какая-то странная ролевая система которую мы так и не смогли натянуть на нашу структуру организации.
Были попытки сделать что-то на базе Alfresco, но тоже потерпели фиаско из-за сложности настройки системы под свои нужды.
Корпоративные монстры типа Lotus нам совершенно не подходят по причине дикой избыточности, а отечественные программные продукты как правило предлагают подписочную систему оплаты, что нам не подходит по финансовым причинам и почти все предлагают SaaS.
Стало очевидно: искать «золотую середину» среди готовых решений — всё равно что подгонять чужой костюм под свои мерки. Мы решили сшить свой. Система, выстроенная вокруг реальных процессов поликли��ики, с возможностью эволюционировать вместе с организацией и в перспективе закрыть весь спектр задач документооборота.
Итак, решение принято! Пишем свой СЭД. Однако в современном мире мало кто пишет системы с чистого листа, многие разработчики используют в своих продуктах различные платформы и сервисы которые написали коллеги и выложили свои разработки в открытый доступ. Главное условие конечно же это соблюдать условия лицензии под которыми опубликованы их open source решения. В ходе поиска базовых систем я наткнулся на совершенно волшебную систему хранения и организации документов про которую раньше ничего не знал Mayan EDMS. Когда я нашёл Mayan EDMS, сразу понял: это именно то, что нужно. Self-hosted решение с открытым исходным кодом, удовлетворяющее почти всем нашим требованиям. Однако два пункта из требований к системе, были не реализованы или реализованы совершенно не так как нужно было нам. В Mayan EDMS не реализована работа с электронными подписями выпущенными Российскими УЦ, а также workflow для задач реализован в зачаточном состоянии, к слову я так и не понял как запустить процесс согласования приказа, хоть и пытался разобраться в нем несколько дней. Работу с электронной почтой можно было реализовать тем или иным способом но отсутствие нормального процессе постановки и контроля задач не позволяет использовать Mayan EDMS в качестве системы СЭД для нашей организации. Но все остальное в этой системе реализовано очень грамотно и красиво. Есть интеграция с LDAP, можно подключить любое хранилище в качестве базы данных документов, даже S3, полнотекстовый поиск по базе документов, ролевая модель доступа и многое другое. Все хорошо, но что делать с системой задач? На роль движка для task manager google уверенно советовал Camunda. Действительно, это наверное лидер среди свободно распространяемых систем управления задачами, такого функционала который есть в Camunda нет ни в одном другом продукте. Плюсом к этому добавим большое комьюнити, удобный и понятный rest api интерфейс, огромную базу знаний в которой можно найти почти любой ответ на любой вопрос. Camunda я готов рекомендовать любому в качестве базы для создания ПО класса task manager.
Схема работы сервиса получилась следующая:

Можно выделить четыре главных блока системы:
Mayan EDMS - сервис по хранению, каталогизации, выдаче документов.
Camunda - сервис отвечающий за workflow рабочих задач. Здесь у нас хранятся все задачи которые пользователи ставят друг другу.
LDAP/AD - сервис для хранения учетных записей пользователей. Так как все системы взаимосвязаны, было логичным шагом сделать для всех этих систем сквозную аутентификацию и авторизацию.
MySED - главный frontend системы. В нем пользователь работает с задачами, ищет документы и т.д.
Кроме этих четырех блоков есть еще cli утилиты которые позволяют в фоновом режиме работать с почтовым сервером, а также отслеживать содержимое указанных директорий, чтобы загружать документы в автоматическом режиме в базу Mayan EDMS.
Теперь немного о технических деталях. Frontend написан на новом framework NiceGUI. Разработчики приме��или довольно интересный подход они объединили декларативный интерфейс и бизнес-логику в одном файле .py. Идея конечно не нова, что-то подобное ранее делали Microsoft в своем ASP.net. Преимущество NiceGUI в том, что в нем уже куча готовых компонентов которые отлично кастомизируются. Поначалу немного не привычно писать как бы разметку web app используя принцип вложенности одних компонентов в другие, но потом, когда ты немного вникаешь в логику компоновки начинаешь ценить, насколько быстро и просто создаются страницы web приложения. В качестве примера приведу код страницы управления процессами:
def process_templates_page(): """Страница работы с шаблонами процессов""" with theme.frame('- Шаблоны процессов -'): ui.label('Управление шаблонами процессов Camunda').classes('text-2xl font-bold mb-6') # Кнопка тестирования подключения with ui.row().classes('mb-4'): ui.button( 'Тест подключения', icon='wifi', on_click=test_camunda_connection ).classes('bg-blue-500 text-white text-xs px-2 py-1 h-7') ui.button( 'Обновить статус', icon='refresh', on_click=update_connection_status ).classes('bg-gray-500 text-white text-xs px-2 py-1 h-7') # Создаем вкладки with ui.tabs().classes('w-full') as tabs: deploy_tab = ui.tab('Развертывание BPMN процессов', icon='cloud_upload') manage_tab = ui.tab('Управление процессами', icon='settings') templates_tab = ui.tab('Шаблоны процессов', icon='description') # Создаем панели вкладок with ui.tab_panels(tabs, value=deploy_tab).classes('w-full'): with ui.tab_panel(deploy_tab): create_deploy_section() with ui.tab_panel(manage_tab): create_manage_section() with ui.tab_panel(templates_tab): create_templates_section()
Вроде бы дико видеть разметку и тут же вызов каких-то функций на python, но в реальности все просто и лаконично.
Взаимодействие между сервисами NiceGUI, Camunda, Mayan EDMS осуществляется через rest api. Все крутиться в Docker, очень удобно.
Несколько скринов самого web app:




Пока запуск приложения идет в тестовом режиме. Работаем с выбранной группой пользователей. Обучаем, собираем обратную связь, уже есть несколько непродуманных изначально сценариев, но которые нужно реализовать для комфортной работы пользователей.
За первый месяц тестовой эксплуатации:
Загружено 200+ документов.
Сокращено время ознакомления с документами с 4-5 дней, до 2-3 часов.
Ни одного случая потери документа.
Что сейчас реализовано:
Загрузка документов в базу с предоставлением ролевого доступа к документам.
Сквозной поиск по документам.
Постановка и отслеживание задач по работе с документами.
Подписание документов электронной подписью (с помощью СSP КриптоПро).
МойСЭД выложен на GitHub под лицензией GPL 2.0.