Руководство по установке продукта Platform V Product 360#

О документе#

Настоящий документ содержит описание процесса установки и настройки продукта Platform V Product 360.

Основные понятия#

В таблице приведены основные аббревиатуры и сокращения:

Аббревиатура, сокращение

Определение

API

Application Programming Interface (интерфейс прикладного программирования)

DB

Database

БД

База данных

Платформа

Набор продуктов Platform V, правообладателем которых является АО "СберТех". Перечень таких продуктов обозначен в документации на конкретный продукт

ПО

Программное обеспечение

Продукт

Platform V Product 360

ФП

Функциональная подсистема

ТУЗ

Техническая учетная запись

ПРОМ

Промышленная эксплуатация

СУБД

Система управления базами данных

PSQL

PostgreSQL

SPAS

Server Part Access System (Сервис приложений сервиса Авторизации)

ОТТ

One-Time Token.Сервис для выпуска и подтверждения валидности выпущенных токенов

СУДИР

Система управления доступом и ресурсами

Системные требования#

Должны быть произведены настройки common репозитория Pipelline DevOps, а также на площадке развертывания должны быть установлены следующие компоненты:

  • Инструменты аудита Platform V Audit.

  • Инструменты Компонент Журналирование продукта Platform V Monitor.

  • Инструменты Компонента Прикладной мониторинг продукта Platform V Monitor.

  • ФП "Stand-In".

  • БД PostgreSQL.

  • SPAS/компонент Объединённый сервис авторизации продукта Platform V IAM SE.

  • Сертификаты компонент Platform V One-Time-Token.

  • СУДИР.

  • Создана ТехУЗ (с доступом в БД и возможностью создания схем в ней).

  • Созданы проекты OpenShift и получен туда доступ.

  • Создан токен для проекта Jenkins.

  • Создан токен для загрузки из Registry.

  • Создан проект в BitBucket.

  • Заказаны проекты в Jenkins.

  • Заказаны сертификаты стенда.

  • Установлен веб-браузер (Internet Explorer или Яндекс. Браузер версии не ниже 19.10.1.).

Требования к аппаратно-программному обеспечению Системы#

Требования к аппаратно-программному обеспечению сервера приложений#

Аппаратное обеспечение сервера приложений должно соответствовать техническим характеристикам, указанным в таблице 1.

Таблица 1 – Требования к аппаратному обеспечению сервера приложений

Параметр

Значение

Процессор

Intel Core 2 Duo или другой схожий по производительности х86-совместимый процессор с количеством ядер 2 и более

Объем оперативной памяти

не менее 512 Мбайт

Свободное место на жестком диске

не менее 1 Гбайт

Разрешение монитора

не менее 1280 –1024 точек

Для эффективной работы сервера приложений должно быть установлено программное обеспечение (ПО), указанное в таблице 2.

Таблица 2 – Требования к ПО сервера приложений

Параметр

Значение

Операционная система (ОС)

Любая ОС имеющая поддержку Docker виртуализации или с предустановленными Kubernetes или Openshift

Требования к аппаратно-программному обеспечению сервера БД#

Требования к аппаратно-программному обеспечению сервера БД совпадают с требованиями, предъявляемыми для установки СУБД. Для работы с системой возможно использовать следующую промышленную СУБД:

  • PostgreSQL 4.1 и выше.

Общие сведения#

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

  • проект / пространство (Namespace) в OpenShift;

  • пространство в Bitbucket;

  • репозиторий maven (Snapshot, Release) для хранения артефактов в Nexus;

  • репозиторий / registry (Snapshot, Release) для хранения Docker образов;

  • технологическую учетную запись (далее также "ТУЗ") с правами записи (Write) на всех вышеперечисленных ресурсах.

Конвейер продукта расположен в Jenkins. Для работы джоба с ресурсами инфраструктуры в проектной области jenkins команды продукта нужно создать следующие секреты / учетные записи (Jenkins Credentials):

  1. Jenkins Credentials с Token от ServiceAccount.

  2. Jenkins Credentials с ТУЗ (логин/пароль).

  3. Jenkins Credentials для доступа к Git.

Состав дистрибутива#

В данный момент в дистрибутиве содержатся темплейты (ямлики) для установки в OpenShift и миграции баз данных.

Сам дистрибутив имеет следующую структуру:

Distr.zip

 |_Flyway/

      |________migration.conf

      |________scripts/


                     |________app-api/. \<−Миграции для Апп-апи

                     |________ auth-api/. \<−Миграции для Аус-апи

                     |________ inner-connector-api/. \<−Миграции для иннетра

|_Liquibase/
                     |________migration.conf
                     |________scripts/
                                                     |________app-api/.    <−Миграции для Апп-апи
                                                     |________ auth-api/.  <−Миграции для Аус-апи
                                                     |________ inner-connector-api/.  <−Миграции для иннетра
|_Templates/

      |________App.yaml

      |________Istio.yaml

      |________Custom_resoures.yaml

      |________...

Миграция в БД#

Миграция БД осуществляется в рамках единого скрипта деплоя, скрипт получит данные по подключению к базам данных из заполненного environment файла, хранящегося в BitBucket и называющегося в соответствии с именем стенда на который планируется деплой.

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

Логин и пароль для подключения к БД создаются в Jenkins для секрета с типом виде Username/Password. В процессе работы скрипта migration.conf дополняется логином и паролем, а так же параметром подключения к БД, после чего с ним запускается flyway/liquibase.
Описание содержимого migrations.conf

filesystem−обязательный параметр, сообщает что дальнейшая ссылка внутри файловой системы
srcDir/−в данной версии скрипта это директория в которую загружаются данные из битбакета

В энвайромент файлах существуют следующие параметры для БД (уникальны для каждого pod).

Параметры для баз данных

AUTH_API_JDBC_URL: 'jdbc:postgresql://database:5432/authdb?currentSchema=product360'
AUTH_API_FAKE_STANDIN_DB: 'jdbc:postgresql://standin-database:54322/authdb?currentSchema=product360'
DB_AUTH_USERNAME: SBT-SA-DB-USER
APP_DB_ROLE: "as_tuz"

В качестве тестирования использовалась следующая конструкция:

Миграции допускаются в любом совместимом с flyway или liquibase формате.

Установка#

Подготовка работы с модулем#

Для подготовки к работе с модулем выполните следующие действия:

  1. Получите доступ к модулю. Для получения URL-адрес сервера приложений обратитесь к администратору Продукта.

  2. Выполните вход в модуль.

  • На компьютере запустите интернет-обозреватель.

  • В адресной строке интернет-обозревателя нажмите URL-адрес сервера приложения. Для получения URL-адрес сервера приложений обратитесь к администратору Продукта.

  • Нажмите на клавишу Enter. Откроется страница авторизации.

  • Чтобы авторизоваться от имени Пользователя, заполните поля Логин и Пароль.

  1. Загрузите локальные справочники, через UI интерфейс системы.

Подготовка к деплою#

Для подготовки к деплою необходимо:

  1. Заведите ТУЗ для доступа.

  2. Запросите права на чтение репозитория содержащего код джоба для развертывания.

  3. Заведите заявку на предоставления доступа к registry для ТУЗ.

  4. Импортируйте job деплоя в Jenkins. (xml в Jenkins, а остальные необходимые файлы в BitBucket).

  5. Создайте credential в Jenkins для запуска Pipeline (есть специальная job для создания credential с правами на доступ к OpenShift).

  6. Создайте credential содержащую ТУЗ для доступа к nexus, в котором будет лежать дистрибутив приложения.

  7. Создайте git репозиторий (получение прав) для хранения фалов конфигурации.

  8. Создайте клиентский сертификат.

  9. Сгенерируйте сертификаты для компонента Platform V One-Time-Token, и создайте секреты.

  10. Создайте ServiceAccount OpenShift. service-acc-ingress (привязать imagePullSecret). Выполнив команды: oc create secret docker-registry registry-sa
    -docker-server=registry.localhost
    -docker-username=username
    -docker-password=passwd
    -docker-email=notused
    oc secrets link default registry-sa -for=pull

Настройка сертификатов для компонента Platform V One-Time-Token#

Для того чтобы выполнить настройку сертификата для компонента Platform V One-Time-Token выполните (ниже информация указана для внутренних пользователей):

  1. Сгенерируйте ключевую пару. Пример (создание происходит с помощью инструмента keytool c примером команды):

   keytool -genkey -keyalg EC -sigalg SHA256withECDSA -keystore ${module_id}.p12 -storetype PKCS12 -keysize 256 -dname "CN=${module_id}" -alias ${module_id}

  1. Сгенерируйте запрос на сертификат. Пример:

   keytool -certreq -keyalg EC -sigalg SHA256withECDSA -keystore ${module_id}.p12 -storetype PKCS12 -alias ${module_id} > ${module_id}_cert_req.pem

