Установка программного комплекса СТЕК через Docker Compose


Установка программного комплекса СТЕК через Docker Compose

Начиная с версии 21.09 предусмотрено развертывание программного комплекса СТЕК с помощью инструментов Docker Compose. Для этого необходимо на сервере установить докер, настроить конфигурационные файлы и запустить приложение. При этом будут скачаны необходимые образы из репозитория, развернутого на серверах компании СТЕК, а на основе этих образов и файлов конфигурации сгенерированы контейнеры с необходимыми для работы программного комплекса окружением и сервисами. Комплекс СТЕК поделен на несколько контейнеров:

  • Nginx - контейнер с веб сервером nginx, работающий в роли реверс-прокси;
  • RabbitMQ - контейнер с брокером сообщений;
  • Gateway - контейнер со StackGateway, который отвечает за аутентификацию и авторизацию пользователей;
  • BirtReporter - контейнер со службой построителя отчетов;
  • DotNetCore - контейнер с построителем отчетов в MS Office;
  • Frontend - контейнер со статикой, он же stack-front;
  • AppHost - набор контейнеров с бинарниками и открытой частью бизнес-логики (workspace). Данные контейнеры поднимаются как минимум по одному на каждую из задач (ФЛ, ЮЛ и т.д.) + контейнеры с шедулером (отдельно для каждой из задач) + при необходимости контейнеры для отладки (так же позадачно).

О том как установить Docker, настроить конфигурацию, подключиться к репозиторию, запустить ПК СТЕК и будет описано ниже.

Следует сразу оговорить, что сервер БД PostgreSQL, разворачивается вне контейнеров, как правило, на отдельном сервере (в частном случае, при незначительном размере БД и количестве пользователей, допускается совместить сервер БД и сервер приложений). Порядок установки и настройки сервера PostgreSQL будет описан отдельно.

Установка в операционной системе Windows

Требования к операционной системе:

Установка сервера PostrgeSQL

image

Здесь нажимаем "Далее/Next";

image

Выбираем директорию установки и нажимаем "Далее/Next";

image

Выбираем необходимые компонеты установки и нажимаем "Далее/Next";

image

Создаем и выбираем директорию для хранения данных и нажимаем "Далее/Next";

image

Задаем пароль пользователя "postgres" и нажимаем "Далее/Next";

image

Оставляем (или задаем другой, если занят) порт по умолчанию и нажимаем "Далее/Next";

image

Выбираем локализацию "Russian, Russia" и нажимаем "Далее/Next";

image

Проверяем данные инсталляции и нажимаем "Далее/Next";

image

После этого запускаем установку, для чего нажимаем "Далее/Next";

image

Отобразится окно с пргрессом установки;

image

После завершения установки нажимаем "Завершить/Finish";

Если при окончании установки была установлена галка в чекбоксе Stack Builder, то откроется окно для установки дополнительных компонентов:

image

в котором, после выбора подключения к своему серверу, при необходимости, можно доустановить компонеты, например pgAgent (планировщик заданий) или pgBouncer (балансировщик нагрузки):

image

  • Запуск и настройка postgresql

После установки необходимо изменить конфигурационные файлы postgresql.conf и pg_hba.conf в директории с данными:

image

В файле postgresql.conf изменить listen_addresses = '*' и max_connections = 1000:

image

В файле pg_hba_conf разрешаем подключение со всех адресов к любой базе используя логин и пароль:

 # IPv4 local connections:
 host    all             all             0.0.0.0/0                md5
 # IPv6 local connections:
 host    all             all             ::0/0                    md5

image

Сохраняем изменения в файлах и перезапускаем службу PSQL, для чего запускаем оснастку управления службами (сочетание клавишь Win+R и вводим services.msc), находим службу PostgreSQL, выбираем правой клавишей мыши и, в открывшемся контекстном меню "Перезапустить":

image

image

На первом шаге выбираем Add Python to PATH и Customize installation

image

Затем нажимаем "Next/Далее";

image

Выбираем отметку Install for all users, каталог установки и нажимаем "Install", после окончания установки нажать "Close".

  • Подключение к серверу БД, добавление пользователей и создание базы данных.

Управление сервером БД можно осуществлять непосредственно из консоли сервера, или через "студию", например, DBeaver или pgAdmin, последний установился в коплексе с сервером, рассмотрим подключение и настройку через него, для этого в меню "Пуск", в сформированной группе PostgreSQL 13, открываем pgAdmin 4:

image

При первом запуске утилита запросит зоздание "мастер пароля", задайте любой и не забудьте его сохранить, затем настроим подключение к серверу, для этого переходим в Dashboard и выбираем Add New Server:

image

На первой вкладке открывшегося окна задаем имя сервера:

image

На вкладке Connection указываем адрес сервера (в нашем случае он развернут локально - localhost), порт и пароль пользователя postgres, которые задали при усановке

