Skip to content

PrudyvusP/cert_ecosystem

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cert_ecosystem

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-шаблон целесообразно хранить рядом с директорией, в которой развернут проект, а директорию с результатами работы генератора писем лучше всего в расшаренную самбу, чтобы пользователи сервиса могли забирать результаты работы, но при этом не могли редактировать шаблон письма.

Parser XML-файлов

В сервис возможно добавить данные, соответствующие схеме. Для этого нужно загрузить через веб-форму соответствующие файлы и указать электронную почту, на которую придут результаты обработки XML-файлов. Парсинг XML-файлов происходит асинхронно, поэтому необходимо указать адрес, по которому доступен брокер сообщений:
CELERY_BROKER_URL=<адрес брокера сообщений>

Отправка e-mail

Созданные письма, содержащие методические документы, часто остаются пользователем незаполненными. Для осуществления контроля таких ситуаций предусмотрен механизм автоматической отправки руководителю 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

Для использования возможностей сервиса в режиме production также нужно указать следующие переменные окружения в файле .env:

DB_NAME=<название базы данных>
DB_HOST=<доменное имя или ip-адрес, на котором вращается PostgreSQL>
DB_PORT=<порт, на котором слушает запросы PostgreSQL>
POSTGRES_USER=<пользователь, под которым будет работать сервис>
POSTGRES_PASSWORD=<пароль, который использует пользователь для подключения>

Пример файла, содержащего переменные окружения

Пример заполнения файла .env - тут

Настройка

Для создания схемы БД необходимо применить подготовленные миграции:

flask db upgrade

Management-команды

flask index

Команда 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. получение образа документа при генерации письма также недоступно по той причине, что логика сервиса предполагает хранение результатов генерации писем в расшаренной самбе, но не их отдачу как файл через веб-сервер.

About

Organizations management service

Topics

Resources

Stars

Watchers

Forks

Languages