В результате выполнения данной команды будет создан файл CSR−**${** module_id}_cert_req.pem.

  1. Полученный файл необходимо передать Администратору компонента Platform V One-Time-Token в заявке на генерацию сертификата для модуля. В заявке явно указать, что сертификат должен быть сгенерирован из приложенного запроса по данной инструкции.

    Результатом выполнения заявки будет два файла: сертификат УЦ ОТТ SberbankPlatformCA _EC .pem и сертификат модуля %{ module_id}.pem.


Информация для внутренних пользователей

Project: XXXX
Type: Запрос
Component/s: Infrastructure _ТС
Тип стенда: <соответствующий тип стенда> // для ИФТ−Major-Check

"Просьба выпустить сертификат компонента Platform V One-Time-Token для модуля … Запрос на генерацию сертификата во вложении. Также просьба прислать корневые сертификат УЦ."


  1. Добавить полученные сертификаты в keystore в указанном порядке:

    keytool -import -keystore ${module_id}.p12 -storetype PKCS12 -file SberbankPlatformCA_EC.pem -alias SberbankPlatformCA_EC
    keytool -import -keystore ${module_id}.p12 -storetype PKCS12 -file ${module_id}.pem -alias ${module_id}
    
  2. Получить сертификат публичного ключа OTTService одним из следующих способов:

    Сертификат публичного ключа OTT Service необходим для корректной работы клиента OTT. Используется для проверки подписи OTT Service.

    • Скачать сертификат и импортировать его в хранилище самостоятельно (должны быть установлены утилиты curl и keytool).
      Получение сертификата OTT Service:

      # Download OTT Service certificate
      curl -X GET "https://<ott-service-host>:8442/ejbca/publicweb/webdist/certdist?cmd=lastcert&subject=cn%3Dott-service" --insecure > ott-service.crt
      
      ### Use PKCS12
      # Import OTT Service certificate into PKCS12 store
      keytool -importcert -file ott-service.crt -keystore truststore.p12 -storetype PKCS12 -storepass <password> -alias "ott-service" -noprompt
      
      ### or JKS
      # Import OTT Service certificate into JKS store
      keytool -importcert -file ott-service.crt -keystore truststore.jks -storetype JKS -storepass <password> -alias "ott-service" -noprompt
      
    • Загрузить подготовленное хранилище.

Также для удобства создан скрипт с возможностью генерации такого сертификата. Для генерации запроса на сертификат ОТТ выполните ./cert_generate.py -CR -OTT -c product360 для product360

Создание технической учетной записи#

В работе системы используется техническая учетная запись, например pct360.

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

Для доступа к базе данных эта УЗ добавляется отдельно, при этом необходимо гарантировать УЗ следующий набор прав:

  • сreate table;

  • schema;

  • index;

  • Grant select;

  • update;

  • delete;

  • truncate;

  • insert;

  • trigger;

  • execute;

  • references;

  • connect;

  • temporary;

  • usage;

  • alter table.

Отсутствие прав:

  • сreate table;

  • schema. Приводит к ошибкам на этапе установки.

При отсутствии остальных будут возникать ошибки в процессе работы самого продукта.

Создание клиентского сертификата#

Для настройки https, а так же для общения с рядом технологических сервисов необходимо создать клиентские сертификаты приложения.

Создание делится на 2 этапа:

  1. Создание запросов на сертификаты.

  2. Отправление запросов на создание сертификатов в удостоверяющий центр.

Для создания запроса необходима консоль с sh.

Для того чтобы создать закрытый ключ:

  1. Создайте в консоли директорию для сертификатов, выполнив команду:

    Создаем директорию

    mkdir -p certs && cd certs
    
  2. После создания директории создайте запрос. Создайте закрытый ключ, воспользовавшись утилитой OpenSSL:

    OpenSSL> genrsa -aes256 -out ourPrivatKey.key 2048
    

    Крайне важно запомнить пароль к контейнеру, который мы будем вводить при создании ключа.

  3. В результате в директории certs появится закрытый ключ ourPrivatKey.key.

Для того чтобы создать открытый ключ:

  1. Воспользуйтесь утилитой OpenSSL:

    OpenSSL> req -new -key ourPrivateKey.key -out ourCertificate.csr
    
  2. Далее консоль запросит пароль для подтверждения. Введите пароль, который был задан в прошлом шаге.

  3. Заполните информацию в сертификате:

    • Country Name: RU;

    • State or Province: <оставим пустым>;

    • Organization Name: SBRF;

    • Organizational Unit Name: SBRF;

    • Common Name : <our hostname>;

    • emal Address: <оставим пустым>.

  4. В результате на выходе будет получен запрос на открытую часть сертификата, который необходимо направить коллегам из УЦ, для создания сертификата. Создание сертификата происходит через HP SM.

  5. После получения сертификатов разделите на корневой, промежуточный и клиентский сертификат. Для этого откройте сертификат для просмотра, нажмите на экспортируемый сертификат и выберите Экспортировать в файл , в качестве кодировки выберите Файлы X.509 (.CER) в кодировке Base64 все эти сертификаты сохраните отдельными файлами.

  6. После чего преобразуйте в OpenSSL клиентский сертификат и дешифруйте приватный ключ, для этого обратитесь к OpenSSL:

    OpenSSL> x509 -inform der -in ourCertificate.cer -out ourSertificate.pem
    
  7. Далее дешифруйте приватный ключ:

    OpenSSL> rsa -in ourPrivateKey.key -out unencryptPrivateKey.key
    

    Команда попросит ввести пароль, который был задан в 1х шагах.

  8. Далее соберите данные ключи в секреты OpenShift, для чего выполните следующее:

    1. Авторизуйтесь в OS, зайдите в необходимый проект, в котором планируется устанавливать приложение.

    2. Пройдите в WorkLoads → Secrets → Create Secret → Key/Value Secret.

Для создания секрета istio-ingressgateway-ca-certs.

Для того чтобы создать цепочку клиентских сертификатов, выполните следующую последовательность:

  1. Перейдите в WorkLoads → Secrets → Create Secret → Key/Value Secret имя секрета−istio-ingressgateway-certs

    • ключ – tls.crt;

    • значение – текстовое содержимое клиентского ключа в формате OpenSSL созданного ранее.

  2. Вторым ключом добавьте дешифрованный ключ, для того чтобы хранить их в 1м секрете:

    • ключ – tls.key;

    • значение – текстовое значение дешифрованного ключа, созданного ранее.

Инструкция cоздания клиентских сертификатов, представлена в данном документе в разделе Создание клиентских сертификатов. Для настройки https, а так же для общения с рядом технологических сервисов необходимо создать клиентские сертификаты. Создание делится на 2 этапа:

  • создание запросов на сертификаты;

  • далее запросы необходимо отправить на создание сертификатов в удостоверяющий центр.

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

     mkdir -p certs && cd certs

После создания директории создайте запрос, сначала создайте зарытый ключ, воспользовавшись утилитой OpenSSL

   OpenSSL> genrsa -aes256 -out ourPrivatKey.key 2048

Крайне важно запомнить пароль к контейнеру, который будете вводить при создании ключа. В результате в директории certs появится закрытый ключ ourPrivatKey.key.

  1. Создайте открытый ключ, для чего воспользуйтесь утилитой OpenSSL.

   OpenSSL> req -new -key ourPrivateKey.key -out ourCertificate.csr

Консоль запросит пароль для продолжения, введите пароль, который задавали в прошлом шаге.

Далее необходимо заполнить информацию в сертификате:

  • Country Name: RU;

  • State or Province: <оставим пустым>;

  • Organization Name: SBRF;

  • Organizational Unit Name: SBRF;

  • Common Name : our hostname;

  • emal Address: <оставим пустым>.

В результате на выходе получите запрос на открытую часть сертификата, который необходимо направить коллегам из УЦ, для создания сертификата. Получения сертификатов необходимо разделить из на корневой, промежуточный и клиентский сертификат, для этого откройте сертификат для просмотра, нажмите на экспортируемом сертификате и выберите экспортировать в файл, в качестве кодировки выберите "Файлы X.509 (.CER) в кодировке Base64" все эти сертификаты сохраните отдельными файлами.

После чего преобразуйте в OpenSSL клиентский сертификат и дешифруйте приватный ключ, для этого вновь обратитесь к OpenSSL:

OpenSSL> x509 -inform der -in ourCertificate.cer -out ourSertificate.pem

Далее дешифруйте приватный ключ:

OpenSSL> rsa -in ourPrivateKey.key -out unencryptPrivateKey.key

Команда попросит ввести пароль, который был задан на первых шагах.

