Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2021ВКР750107ИСАКОВ

.pdf
Скачиваний:
8
Добавлен:
04.09.2023
Размер:
1.84 Mб
Скачать

2 ТЕОРЕТИЧЕСКИЕ ОСНОВЫ РАЗРАБОТКИ ВЕБ-ПРИЛОЖЕНИЯ ДЛЯ УДАЛЕННОГО МОНИТОРИНГА

2.1 Обоснование выбора инструментов реализации и площадки для развертывания веб-приложения

2.1.1 Выбор языка и интегрированной среды разработки

Python – это многопарадигмальный, динамически типизированный,

многоцелевой язык программирования. Он разработан для быстрого изучения,

понимания и использования, что делает его незаменимым в учебных и научных целях. Python позволяет писать программы компактно и читаемо.

Программы, написанные на нем, обычно намного короче своих эквивалентов на C, C ++ или Java по нескольким причинам [32]:

позволяет выражать сложные операции в одном операторе;

группировка операторов выполняется по отступам;

объявления переменных или аргументов не требуются.

Более того, Python может включать в себя модули, написанные на других языках – C или C++. Это свойство называется расширяемостью и, возможно,

позволит в будущем усовершенствовать разработку системы «ДиаКомпаньон» путем создания общих модулей, как для веб-приложения, так и для десктопных приложений. Будучи языком высокого уровня, он имеет встроенные типы данных высокого уровня, такие как массивы и словари. Их гибкость, в совокупности с более общими типами данных, расширила область применения языка, сделав его одним из самых часто упоминаемых языков по данным Stack Overflow и индексу TIOBE (см. рисунки 9, 10) [33; 34].

Рисунок 9 – Рейтинг популярности языков по версии TIOBE

31

Рисунок 10 – Статистика упоминаний на Stack Overflow

Однако, у Python есть и недостаток – отсутствие встроенной поддержи матриц, что делает невозможным математические операции с ними. В таком случае для работы с массивами данных можно воспользоваться сторонними библиотека в открытом доступе: NumPy (Numeric Python) и Pandas (Panel Data). При установке библиотеки Pandas устанавливается также и NumPy.

Происходит это потому как Pandas для создания Series и DataFarme объектов используются одномерные массивы ndarray, объединенные под одним именем.

Объекты этого класса занимают меньше памяти, а операции над ними производятся быстрее, чем с обычными списками Python, т.к. библиотека

NumPy написана на C. Использование ndarray открывает нам поддержку математического, а значит и статистического аппарата NumPy при выполнении операций над DataFrame объектами, но кроме этого мы получаем возможность обрабатывать пропущенные значения в массиве как «np.nan».

Для того, чтобы взаимодействовать с SQLite необходимо импортировать встроенную, начиная с версии Python 3, библиотеку sqlite3 (клиентская часть системы управления базами, сокращенно СУБД). Полученные с сервера данные, пройдя предобработку, будут занесены в базу данных. Таким образом,

объект DataFrame станет промежуточным звеном, между базой данных и

Microsoft Excel. При выгрузке данных был выбран встроенный по умолчанию генератор (engine = ‘xlsxwriter’). Также необходимо перевести данные из

32

текстового формата, в котором они изначально хранились в БД, в численный

('strings_to_numbers') и определить формат даты ('default_date_format'). Цель заключается в том, чтобы конечный пользователь, избегая проблем с совместимостью форматов, мог использовать функционал Microsoft Excel для самостоятельно анализа.

Для реализации алгоритма градиентного бустинга модели регрессионных деревьев будет использована одноименная библиотека xgboost. Возможно, для предварительной подготовки данных потребуется использовать одну из двух библиотек машинного обучения: scikit-learn или scipy. Обе библиотеки рекомендуются к использованию для решения задач машинного обучения на главной странице официального сайта Python.

Основой для создания приложения послужит микрофреймворк Flask. В

сравнении с альтернативным Django можно сказать, что Flask приложения значительно меньше и представляют больше свободы разработчикам за счет минимального набора стандартных методов. Все действительно необходимые библиотеки можно установить самому.

В качестве второго языка программирования был выбран JavaScript. С

его помощью можно обойти некоторые ограничения веб-фреймворка Python Flask. Например, чтобы реализовать выделение цветом продуктов в корзине питания по уровню гликемической нагрузки (ГН) – от красного (ГН > 20) до зеленого (ГН < 10). Библиотека React.js окажется незаменимым инструментом для создания виджетов сайта. Суть ее работы заключается в создании некой виртуальной объектной модели документа и сравнение ее с реальной моделью,

той, что непосредственно представлена в окне браузера. После сравнения

React вычленяет отличия и обновляет только тот реакт-компонент, что был изменен. Такой подход к разработке веб-приложения упраздняет необходимость в перезагрузке страницы целиком каждый раз, как приходит ответ от сервера.

