Установка программного комплекса СТЕК через 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
- Скачайте (https://www.postgresql.org/download/windows) и установите PostgreSQL 13
Здесь нажимаем "Далее/Next";
Выбираем директорию установки и нажимаем "Далее/Next";
Выбираем необходимые компонеты установки и нажимаем "Далее/Next";
Создаем и выбираем директорию для хранения данных и нажимаем "Далее/Next";
Задаем пароль пользователя "postgres" и нажимаем "Далее/Next";
Оставляем (или задаем другой, если занят) порт по умолчанию и нажимаем "Далее/Next";
Выбираем локализацию "Russian, Russia" и нажимаем "Далее/Next";
Проверяем данные инсталляции и нажимаем "Далее/Next";
После этого запускаем установку, для чего нажимаем "Далее/Next";
Отобразится окно с пргрессом установки;
После завершения установки нажимаем "Завершить/Finish";
Если при окончании установки была установлена галка в чекбоксе Stack Builder, то откроется окно для установки дополнительных компонентов:
в котором, после выбора подключения к своему серверу, при необходимости, можно доустановить компонеты, например pgAgent (планировщик заданий) или pgBouncer (балансировщик нагрузки):
- Запуск и настройка postgresql
После установки необходимо изменить конфигурационные файлы postgresql.conf и pg_hba.conf в директории с данными:
В файле postgresql.conf
изменить listen_addresses = '*'
и max_connections = 1000
:
В файле pg_hba_conf
разрешаем подключение со всех адресов к любой базе используя логин и пароль:
# IPv4 local connections:
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::0/0 md5
Сохраняем изменения в файлах и перезапускаем службу PSQL, для чего запускаем оснастку управления службами (сочетание клавишь Win+R и вводим services.msc
), находим службу PostgreSQL, выбираем правой клавишей мыши и, в открывшемся контекстном меню "Перезапустить":
- Скачаем (https://www.python.org/downloads/release/python-379/) и установим Python 3.7.9 (необходим для работы расширения, которое, позднее, будет установлено на БД):
На первом шаге выбираем Add Python to PATH
и Customize installation
Затем нажимаем "Next/Далее";
Выбираем отметку Install for all users
, каталог установки и нажимаем "Install", после окончания установки нажать "Close".
- Подключение к серверу БД, добавление пользователей и создание базы данных.
Управление сервером БД можно осуществлять непосредственно из консоли сервера, или через "студию", например, DBeaver или pgAdmin, последний установился в коплексе с сервером, рассмотрим подключение и настройку через него, для этого в меню "Пуск", в сформированной группе PostgreSQL 13, открываем pgAdmin 4:
При первом запуске утилита запросит зоздание "мастер пароля", задайте любой и не забудьте его сохранить, затем настроим подключение к серверу, для этого переходим в Dashboard и выбираем Add New Server
:
На первой вкладке открывшегося окна задаем имя сервера:
На вкладке Connection
указываем адрес сервера (в нашем случае он развернут локально - localhost
), порт и пароль пользователя postgres, которые задали при усановке
На вкладке SSL
разрешаем такое подключение (Allow):
И нажимаем "Save/Сохранить";
В левой части окна pgAdmin, в обозревателе отобразится созданное нами подключение:
Слева в обозревателе открываем на вкладке Login/Group Role
правой кнопкой мыши меню и выбираем Create - Login/Group Role
И добаляем пользователя SA
- в поле "Name" вводим имя пользователя SA
:
На следующей вкладке Definition
указываем пароль:
На вкладке Privileges
выставляем полные права:
И нажимаем "Save/Сохранить".
Создаем БД для этого на вкладке Databases
в обозревателе, открываем правой кнопкой мыши меню и выбираем Create - Database
:
На первой вкладке задаем имя БД:
И нажимаем "Save/Сохранить".
Перед восстановлением в созданную базу резервной копии, необходимо на БД создать расширения, для чего в обозревателе, выбираем правой кнопкой мыши базу, в открывшемся меню нажимаем "Query Tool":
В окно запроса вставляем расширения, как указано ниже и выполняем запрос:
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:
И нажимаем "Save/Сохранить".
Для восстановления резервной копии БД, на созданной базе открываем правой кнопкой мыши меню и выбираем "Restore":
В открывшемся окне на первой вкладке указываем формат резервной копии, путь к файлу (каталогу) резервной копии и владельца postgres
:
На следующей вкладке Restore Options
выставляем флаги как указано на скриншоте ниже:
И нажимаем "Restore/Восстановить". Начнется восстановление БД из резервной копии.
На этом подготовку сервера PostgreSQL к работе со сборкой можно считать завершенной.
Установка Docker Desktop
- Скачиваем Docker Desktop
Запускаем установщих, оставляем отметки по умодчанию:
И нажимаем "ОК" начнется инсталляция программы.
После окончания установки, соглашаемся с презагрузкой операционной системы;
После перезагрузки соглашаемся с лицензионным соглашением.
Настройка конфигурационных файлов
Размещаем в произвольном каталоге файлы .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
в результате выполнения которой, будут выкачаны образы из репозитория, сгенерированы и запущены контейнеры:
Теперь можно открыть web-интрфейс программы по адресу указанному в параметре SITE_NAME
:
На этом установка ПК СТЕК в докере под Windows завершена.