Далее соберите данные ключи в секреты OpenShift:

  1. Авторизуйтесь.

  2. Зайдите в проект.

  3. Пройдите по цепочке: WorkLoads → Secrets → Create Secret → Key/Value Secret.

  4. Создайте цепочку клиентских сертификатов.

  5. Перейдите в WorkLoads → Secrets → Create Secret → Key/Value Secret. имя секрета - istio-ingressgateway-certs

    • ключ – tls.crt;

    • значение – текстовое содержимое клиентского ключа в формате OpenSSL созданного ранее.

    Вторым ключом необходимо добавить дешифрованный ключ, для того чтобы хранить их в 1м секрете:

    • ключ – tls.key;

    • значение – текстовое значение дешифрованного ключа, созданного ранее.

Далее запустить скрипт: ./cert_generate.py -CR -server -req san.cnf -c CommonName. После чего придет запрос на создание сертификата.

Создание секретов для OpenShift#

Для выполнения команд необходим установленный клиент OpenShift.

Необходимо получить следующие секреты:

  • api-key-app-secret;

  • db-secret;

  • ingressgateway-secret;

  • ingressgateway-ca-secret;

  • secret-pct360-ott-certs;

  • kafka-secret.

  1. Создание секрета

    За основу возьмите yaml-файл примерно такого содержания:

     kind: Secret
    apiVersion: v1
    metadata:
    name: <имя секрета>
    data:
    <key>: <value>
    type: Opaque
    
  • secret-ingressgateway-ca-certs и secret-ingressgateway-certs – для хранения сертификатов Envoy файлы подготавливаются при создании клиентского сертификата:

  1. Логин в OpenShift:

    oc login --token=<openshift_user_token> --server=<openshift_api_url>:6443
    
  2. Создание секрета istio-certs (вывод содержимого в консоль):

    oc create secret generic istio-certs --from-file=root-ca.pem --from-file=envoy.crt --from-file=envoy.key --dry-run -o yaml > secret-istio-certs.yaml
    
  3. Создание секрета secret-ingressgateway-ca-certs:

    oc create secret generic secret-ingressgateway-ca-certs --from-file=ca.pem=root-ca.pem --dry-run -o yaml > secret-ingressgateway-ca-certs.yaml
    
  4. Создание секрета secret-ingressgateway-certs:

    oc create secret generic secret-ingressgateway-certs --from-file=tls.key=envoy.key --from-file=tls.crt=envoy.crt --dry-run -o yaml > secret-ingressgateway-certs.yaml
    
  5. Применить jenkins job для шифрования файлов.

  6. Выложить зашифрованный файл секрета в git repository в папку /config/<project_name>/<stand_name>/secrets.

Для простоты использования, секреты можно создать из ранее подготовленных сертификатов с помощью скрипта

./cert_generate.py -h

   usage: cert_generate.py [-h] -c CN [-p PWD] [-r ROOT] [-i INTERMEDIATE]
[-C CLIENT] [-CR] [-I] [-kafka] [-server] [-req REQ]
[-IngressSecret] [-secretname SECRETNAME]
[-OSKafkaSecret] [-Certs CERTS] [-Keys KEYS] [-OTT]
[-OTTSecret] [-ottpem OTTPEM] [-rootsber ROOTSBER]
Create JKS with you
optional arguments:
-h, --help show this help message and exit
-c CN, --cn CN common name
-p PWD, --pwd PWD password for jks
-r ROOT, --root ROOT root certificate
-i INTERMEDIATE, --intermediate INTERMEDIATE
intermediate cert
-C CLIENT, --client CLIENT
client cert
-CR, --create need create jks
-I, --Import need add cert to exist jks
-kafka Crete jks for kafka
-server create openshift ingress cert from req file
-req REQ req файл с параметрами
создаваемого сертификата
-IngressSecret create OpenShift secret for Ingress/Egress from cert
key and trusted CA
-secretname SECRETNAME
имя создаваемого сертификата
-OSKafkaSecret create OpenShift secret for kafka from cert key and
trusted CA
-Certs CERTS массив сертификатов для
кафки, в порядке указанном
для ключей
-Keys KEYS массив ключей, в порядке
указанном для сертификато
для кафки
-OTT create cert for OTT
-OTTSecret create secret for OTT
-ottpem OTTPEM Ott pem from ott ZNO
-rootsber ROOTSBER root pem from ott ZNO

Создать секрет для ОТТ: ./cert_generate.py -OTTSecret -c CommonName -secretname secret-pct360-ott-certs

где, CommonName – созданный на предыдущем шаге, этим же скриптом, сертификат.

Создать kafka-secret

./cert_generate.py -server -req san.cnf -c ci02707148-idevgen-errm-kb-ift-1.apps.dev-gen.ca.sbrf.ru -OSKafkaSecret -secretname kafka-cert -r ../RootCa.cer -i ../intermediate.cer -Certs ci02707148-idevgen-errm-kb-ift-1.apps.dev-gen.ca.sbrf.ru/ci02707148-idevgen-errm-kb-ift-1.apps.dev-gen.ca.sbrf.ru.csr,ci02707148-idevgen-errm-kb-ift-1.apps.dev-gen.ca.sbrf.ru/ci02707148-idevgen-errm-kb-ift-1.apps.dev-gen.ca.sbrf.ru.csr -Keys APP_cert,AUTH_cert

Создать серверный сертификат:

./cert_generate.py -server -req san.cnf -c ci02707148-idevgen-errm-kb-ift-1.apps.dev-gen.ca.sbrf.ru -IngressSecret -secretname secret-ingressgateway-certs -r ../RootCa.cer -i ../intermediate.cer

Конфигурация#

Структура каталогов#

В репозитории необходимо создать структуру каталогов (openshift \config\<project_name>\<stand_name>\env.properties). В одном репозитории допускается хранение нескольких наборов конфигураций для разных проектов и разных стендов.

Пример:

Структура папок

Описание

config

Содержит в себе конфигурации, уникальные для каждого стенда

secrets

Папка содержит в себе зашифрованные Ansible-vault секреты (используется только ansible-vault)

secret1.yaml secret2.yaml

Файл env.properties#

В файле env.properties описываются параметры приложения, уникальные для текущего стенда. Для того чтобы было проще разобраться рекомендуется называть файл по имени стенда например: dev-gen.env или dev-gen2.env.

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


Информация для внутренних пользователей


REGISTRY_URL: 'xxx/sigma/pprb/ci00611947/ci01558713_pct360/product360' - Адрес до  docker registry репозитария
PCT_NAMESPACE: 'ci00611947-idevgen-product360-ift1' - неймспейс в который будет проводиться установка
PCT_VERSION: 'dev' - лейбл версии
PCT_REPLICA_COUNT: "1"  - количество разворачиваемых подиков
PRODUCT_LABEL: 'product360' - лейбл продукта
STARTER_CLIENT_AUTH_API_URL: 'auth-api' - имя сервиса авторизации
FLUENT_BIT_IMAGE: 'xxx/ci00734898/ci00685811_synapse/fluent-bit:latest' - под fluent-bit
SPAS_URL: 'http://str-vat-app0273.delta.sbrf.ru/spas/rest' - адрес SPAS
AUTH_SYSTEM: 'SUDIR' - способ авторизации (SPAS,SUDIR)
#*************************APP_API************************
APP_API_JDBC_URL: 'jdbc:postgresql://XXXX/appapidb?currentSchema=product360' - адрес БД
APP_API_FAKE_JDBC_URL: 'jdbc:postgresql://XXXX/appapidb?currentSchema=product360' внутренний дрес БД (для доступа через egress)
APP_API_STANDIN_DB: 'jdbc:postgresql://XXXX/appapidb?currentSchema=product360' адрес БД StandIn
APP_API_FAKE_STANDIN_DB: 'jdbc:postgresql://XXXX/appapidb?currentSchema=product360' внутренний адрес БД StandIn
DB_DRIVER: 'org.postgresql.Driver' драйвер БД
SPRING_PROFILE: 'pprb,applJournal' подключенные профиля
APP_API_CPU_LIMIT: "1" лимиты для приклада
APP_API_KEY: 'appapikey' ключ авторизации для проекта
APP_API_CPU_REQUEST: "500m"
APP_API_MEMORY_LIMIT: "1Gi"
APP_API_MEMORY_REQUEST: "512Mi"
STARTER_CLIENT_APP_API_URL: 'app-api'
DB_APP_USERNAME: SBT-DB-USER - пользователь под которым будет осуществляться доступ к БД
#***************************AUTH_API****************
AUTH_API_JDBC_URL: 'jdbc:postgresql://XXXX/authdb?currentSchema=product360'
AUTH_API_FAKE_JDBC_URL: 'jdbc:postgresql://XXXX/authdb?currentSchema=product360'
AUTH_API_STANDIN_DB: 'jdbc:postgresql://XXXX/authdb?currentSchema=product360'
AUTH_API_FAKE_STANDIN_DB: 'jdbc:postgresql://XXXX/authdb?currentSchema=product360'
AUTH_API_CPU_LIMIT: "1"
AUTH_API_CPU_REQUEST: "500m"
AUTH_API_MEMORY_LIMIT: "1Gi"
AUTH_API_MEMORY_REQUEST: "512Mi"
AUTH_API_KEY: 'key'
DB_AUTH_USERNAME: SBT-SA-PCT360A