image

На вкладке SSL разрешаем такое подключение (Allow):

image

И нажимаем "Save/Сохранить";

В левой части окна pgAdmin, в обозревателе отобразится созданное нами подключение:

image

Слева в обозревателе открываем на вкладке Login/Group Role правой кнопкой мыши меню и выбираем Create - Login/Group Role

image

И добаляем пользователя SA - в поле "Name" вводим имя пользователя SA:

image

На следующей вкладке Definition указываем пароль:

image

На вкладке Privileges выставляем полные права:

image

И нажимаем "Save/Сохранить".

Создаем БД для этого на вкладке Databases в обозревателе, открываем правой кнопкой мыши меню и выбираем Create - Database:

image

На первой вкладке задаем имя БД:

image

И нажимаем "Save/Сохранить".

Перед восстановлением в созданную базу резервной копии, необходимо на БД создать расширения, для чего в обозревателе, выбираем правой кнопкой мыши базу, в открывшемся меню нажимаем "Query Tool":

image

В окно запроса вставляем расширения, как указано ниже и выполняем запрос:

image

 CREATE EXTENSION "uuid-ossp";
 CREATE EXTENSION "tablefunc";
 CREATE EXTENSION "pgcrypto";
 CREATE EXTENSION "pgstattuple";
 CREATE EXTENSION "hstore";
 CREATE EXTENSION "plpython3u";
 CREATE EXTENSION "pg_trgm";

Перед восстановлением БД, необходимо в настройках pgAdmin указать путь к утилитам установленной версии PostgreSQL, для этого открываем File - Preferences - Binary paths и указываем путь до папки bin Postgres:

image

И нажимаем "Save/Сохранить".

Для восстановления резервной копии БД, на созданной базе открываем правой кнопкой мыши меню и выбираем "Restore":

image

В открывшемся окне на первой вкладке указываем формат резервной копии, путь к файлу (каталогу) резервной копии и владельца postgres:

image

На следующей вкладке Restore Options выставляем флаги как указано на скриншоте ниже:

image

И нажимаем "Restore/Восстановить". Начнется восстановление БД из резервной копии.

image

На этом подготовку сервера PostgreSQL к работе со сборкой можно считать завершенной.

Установка Docker Desktop

Запускаем установщих, оставляем отметки по умодчанию:

image

И нажимаем "ОК" начнется инсталляция программы.

image

После окончания установки, соглашаемся с презагрузкой операционной системы;

image

После перезагрузки соглашаемся с лицензионным соглашением.

Настройка конфигурационных файлов

Размещаем в произвольном каталоге файлы .env и docker-compose.yml

В файле .env заполняем переменные:

 # Имя проекта Docker Compose   
 # и номер сборки, например:   
 #   latest          - последняя стабильная(?),   
 #   21.9            - последняя стабильная указанной версии,   
 #   21.9.20220512   - конкретная сборка от нужной даты   
 COMPOSE_PROJECT_NAME=stack   
 BUILD=22.12

 # Часовой пояс, код региона и маска подсети контейнеров   
 # DIVO_ID переменная устанавливается только для работы с контейнерами сервиса Стек-Диво   
 TZ=Europe/Moscow   
 REGION_CODE=76

 SUBNET_PATTERN=172.30.0.0/16   
 SUBNET_NAME=${COMPOSE_PROJECT_NAME}_network

 # Cписок задач для запуска   
 #TASK_NAMES=fl ul admin dlg_fl dlg_ul commun avar passport pdu rsp kassa
 TASK_NAMES=fl admin

 # Имя сервера или домена (например examle.com или 192.168.111.111), по которому будет доступ в программу,   
 # порт (если nginx внешний, порт все равно надо указать),   
 # и наличие SSL (true or false)   
 SITE_NAME=192.168.1.118   
 NGINX_PORT=80   
 SSL=false

 # Данные для подключения к СУБД и БД (могут быть разные логины/пароли)   
 POSTGRES_HOST=192.168.1.118   
 POSTGRES_PORT=5432

 DATABASE_LOGIN=SA   
 DATABASE_PASSWORD=Stack450194   
 DATABASE_NAME="stack_test"

 # Количество синхронных потоков, асинхронных потоков и исполнители для каждой из задач в контейнере.   
 THREAD_COUNT=10   
 THREAD_ASYNC_COUNT=2   
 WORKER_ASYNC_COUNT=4

 # Настройки для подключение к BirtReport. Может быть как в своем контейнере так и внешний.   
 # Количество памяти для BirtReport (только если в местном контейнере).   
 BIRT_HOST=birtreport   
 BIRT_PORT=20777   
 BIRT_MEMORY=512

 # Настройки для подключение к DotNetCore. Может быть как в своем контейнере так и внешний.   
 DOTNETCORE_HOST=dotnetcore   
 DOTNETCORE_PORT=20001

 # Настройки для подключение к RabbitMQ. Может быть как в своем контейнере так и внешний.   
 # Порт для подключения к GUI (только если в местном контейнере).   
 RABBITMQ_HOST=rabbitmq   
 RABBITMQ_PORT=5672   
 RABBITMQ_GUI_PORT=15672

 SERVICE_QUEUE_1=${COMPOSE_PROJECT_NAME}_queue_1   
 SERVICE_QUEUE_2=${COMPOSE_PROJECT_NAME}_queue_2

 # Настройки для подключение к StackGateway. Может быть как в своем контейнере так и внешний.   
 GATEWAY_HOST=gateway   
 GATEWAY_PORT=8182   
 MIN_IDLE=1000   
 CONNECTION_TIMEOUT=30000

 # Имя и порт с отдачей статики фронтэнда.   
 FRONT_HOST=frontend   
 FRONT_PORT=3000

