CERT_ecosystem - это сервис учета взаимодействия с юридическими лицами (организациями).
Написан с помощью Flask с использованием Flask-Admin в целях получения большей функциональности при минимальной вёрстке. В качестве БД используется PostgreSQL.
- Основная сущность сервиса - Организация (юридическое лицо) - Organization.
- Реквизиты организации добавляются вручную или из Единого государственного реестра юридических лиц (ЕГРЮЛ).
- Для использования сведений из ЕГРЮЛ предусмотрено взаимодействие с микро-сервисом egrul_fts_api по API (форма поиска).
- Организацию можно редактировать, но нельзя удалить.
- С организацией ведется деловая переписка - Message.
- Письма могут быть входящими или исходящими.
- Одно Письмо можно отправить нескольким Организациям сразу, а у одной Организации может быть несколько Писем.
- Письма могут быть связаны друг с другом через дерево корнями вниз.
- Письма можно как редактировать, так и удалять.
- Организации направляют на согласование свои организационно-распорядительные (ОР) документы - OrgAdmDoc.
- У одной Организации может быть несколько ОР Документов.
- ОР Документы хранятся в формате .pdf на файловой системе в директориях по первым двум символам UUID Организации.
- ОР Документ может быть открытым или конфиденциальным. Конфиденциальный ОР Документ в сервисе не хранятся.
- Тип ОР Документа добавляется вручную. Удаление типа ОР Документа запрещено.
- Среди ОР Документов должен быть основополагающий. В нынешней реализации сервиса под таким понимается некое соглашение.
- Если ОР документ поступает официально, то создается входящее Письмо.
- Организациям направляются методические документы (MethodicalDoc) в соответствии с их официальными запросами.
- Тип методического документа (М Документ) вместе с его файловым образом добавляет пользователь.
- Электронный образ М Документа хранится в двоичном виде в СУБД.
- М Документ может быть действующим или потерявшим актуальность.
- М Документ можно редактировать, но нельзя удалять.
- Под отправкой М Документа подразумевается создание .docx-образа официального письма и .iso-образа, содержащего архив с М Документами.
- При направлении М Документов по запросу Организации создаются два Письма - входящее (запрос) и исходящее (ответ).
- Организация может владеть информационными ресурсами (Resource).
- Информационные ресурсы (ИР) можно добавлять, редактировать и удалять.
- У ИР могут быть сфера(-ы) функционирования (Industry), задаваемые законодательством.
- У каждой Организации есть фактический адрес расположения.
- Элементы одного ИР могут располагаться по разным адресам расположения.
- Для получения возможности выборки по географическим адресам создана сущность почтового адреса - Address.
- Адрес обязательно относится к определенному субъекту РФ (Region) и федеральному округу РФ (Okrug) соответственно.
- Создание, редактирование и удаление Адресов, Регионов и Округов запрещено. Географические данные Регионов и Округов заполняются с помощью миграции данных, а данные Адресов берутся из Эталонного справочника почтовых индексов объектов почтовой связи АО "Почта России"
- У организации может быть один или несколько Центров Мониторинга (Cert).
- Центр мониторинга добавляется и редактируется сугубо через XML-parser сведений.
- Одна организация может передавать центру мониторинга другой Организации собственные ИР на аутсорс (Responsibility) в части оказания услуг в сфере информационной безопасности.
- Набор услуг (Service) у каждой единицы аутсорсинга свой.
- Информация о зоне ответственности доступна только для чтения и заводится через XML-parser.
Установить python3 и другие необходимые пакеты:
apt-get install python3 python3-venv python3-dev
Установить git:
apt-get install git
Установить PostgreSQL:
apt-get install postgresql
Установить RabbitMQ:
apt-get install rabbitmq-server
Клонировать проект:
git clone https://github.com/PrudyvusP/cert_ecosystem.git && cd "$(basename "$_" .git)"
Создать виртуальное окружение и активировать его:
python3 -m venv venv && source venv/bin/activate
Установить зависимости:
pip3 install -r requirements.txt
В случае локального развертывания зеркала pypi.org использовать флажок --trusted-host=<url>
.
production - основной режим работы. DEBUG-режим выключен, в качестве БД используется PostgreSQL.
development - режим работы для разработки. DEBUG-режим включен, все ошибки имеют подробное описание.
В качестве БД используется SQLite.
testing - режим работы для отладки. DEBUG-режим выключен, БД - SQLite.
В случае использования режима production необходимо предварительно подготовить PostgreSQL.
Запустить консольную утилиту psql
:
sudo -iu postgres psql
Создать базу данных, создать пользователя и дать ему права:
CREATE DATABASE <db_name>;
CREATE USER <db_user> WITH PASSWORD '<db_password>';
GRANT ALL PRIVILEGES ON DATABASE <db_name> TO <db_user>;
В корне основной директории проекта должен быть создан файл с названием .env
, в котором обязательно необходимо
указать следующие переменные окружения:
SECRET_KEY=<ключ для защиты от CSRF-атак (любая строка)>
FLASK_ENV=<среда использования (принимает значения development/testing/production)>
Если дополнительно развернуть в докере данный сервис,
то возможно добавлять организации из ЕГРЮЛ в рабочее пространство через форму поиска.
Для получения соответствующего функционала нужно задать следующую переменную окружения:
EGRUL_SERVICE_URL=<url на котором расположен сервис с ЕГРЮЛ>
Для возможности создания .docx-образа письма в адрес определенной организации необходимо
добавить в переменные окружения путь до файла-шаблона:
DOCX_TEMPLATE_PATH=</path/to/file.docx>
Для сохранения результатов работы генератора письма, содержащего .docx-образ файла письма, а также
.iso-образ приложения к письму, необходимо указать путь:
METHOD_DOCS_PATH=</path/to/dir/>
.docx-шаблон целесообразно хранить рядом с директорией, в которой развернут проект, а директорию с результатами работы генератора писем лучше всего в расшаренную самбу, чтобы пользователи сервиса могли забирать результаты работы, но при этом не могли редактировать шаблон письма.
В сервис возможно добавить данные, соответствующие схеме.
Для этого нужно загрузить через веб-форму соответствующие файлы и указать
электронную почту, на которую придут результаты обработки XML-файлов.
Парсинг XML-файлов происходит асинхронно, поэтому необходимо указать
адрес, по которому доступен брокер сообщений:
CELERY_BROKER_URL=<адрес брокера сообщений>
Созданные письма, содержащие методические документы, часто остаются пользователем
незаполненными. Для осуществления контроля таких ситуаций предусмотрен
механизм автоматической отправки руководителю e-mail сообщений о таких
письмах. Для использования данного функционала необходимо указать
следующие переменные окружения:
SMTP_PORT=<номер smtp-порта, по умолчанию 25>
SMTP_HOST=<наименование сервера исходящих сообщений, по умолчанию localhost>
SMTP_USER=<логин пользователя, от которого будет отправлен e-mail>
SMTP_PASSWORD=<пароль пользователя, от которого будет отправлен e-mail>
BOSS_EMAIL_FOR_NOTIFY=<e-mail адреса руководителей, разделенные пробелом>
CELERY_BROKER_URL=<адрес брокера сообщений>
Для использования возможностей сервиса в режиме production также нужно указать следующие
переменные окружения в файле .env
:
DB_NAME=<название базы данных>
DB_HOST=<доменное имя или ip-адрес, на котором вращается PostgreSQL>
DB_PORT=<порт, на котором слушает запросы PostgreSQL>
POSTGRES_USER=<пользователь, под которым будет работать сервис>
POSTGRES_PASSWORD=<пароль, который использует пользователь для подключения>
Пример заполнения файла .env
- тут
Для создания схемы БД необходимо применить подготовленные миграции:
flask db upgrade
Команда flask index <path_to_file>
обрабатывает информацию о почтовых индексах.
На вход хочет получать файл вида PIndx*.dbf
,
который загружается отсюда.
flask index -f <path_to_file> check
flask index -f <path_to_file> update
check
- сравнивает данные в БД с файлом <path_to_file>
;
update
- заполняет БД актуальными данными из <path_to_file>
.
Таким образом, для первого использования необходимо выполнить команду flask index <path_to_file> update
.
В консоли psql
можно проверить результат применения миграций и залива сведений о регионах, например:
\c <db_name>;
SELECT COUNT(*) FROM regions;
Результатом SQL-запроса выше может быть следующая строка:
count
-------
86
(1 row)
Если count > 0, то миграции успешно применены, а сведения корректно залиты.
Один из вариантов развертывания сервиса - это создание соответствующей службы.
Представим, что сервис должен вращаться от имени пользователя debian в домашней
директории /home/debian/ и быть доступным по адресу http://localhost:8000.
В таком случае необходимо создать файл /etc/systemd/system/cert_ecosystem.service
как минимум следующего содержания:
[Unit]
Description=Cert Ecosystem Web Service
After=network.target
[Service]
User=debian
WorkingDirectory=/home/debian/cert_ecosystem/
ExecStart=/home/debian/cert_ecosystem/venv/bin/gunicorn -b localhost:8000 -w 3 app:app --access-logfile -
Restart=always
[Install]
WantedBy=multi-user.target
После заполнения файла /etc/systemd/system/cert_ecosystem.service
нужно создать символическую ссылку на сервис для автоматического поднятия службы,
перезапустить конфигуратор служб и запустить cert_ecosystem:
celery -A make_celery worker -B --loglevel INFO
sudo systemctl enable cert_ecosystem.service
sudo systemctl daemon-reload
sudo systemctl start cert_ecosystem
Убедиться в том, что сервис работает корректно можно переходом в браузере на адрес http://localhost:8000.
В качестве статического сервера можно и нужно использовать либо Nginx, либо Apache. Данный сервис используется разработчиком в паре с Apache.
Проблема:
в pg_hba.conf нет записи для компьютера "<db_host>", пользователя "<db_user>",
базы "<db_name>", SSL выкл.
Решение:
Открыть конфиг PostgreSQL:
sudo vim /etc/postgresql/12/main/pg_hba.conf
Добавить строчку вида: host <db_name> <db_user> <db_host>:<db_port> md5
Перезапустить PostgreSQL:
sudo serivce postgresql reload
Для создания резервной копии БД можно использовать команду pg_dump
в паре с cron
.
Для формирования дампа из PostgreSQL может использоваться команда:
pg_dump -U <POSTGRES_USER> -h <DB_HOST> -p <DB_PORT> -d <DB_NAME> > <dump_name>.sql
Подробнее о бэкапе можно почитать тут.
Для резервного копирования файлов организации может использоваться команда:
tar -zcf <path_to_dir_for_backups>.cert_org_files_backup-$(date +"%d-%m-%Y_%H-%M").tar.gz -C <path_to_dir_with_service>/cert_ecosystem/organizations/static/organizations .
Для быстрого развертывания предусмотрен скрипт setup.sh, который создаст виртуальное окружение, загрузит необходимые зависимости, добавит необходимые переменные окружения (режим testing), сделает миграции БД (дополнительно добавив сведения о регионах и округах РФ), а также зальет тестовые данные для демонстрации логики работы сервиса:
bash setup.sh
С результатом развертывания сервиса можно ознакомиться тут.
На текущий момент времени Поиск по ЕГРЮЛ по ссылке выше недоступен в связи с ограничением бесплатного хостинга
(один сервер = один сервис, бд: MySQL, SQLite).
P.S. получение образа документа при генерации письма также недоступно по той причине, что логика сервиса предполагает
хранение результатов генерации писем в расшаренной самбе, но не их отдачу как файл через веб-сервер.