#*********************************FRONTEND******************
FRONTEND_CPU_LIMIT: '1'
FRONTEND_CPU_REQUEST: '1Gi'
FRONTEND_MEMORY_LIMIT: '500m'
FRONTEND_MEMORY_REQUEST: '512Mi'
FRONTEND_ROUTE_HOST: product360ift.apps.dev-gen.ca.sbrf.ru
FRONTEND_HTTPS_HOST: https-ci00611947-edevgen-product360-dev.apps.dev-gen.ca.sbrf.ru
SUDIR_FRONT_ROUTE: ci00611947-edevgen-product360-dev.apps.dev-gen.ca.sbrf.ru
#********************************ISTIO**********************
CONTROL_PLANE_ADDR: 'istio-pilot.ci01994970-idevgen-control-panel-ift:15010'
ZIPKIN_ADDR: 'zipkin.ci01994970-idevgen-control-panel-ift:9411'
PROXY_IMAGE: 'xxx/ci01563053/ocp4/operatorhub/openshift-service-mesh/proxyv2-rhel8:1.1.3-2'
PROMETHEUS_IMAGE: 'xxx/sigma/pprb/ci00641491/ci00860573_custodian_pprb/tools/prometheus@sha256:0ec13a50dfa65ec1cf8583ef640271e14392534f1d2c21f758eb0e0e441f7540'
SUDIR_ROUTE: "ci00611947-edevgen-product360-dev.apps.dev-gen.ca.sbrf.ru"
EGRESS_IMAGE: "xxx/ci01563053/ocp4/operatorhub/openshift-service-mesh/proxyv2-rhel8@sha256:8f23a879d0443e8c77bfe07cc4dcf188beefdcc658719dd788edcfb45ae61563"
OTT_IMAGE: "xxx/sigma/pprb/ci00641491/ci01125613_ott/ott-client-api-v2@sha256:05b3d2530abdb9e27b6862793a939c87c3a72d09dde6656c4f192f6d408d7088"
AUDIT_HOST: 'http://ift.audit2-http-proxy.apps.dev-gen.ca.sbrf.ru/v1'
AUDIT_GW: 'ift.audit2-http-proxy.apps.dev-gen.ca.sbrf.ru'
AUDIT_USER: 'SBT-SA-PCT360A'
AUDIT_PORT: "443"
AUDIT_PROTO: "HTTPS"
SPAS_HOST: 'str-vat-app0273.delta.sbrf.ru'
#SPAS_HOST: 'tkli-pprb2465.vm.mos.cloud.sbrf.ru:8443'
SPAS_PORT: 8443
SPAS_PROTO: "HTTPS"
OTT_SERVICE_URL: 'https://str-vat-app2141.delta.sbrf.ru:8443/ott-service/rest/token'
OTT_SERVICE_HOST: 'str-vat-app2141.delta.sbrf.ru:8443,str-vat-app2142.delta.sbrf.ru:8443'
OTT_CLIENT_CERT_ALIAS: 'error-processor-cloud'
OTT_CERTSTORE_PATH: '/mnt/secrets/error-processor-cloud.p12'
OTT_TRUST_STORE_PATH: '/mnt/secrets/ott_service_truststore.p12'
OTT_SERVICE_SI_HOSTS: '=str-vat-app2141.delta.sbrf.ru:8443,str-vat-app2142.delta.sbrf.ru:8443'
OTT_SERVICE_HOSTS: '=str-vat-app2141.delta.sbrf.ru:8443,str-vat-app2142.delta.sbrf.ru:8443'
OTT_MODULE_ID: 'error-processor-cloud'
PROMETHEUS_IMAGE: 'xxx/sigma/pprb/ci00641491/ci00860573_custodian_pprb/tools/prometheus@sha256:0ec13a50dfa65ec1cf8583ef640271e14392534f1d2c21f758eb0e0e441f7540'
MONITORING_URL: "applied-monitoring-ci00641491-idevgen2-custodian-dev.apps.dev-gen2.ca.sbrf.ru"
MONITORING_URL_2: "applied-monitoring-ci00641491-idevgen-pprb-applied-monitoring.apps.dev-gen.ca.sbrf.ru"
 
LOGGER_GW: "logger-endpoint-demo-http-ci00641491-idevgen-logger-dev.apps.dev-gen.ca.sbrf.ru"
LOGGER_ENDP: "logger-endpoint-demo-http-ci00641491-idevgen-logger-dev.apps.dev-gen.ca.sbrf.ru"
LOGGER_ENDP_2: "logger-endpoint-http-ci00641491-idevgen-yamaha-logger-st.apps.dev-gen.ca.sbrf.ru"
LOGGER_PORT: "443"
LOGGER_PROTO: "HTTPS"
 
