# Описание общей архитектуры приложения

Приложение построено по 3х звенной модели

**Клиент - Сервер приложений - Сервер БД**

Взаимодействие клиентской и серверной части приложения осуществляется на основе веб-протоколов (http(s), webSocket и др.). Каждый веб-сервис определяет свой набор публичных программных интерфейсов (API) в виде путей относительно адреса приложения, по которым клиент может обращаться к нему. Например,  _/api/v1.0/service/_  - путь для обращения к веб-сервису service. Обращение к веб-сервисам чаще всего происходит с помощью http-запросов.

## Клиент

Клиентская часть представляет собой  браузерное html5-приложение на основе различных библиотек и пакетов,  написанное на языке javascript. 

## Сервер приложений

Сервер приложений имеет микросервисную архитектуру и может быть адаптирован для запуска в облаке

![Серверная архитектура](./img/Server_arch.png)

На подробной схеме представлены веб-service приложения  **Lexema**. Веб-service представляют собой самостоятельные приложения на базе экосистемы  _Node.js_  и фреймворка  [**Koa**](https://koajs.com/). Каждый веб-сервис реализует строго определённый функционал и не зависит от реализации других веб-сервисов. Исходя из выполняемой ими функции, веб-service могут обращаться к другим веб-сервисам приложения  **Lexema**  и к различным используемым технологиям. Например, к хранилищу  _Redis_  или к хранилищу данных.

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

### Используемые веб-service

| Сервис   | Описание                                                        |
|----------|-----------------------------------------------------------------|
| **data**     | Сервис доступа к данным и процедурам, хранимым в БД              |
| **entrypoint** | Точка входа для клиентов                                      |
| **gate**     | Сервис входа (аутентификации)                                    |
| **jsreport** | Сервис jsreport предназначен для работы с отчетами jsreport     |
| **logic**    | Сервис логики                                                    |
| **lock**     | Сервис пессимистического блокировщика                            |
| **post**     | Сервис электронной почты и SMS-сообщений                          |
| **RabbitMQ** | Сервер RabbitMQ служит шиной обмена данными между веб-сервисами  |
| **Redis**    | Для хранения различной системной информации используется высокоскоростное хранилище данных Redis |
| **radio**    | Сервис взаимодействия в реальном времени                         |
| **config**   | Сервис конфигурации                                              |

## Сервер базы данных

В качестве сервера баз данных используется **PostgreSQL**.

### Подготовка сервера приложения для развертывания Docker образов. 

**Сервер приложений** - это хост для выполнения Docker контейнеров приложения.

**Docker** — это платформа контейнеризации с открытым исходным кодом, с помощью которой можно автоматизировать создание приложений.

Базовые понятия:

* **Образ (image)** - подготовленный для использования архив с приложением

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

#### Установка docker-образов

1.	Установить на сервер следующие пакеты:

•	docker: https://docs.docker.com/engine/install/ubuntu/

•	docker-compose: https://docs.docker.com/compose/install/linux/

2.	Настройки Docker Network

Для межсервисного трафика при запуске приложения создается отдельная виртуальная сеть с именем проекта. Для взаимодействия с внешними сервисами необходимо создать виртуальную сеть с именем proxy. Cоздание сети proxy следующей командой:  docker network create proxy.

3.	Разместить образы, предоставленные компанией ООО "Лексема" на сервере приложения. Создать временную папку для загрузки образов `mkdir /tmp/lexema && cd /tmp/lexema`

Скопировать архивы образов в папку /tmp/lexema на сервере.

Выполнить команду загрузки образов docker load -i *.tar

Удалить образы  rm -f *.tar

4.	Настроить сервер для доступа к сервису обновлений. 


## Используемые в приложении service

Каждый docker-образ отвечает за работу определенного сервиса. В приложении используется следующий набор сервисов:

* [Entrypoint](../service/entrypoint/configuration.md) -  это исполняемый файл, в котором прописаны команды для выполнения. Обязательный элемент системы. 
* [Config](../service/config/configuration.md#настройка_сервиса) - сервис выдачи настроек других сервисов. 
* [Data](../service/data/configuration.md) – сервис доступа к данным и процедурам, хранимым в БД. 
* [File](../service/file/configuration.md) – сервис работы с файлами . 
* [Fluentd](../service/fluentd/configuration.md) – коллектов логов 
* [Gate](../service/gate/configuration.md) – сервис входа (аутентификации)
* [JSReport](../service/jsreport/configuration.md) - Сервис jsreport предназначен для работы с отчетами jsreport
* [Logic](../service/logic/configuration.md) - Сервис логики предназначен для получения информации о серверных объектах бизнес-логики: моделях, запросах, отчетах, sql-объектах.
* [Post](../service/post/configuration.md) – сервис электронной почты и смс сообщений
* [Preview](../service/preview/configuration.md)  - сервис предназначен для конвертации файлов в файлы в формате pdf, которые можно просматривать в контроле FilePreview
* [Radio](../service/radio/configuration.md) - система взаимодействия реального времени имеет большую область применения: от оповещения сеансов пользователей о произвольных событиях до полноценных сервисов обмена мгновенными сообщениями между пользователями приложения
* [Sheduler](../service/sheduler/configuration.md) – сервис планировщика задач

**Подготовка сервера БД PostgreSQL**

Установить сервер БД со следующими настройками. На сервере создать пользователя с ролью sysadmin

**Публикация сайта**

После развертывания сервера приложений и сервера БД необходимо придумать имя сайта и опубликовать его в интранете либо в интернете

## Требования к системе

**Сервер приложений для Docker**

Уровень | Требование
--------|-----------
Среда исполнения | Docker, Docker-compose
Ubuntu | 20.04+
CentOS | 8.9
Debian | 11 stable
Ред-ОС | 8.3
Oracle Linux | 9
Astra Linux | 1.8 SE
CPU | Архитектура x64, не менее 10 ядер, частота процессора не ниже 2,6 ГГц
RAM | Не менее 16 Гб
HDD | Не менее 100 Гб
Net | Не менее 1 Гбит
 
**Сервер приложений для NPM**

Уровень | Требование
--------|-----------
Среда исполнения | NodeJS 10+
Nginx | 1.19+
Redis | 3.2.100
Erlang OTP | 23.3
Rabbitmq | 3.8.9
Платформа | Windows Server (2012 R2)
CPU | Архитектура x64, не менее 16 ядер, частота процессора не ниже 2,6 ГГц
RAM | Не менее 32 Гб
HDD | Не менее 200 Гб
Net | Не менее 1 Гбит

**Сервер PostgreSQl**

Уровень | Требование
--------|-----------
Среда исполнения | PostgreSQl 13
Платформа | Linux (Ubuntu 2004)
CPU | Архитектура x64, не менее 16 ядер, частота процессора не ниже 2,6 ГГц
RAM | Не менее 32 Гб
HDD | Не менее 500 Гб
Net | Не менее 1 Гбит

**Сервер MS SQL**

 Уровень | Требование 
 ------- | ---------- 
Среда исполнения | MS SQL 2014  
Платформа | Windows Server |
CPU | Архитектура x64, не менее 16 ядер, частота процессора не ниже 2,6 ГГц
RAM | Не менее 32 Гб
HDD | Не менее 1024 Гб
Net | Не менее 1 Гбит


<!-- # Список необходимых лицензий

| Продукт | Прмечание |
| ------- | ---------- |
| MSSQL 2014   | лицензия на сервер + клиентские или  |
|              | лицензия на ядра сервера | -->


**Требования к клиентским компьютерам:**

1.  Подключение к сети
2.  Установленный браузер: 

Браузер | Версия
----------------------|-----
Google Chrome | версия 88.0.4324.150 и выше
Mozilla Firefox | версия 85.0 и выше
Yandex Browser | версия 21.2.0.1099 и выше
Safari | версия 12.1.2 и выше
Edge | версия 88.0.705.81 и выше

Дополнительные требования для рабочих мест, с которых будут подписывать КЭП:

1.  Установлено **ПО СКЗИ Крипто-Про**

2.  Очень желательно **ОС MS Windows 8** и выше

Требование к смартфонам:

1.  **iPhone** – версия iOS 10 и выше
2.  **Android** – версия Android 7 и выше

## Конфигурирование приложения

Основные настройки конфигурирования описываются в файле `productions.js`, который располагается в docker-контейнере config_service приложения. Конфигурационный файл состоит из нескольких разделов, ниже описаны настройки каждого из них. Подробнее про конфигурирование приложения описано в соответствующих разделах [Конфигурирование приложения](../Конфигурирование/Конфигурирование приложения.md) и [Конфигурирование экземпляра приложения](../Конфигурирование/Конфигурирование экземпляра приложения.md)