Средой для написания кода станет Visual Studio Code. Один из самых популярных текстовых редакторов, поддерживающих множество сторонних

33

библиотек для улучшения визуальной составляющей кода и встроенные Git

команды (Git – система контроля версий). Размещение кода на GitHub станет отличным решением для совместного доступа к исходникам приложения.

2.1.2 Выбор виртуального выделенного сервера

Для развертывания приложения на виртуальном выделенном сервере

(VPS) необходимо выбрать поставщика услуг. На рынке на данный момент существенно расширился выбор среди отечественных и иностранных серверов. Несмотря на то, что принципиальной разницы между ними нет,

отметим со стороны иностранных провайдеров качественную сервисную поддержку и объемную документацию для разработчиков. С другой стороны,

использование отечественных серверов упрощает законодательные требования к процедуре хранения пользовательской информации. Чаще всего при покупке сервера необходимо учитывать настройки файрволла. Например,

открыт или закрыт порт 465 для smtp.gmail.com – некоторые провайдеры любят предлагать в качестве альтернативы собственные платные почтовые клиенты, возможность подключения по защищенному протолку через порт

443. За редким исключением, вроде особой политики борьбы со спам рассылками Linode [35], эти условия соблюдены по умолчанию. Следующим критерием будет ежемесячная плата за сервер. Как уже было сказано в предыдущей главе, по поводу экономической эффективности телемедицинских систем еще ведутся споры. Поэтому перед нами стоит задача подобрать оптимальный тарифный план для разработки и практического использования веб-приложения.

Отметим, что при разработке стоимость ежемесячных затрат может быть минимальна, т.к. требования к ресурсам незначительные. Например, Amazon Lightsail предлагает за 3,50 $ в месяц: объем диска до 20 Гб SSD (твердотельный накопитель), 512 Мб оперативной памяти и 1 ядро (см.

рисунок 11).

34

Рисунок 11 – Тарифные планы Amazon Lightsail

В то время как рабочая версия сервера потребует значительно больших ресурсов – минимум 8 Гб оперативной памяти, для повышения скорости работы приложения, диск не менее 100 Гб. Хотя данные и не хранятся на сервере постоянно, возможен сбой в работе, если размер пользовательских записей превысит лимит. От количества ядер зависит производительность в режиме многопоточности, но наше приложение не рассчитано на работу с использованием нескольких ядер. Таким образом в качестве «рабочего» тарифного плана стоило бы рассмотреть тариф за 40$ в месяц, который предлагает: 8 Гб оперативной памяти, 2 ядра, 160 Гб SSD и передачу данных до 5 Тб.

Вспоминая ограничения, накладываемые при использовании нами

SQLite базы данных, стоит наперед уточнить возможность подключения в будущем к серверу MySQL или PostgreSQL базы данных. Предложенные

Amazon Lightsail базы данных имеют следующие параметры: объем собственной оперативной памяти (т.к. MySQL – это серверная база данных),

объем хранилища, максимальный объем импортируемых данных и процессор

(см. рисунок 12).

35

Рисунок 12 – Тарифные планы Amazon Lightsail Database

Т.к. наше приложение нетребовательно к пропускной способности сервера и не превысит лимит хранения в 40 Гб, то оптимальным выбором в будущем стал бы переход со встраиваемой SQLite на клиент-серверную

MySQL базу данных по минимальному тарифу. Итоговая стоимость на данный момент складывается только из ежемесячной стоимости оплаты сервера –

3,50$. В будущем при переходе на промышленный сервер стоимость увеличится до 40$ и в случае перехода на MySQL – еще на 15$, итого 55$.

Стоит упомянуть разнообразие операционных систем и предустановленных приложений, поставляемое Amazon (см. рисунок 13).

Рисунок 13 – Создание нового инстанса Amazon Lightsail

При создании инстанса (выделенный участок ресурсов на удаленном компьютере) Amazon предлагает установить некоторые программы, такие как

36

Nginx сервер (вкладка «App + OS» на рисунке 13), или же выбирать их самому уже после выделения ресурсов компьютера в пользование (вкладка «OS Only»

рисунок 13). Предпочтительно на этом этапе было бы выбрать платформу

Linux/Unix на чистом Ubuntu последней версии 20.04 LTS или Debian 10.8, т.к.

это самый простой в настройке вариант с широкой документационной поддержкой.

2.2 Разработка структуры и алгоритма работы с приложением

2.2.1 Клиент-серверная архитектура приложения

Для создания веб-приложения с применением языка программирования

Python необходимо задействовать веб-фреймворк, такой как Flask. Фреймворк предоставляет собой набор инструментов для разработки сайта. Отличие фреймворка от библиотеки состоит в том, что фреймворк диктует правила построения архитектуры приложения, задавая на начальном этапе разработки поведение по умолчанию – «каркас», который нужно будет расширять и изменять согласно указанным требованиям. Будем называть такое приложение, написанное по шаблону фреймворка «Flask-приложение». Веб-