Заполняем файл docker-compose.yml:

 # Файл docker-compose должен начинаться с тега версии.
 # Создание файлов yml с использованием синтаксиса версии 3.7
 version: "3.7"

 volumes:
       public_files:
       upload_files:
       birt_exchange:
       dotnetcore_exchange:
       share_files:
             driver_opts:
             type: "none"
                   o: "bind"
                   device: "/mnt/share"

 # Объявляем сеть
 # name - наименование сети
 # driver - драйвер сети
 # ipam - конфигурация сети
 networks:
       default:
             name: ${SUBNET_NAME}
             driver: bridge
             ipam:
                   driver: default
                   config:
                         - subnet: $SUBNET_PATTERN}

 # Следует учитывать, что docker-composes работает с сервисами.
 # 1 сервис = 1 контейнер.
 # Сервисом может быть клиент, сервер, сервер баз данных...
 # Раздел, в котором будут описаны сервисы, начинается с 'services'.

 # Основные ключи в разделе servoces :

 # container_name: - название контейнера
 # image - указываем скачиваемый образ docker
 # restart - определение политики перезапуска контейнера: unless-stopped - перезапуск контейнера во всех случаях, кроме преднамеренной остановки
 # depends_on - позволяет указывать, должен ли сервис, прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы
 # environment - указываем переменные, пробрасываемые в контейнер
 # hostname: - hostname в контейнере
 # ports: - порты, которые мы хотим прокинуть в контейнер
 # volumes: - директории, которые мы хотим прокинуть в контейнер.
 # extends - можно cовместно использовать конфигурации сервисов

 services:
      rabbitmq:
            image: docker.stack-it.ru/stable/rabbitmq:latest
            restart: unless-stopped
            hostname: rabbitmq
            environment:
                  TZ: ${TZ}
            labels:
                  - "rabbitmq"
            ports:
                  - "${RABBITMQ_GUI_PORT}:15672"

      nginx:
            image: docker.stack-it.ru/test/nginx:${BUILD}
            restart: unless-stopped
            depends_on:
                 - "frontend"
                 - "gateway"
            environment:
                  NGINX_PORT: ${NGINX_PORT}
                  SITE_NAME: ${SITE_NAME}
                  GATEWAY_HOST: ${GATEWAY_HOST}
                  GATEWAY_PORT: ${GATEWAY_PORT}
                  FRONT_HOST: ${FRONT_HOST}
                  FRONT_PORT: ${FRONT_PORT}
                  TZ: ${TZ}
            ports:
                  - "${NGINX_PORT}:${NGINX_PORT}"
            labels:
                  - "nginx"

      gateway:
            image: docker.stack-it.ru/stable/gateway:${BUILD}
            restart: unless-stopped
            hostname: gateway
            depends_on:
                 - "rabbitmq"
            environment:
                  COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME}
                  RABBITMQ_HOST: ${RABBITMQ_HOST}
                  RABBITMQ_PORT: ${RABBITMQ_PORT}
                  DATABASE_LOGIN: ${DATABASE_LOGIN}
                  DATABASE_PASSWORD: ${DATABASE_PASSWORD}
                  DATABASE_NAME: ${DATABASE_NAME}
                  GATEWAY_PORT: ${GATEWAY_PORT}
                  NGINX_PORT: ${NGINX_PORT}
                  SITE_NAME: ${SITE_NAME}
                  POSTGRES_HOST: ${POSTGRES_HOST}
                  POSTGRES_PORT: ${POSTGRES_PORT}
                  TZ: ${TZ}
                  MIN_IDLE: ${MIN_IDLE}
                  CONNECTION_TIMEOUT: ${CONNECTION_TIMEOUT}
                  EXCHANGE_IN: ${SERVICE_QUEUE_1}
                  EXCHANGE_OUT: ${SERVICE_QUEUE_2}
                  TASK_NAMES: ${TASK_NAMES}
            volumes:
                  - upload_files:/root/upload
                  - public_files:/root/share
            labels:
                  - "gateway"

      frontend:
            image: docker.stack-it.ru/stable/frontend:${BUILD}
            restart: unless-stopped
            hostname: frontend
            ports:
                  - "${FRONT_PORT}:3000"
            environment:
                  NGINX_PORT: ${NGINX_PORT}
                  SITE_NAME: ${SITE_NAME}
                  TASK_NAMES: ${TASK_NAMES}
            labels:
                  - "frontend"

      birtreport:
            image: docker.stack-it.ru/stable/birtreport:${BUILD}
            restart: unless-stopped
            environment:
                  BIRT_PORT: ${BIRT_PORT}
                  BIRT_MEMORY: ${BIRT_MEMORY}
                  TZ: ${TZ}
            hostname: birtreport
            volumes:
                  - birt_exchange:/root/birt_exchange
            labels:
                  - "birtreport"

      dotnetcore:
            image: docker.stack-it.ru/stable/dotnetcore:${BUILD}
            restart: unless-stopped
            environment:
                  DOTNETCORE_PORT: ${DOTNETCORE_PORT}
                  TZ: ${TZ}
            hostname: dotnetcore
            volumes:
                  - dotnetcore_exchange:/root/dotnetcore_exchange
            labels:
                  - "dotnetcore"

 # Следующий раздел не трогаем
 #################################################
      app_host_admin:
            image: docker.stack-it.ru/stable/apphost:${BUILD}
            restart: unless-stopped
            environment:
                  COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME}
                  DATABASE_LOGIN: ${DATABASE_LOGIN}
                  DATABASE_PASSWORD: ${DATABASE_PASSWORD}
                  DATABASE_NAME: ${DATABASE_NAME}
                  POSTGRES_HOST: ${POSTGRES_HOST}
                  POSTGRES_PORT: ${POSTGRES_PORT}
                  REGION_CODE: ${REGION_CODE}
                  RABBITMQ_HOST: ${RABBITMQ_HOST}
                  RABBITMQ_PORT: ${RABBITMQ_PORT}
                  THREAD_COUNT: ${THREAD_COUNT}
                  THREAD_ASYNC_COUNT: ${THREAD_ASYNC_COUNT}
                  WORKER_ASYNC_COUNT: ${WORKER_ASYNC_COUNT}
                  EXCHANGE_IN: ${SERVICE_QUEUE_2}
                  EXCHANGE_OUT: ${SERVICE_QUEUE_1}
                  BIRT_HOST: ${BIRT_HOST}
                  BIRT_PORT: ${BIRT_PORT}
                  DOTNETCORE_HOST: ${DOTNETCORE_HOST}
                  DOTNETCORE_PORT: ${DOTNETCORE_PORT}
                  SITE_NAME: ${SITE_NAME}
                  TZ: ${TZ}
                  TASK_NAMES: ${TASK_NAMES}
                  TASK_NAME: admin
            depends_on:
                  - "rabbitmq"
                  - "gateway"
            privileged: true
            volumes:
                  - public_files:/root/public
                  - upload_files:/root/upload
                  - share_files:/root/share
                  - birt_exchange:/root/birt_exchange
                  - dotnetcore_exchange:/root/dotnetcore_exchange
            labels:
                  - "app_host_admin"

 ####################################################

 # Для добавления контейнеров c другими задачами: скопировать сервис, изменить его название,
 # в параметре TASK_NAME указать необходимую задачу (только одну).
 # Можно переопределить другие переменные при необходимости (например BIRT_HOST).
 # При необходимости запуска отладки добавить параметр DEBUG_PORT с номером порта в значении (например DEBUG_PORT: 3280).
 # CMD_FULL
 # CMD_ADDITIONAL

      app_host_fl:
            extends:
                  service: app_host_admin
            environment:
                  TASK_NAME: fl

 #     app_host_fl_sched:
 #           extends:
 #                 service: app_host_admin
 #           environment:
 #                 TASK_NAME: fl
 #                 SCHEDULER: true

 #     app_host_xx:
 #           extends:
 #                 service: app_host
 #           environment:
 #                 TASK_NAME: dlg_fl

Сохраняем файлы в произвольный каталог на сервере. Затем открываем командную строку, переходим в директорию с файлами и выполняем команду вида docker login -u user -p password docker.stack-it.ru (логин и пароль сообщат сотрудники нашей компании), вывод консоли должен сообщить Login Succeeded.

После успешной авторизации, выполняем команду docker-compose up -d в результате выполнения которой, будут выкачаны образы из репозитория, сгенерированы и запущены контейнеры:

image

image

Теперь можно открыть web-интрфейс программы по адресу указанному в параметре SITE_NAME:

image

На этом установка ПК СТЕК в докере под Windows завершена.