DATABASE_SRV_MASTER: "tklid-pprb00558.vm.mos.cloud.sbrf.ru"
DATABASE_SRV_MASTER_IP: "XXXX"
DATABASE_PORT_MASTER: "5432"
INTERNAL_DATABASE_PORT_MASTER: "54321"
DATABASE_SRV_SLAVE: "tklid-pprb00559.vm.mos.cloud.sbrf.ru"
DATABASE_SRV_SLAVE_IP: "XXXX"
DATABASE_PORT_SLAVE: "5432"
INTERNAL_DATABASE_PORT_SLAVE: "54322"
DATABASE_SRV_DATAMART_SLAVE: "tklid-pprb00560.vm.mos.cloud.sbrf.ru"
DATABASE_DATAMART_SLAVE_IP: "XXXX"
DATABASE_DATAMART_PORT_SLAVE: "5437"
INTERNAL_DATABASE_DATAMART_PORT_SLAVE: "54323"
DATABASE_SRV_DATAMART_MASTER: "tklid-pprb00561.vm.mos.cloud.sbrf.ru"
DATABASE_DATAMART_MASTER_IP: "XXXX"
DATABASE_DATAMART_PORT_MASTER: "5432"
INTERNAL_DATABASE_DATAMART_PORT_MASTER: "54324"
DATABASE_SRV_MASTER_STDIN: "tklid-pprb00565.vm.mos.cloud.sbrf.ru"
DATABASE_SRV_MASTER_IP_STDIN: "XXXX"
DATABASE_PORT_MASTER_STDIN: "5432"
INTERNAL_DATABASE_PORT_MASTER_STDIN: "54327"
DATABASE_SRV_SLAVE_STDIN: "tklid-pprb00562.vm.mos.cloud.sbrf.ru"
DATABASE_SRV_SLAVE_IP_STDIN: "XXXX"
DATABASE_PORT_SLAVE_STDIN: "5432"
INTERNAL_DATABASE_PORT_SLAVE_STDIN: "54328"
DATABASE_SRV_DATAMART_SLAVE_STDIN: "tklid-pprb00563.vm.mos.cloud.sbrf.ru"
DATABASE_DATAMART_SLAVE_IP_STDIN: "XXXX"
DATABASE_DATAMART_PORT_SLAVE_STDIN: "5432"
INTERNAL_DATABASE_DATAMART_PORT_SLAVE_STDIN: "54325"
DATABASE_SRV_DATAMART_MASTER_STDIN: "tklid-pprb00564.vm.mos.cloud.sbrf.ru"
DATABASE_DATAMART_MASTER_IP_STDIN: "XXXX"
DATABASE_DATAMART_PORT_MASTER_STDIN: "5432"
INTERNAL_DATABASE_DATAMART_PORT_MASTER_STDIN: "54326"
#*******************************PJ***************************
KAFKA_BOOTSTRAP_SERVERS: 'XXXX'
KAFKA_SERVER1: "tkliq-pprb00343.vm.mos.cloud.sbrf.ru"
KAFKA_SERVER2: "tkliq-pprb00342.vm.mos.cloud.sbrf.ru"
KAFKA_SERVER3: "tkliq-pprb00341.vm.mos.cloud.sbrf.ru"
KAFKA_PORT: '9093'
APP_API_MODULE_ID: 'app-api-ift1'
STANDIN_AUTH_API_MODULE_ID: 'auth-api-ift1'
SSL_IDENTIFICATION_ALGORITHM: ""
STANDIN_ZONE_APP_API: 'PCT360A'
STANDIN_ZONE_AUTH_API: 'PCT360B'
#********************************DATAMART*******************
DATAMART_API_JDBC_URL_MASTER: 'jdbc:postgresql://XXXX/icondb?currentSchema=datamart1'
DATAMART_API_JDBC_FAKE_URL_MASTER: 'jdbc:postgresql://XXXX/icondb?currentSchema=datamart1'
DATAMART_API_JDBC_URL_STANDIN: 'jdbc:postgresql://XXXX/icondb?currentSchema=datamart12'
DATAMART_API_KEY: 'datamart-api'
DATAMART_ROUTE_HOST: "product360ift2-datamart.apps.dev-gen.ca.sbrf.ru"
DB_DM_USERNAME: SBT-SA-PCT360A
#********************************IMPORT-CONNECTOR***********
ICON_JDBC_URL: 'jdbc:postgresql://XXXX/icondb?currentSchema=product360'
ICON_FAKE_JDBC_URL_STANDIN: 'jdbc:postgresql://tklid-pprb00558.vm.mos.cloud.sbrf.ru:54321/icondb?currentSchema=product3602'
ICON_FAKE_JDBC_URL_MASTER: 'jdbc:postgresql://tklid-pprb00558.vm.mos.cloud.sbrf.ru:54321/icondb?currentSchema=product360'
ICON_STANDIN_DB: 'jdbc:postgresql://XXXX/icondb?currentSchema=product3602'
ICON_API_KEY: "inner-connector-api"
DB_INNER_USERNAME: SBT-SA-PCT360A
ICON_SPRING_PROFILE: "pprb"
S3_SERVICE_ENDPOINT: "https://nun-idz.ca.sbrf.ru"
###############################Liquibase roles
APP_DB_ROLE: "as_admin"
AUTH_DB_ROLE: "as_admin"
DATAMART_DB_ROLE: "as_admin"
ICON_DB_ROLE: "as_admin"
###########
DATABASE_SRV_SLAVE_IP_STDIN: "XXXX"
DATABASE_PORT_SLAVE_STDIN: "5433"
DATABASE_SRV_SLAVE_STDIN: "database102.sbrf.ru"
DATABASE_DATAMART_PORT_MASTER: "5433"
DATABASE_SRV_DATAMART_MASTER_STDIN: "database101.sbrf.ru"
DATABASE_SRV_MASTER_IP_STDIN: "XXXX"
################KFI
KAFKA_KFI_PORT: "9093"
KAFKA_KFI_IP1: "XXXX"
KAFKA_KFI_HOST1: "kafka-kfi-1.ru"
KAFKA_KFI_HOST2: "kafka-kfi-2.ru"
KAFKA_KFI_IP2: "XXXX"
KAFKA_KFI_IP3: "XXXX"
KAFKA_KFI_HOST3: "kafka-kfi-3.ru"
KFI_KAFKA_TOPIC: "KFI.PCT_SECURITY_EVENT.V1"
KAFKA_KFI_IP4: "XXXX"
KAFKA_KFI_HOST4: "kafka-kfi-4.ru"
##############mTLS
EFS_CERT_CN: '.*CN=00ca0001efsukoflwas,OU=00CA,O=Savings Bank of the Russian Federation,C=RU.*'
EFS_HEADER_VALUE: EFSPFM_CALENDAR
## Значения для клиентского сертификата СУДИР (CN)
SUDIR_CERT_CN='.*CN=.*'
##########______NEW_5.2
KAFKA_PJ_PORT: "9093"
KAFKA_PJ_HOST_1: "tkliq-pprb00341.vm.mos.cloud.sbrf.ru"
KAFKA_PJ_IP_1: "XXXX"
KAFKA_PJ_HOST_2: "tkliq-pprb00342.vm.mos.cloud.sbrf.ru"
KAFKA_PJ_IP_2: "XXXX"
KAFKA_PJ_HOST_3: "tkliq-pprb00343.vm.mos.cloud.sbrf.ru"
KAFKA_PJ_IP_3: "XXXX"
KAFKA_PJ_HOST_4: "kafka-polnoy-jopy.sbrf.ru"
KAFKA_PJ_IP_4: "XXXX"
KAFKA_PJ_HOST_5: "kafka-polnoy-jopy2.sbrf.ru"
KAFKA_PJ_IP_5: "XXXX"
KAFKA_PJ_HOST_6: "kafka-polnoy-jopy3.sbrf.ru"
KAFKA_PJ_IP_6: "XXXX"
LOGGER_ENDPOINT_URI: "/v1/events"
LOGGER_GW: "logger-cloud-ift-ott.ingress.apps.dev-gen2.ca.sbrf.ru"
LOGGER_ENDP: "logger-cloud-ift-ott.ingress.apps.dev-gen2.ca.sbrf.ru"
LOGGER_ENDP_2: "ci00641491-idevgen-logger-ift.ingress.apps.dev-gen.ca.sbrf.ru"
LOGGER_PORT: "443"
LOGGER_PROTO: "HTTPS"
CEPH_GW: "nun-idz.ca.sbrf.ru"
CEPH_PORT: "443"
CEPH_ENDPOINT: "nun-idz.ca.sbrf.ru"
DATAMART_SPRING_PROFILE: "pprb"
SUDIR_GEOROUTE: "ci00611947-idevgen-product360.dev-apps.ocp-geo.ca.sbrf.ru"
KFI_INTEGRATION_FEATURE_ENABLED: "true"
RISK_RATING_INTEGRATION_FEATURE_ENABLED: "true"
STANDIN_ZONE_DATAMART_API: "PCT360A"
STANDIN_DATAMART_API_MODULE_ID: "datamart-api-ift1"
DATAMART_API_JDBC_FAKE_URL_STANDIN: 'jdbc:postgresql://XXXX/icondb?currentSchema=datamart12'
STANDIN_ZONE_ICON: PCT360ICON
STANDIN_ICON_MODULE_ID: icon-api-ift1
KAFKA_KFI_IP5: "XXXX"
KAFKA_KFI_HOST5: "kafka-kfi-5.ru"
KAFKA_KFI_IP6: "XXXX"
KAFKA_KFI_HOST5: "kafka-kfi-6.ru"
DATAMART_MTLS_HOST: "ci00611947-idevgen-product360-datamart.dev-apps.ocp-geo.ca.sbrf.ru"
DATAMART_APP_API_READ_PAGE_SIZE: "100"
DATAMART_APP_API_READ_CATEGORY_PAGE_SIZE: "100"
 
#NEW_IN 5.3
SIDECAR_ISTIO_CPU_REQ: 1000m
SIDECAR_ISTIO_CPU_LIM: 1000m
SIDECAR_ISTIO_MEM_REQ: 1000Mi
SIDECAR_ISTIO_MEM_LIM: 1000Mi
OTT_CERTSTORE_TYPE: PKCS12

Pipeline для деплоя проекта Platform V Product 360 в OpenShift#

Запуск осуществляется в Jenkins Job типа pipelne, definition у которого выставлен как Jenkinsfile из данного репозитория. Данный пайплайн можно сразу настроить на все стенды OpenShift, для достижения универсальности созданных template. Для каждого стенда создается свой enviroment файл расположенный по пути config/stand_name, где вместо stand_name создается директория для нового стенда, в которую подкладывается индивидуальные настройки для стенда.(Пример выше)

Секреты стендов#

Каждый стенд может иметь уникальный список секретов, например пароли в БД. Внутри гита секреты сохранены в виде зашифрованных с помощью ansible-vault файлов.

Зашифровать созданный ранее секрет можно командой

Зашифровать файл ансиблом

ansible-vault encrypt file

Расшифровать файл ансиблом

ansible-vault decrypt file

При создании файлов секретов, все параметры передаваемые внутри value должны быть зашифрованы в base64.

Для того чтобы зашифровать секреты создан отдельный pipe, который на входе принимает четыре параметра:

  • gitSshUrl – репозиторий, в котором временно находятся секреты, которые необходимо шифровать;

  • gitBranch – ветка репозитория, в которой лежать секреты;

  • folder – папка, в которой сложены секреты;

  • workMode – режим работы скрипта, encrypt – шифруем, decrypt – расшифровываем.

В результате получаем архив, прикрепленный к результату сборки, в котором находятся зашифрованные или расшифрованные секреты (взависимости от типа задачи), которые нужно подложить в репозиторий в папку secrets/example, где examle – имя стенда, для которого предназначаются секреты.

Jenkinsfile#

В Jenkinsfile находится сам скрипт, в котором объявлен так же ряд переменных:

  • standsApi – адрес api стендов OpenShift (массив, пример):

    standsApi = [ 
          'stand1' : 'insecure://api.openshift.example.com:8080',
          'stand2': 'insecure://api.openshift.stand2.ru:8081'
          ]   
    
  • projectNames – соответствие короткого имени в choice(на странице запуска) и имени проекта в Openshift (массив, пример):

  projectNames = [
        'stand1' : 'Example_project-dev',
        'stand2': 'Example_project-test',
        'stand3' : 'Example_project-master'
 ]
  • projectSecrets – уникальные токены для работы Jenkins в openshift, токены задаются в виде jenkins credential с типом secret text:

    projectSecrets = [
          'stand1' : 'OS_token_dev',
          'stand2': 'OS_token_master',
          'stand3' : 'OS_token_test'
    ]
    