сервер – это сетевое приложение, обслуживающее HTTP-запросы от клиентов

(HTTP – протокол передачи гипертекста), обычно веб-браузеров. Изначально веб-сервера не умели нормально работать с такими приложениями,

написанными на языке Python, поэтому появился стандарт взаимодействия

WSGI (Web Server Gateway Interface). WSGI был разработан как интерфейс для маршрутизации запросов от веб-серверов (Nginx) на веб-приложения см.

рисунок 14.

Рисунок 14 – WSGI интерфейс

37

Веб-сервер исполняет код и отправляет связанную с HTTP-запросом информацию и callback-функцию в веб-приложение. Запрос обрабатывается на стороне приложения и высылается ответ на веб-сервер [36]. В нашем случае в роли WSGI сервера будет выступать Gunicorn. Он относительно быстрый,

легко запускается и работает с широким спектром веб-фреймворков, но главное, что сама команда разработчиков рекомендует использовать его в связке с Nginx веб-сервером. За запуск и контроль процессов в Unix среде будет отвечать клиент серверная система Supervisor. Если говорить проще, то ее роль заключается в автоматическом запуске и поддержании работы

Gunicorn. Также с помощью супервайзера можно настроить порт, на котором будет отвечать наш WSGI сервер.

Двигаясь дальше, обрисуем структуру взаимодействия клиента из внешней сети и нашего веб-сервера, см. рисунок 15. Периодически между клиентом и веб-сервером или веб-сервером и веб-приложением существует промежуточный узел. Такая прослойка позволяет осуществить балансировку нагрузки между несколькими веб-серверами или веб-приложениями, а иногда даже предобработку выходных данных.

Рисунок 15 – Структура взаимодействия клиента и серверного компьютера Грамотная архитектура приложения не только гарантирует

бесперебойную работу, но и защищает пользовательские данные от несанкционированного доступа. Рассмотрим возможные пути утечки информации. Во-первых, в момент передачи запроса от клиента к приложению данные могут быть перехвачены, но этого не произойдет если использовать выделенный защищенный канал связи с VPN сервисом. Он в свою очередь

38

шифрует данные и передает их по сети в приложение. На данный момент нет нужды в использовании стороннего VPN сервиса, т.к. данные могут быть зашифрованы и переданы по протоколу HTTPS. К тому же, при использовании мошеннических VPN возникает дыра в безопасности хуже, чем если бы его вовсе не было, ведь VPN сервис – единственный участник цепи, кто знает о вас все, включая IP-адрес (IP – межсетевой протокол). Далее уязвимой точкой становится непосредственно сам сервер, ведь именно на нем хранится вся информация о пользователе в базе данных. Решением этой проблемы может стать как настройка Файрволла, так и деперсонализация медицинской информации по принципу, описанному нами в предыдущей главе. Файрволл представляет собой межсетевой экран, все запросы из внешней сети обязательно проходят через него, чтобы попасть на веб-сервер. При создании правил для сетевого экрана важно учитывать, что порядок имеет значение: чем меньше порядковый номер правила, тем выше приоритет. Кроме того, все, что не запрещено – разрешено по умолчанию. Чтобы включить передачу данных через порт 443 по HTTPS (хэш алгоритм AES_128_GCM, протокол TLS 1.3,

механизм обмена ключами X25519) необходимо внести это правило в Файрволл. Там же выше приоритетом должно располагаться правило передачи информации через порт 80 по HTTP и самое первое правило – порт для SSH (криптографический сетевой протокол) подключения к серверу. Пример выставленных настроек для Файрволла приведен на рис. 16.

39

Рисунок 16 – Консоль управления Firewall на Amazon LightSail Помимо хакерских запросов к серверу, брешью может стать

неосторожность в размещении файлов. Помимо home директории, в которой и хранится приложение, существуют публичные папки с открытым доступом из сети. Обычно их используют для хранения статического контента, например, sitemap.xml файлов, необходимых для прохождения индексации сайтов в таких поисковиках, как Yandex или Google. На веб-серверах Nginx такой открытой директорией является: /usr/share/nginx/html/sitemap.xml. Доступ к файлам в папке легко получить прописав: https://diocompanion.de/sitemap.xml.

2.2.2 Алгоритм работы приложения

Алгоритм работы приложения основывается на взаимодействии пациента с врачом посредством отправки электронного дневника через почту,

см. рисунок 17.

Рисунок 17 – Схема лечебно-диагностического процесса Для начала необходимо пройти процесс регистрации. Для этого

пациенту потребуется ввести желаемый логин (Никнейм должен быть от 5 до

15 символов), затем пароль (минимум 5 символов). Эти данные вводятся как

40