Завести эти токены можно следующим образом.

Как получить секрет из OpenShift

Для стендов разработки:
       Получите токен:
            1) Зайдите в UI OpenShift, выбрать Administrator > Workloads > Secrets.
            2) Отфильтруйте по "jenkins" и выбрать секрет "jenkins-token".
            3) В первой вкладке Overview найдите поле token и скопировать его в буфер обмена, нажатием Control + C.
            4) Создайте пользователя в своем аккаунте Jenkins. В Jenkins в правом верхнем углу нажмите на свой логин, далее выберите credentials > global > добавить учетные данные. При этом:
                 Kind = secret text;
                 Secret = скопированный токен;
                 ID – имя проекта;
                 Description – заполнить так, чтобы было понятно, для чего этот аккаунт.
 
 
Для PSI\PROM:
Credentials для деплоя в OpenShift создаются через специальный job в Jenkins. (DevopsTools -> Получение OpenShift token)
  • secretRepo – репозиторий в котором лежат темплэйты, файлы параметров и cекреты

    secretAndParametersRepo = 'ssh://git@example.com:8080/project/repo.git'
    
  • secretAndParametersRepoBranch – ветка из указанного выше репозитория, из которой нужно взять темплэйты и параметры(для каждого стенда может быть разная):

  secretAndParametersRepoBranch = [
        'stand1' : 'pipe-develop',
        'stand2': 'develop',
        'stand3' : 'pipe-develop'
]
  • secretAndParametersRepoCredentials – id credentials для работы с гитом( credential так же заведена в jenkins и тут нужно указать только ее id):

    secretAndParametersRepoCredentials = "git"
    
  • templatesConfigurationPath – путь в репозиторий до enviroment файла

    templatesConfigurationPath = [
          'kb': [
                  'stand1' : 'config/dev.env',
                  'stand2' : 'config/master.env',
                  'stand3' : 'config/test.env'
          ]
    
  • secretConfigurationPath – путь до файлов с секретами:

  secretConfigurationPath = [
        'stand1' : 'secrets/dev',
        'stand2': 'secret/master',
        'stand3' : 'secret/test'
]
  • storyPass – Ansible-vault пароль для расшифровки секретов, перед их развертыванием в OpenShift:

    storyPass = "AnsibleVaultPassword"
    

Деплой продукта через Jenkins#

Внешний вид job

standType – параметр указывает стенд, на который будет производиться установка;

releaseVersion – версия релиза, которая будет устанавливаться;

Migrations – необходимость обновления БД;

MigrationsOnly – установка только миграций, без установки OpenShift темплейтов;

DropSchemas – удаление данных и миграций из БД (dev only);

secretsApply – установка/обновление секретов на стенде;

Datamart – установка или обновление Datamart;

ICON – установка или обновление Inner-Connector;

debug – DEBUG режим для работы системы;

delete – удаление всех сущностей из OpenShift.

Деплой в OpenShift#

Необходимо выполнить следующие действия:

  1. Запустите job с параметром action = applySecrets для загрузки секретов. Расшифровка секретов произойдет с созданным заранее JenkinsCredential с именем, переданным в storyPass.

  2. Для деплоя миграций запустите джоб с action = Migrations.

  3. Если не установлен параметр MigrationsOnly, то основной набор приложений будет обновлен в любом случае.

Сервис авторизации СУДИР/SPAS#

Для интеграции с СУДИРом необходимо заказать у команды СУДИРа ответвление на свой проект, в ответвлении необходимо указать CN TLS сертификата, с которым происходит интеграция и адрес стенда на который происходит редирект.

Интеграция с SPAS в данный момент времени состоит из двух шагов:

  1. Необходимо прогрузить ролевую модель в SPAS, поддержка АС каждого стенда может это сделать самостоятельно пример ролевой модели для Продукта

      <?xml version="1.0" encoding="UTF-8"?>
    <module moduleVersion="1.0"
    roleModelVersion="24112020.1444"
    name="product360"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://AccessSystem/namespace"
    xsi:schemaLocation="http://AccessSystem/namespace">
    <nodes>
    <node display-name="Права Product360" type="folder">
    <permission display-name="Права бизнес администратора" type="USER_RIGHT" id="BUSINESS_ADMIN_RIGHT"/>
    <permission display-name="Права бизнес пользователя" type="USER_RIGHT" id="BUSINESS_USER_RIGHT"/>
    <permission display-name="Права системного администратора" type="USER_RIGHT" id="SYSTEM_ADMIN_RIGHT"/>
    </node>
    </nodes>
    <roles>
    <role name="Бизнес администратор" description="Бизнес администратор тенанта" code="BUSINESS_ADMIN">
    <permission-ref id="BUSINESS_ADMIN_RIGHT"/>
    </role>
    <role name="Бизнес пользователь" description="Бизнес пользователь тенанта" code="BUSINESS_USER">
    <permission-ref id="BUSINESS_USER_RIGHT"/>
    </role>
    <role name="Системный администратор" description="Системный администратор всех тенантов" code="SYSTEM_ADMIN">
    <permission-ref id="SYSTEM_ADMIN_RIGHT"/>
    </role>
    </roles>
    </module>
    
  2. После загрузки ролевой модели, установите секрет SPAS в неймспейс.

Процедура установки секрета SPAS

https://confluence.ca.sbrf.ru/pages/viewpage.action?pageId=5452958736
Администратор ПФ регистрирует ЗНО
Услуга - ППРБ ЮЛ Платформа.SYS601.05.01 Управление настройками ППРБ (CI03132801)
Рабочая группа исполнителя: - ДОПСБ ППРБ Технологические сервисы (Трапезников Ю.Г.)
Текст – Прошу для деплоя секрета SPAS в NS ПФ _______ предоставить права владельца проектной области ППРБ ЮЛ Платформа.SYS601.05.01 Управление настройками ППРБ Иванову Ивану Ивановичу УЗ Ivanov-II

Компонент Журналирование продукта Platform V Monitor#

Для интеграции с компонентом корректно заполните enviroment файл стенда, за настройки коннекта к компоненту отвечают параметры:

IFT-gen.env

LOGGER_GW: "logger-endpoint-demo-http-ci00641491-idevgen-logger-dev.apps.dev-gen.ca.sbrf.ru"
LOGGER_ENDP: "logger-endpoint-demo-http-ci00641491-idevgen-logger-dev.apps.dev-gen.ca.sbrf.ru"
LOGGER_ENDP_2: "logger-endpoint-http-ci00641491-idevgen-yamaha-logger-st.apps.dev-gen.ca.sbrf.ru"
LOGGER_PORT: "443"
LOGGER_PROTO: "HTTPS"

LOGGER_GW – предпочитаемый хост логгера для стенда LOGGER_ENP и LOGGER_ENDP2 – ноды балансировки LOGGER_PORT – порт логгера LOGGER_PROTO – протокол HTTP/HTTPS

Более никаких настроек не требуется.

Компонент Аудит продукта Platform V Audit#

Для того чтобы выполнить подключение к ТС Аудит:

  1. Выполните согласование со специалистами по кибербезопасности состав данных, отправляемых в Аудит, для этого:

  • определите точки аудирования (места отправки событий в Аудит);

  • состав отправляемых событий в каждой из точек.

  1. По результатам согласования определите параметры потока событий и сообщить их команде Аудита.

  • среднее количество сообщений в сутки;

  • редкий размер события;

  • название и КЭ вашего модуля/сервиса/АС.

  1. После определения характеристик потока согласуйте свою квоту по хранимым данным.

  2. При развертывании на стендах промышленной эксплуатации создайте сертификат (создание сертификатов описано в документе Руководство по установке продукта Platform V Product 360) и сформируйте хранилища ключей.

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

ift-gen.env


Информация для внутреннего пользователя


AUDIT_HOST: 'http://ift.audit2-http-proxy.apps.dev-gen.ca.sbrf.ru/v1'
AUDIT_GW: 'ift.audit2-http-proxy.apps.dev-gen.ca.sbrf.ru'
AUDIT_USER: 'SBT-SA-PCT360A'
AUDIT_PORT: "443"
AUDIT_PROTO: "HTTPS"

OTT#

Выпустите сертификаты и создайте секреты, согласно данной инструкции. Настройка сертификатов для компонента Platform V One-Time-Token

СУБД#

Для того чтобы подготовить базу данных:

  • В СУБД проверьте наличие ролей as_admin, as_TUZ. При разворачивании в СУБД PostgreSQL роли входят в поставку. При использовании СУБД PostgreSQL, предварительно создать роли.


-- скрипт проверки на наличие ролей
SELECT rolname FROM pg_roles WHERE rolname in ('as_TUZ', 'as_admin');

-- скрипт создания ролей
CREATE ROLE as_admin;
CREATE ROLE "as_TUZ";

  • Создайте пользователя владельца, от имени которого выполняется накат скриптов по разворачивании БД:

-- создание пользователя 360
CREATE USER 360 WITH
    PASSWORD '***************'
    LOGIN
    NOCREATEDB
    NOCREATEROLE
    NOSUPERUSER
    NOINHERIT
    NOREPLICATION
    NOBYPASSRLS;

-- Устанавливаем порядок поиска схем для пользователя
ALTER ROLE 360 SET search_path = "$user";
GRANT as_admin TO 360;
ALTER ROLE rspit SET role TO 'as_admin';

  • Создайте табличные пространства:

-- на сервере создать папки дл пространств
mkdir /mnt/360_i
mkdir /mnt/360_t

--в СУБД выполнять пользователем с правами db_admin (psql)
CREATE TABLESPACE 360_t
OWNER as_admin
LOCATION '/pgdata/11/';

CREATE TABLESPACE 360_i
OWNER as_admin
LOCATION '/pgdata/11/';

GRANT CREATE ON TABLESPACE 360_t TO as_admin;
GRANT CREATE ON TABLESPACE 360_i TO as_admin;

GRANT CREATE ON TABLESPACE 360_t TO "as_TUZ";
GRANT CREATE ON TABLESPACE 360_i TO "as_TUZ";


  • Создайте БД:

--выполнять пользователем с правами db_admin (360)
CREATE DATABASE 360 
WITH
OWNER = db_admin
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
TABLESPACE = 360_t
CONNECTION LIMIT = -1;

GRANT CREATE ON DATABASE 360 TO as_admin;

  • Создайте схемы:

-- Схема для владельца схемы приложения
CREATE SCHEMA 360 AUTHORIZATION as_admin;
GRANT ALL ON SCHEMA 360 TO as_admin;
GRANT USAGE ON SCHEMA 360 TO "as_TUZ";


  • Предоставьте дефалтовые привилегии на схему для ролей as_admin, as_TUZ:

GRANT USAGE ON SCHEMA 360 TO "as_TUZ";
GRANT SELECT, UPDATE, INSERT, DELETE ON ALL TABLES IN SCHEMA 360 TO "as_TUZ";
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA 360 TO "as_TUZ";
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA 360 TO "as_TUZ";
GRANT EXECUTE ON ALL ROUTINES IN SCHEMA 360 TO "as_TUZ";
GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA 360 TO "as_TUZ";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO "as_TUZ";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT ALL PRIVILEGES ON SEQUENCES TO"as_TUZ";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT EXECUTE ON FUNCTIONS TO"as_TUZ";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT EXECUTE ON ROUTINES TO"as_TUZ";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT USAGE ON TYPES TO "as_TUZ";
  
GRANT ALL PRIVILEGES ON SCHEMA 360 TO "as_admin";
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA 360 TO "as_admin";
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA 360 TO "as_admin";
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA 360 TO "as_admin";
GRANT ALL PRIVILEGES ON ALL ROUTINES IN SCHEMA 360 TO "as_admin";
GRANT ALL PRIVILEGES ON ALL PROCEDURES IN SCHEMA 360 TO "as_admin";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT ALL PRIVILEGES ON TABLES TO"as_admin";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT ALL PRIVILEGES ON SEQUENCES TO"as_admin";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT ALL PRIVILEGES ON FUNCTIONS TO"as_admin";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT ALL PRIVILEGES ON ROUTINES TO"as_admin";
ALTER DEFAULT PRIVILEGES FOR ROLE as_admin IN SCHEMA 360 GRANT ALL PRIVILEGES ON TYPES TO"as_admin";

  • Создайте пользователя системы datamart_appl:

--Выполнять пользователем с правами dba
CREATE USER datamart_appl WITH
    PASSWORD '***************'
    LOGIN
    NOCREATEDB
    NOCREATEROLE
    NOSUPERUSER
    NOINHERIT
    NOREPLICATION
    NOBYPASSRLS;
    
ALTER ROLE datamart_appl SET search_path = 360;
ALTER ROLE datamart_appl SET role TO "as_TUZ";
GRANT "as_TUZ" TO datamart_appl;

Компонент Прикладной мониторинг продукта Platform V Monitor#

Cервис, предназначенный для сбора прикладных и инфраструктурных метрик и отправки их в целевую систему хранения. С детальным описанием можно ознакомиться в документации Platform V Monitor.

Synapse#

Для интеграции с Synapse никаких специальных действий производить не нужно. С детальным описанием можно ознакомиться в документации Synapse service Mesh

Запуск джобы деплоя#

После заполнения всех параметров перейдите в Jenkins, где слева в меню выберите Собрать с параметрами:

  • standType – выберите один из указанных ранее стендов, с которым необходимо работать;

  • secretsApply – параметр, позволяющий залить секреты на стенд при необходимости;

  • Migrations – параметр, установки миграций, при необходимости.

Обновление#

Обновление продукта осуществляется стандартным образом аналогично установке с актуализацией env файлов, в случае необходимости, а так же изменением версии релиза в параметрах джобы деплоя. Установку новой версии продукта необходимо осуществить согласно описанным шагам в пункте Установка дистрибутива текущего документа. Дополнительных настроек не требуется.

Проверка работоспособности#

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

http://host/component-name/actuator/health. где:

  • host – адрес сервера;

  • component-name – имя компонента.

http:///auth-api/actuator/health http:///app-api/actuator/health http:///inner-connector/actuator/health

В том числе для проверки работоспособности web-интерфейса продукта:

  1. Успешно войти в АРМ продукта под пользователем, которому назначена определенная роль.

  2. Перейти по всем разделам сайдбара продукта и убедиться, что при переходе отсутствуют ошибки.

Откат#

Для отката продукта к ранним версиям ПО после установки обновлений необходимо восстановить предыдущие версии Docker Images, либо путем включения предыдущего Replication Controller (предыдущая версия конфигурации в openShift), либо путем наката предыдущего релиза.

  1. Откат к предыдущей версии представляет собой удаление и установку последней стабильной версии.(Запуск джоба установки с параметром delete и указанием предыдущей версии релиза)

  2. Для отката необходимо выполнить установку предыдущей стабильной версии в соответствии с инструкцией, пункт Установка дистрибутива текущего документа.

Часто встречающиеся проблемы и пути их устранения#

При ошибке импорта инструменты журналирования Компонент Прикладной мониторинг продукта Platform V Monitor, инструменты аудита Platform V Audit проверьте корректность настройки URL для импорта в common репозитории Pipelline DevOps, а также работоспособность самих инструментов.

При ошибке установки SQL-скриптов посмотрите лог сборки в Jenkins на предмет ошибки, проверьте подключение к БД, выполните необходимые правки в common репозитории Pipelline DevOps или репозитории с конфигурацией продукта, если ошибка связана с настройками, или обратитесь к команде разработки продукта для внесения изменений в SQL-скрипты и пересборки дистрибутива.

При ошибке установки в Openshift посмотрите лог сборки в Jenkins на предмет ошибки, выполните необходимые правки в common репозитории Pipelline DevOps или репозитории с конфигурацией продукта, если ошибка связана с настройками, или обратитесь к команде разработки продукта для внесения изменений в SQL-скрипты и пересборки дистрибутива.

При ошибке авторизации убедитесь, что пользователь заведен в СУДИРа, если ошибка связана с настройками, или обратитесь к команде разработки продукта для пересборки дистрибутива.

При ошибке авторизации убедитесь что пользователь заведен в СУДИРе и SPAS.

Пример ошибки при накате базы

[DEBUG] No configuration value for liquibase.filterLogMessages found [DEBUG] Running Changeset:…/migrations/changeset.xml::01_create_role-grant::pastukhov_mi [DEBUG] Changeset …/migrations/changeset.xml::01_create_role-grant::pastukhov_mi [DEBUG] No configuration value for liquibase.outputLineSeparator found [DEBUG] Configuration liquibase.outputLineSeparator is using the default value of

[INFO] Continuing past: …/migrations/changeset.xml::01_create_role-grant::pastukhov_mi despite precondition failure due to onFail='CONTINUE': db.changelog-master.xml : Changelog property 'test_password' was not set

[DEBUG] Executing with the 'jdbc' executor [DEBUG] 0 row(s) affected [DEBUG] Skipping ChangeSet: …/migrations/changeset.xml::01_create_role-grant::pastukhov_mi [DEBUG] Executing with the 'jdbc' executor [DEBUG] Running Changeset:…/migrations/changeset.xml::01_create_appl_user::pastukhov_mi [DEBUG] Changeset …/migrations/changeset.xml::01_create_appl_user::pastukhov_mi [DEBUG] Executing with the 'jdbc' executor [INFO] Continuing past: …/migrations/changeset.xml::01_create_appl_user::pastukhov_mi despite precondition failure due to onFail='CONTINUE': db.changelog-master.xml : SQL Precondition failed. Expected '0' got '1'

[DEBUG] Executing with the 'jdbc' executor [DEBUG] 0 row(s) affected [DEBUG] Skipping ChangeSet: …/migrations/changeset.xml::01_create_appl_user::pastukhov_mi [DEBUG] Executing with the 'jdbc' executor [DEBUG] Running Changeset:…/migrations/changeset.xml::01_create_appl_user-schema::pastukhov_mi [DEBUG] Changeset …/migrations/changeset.xml::01_create_appl_user-schema::pastukhov_mi [DEBUG] Executing with the 'jdbc' executor [INFO] Continuing past: liquibase.precondition.core.PreconditionContainer@79ca7bea despite precondition error: 1 preconditions failed db.changelog-master.xml : liquibase.precondition.core.SqlPrecondition@115c946b : ERROR: column "tuz_sbt_ci_catalogci" does not exist Position: 48

[DEBUG] Executing with the 'jdbc' executor [DEBUG] 0 row(s) affected [DEBUG] Executing with the 'jdbc' executor

Пример ошибки при установке на k8s openshift

 [localhost] (item={'path': 'templates_ansible/app-api/PodDisruptionBudget.yaml'}) => {
     "ansible_loop_var": "item",
     "changed": false,
     "invocation": {
         "module_args": {
             "api_key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
             "api_version": "v1",
             "append_hash": false,
             "apply": false,
             "ca_cert": "cloud_ca.pem",
             "client_cert": null,
              "client_key": null,
              "context": null,
              "definition": {
                 "apiVersion": "policy/v1beta1",
                  "kind": "PodDisruptionBudget",
                 "metadata": {
                      "name": "app-api"
                  },
                  "spec": {
                      "minAvailable": "100%",
                      "selector": {
                          "matchLabels": {
                              "app": "app-api"
                          }
                      }
                  }
              },
              "delete_options": null,
              "force": false,
              "host": "https://XXXX",
              "kind": null,
              "kubeconfig": null,
              "merge_type": null,
              "name": null,
              "namespace": "tribe-pf-dev-pd36-k8s",
              "password": null,
              "persist_config": null,
              "proxy": null,
              "resource_definition": {
                 "apiVersion": "policy/v1beta1",
                  "kind": "PodDisruptionBudget",
                  "metadata": {
                      "name": "app-api"
                  },
                  "spec": {
                      "minAvailable": "100%",
                     "selector": {
                          "matchLabels": {
                              "app": "app-api"
                          }
                      }
                  }
             },
              "src": null,
             "state": "present",
              "template": null,
              "username": null,
              "validate": null,
             "validate_certs": false,
              "wait": false,
              "wait_condition": null,
              "wait_sleep": 5,
              "wait_timeout": 120
         }
      },
      "item": {
          "path": "templates_ansible/app-api/PodDisruptionBudget.yaml"
      },
     "msg": "Failed to get client due to HTTPSConnectionPool(host='XXXX', port=6443): Max retries exceeded with url: /version (Caused by SSLError(FileNotFoundError(2, 'No such file or directory'),))"
  }
  <localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp `"&& mkdir "` echo $HOME/.ansible/tmp/ansible-tmp-1657279706.817063-30568-75500627184036 `" && echo ansible-tmp-1657279706.817063-30568-75500627184036="` echo $HOME/.ansible/tmp/ansible-tmp-1657279706.817063-30568-75500627184036 `" ) && sleep 0'
  redirecting (type: modules) ansible.builtin.k8s to kubernetes.core.k8s
  Using module file /usr/local/lib/python3.6/site-packages/ansible_collections/kubernetes/core/plugins/modules/k8s.py
  <localhost> PUT /home/jenkins/.ansible/tmp/ansible-local-305109nzez916/tmpmqnfwreu TO /home/jenkins/.ansible/tmp/ansible-tmp-1657279706.817063-30568-75500627184036/AnsiballZ_k8s.py
  <localhost> EXEC /bin/sh -c 'chmod u+x /home/jenkins/.ansible/tmp/ansible-tmp-1657279706.817063-30568-75500627184036/ /home/jenkins/.ansible/tmp/ansible-tmp-1657279706.817063-30568-75500627184036/AnsiballZ_k8s.py && sleep 0'
  <localhost> EXEC /bin/sh -c '/usr/bin/python3 /home/jenkins/.ansible/tmp/ansible-tmp-1657279706.817063-30568-75500627184036/AnsiballZ_k8s.py && sleep 0'
  <localhost> EXEC /bin/sh -c 'rm -f -r /home/jenkins/.ansible/tmp/ansible-tmp-1657279706.817063-30568-75500627184036/ > /dev/null 2>&1 && sleep 0'
  The full traceback is:
    File "/tmp/ansible_k8s_payload_kynh2424/ansible_k8s_payload.zip/ansible_collections/kubernetes/core/plugins/module_utils/common.py", line 294, in get_api_client
      return DynamicClient(kubernetes.client.ApiClient(configuration))
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/client.py", line 71, in __init__
      self.__discoverer = discoverer(self, cache_file)
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/discovery.py", line 259, in __init__
      Discoverer.__init__(self, client, cache_file)
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/discovery.py", line 31, in __init__
      self.__init_cache()
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/discovery.py", line 77, in __init_cache
      self.invalidate_cache()
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/discovery.py", line 92, in invalidate_cache
      self.__init_cache(refresh=True)
   File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/discovery.py", line 78, in __init_cache
      self._load_server_info()
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/discovery.py", line 158, in _load_server_info
      'kubernetes': self.client.request('get', '/version', serializer=just_json)
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/client.py", line 42, in inner
      resp = func(self, *args, **kwargs)
    File "/usr/local/lib/python3.6/site-packages/openshift/dynamic/client.py", line 249, in request
      _return_http_data_only=params.get('_return_http_data_only', True)
    File "/usr/local/lib/python3.6/site-packages/kubernetes/client/api_client.py", line 353, in call_api
      _preload_content, _request_timeout, _host)
    File "/usr/local/lib/python3.6/site-packages/kubernetes/client/api_client.py", line 184, in __call_api
      _request_timeout=_request_timeout)
    File "/usr/local/lib/python3.6/site-packages/kubernetes/client/api_client.py", line 377, in request
      headers=headers)
    File "/usr/local/lib/python3.6/site-packages/kubernetes/client/rest.py", line 243, in GET
      query_params=query_params)
    File "/usr/local/lib/python3.6/site-packages/kubernetes/client/rest.py", line 216, in request
      headers=headers)
    File "/usr/local/lib/python3.6/site-packages/urllib3/request.py", line 75, in request
      method, url, fields=fields, headers=headers, **urlopen_kw
    File "/usr/local/lib/python3.6/site-packages/urllib3/request.py", line 96, in request_encode_url
      return self.urlopen(method, url, **extra_kw)
    File "/usr/local/lib/python3.6/site-packages/urllib3/poolmanager.py", line 375, in urlopen
      response = conn.urlopen(method, u.request_uri, **kw)
    File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 796, in urlopen
     **response_kw
    File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 796, in urlopen
      **response_kw
    File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 796, in urlopen
      **response_kw
    File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 756, in urlopen
      method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
    File "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", line 574, in increment
      raise MaxRetryError(_pool, url, error or ResponseError(cause))
  failed: [localhost] (item={'path': 'templates_ansible/app-api/cm-app-logback.yaml'}) => {

Чек лист валидации установки#

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

  • DB_UPDATE – проверить, что применена последняя миграция скриптов из папки liquibase/scripts дистрибутива; По env переменным отвечающим за строку коннекта к базе, зайдите и проверьте, что в соответствующих схемах создались таблицы ответственные за работу приложения. ENV переменные

    APP_API_JDBC_URL
    AUTH_API_JDBC_URL
    INNER_COONECTOR_API_JDBC_URL
    DATAMART_API_JDBC_URL
    

Таблицы с логом Миграции - databasechangelog, databasechangeloglock.

  • OPENSHIFT_DEPLOY – проверить, в проектной области OpenShift появились ConfigMaps, VirtualService, DeploymentConfig, Service, Route, ServiceEntry, Gateway, DestinationRule и создались POD. Проверьте, что появились боды pct360-auth-api, pct360-app-api

  • OPENSHIFT_INGRESS_EGRESS_DEPLOY – проверить, что появились POD INGRESS и EGRESS.

При соблюдении всех шагов деплоя установка считается выполненной успешно.