Установка#

В руководстве приведены инструкции по установке Projects.

Для распаковки дистрибутива воспользуйтесь Solution-merger и Solution-unpacker Jenkins jobs продукта Platform V Devops Tools.

Выбор способа установки#

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

  • ручная установка пакетным менеджером Helm

  • автоматизированная установка с помощью Platform V DevOps Tools

Порядок установки#

  1. Ручная установка пакетным менеджером Helm

  2. Автоматизированная установка с использованием Deploy Tools

  3. Установка в контейнере при помощи Docker-compose

  4. Настройка интеграций

    1. Интеграция с таск-трекером

    2. Интеграция с Jenkins

    3. Интеграция с KeyCloak

    4. Интеграция с SMTP для отправки e-mail уведомлений

    5. Интеграция с Secman/HashiCorp Vault

    6. Настройка CronJob backend сервиса

    7. Публичные API

Ручная установка пакетным менеджером Helm#

Подготовка конфигурационных файлов#

Файл конфигурации Helm Charts сервисов Projects имеет следующий вид:

Installer:
  type: helm # Тип дистрибутива
  helmChartsPath: package/conf/helm # Путь к Helm Charts в дистрибутиве
  k8sConfigCredId: {CREDENTIAL_NAME} # Имя credential с kube config
  namespace: {PROJECT_NAMESPACE} # Имя namespace, в который производится установка. Namespace должен быть создан
  helmSettings: # Конфигурация helm
    timeout: 600 #время в секундах, сколько Helm должен ждать завершения операции установки, обновления или удаления перед таймаутом
  parameters: # Здесь необходимо перечислить все имена устанавливаемых Helm Charts
    sberproject-ds-core:  # Имя Helm Chart в дистрибутиве
      releaseName: sberproject-ds-core # Release Name. Имя, с которым будет установлен Helm Charts
      values: # Список параметров, который будет передан как -f values.yaml при установке Helm Charts
    sberproject-backend: # Имя Helm Chart в дистрибутиве
      releaseName: sberproject-backend # Release Name. Имя, с которым будет установлен Helm Charts
      values: # Список параметров, который будет передан как -f values.yaml при установке Helm Charts
    sberproject-gantt-server: # Имя Helm Chart в дистрибутиве
      releaseName: sberproject-gantt-server # Release Name. Имя, с которым будет установлен Helm Charts
      values: # Список параметров, который будет передан как -f values.yaml при установке Helm Charts
    sberproject-ui: # Имя Helm Chart в дистрибутиве
      releaseName: sberproject-ui # Release Name. Имя, с которым будет установлен Helm Charts
      values: # Список параметров, который будет передан как -f values.yaml при установке Helm Charts

Helm Chart sberproject-backend содержит секцию настроек Values.appConfig.overrideProperties. Вложенные секции данной настройки попадают в ConfigMap, который монтируется в файловую систему pod и подключается в spring-boot приложение через -Dspring.config.location="..., optional:file:/deployment/config/override.yaml.

appConfig:
   overrideProperties:
    keycloak:
      auth-server-url: ""
      realm: ""
      resource: ""
      bearer-only: true

Обратите внимание Основные настройки могут быть переданы с использованием ConfigMap. Конфиденциальные настройки должны быть переданы с использованием Secret.

Настройка журналирования сервисов sberproject-backend и sberproject-ds-core осуществляется за счет передачи logback.xml в Projects. Helm Charts сервисов sberproject-backend и sberproject-ds-core содержат ConfigMap с logback.xml по умолчанию.

  • При запуске в pod Kubernetes передача файла logback.xml осуществляется посредством конфигурирования ConfigMap и подключения в Deployment, как volume с именем logback-config. Данный ConfigMap должен содержать единственный ключ logback.xml с содержимым согласно документации logback.

  • При запуске JAR файл logback.xml можно переопределить за счет передачи следующего параметра:

    -Dlogging.config=./logback.xml
    

Данный файл logback.xml может быть переопределен. Для этого необходимо передать параметр appConfig.customLogback на предварительно созданный ConfigMap со следующей структурой:

  • values.yaml

    appConfig:
      customLogback: "my-logback-cm"
    
  • ConfigMap

    kind: ConfigMap #инструмент для запуска локальных кластеров Kubernetes
    apiVersion: v1 #версия API Kubernetes
    metadata: #информация об объектах кластера
      name: "my-logback-cm" #наименование создаваемого объекта
    data:
        logback.xml: |-
          YOUR LOGBACK
    
  1. Создайте yaml файл-манифест ConfigMap {CUSTOM_LOGBACK_CM_MANIFEST}:

    Примечание Для справочной информации по logback.xml обратитесь к официальной документации.

    kind: ConfigMap #инструмент для запуска локальных кластеров Kubernetes
    apiVersion: v1 #версия API Kubernetes
    metadata: #информация об объектах кластера
      name: "{CUSTOM_LOGBACK_CM}" #наименование создаваемого объекта
    data:
      #файл logback.xml, подключаемый в Projects через объект configmap. Формирует логи работы сервисов в виде json для интеграции с fluentbit
      logback.xml: |-
        <?xml version="1.0" encoding="UTF-8"?>
        <configuration debug="true" scan="true" scanPeriod="30 seconds">
            <property name="loggingDir" value="/tmp" />
            <property name="loggingFile" value="application.log" />
            <property name="loggingJSONFile" value="application.log.json" />
            <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
               <file>${loggingDir}/${loggingFile}</file>
               <encoder>
                   <charset>UTF-8</charset>
                   <pattern>%d{ISO8601} [%t] [%level] \(%c\) [%C::%M:%L] mdc:\(%mdc\)| %m%n</pattern>
               </encoder>
               <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                   <fileNamePattern>${loggingDir}/${loggingFile}_%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
                   <maxFileSize>10MB</maxFileSize>
                   <maxHistory>5</maxHistory>
                   <totalSizeCap>50MB</totalSizeCap>
               </rollingPolicy>
           </appender>
    
           <appender name="JSON" class="ch.qos.logback.core.rolling.RollingFileAppender">
               <file>${loggingDir}/${loggingJSONFile}</file>
               <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                   <providers>
                       <timestamp>
                           <fieldName>timestamp</fieldName>
                           <pattern>[UNIX_TIMESTAMP_AS_STRING]</pattern>
                       </timestamp>
                       <logLevel>
                           <fieldName>levelStr</fieldName>
                       </logLevel>
                       <logLevelValue>
                           <fieldName>levelInt</fieldName>
                       </logLevelValue>
                       <loggerName>
                           <fieldName>loggerName</fieldName>
                       </loggerName>
                       <threadName>
                           <fieldName>threadName</fieldName>
                       </threadName>
                       <callerData>
                           <classFieldName>callerClass</classFieldName>
                           <methodFieldName>callerMethod</methodFieldName>
                           <lineFieldName>callerLine</lineFieldName>
                           <fileFieldName>callerFile</fileFieldName>
                       </callerData>
                       <message/>
                       <stackTrace>
                           <fieldName>stackTrace</fieldName>
                           <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                               <maxDepthPerThrowable>30</maxDepthPerThrowable>
                               <maxLength>4096</maxLength>
                               <rootCauseFirst>true</rootCauseFirst>
                           </throwableConverter>
                       </stackTrace>
                       <pattern>
                           <omitEmptyFields>true</omitEmptyFields>
                           <pattern>
                             {
                               "requestUid": "%mdc{requestUid}",
                               "requestDepth": "#asLong{%mdc{requestDepth}}",
                               "sessionUid": "%mdc{sessionUid}",
                               "sessionLogin": "%mdc{sessionLogin}",
                               "rn": {{ .Values.appConfig.fluentBit.mtResourceName | quote }}
                             }
                           </pattern>
                       </pattern>
                       <nestedField>
                           <fieldName>mdc</fieldName>
                           <providers>
                               <mdc>
                                   <excludeMdcKeyName>requestUid</excludeMdcKeyName>
                                   <excludeMdcKeyName>requestDepth</excludeMdcKeyName>
                                   <excludeMdcKeyName>sessionUid</excludeMdcKeyName>
                                   <excludeMdcKeyName>sessionLogin</excludeMdcKeyName>
                               </mdc>
                           </providers>
                       </nestedField>
                   </providers>
               </encoder>
               <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                   <fileNamePattern>${loggingDir}/${loggingJSONFile}_%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
                   <maxFileSize>10MB</maxFileSize>
                   <maxHistory>5</maxHistory>
                   <totalSizeCap>50MB</totalSizeCap>
               </rollingPolicy>
           </appender>
    
           <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
               <encoder>
                   <pattern>%d{ISO8601} [%t] [%level] \(%c\) [%C::%M:%L] mdc:\(%mdc\)| %m%n</pattern>
               </encoder>
           </appender>
    
           <root level="info">
               <appender-ref ref="STDOUT"/>
               <appender-ref ref="FILE"/>
               <appender-ref ref="JSON"/>
           </root>
       </configuration>
    
  2. Создайте yaml файл-манифест {DS_CORE_MANIFEST} для сервиса ds-core:

    istio: #секция настроек istio
       enabled: false #флаг активации или деактивации настроек istio
     replicaCount: 2 #количество единиц развертывания сервиса в кластере Kubernetes
     appConfig: #секция настроек сервиса
       runDebug: false #флаг запуска сервиса в режиме debug
       packagesToScan: "ru.sbt.sberproject" #наименование пакета с JPA классами для работы Platform V DataSpace. Оставить неизменным
       fluentBit: #секция настроек fluentBit
         enabled: false #флаг активации или деактивации fluentBit
         image: "{FLUENTBIT_IMAGE}" #url расположения образа fluentBit
       db: #секция настроек подключения к БД
         max-aggregates-per-transaction: 10000 #максимальное количество агрегатов запросов для одной транзакции
         ssl: #секция настроек подключения к БД по ssl
           keystoresecret: "{NAME_KEYSTORE_SECRET}" #наименование секрета с keystore, в котором лежат сертификаты, необходимые для подключения к БД
         main: #секция настроек main
           secret: "{NAME_DB_MAIN_SECRET}" #наименование секрета с конфигурацией подключения к БД
       security: #секция настроек security
         jwks: #секция настроек секрета jwks
           value: {HOST_JWKS} #путь к секрету jwks
       overrideProperties: #секция переопределения настроек сервиса
         server: #секция настроек server
           tomcat:  #server tomcat
             min-spare-threads: 10 #определение количества рабочих потоков
             max-threads: 30 #максимальное количество потоков
             queuesize: 30 #размер очереди в терминах количества задач
         spring: #секция настроек spring
           datasource: #секция настроек datasource
             hikari: #секция настроек hikari
               minimum-idle: 50 #минимальное количество неактивных соединений, которое пытается поддерживать hikari
               maximum-pool-size: 50 #максимальное число соединений, которое может находиться в пуле
         dataspace-core: #секция настроек dataspace-core
           integrity-check: #проверка целостности данных, хранящихся в базе данных
           delete: true #отметка об удалении
         dataspace: #секция настроек dataspace
           useEntityReferenceAggregateValidation: false #модуль контроля ссылок
           endpoint: #секция настроек endpoint
             graphql: #секция настроек graphql
               schema: #секция настроек schema
                 settings: #секция настроек settings
                   calc-expr-fields-placement: ON_EACH_TYPE #определение расположений полей для вычисляемых выражений
           replication: #поддержания копий наборов данных
             max-aggregates-per-transaction: 100000 #максимальное количество допустимых экземпляров агрегатов в пакете
           dictionary: #секция настроек модуля dictionary
             tableLoad: #параметров запуска модуля
               enable: false #флаг активации или деактивации tableLoad
         graphiql: #секция настроек graphql
           endpoint: #секция настроек endpoint
             graphql: /sberproject-ds-core-unsecure/graphql #путь к graphql
             subscriptions: /sberproject-ds-core-unsecure/subscriptions #путь к subscriptions
           basePath: /sberproject-ds-core-unsecure/ #путь к basePath
    image: #секция настроек расположения образа сервиса dataspace-core
     registryUrl: "{REGISTRY_URL}" #адрес registry
     registryProject: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registry
    resources: #ресурсы контейнера
     limits: #максимальное количество ресурсов контейнера
       cpu: 1000m #максимальное значение процессорной мощности
       memory: 2536Mi #максимальное значение памяти
     requests: #минимальное количество ресурсов контейнера
       cpu: 750m #минимальное значение процессорной мощности
       memory: 1024Mi #минимальное значение памяти
    ingress: #секция настроек ingress-nginx controller
     enabled: true #флаг активации или деактивации ingress
     annotations: #секция настроек аннотаций ingress-nginx (смотрите официальную документацию)
       kubernetes.io/ingress.class: nginx #указания контроллера Ingress
       nginx.ingress.kubernetes.io/proxy-buffer-size: 128k #размер буфера для чтения заголовка ответа, полученного от прокси-сервера
       nginx.ingress.kubernetes.io/rewrite-target: /$2 #аннотация настройки основных правил перезаписи URL
       nginx.ingress.kubernetes.io/proxy-body-size: 100m #максимальный допустимый размер тела запроса в nginx ingress
       nginx.ingress.kubernetes.io/configuration-snippet: | #добавление пользовательской конфигурации в блок конфигурации местоположения
         more_set_input_headers "x-Dspc-Tenant: SBT-TNT";
     hosts: #секция настроек hosts
       - host: '{HOST}' #host, прослушиваемый ingress-controller
         paths: #секция настроек paths
           - path: /sberproject-ds-core(/|$)(.*) # путь к sberproject-ds-core
             pathType: Prefix #значение pathType
             servicePort: 8083 #порт, на который ссылаются локальные ресурсы sberproject-ds-core
           - path: /sberproject-ds-core-unsecure(/|$)(.*) # путь к sberproject-ds-core-unsecure
             pathType: Prefix #значение pathType
             servicePort: 8080 #порт, на который ссылаются локальные ресурсы sberproject-ds-core-unsecure
           - path: /api/dataspace(/|$)(graphql) # путь к sberproject-ds-core-unsecure
             pathType: Prefix #значение pathType
             servicePort: 8083 #порт, на который ссылаются локальные ресурсы /api/dataspace
           - path: /api/dataspace-unsecure(/|$)(graphql) # путь к sberproject-ds-core-unsecure
             pathType: Prefix #значение pathType
             servicePort: 8080 #порт, на который ссылаются локальные ресурсы /api/dataspace-unsecure
     tls: #секция tls настроек host
       - secretName: {HOST} #Имя секрета TLS
         hosts: #секция hosts
           - {HOST} #DNS имена endpoints
    core: #секция настроек core
      labels: #настройка для метрик, собираемых prometheus
       modelid: sberproject
      readinessProbe: #секция настроек readinessProbe (смотрите официальную документацию по kubernetes)
       httpGet: #поле хоста httpGet
         port: 9080 #номер порта для доступа к контейнеру
       failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
       periodSeconds: 10 #определяет, как часто проверять probe
       initialDelaySeconds: 120 #количество секунд ожидания перед запуском проверки работоспособности или готовности
      livenessProbe: #секция настроек livenessProbe(смотрите официальную документацию по kubernetes)
       httpGet: #поле хоста httpGet
         port: 9080 #номер порта для доступа к контейнеру
       failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
       periodSeconds: 10 #определяет, как часто проверять probe
       initialDelaySeconds: 120 #количество секунд ожидания перед запуском проверки работоспособности или готовности
    
    secman: #секция настроек Secman/HashiCorp Vault
     enabled: true #флаг активации или деактивации Secman/HashiCorp Vault
     agentRunAsUser: ~ #имя пользователя агента
     agentRunAsGroup: ~ #имя группы агента
     image: #образ агента Secman/HashiCorp Vault
       registry: "{REGISTRY_URL}" #адрес registry
       repository: "{REGISTRY_FOLDER_DOCKER_IMAGE_SECMAN}" #путь до расположения Secman/HashiCorp Vault в registry
       digestOrTag: "{VERSION_DOCKER_IMAGE}" # версия образа Secman/HashiCorp Vault
     noNamespace: true #объект без пространства имен
    
    hooks:  #hook жизненного цикла контейнера
     graphql: #секция настроек проверки graphql
       enabled: true #флаг активации или деактивации graphql
       grepV: #команда для аудита
         - "/update/"
    
  3. Создайте yaml файл-манифест {PROJECT_BACKEND_MANIFEST} для бэкенд сервиса:

    istio: #секция настроек istio
      enabled: false #флаг активации или деактивации настроек istio
    replicaCount: 2 #количество единиц развертывания сервиса в кластере Kubernetes
    appConfig: #секция настроек сервиса
      jks: #секция настроек jks
        keyStore: #секция настроек keyStore
          secretName: "notExist" #имя секрета jks
          password: "notExist" #пароль секрета jks
        trustStore: #секция настроек trustStore
          secretName:  {NAME_TRUSTSTORE} #наименование секрета, созданного на шаге №2 раздела "Сертификаты для обмена данными между пользователями и внутренними сервисами Projects"
          password: "{PASSWORD_TRUSTSTORE}" #пароль от хранилища, созданного на шаге №3 раздела "Сертификаты для обмена данными между пользователями и внутренними сервисами Projects"
      runDebug: false #инструмент для отладки в pod кластера
      jira: #секция настроек jira
        secretName: {JIRA_SECRET} #наименование секрета jira
      fluentBit: #секция настроек fluentBit
        enabled: false #флаг активации или деактивации fluentBit
        mtResourceName: "n/a" #идентификатор fluentBit
      jobs: #секция настроек cron-job
        checker: #проверка статусов проектов
          enabled: false  #флаг активации или деактивации cron-job checker
          image: "{BASE_IMAGE}" #url расположения образа cron-job checker
          cron: "0 2 * * *" #настройка расписания планировщика задач.
        notification: #отправка уведомлений
          enabled: false #флаг активации или деактивации cron-job notification
          image: "{BASE_IMAGE}" #url расположения образа cron-job notification
          cron: "*/3 * * * *" #настройка расписания планировщика задач.
        automaticsynctimesheet: #синхронизация трудозатрат с таск-трекером
          enabled: false #флаг активации или деактивации cron-job automaticsynctimesheet
          image: "{BASE_IMAGE}" #url расположения образа cron-job automaticsynctimesheet
          cron: "0 23 * * *" #настройка расписания планировщика задач.
      commonSecret: {BACKEND_COMMON_SECRET} #название секрета, в котором расположены данные для интеграций с внешними сервисами
      overrideProperties: #секция переопределения стандартных параметров сервиса
        spring: #секция настроек spring
          mail: #настройка интеграции с почтовым сервисом
            host: {EMAIL_HOST} #ip адрес почтового сервера
            port: {EMAIL_PORT} #port почтового сервиса
            properties: #параметров сервиса mail
              mail: #секция настроек взаимодействия с почтовым сервисом
                smtp: #протокол передачи электронной почты
                  auth: true #флаг активации или деактивации настройки аутентификации
                  starttls: #расширение обычного протокола зашифрованного соединение (TLS или SSL) текстового обмена данных
                    enable: true #флаг активации или деактивации starttls
                    required: true #флаг активации или деактивации набор меток required
          servlet: #настройка для конфигурации обработки multipart-запросов
            multipart: #секция настроек multipart
              max-file-size: 100MB #максимальный размер файла журнала
              max-request-size: 110MB #максимальный размер запроса
        sberproject: #секция настроек sberproject
          gantt: #секция настроек gantt
            host: "http://svc-sberproject-gantt-server:8080" #url адрес gantt-server
            healthUri: "system/health/liveness" #проверка healthUri gantt-server
          security: #настройки безопасности
            enabled: true #флаг активации или деактивации security
            permissionsCheck: true #флаг активации или деактивации разрешений
            type: BEARER #тип токена клиента
            oauth2: #секция настроек для oauth2 прокси
              client: #секция настроек клиента oauth2 прокси
                clientId: {CLIENT_ID} #id клиента, созданного в п.6 Настройка KeyCloak
                clientSecret: "{CLIENTS_CREDENTIALS_SECRET}" #секрет созданного клиента oauth в keycloak
              resourceserver: #секция настроек resourceserver
                jwt: #секция настроек jwt
                  issuerUri: https://{KEYCLOAK_HOST}/auth/realms/{REALM} #oidc-issuer-url. {REALM} - realm, в котором созданы клиенты из п.4, п.6 Настройка KeyCloak
          graphqlserver: #настройки graphqlserver
            url: "http://svc-sberproject-ds-core:8080/graphql" #url graphql server
          facade: #настройка синхронизации сотрудников
            enableSyncEmployeeVacations: true #флаг активации или деактивации SyncEmployeeVacations
            scheduler: # секция подключения интеграции
              employeesDefaultUnitRequestTime: "0 0 3 * * *"  #настройка расписания планировщика задач по пользователям
              tribesRequestTime: "0 5 3 * * *" #настройка расписания планировщика задач по трайбам
              squadsRequestTime: "0 10 3 * * *" #настройка расписания планировщика задач по командам
              departmentsRequestTime: "0 15 3 * * *" #настройка расписания планировщика задач по департаментам
              employeesVacationsRequestTime: "0 20 3 * * *" #настройка расписания планировщика задач по календарям сотрудников
              employeesNoChangesRequestTime: "0 25 3 * * *" #настройка расписания планировщика задач по сотрудникам без изменений
              productDeliveryOptionRequestTime: "0 30 3 * * *" #настройка расписания планирования задач по вариантам поставки в продуктах
            integrations:
              zup3:
                url: {URL_1C} #url адрес интеграции с 1С
              aspu:
                url: {URL_ASPU} #url адрес интеграции с АС ПУ
                jksFilePath: {PATH_JKS_FILE} #расположение jks файла с сертификатами подключения с АС ПУ
          services: #секция настроек сервисов
            subjects: #секция настроек компонентов сервиса
              caching: false #флаг активации или деактивации кэширования данного сервиса
            credentials: #секция настроек секретов сервисов
              provider: properties #источник предоставления учетных данных
              credentials: #секция настроек секретов provider
                jenkinsci: #секция настроек jenkinsci
                  username: {USER_JENKINS} #наименование учетной записи jenkins
                  token: {TOKEN_JENKINS} #токен jenkins
            tasktracker: #интеграции с таск-трекером
              writeComment: false #флаг активации или деактивации разрешения пользователям писать комментарии к задачам
              isCreateMember: true #флаг активации или деактивации создания новых участников (членов) в системе отслеживания задач
              enableSyncTimesheet: true #флаг активации или деактивации SyncTimesheet
              autosync: #автоматически проверяет настроенный репозиторий Git и гарантирует, что состояние кластера соответствует манифестам из репозитория
                taskKindUniqGroupMapping: #определение соответствий между уникальными группами задач и их типами
                  general_plan_labor_costs: general_plan_costs #тип трудозатрат в задаче по общему плану
                  internal_acceptance: acceptance #тип задачи внутренней приемки
            notification: #настройка рассылки пользовательских уведомлений
              from: {USERNAME_EMAIL_SEND_NOTIFICATION} #почтовый адрес сервиса отправки уведомлений
              emailService: smtp #протокол передачи электронной почты
              emailsFilter: #настройка фильтра почтовых адресов, на которые будет осуществляться рассылка (пример: - ivanov.i.i@email.ru)
                - example.e.e@example.ru
              allowedDomains: #список разрешенных доменов для использования DNS
                - example.ru
          jenkins: #секция настроек интеграции с jenkins
            type: MOCK #type endpoint jenkins
            url: {URL_JENKINS_ENDPOINT} #url endpoint jenkins
            optionalFolderPath: sre/test/ #путь к папке в jenkins
            installerName: Notifier #имя установщика jenkins
          jira: #секция настроек интеграции с jira
            enableRateLimiter: true #флаг активации или деактивации RateLimiter
            requestPerSecond: 10 #количество запросов в секунду
            insecure: true #подключение без проверки сертификата TLS
            enableUpdateFixVersion: false #флаг активации или деактивации UpdateFixVersion
          naumen:
            type: IMPL #type endpoint naumen
            url: {REGISTRY_URL_SWTR} #адрес registry Naumen
            insecure: true #подключение без проверки сертификата TLS
            limitPage: 50 #ограничение результатов на странице
          swtr: #секция настроек интеграции с TaskTracker
            insecure: true #подключение без проверки сертификата TLS
            limitPage: 50 #ограничение результатов на странице
            type: IMPL #type endpoint swtr
            url: '{REGISTRY_URL_SWTR}' #адрес registry TaskTracker
          actuator: #инструмент управления и мониторинга кластеров
            httptrace: true #инструмент для сбора информации жизненного цикла запроса клиента HTTP
        server.port: 8080 #порт подключения
        core.unsecure.url: "http://svc-sberproject-ds-core:8080"
        erp: #секция настроек подключения к ui Projects
          msp:
            dayUnitMappingExport:
              monday: 2
              tuesday: 3
              wednesday: 4
              thursday: 5
              friday: 6
              saturday: 7
              sunday: 8
          notification: #настройка рассылки пользовательских уведомлений
            emailService: smtp #протокол передачи электронной почты
          instance: #секция настроек instance
            uiHost: "https://{HOST}/erp" #host ui Projects
    image: #секция настроек расположения образа сервиса
      registryUrl: "{REGISTRY_URL}" #адрес registry
      registryProject: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registry
    core: #секция настроек core
      readinessProbe: #секция настроек readinessProbe (смотрите официальную документацию по kubernetes)
        httpGet: #поле хоста httpGet
          port: 8080 #номер порта для readinessProbe
        failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
      livenessProbe: #секция настроек livenessProbe (смотрите официальную документацию по kubernetes)
        httpGet: #поле хоста httpGet
          port: 8080 #номер порта для livenessProbe
        failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
    resources: #секция настроек resources
      limits: #настройка limits (смотрите официальную документацию по kubernetes)
        cpu: 750m #максимальное значение процессорной мощности
        memory: 2048Mi #максимальное значение памяти
      requests: #настройка requests (смотрите официальную документацию по kubernetes)
        cpu: 500m #минимальное значение процессорной мощности
        memory: 1024Mi #минимальное значение памяти
    ingress: #секция настроек ingress-nginx controller
      enabled: true #флаг активации или деактивации ingress
      annotations: #секция настроек аннотаций ingress-nginx (смотрите официальную документацию)
        kubernetes.io/ingress.class: nginx #указания контроллера Ingress
        nginx.ingress.kubernetes.io/proxy-buffer-size: 128k #размер буфера для чтения заголовка ответа, полученного от прокси-сервера
        nginx.ingress.kubernetes.io/rewrite-target: /$1 #аннотация настройки основных правил перезаписи URL
        nginx.ingress.kubernetes.io/proxy-body-size: 100m #максимальный допустимый размер тела запроса в nginx ingress
        nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" #максимальное время ожидания подключения в nginx ingress
        nginx.ingress.kubernetes.io/proxy-send-timeout: "600" #максимальное время передачи запроса в nginx ingress
        nginx.ingress.kubernetes.io/proxy-read-timeout: "600" #максимальное время ожидания чтения в nginx ingress
        nginx.ingress.kubernetes.io/configuration-snippet: | #добавление пользовательской конфигурации в блок конфигурации местоположения
          more_set_input_headers "x-Dspc-Tenant: SBT-TNT";
      hosts: #секция настроек hosts
        - host: '{HOST}' #host, прослушиваемый ingress-controller
          paths: #секция настроек paths
            - path: /(public/v1.*) #путь к public
              pathType: Prefix #значение pathType
            - path: /(internal/.*) #путь к internal
              pathType: Prefix #значение pathType
            - path: /backend/(.*) #путь к backend
              pathType: Prefix #значение pathType
            - path: /(erp/backend/swagger-ui.*) #путь к swagger-ui
              pathType: Prefix #значение pathType
            - path: /backend/(actuator.*) #путь к backend
              pathType: Prefix #значение pathType
            - path: /api/(v1/.*) #путь к api
              pathType: Prefix #значение pathType
            - path: /(public/v1.*) #путь к public
              pathType: Prefix #значение pathType
            - path: /(public/v2.*) #путь к (public
              pathType: Prefix #значение pathType
            - path: /(erp/backend/v3/api-docs.*) #путь к api-docs
              pathType: Prefix #значение pathType
    
    secman: #секция настроек Secman/HashiCorp Vault
      enabled: true #флаг активации или деактивации Secman/HashiCorp Vault
      agentRunAsUser: ~ #имя пользователя агента
      agentRunAsGroup: ~ #имя группы агента
      image: #секция настроек расположения образа сервиса
        registry: '{REGISTRY_URL}' #адрес registry
        repository: '{REGISTRY_FOLDER_DOCKER_IMAGE_SECMAN}' #путь до расположения Secman/HashiCorp Vault в registry
        digestOrTag: '{VERSION_DOCKER_IMAGE}' # версия образа Secman/HashiCorp Vault
      noNamespace: true #объект без пространства имен
    
  4. Создайте yaml файл-манифест {PROJECT_GANTT_SERVER_MANIFEST} для gantt-server сервиса:

    istio: #секция настроек istio
      enabled: false #флаг активации или деактивации настроек istio
    replicaCount: 1 #количество единиц развертывания сервиса в кластере Kubernetes
    appConfig: #секция настроек сервиса
      configFileNames: "[ \"../overrideConf/override.yml\" ]" #файл конфигурации приложения
      fluentBit: #секция настроек fluentBit
        enabled: false #флаг активации или деактивации fluentBit
      overrideProperties: #секция переопределения стандартных параметров сервиса
        disableCorsCheck: true #секция отключения Cors проверок в браузере
        logFile: /tmp/app-root/src/logs/log.log #директория расположения логов pods
        logLevel: info #уровень логирования
        logTo: #вывод логов
          - "console" #метод вывода логов
        graphqlURL: "http://svc-sberproject-ds-core:8080/graphql" #url адрес graphql сервера
        swaggerServerPath: '/api/gantt/' #swagger
        gantt: #секция настроек gantt
          load: 'http://svc-sberproject-backend:8080/rest/srvc/v1/accountingObjects/{accountingObjectId}/plans/{planId}/load' #url адрес загрузки backend
          sync: 'http://svc-sberproject-backend:8080/rest/srvc/v1/accountingObjects/{accountingObjectId}/plans/{planId}/sync' #url адрес синхронизации backend
        jira: #секция настроек jira
          protocol: 'https' #протокол подключения
          host: '{REGISTRY_URL_JIRA}' #адрес registry jira
          bearer: '{TOKEN_JIRA}' #токен jenkins
          apiVersion: '2' #версия API Kubernetes
          strictSSL: false #проверка SSL-сертификата при использовании API
          taskTypeCustomFill:
            '10000':
              customfield_19100:
                id: '{ID}'
              customfield_10007: 'get:name'
        swrt: #секция настроек TaskTracker
          host: '{REGISTRY_URL_SWTR}' #адрес registry TaskTracker
    image: #секция настроек расположения образа сервиса
      registryUrl: "{REGISTRY_URL}" #адрес registry
      registryProject: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registry
    core: #секция настроек core
      readinessProbe: #секция настроек readinessProbe (смотрите официальную документацию по kubernetes)
        failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
      livenessProbe: #секция настроек livenessProbe (смотрите официальную документацию по kubernetes)
        failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
    resources: #секция настроек resources
      limits: #настройка limits (смотрите официальную документацию по kubernetes)
        cpu: 750m #максимальное значение процессорной мощности
        memory: 1024Mi #максимальное значение памяти
      requests: #настройка requests (смотрите официальную документацию по kubernetes)
        cpu: 500m #минимальное значение процессорной мощности
        memory: 1024Mi #минимальное значение памяти
    ingress: #секция настроек ingress-nginx controller
      enabled: true #флаг активации или деактивации ingress
      annotations: #секция настроек аннотаций ingress-nginx (смотрите официальную документацию)
        kubernetes.io/ingress.class: nginx #указания контроллера Ingress
        nginx.ingress.kubernetes.io/rewrite-target: /$1 #аннотация настройки основных правил перезаписи URL
        nginx.ingress.kubernetes.io/proxy-body-size: 100m #максимальный допустимый размер тела запроса в nginx ingress
        nginx.ingress.kubernetes.io/proxy-buffer-size: 128k #размер буфера для чтения заголовка ответа, полученного от прокси-сервера
        nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" #максимальное время ожидания подключения в nginx ingress
        nginx.ingress.kubernetes.io/proxy-send-timeout: "300" #максимальное время передачи запроса в nginx ingress
        nginx.ingress.kubernetes.io/proxy-read-timeout: "300" #максимальное время ожидания чтения в nginx ingress
      hosts: #секция настроек hosts
        - host: '{HOST}' #host, прослушиваемый ingress-controller
          paths: #секция настроек paths
            - path: /gantt/(api.*) #путь к gantt/api
              pathType: Prefix #значение pathType
            - path: /gantt/(system/health.*) #путь к gantt/system/health
              pathType: Prefix #значение pathType
            - path: /gantt/(rest/.*) #путь к gantt/rest
              pathType: Prefix #значение pathType
    
      tls: #секция настроек tls
        - secretName: '{HOST}' # Имя секрета TLS
          hosts: #секция hosts
            - '{HOST}' #DNS имена endpoints
    
  5. Создайте yaml файл-манифест {PROJECT_UI_MANIFEST} для ui сервиса:

    istio: #секция настроек istio
      enabled: false #флаг активации или деактивации настроек istio
    replicaCount: 2 #количество единиц развертывания сервиса в кластере Kubernetes
    appConfig: #секция настроек сервиса
      nginx: #настройка nginx
        maxBodySize: 50M #максимальный размер загружаемого файла в Projects
        redirect: #настройка переадресации на другой адрес url
           from: "{HOST_LOCAL}" #переадресация от адреса url
           to: "{HOST}" #переадресация на адрес url
        nginxConfa: "{CONFIGMAP_NGINX_NAME}" #название конфигурационного файла
      graphqlUrl: "http://svc-sberproject-ds-core:8080" #host ds-core
      ganttServiceUrl: "http://svc-sberproject-backend:8080" #host backend
    oidc: #секция настроек провайдера OIDC Auth Provider
      authority: "https://{KEYCLOAK_HOST}/auth/realms/{REALM}" #oidc-issuer-url
      clientId: "{REALM}" #id клиента, в котором выполнена настройка (п.4 настройка KeyCloak)
      scope: "openid" #область и сопоставления для этого клиента
      responseType: "code" #тип запроса OIDC
      disablePKCE: true #отключение аутентификации PKCE
      filterProtocolClaims: true #фильтрация стандартных протоколов утверждения из токена идентификации
      loadUserInfo: false #загрузка атрибутов текущего пользователя в Kubernetes после завершения процесса аутентификации
    ingress: #секция настроек ingress-nginx controller
      enabled: true #флаг активации или деактивации ingress
      annotations: #секция настроек аннотаций ingress-nginx (смотрите официальную документацию)
        kubernetes.io/ingress.class: nginx #указания контроллера Ingress
        nginx.ingress.kubernetes.io/proxy-buffer-size: 128k #размер буфера для чтения заголовка ответа, полученного от прокси-сервера
        nginx.ingress.kubernetes.io/proxy-body-size: 100m #максимальный допустимый размер тела запроса в nginx ingress
        nginx.ingress.kubernetes.io/auth-response-headers: x-auth-request-user, x-auth-request-email #добавляет указанные заголовки из ответа в запрос
        nginx.ingress.kubernetes.io/auth-signin: https://$host/oauth2/start?rd=$escaped_request_uri #указывает URL для входа в систему при неудачной авторизации
        nginx.ingress.kubernetes.io/auth-url: https://$host/oauth2/auth #указывает URL для прохождения аутентификации
        nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" #максимальное время ожидания подключения в nginx ingress
        nginx.ingress.kubernetes.io/proxy-send-timeout: "300" #максимальное время передачи запроса в nginx ingress
        nginx.ingress.kubernetes.io/proxy-read-timeout: "300" #максимальное время ожидания чтения в nginx ingress
      hosts: #секция настроек hosts
        - host: '{HOST}'  #host, прослушиваемый ingress-controller
          paths: #секция настроек paths
            - path: / #путь к корневому каталогу
              pathType: Prefix #значение pathType
      tls: #секция tls настроек host
        - secretName: '{HOST}' # Имя секрета TLS
          hosts: #секция hosts
            - '{HOST}' #DNS имена endpoints
    image: #секция настроек расположения образа сервиса
      registryUrl: "{REGISTRY_URL}" #адрес registry
      registryProject: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registry
      pullPolicy: "Always" #политика определения загрузки изображения в Kubernetes
    core: #секция настроек core
      readinessProbe: #секция настроек readinessProbe (смотрите официальную документацию по kubernetes)
        httpGet: #поле хоста httpGet
          port: 8080 #номер порта для readinessProbe
        failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
      livenessProbe: #секция настроек livenessProbe (смотрите официальную документацию по kubernetes)
        httpGet: #поле хоста httpGet
          port: 8080 #номер порта для livenessProbe
        failureThreshold: 30 #количество повторных попыток до пометки probe как неудачной
    resources: #секция настроек resources
      limits: #настройка limits (смотрите официальную документацию по kubernetes)
        cpu: 750m #максимальное значение процессорной мощности
        memory: 1024Mi #максимальное значение памяти
      requests: #настройка requests (смотрите официальную документацию по kubernetes)
        cpu: 250m #минимальное значение процессорной мощности
        memory: 512Mi #минимальное значение памяти
    

    Примечания

    • При необходимости можно настроить переадресацию запросов на другой адрес. Для этого необходимо добавить в appConfig.nginx следующие параметры:

      redirect: #настройка переадресации на другой адрес url
      from: "{HOST_REDIRECT}"
      to: "{HOST}"
      
    • При необходимости можно использовать нестандартный файл конфигурации вэб-сервера nginx. Для этого необходимо создать конфигурационный файл типа config map с необходимой конфигурацией, установить его в кластере и подключить в разделе appConfig.nginx, указав название созданного конфигурационного файла. Пример:

      nginxConfa: "{CONFIGMAP_NGINX_NAME}" #название конфигурационного файла
      
  6. Создайте YAML-файл с манифестом секрета подключения к базе данных {DB_MAIN_SECRET_MANIFEST}

    apiVersion: v1 #версия API Kubernetes
    kind: Secret #инструмент для запуска локальных кластеров Kubernetes
    metadata: #информация об объектах кластера
      name: {} #название секрета
    data:
    stringData: #секция настроек параметров подключения к БД
      secret.properties: |- #параметры секрета
        spring.datasource.username={USERNAME_DB_PROJECT} #имя пользователя БД sbrprjct, созданного на ш.2 "Подготовка базы данных"
        spring.datasource.password={PASSWORD_DB_PROJECT} #пароль пользователя БД sbrprjct, созданного на ш.2 "Подготовка базы данных"
        spring.datasource.url={JDBC_URL_PROJECT_DB} #jdbc url подключения к БД
        spring.datasource.driver-class-name=org.postgresql.Driver #драйвер подключения
        spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect #диалект БД подключения
        dataspace.datasource.primary.dbschema={SCHEME_DB_PROJECT} #схема подключаемой БД
        dataspace.db.ssl.keyStorePassword={PG_KEYSTORE_PASSWORD_CLIENT_PROJECT_CRT} #пароль от jks хранилища, созданного на шаге №2 раздела "Сертификаты для обмена данными между внутренними сервисами Projects и внешними сервисами"
        dataspace.db.ssl.trustStorePassword={PG_TRUSTSTORE_PASSWORD_CLIENT_PROJECT_CRT} #пароль от jks хранилища, созданного на шаге №2 раздела "Сертификаты для обмена данными между внутренними сервисами Projects и внешними сервисами"
    
  7. Создайте yaml файл-манифест общего секрета {BACKEND_COMMON_SECRET_MANIFEST}:

    kind: Secret #инструмент для запуска локальных кластеров Kubernetes
    apiVersion: v1 #версия API Kubernetes
    metadata: #информация об объектах кластера
      name: {BACKEND_COMMON_SECRET} #название секрета
    stringData: #секция настроек параметров подключения к jenkins и почтовому сервису
      common.yaml: |-
         sberproject:
           jenkins: #секция настроек взаимодействия с jenkins
             username: {TUZ_JENKINS_USERNAME} #имя пользователя jenkins
             token: {TUZ_JENKINS_TOKEN} #токен пользователя jenkins
           facade:
             integrations:
               zup3:
                 username: {TUZ_1C_USERNAME} #имя пользователя интеграции 1С
                 password: {TUZ_1C_PASSWORD} #пароль пользователя 1С
               aspu:
                 jksFilePassword: {JKS_PASSWORD} #пароль от jks хранилища
                 certificateAlias: {ALIAS_CERTIFICATE} #имя алиас сертификата
                 certificateAliasPassword: {PASSWORD_CERTIFICATE} #пароль сертификата
           naumen:
             token: {TOKEN_NAUMEN} #токен подключения к Naumen
           swtr:
             token: {TOKEN_SWTR} #токен подключения к Task-Tracker
         spring:
           mail: #секция настроек взаимодействия с почтовым сервисом
            username: {USERNAME_EMAIL_SEND_NOTIFICATION} #адрес электронной почты
            password: {PASSWORD_EMAIL_SEND_NOTIFICATION} #пароль электронной почты
    
  8. При необходимости интеграции с таск-трекером создайте манифест секрета в YAML-файле (опционально):

    kind: Secret #инструмент для запуска локальных кластеров Kubernetes
    apiVersion: v1 #версия API Kubernetes
    metadata: #информация об объектах кластера
      name: {TASK_TRACKER_SECRET} #название секрета
    stringData: #секция настроек параметров подключения к tasktracker
      secret.yaml: |-
        sberproject: #секция настроек приложения
           {TASK_TRACKER_NAME}:
             username: {TUZ_TASK_TRACKER_USERNAME}
             password: {TUZ_TASK_TRACKER_PASSWORD}
    

Последовательность действий#

  1. Создайте отдельное пространство имен для установки сервисов Projects, где {PROJECT_NAMESPACE} - название namespace, например, sbrprjct:

    kubectl create namespace {PROJECT_NAMESPACE}
    
  2. Создайте секрет для скачивания docker образов и свяжите его с default аккаунтом. Замените следующие элементы соответствующими значениями:

    • {NAME_SECRET} - название создаваемого секрета, например, docker-registry,

    • {REGISTRY_URL} - url-адрес docker registry,

    • {TUZ_INFRASTRUCTURE} - техническая учетная запись с доступом к docker registry,

    • {PASSWORD_TUZ_INFRASTRUCTURE} - пароль от технической учетной записи с доступом к docker registry,

    • {EMAIL_INFRASTRUCTURE} - почтовый адрес.

    kubectl create secret docker-registry {NAME_SECRET} --namespace {PROJECT_NAMESPACE}  --docker-server={REGISTRY_URL} --docker-username={TUZ_INFRASTRUCTURE} --docker-password={PASSWORD_TUZ_INFRASTRUCTURE} --docker-email={EMAIL_INFRASTRUCTURE}
    kubectl patch serviceaccount default --namespace {PROJECT_NAMESPACE} -p '{"imagePullSecrets": [{"name": "{NAME_SECRET}"}]}'
    
  3. Выполните установку из файла манифеста {CUSTOM_LOGBACK_CM_MANIFEST}, созданного на шаге 1 раздела Ручная установка пакетным менеджером Helm. Замените следующий элемент соответствующим значением:

    • {CUSTOM_LOGBACK_CM_MANIFEST}.yaml - имя файла конфигурации установки configmap.

    kubectl apply -f {CUSTOM_LOGBACK_CM_MANIFEST}.yaml -n {PROJECT_NAMESPACE}
    
  4. Выполните установку из файла манифеста {DB_MAIN_SECRET_MANIFEST} секрета в кластер, созданного на шаге 7 раздела Ручная установка пакетным менеджером Helm. Замените следующий элемент соответствующим значением:

    • {DB_MAIN_SECRET_MANIFEST}.yaml - имя файла конфигурации установки секрета.

    kubectl apply -f {DB_MAIN_SECRET_MANIFEST}.yaml -n {PROJECT_NAMESPACE}
    
  5. Выполните установку из файла манифеста {BACKEND_COMMON_SECRET_MANIFEST} секрета в кластер, созданного на шаге 8 раздела Ручная установка пакетным менеджером Helm. Замените следующий элемент соответствующим значением:

    • {BACKEND_COMMON_SECRET_MANIFEST}.yaml - имя файла конфигурации установки секрета:

    kubectl apply -f {BACKEND_COMMON_SECRET_MANIFEST}.yaml -n {PROJECT_NAMESPACE}
    
  6. Выполните установку из файла манифеста {DS_CORE_MANIFEST}, созданного на шаге 2 раздела Ручная установка пакетным менеджером Helm. Замените следующие элементы соответствующими значениями:

    • {DS_CORE_HELM_CHART_NAME} - имя устанавливаемого helm chart, например sberproject-ds-core,

    • {DS_CORE_CHART} - директория с helm chart sberproject-ds-core (package/conf/helm/application/sberproject-ds-core),

    • {DS_CORE_MANIFEST}.yaml - имя файла конфигурации установки helm chart sberproject-ds-core.

    helm upgrade {DS_CORE_HELM_CHART_NAME} {DS_CORE_CHART}/ -f {DS_CORE_MANIFEST}.yaml --atomic --cleanup-on-fail --debug --install --namespace {PROJECT_NAMESPACE}
    
  7. Выполните установку из файла манифеста {PROJECT_BACKEND_MANIFEST}, созданного на шаге 3 раздела Ручная установка пакетным менеджером Helm. Замените следующие элементы соответствующими значениями:

    • {PROJECT_BACKEND_HELM_CHART_NAME} - имя устанавливаемого helm chart, например sberproject-backend,

    • {PROJECT_BACKEND_CHART} - директория с helm chart sberproject-backend (package/conf/helm/application/sberproject-backend),

    • {PROJECT_BACKEND_MANIFEST}.yaml - имя файла конфигурации установки helm chart sberproject-backend.

    helm upgrade {PROJECT_BACKEND_HELM_CHART_NAME} {PROJECT_BACKEND_CHART}/ -f {PROJECT_BACKEND_MANIFEST}.yaml --atomic --cleanup-on-fail --debug --install --namespace {PROJECT_NAMESPACE}
    
  8. Выполните установку из файла манифеста{PROJECT_GANTT_SERVER_MANIFEST}, созданного на шаге 5 раздела Ручная установка пакетным менеджером Helm. Замените следующие элементы соответствующими значениями:

    • {PROJECT_GANTT_SERVER_HELM_CHART_NAME} - имя устанавливаемого helm chart, например sberproject-gantt-server,

    • {PROJECT_GANTT_SERVER_CHART} - директория с helm chart sberproject-gantt-server (package/conf/helm/application/sberproject-gantt-server),

    • {PROJECT_GANTT_SERVER_MANIFEST}.yaml - имя файла конфигурации установки helm chart sberproject-gantt-server.

    helm upgrade {PROJECT_GANTT_SERVER_HELM_CHART_NAME} {PROJECT_GANTT_SERVER_CHART}/ -f {PROJECT_GANTT_SERVER_MANIFEST}.yaml --atomic --cleanup-on-fail --debug --install --namespace {PROJECT_NAMESPACE}
    
  9. Выполните установку из файла манифеста {PROJECT_UI_MANIFEST}, созданного на шаге 6 раздела Ручная установка пакетным менеджером Helm. Замените следующие элементы соответствующими значениями:

    • {PROJECT_UI_HELM_CHART_NAME} - имя устанавливаемого helm chart, например sberproject-ui,

    • {PROJECT_UI_CHART} - директория с helm chart sberproject-ui (package/conf/helm/application/sberproject-ui),

    • {PROJECT_UI_MANIFEST}.yaml - имя файла конфигурации установки helm chart sberproject-ui.

    helm upgrade {PROJECT_UI_HELM_CHART_NAME} {PROJECT_UI_CHART}/ -f {PROJECT_UI_MANIFEST}.yaml --atomic --cleanup-on-fail --debug --install --namespace {PROJECT_NAMESPACE}
    
  10. Перейдите на endpoint URL https://{HOST}/sberproject-ds-core-unsecure/graphiql.

  11. Для импорта данных в Projects проинициализируйте данные в соответствии со следующим списком:

    1. Вставьте данные из файла workspaceInit.graphql в форму и поочередно примените все стадии.

    2. Вставьте данные из файла workflowStages.graphql в форму и поочередно примените все стадии.

    3. Вставьте данные из файлов initializationData*.graphql в форму и поочередно примените все стадии.

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

    4. В папке 04_privilegeGroups-gen содержатся файлы для инициализации ролевой модели. Они именованы по типу privilegeGroups-gen_XXXX.graphql, где XXXX - порядковый номер файла. Необходимо применить их все в порядке возрастания порядкового номера. Вставьте данные из каждого файла в форму и поочередно примените все стадии.

    5. Вставьте данные из файла rolesAndScopes.graphql в форму и поочередно примените все стадии.

Проверка результата#

Убедитесь в корректности установки, как описано в разделе Чек-лист валидации установки.

Добавление пользователя с правами администратора#

При выполнении скрипта workspaceInit.graphql создается суперпользователь admin для администрирования Projects.

mutation createAdmin{
   packet(idempotencePacketId:"admin"){
   isIdempotenceResponse
   updateOrCreateSubject(input:{
      id: "admin"
      name: "Администратор системы"
         email:"project@example.ru"
      personnelNumber: "0"
      position: "Супер админ"
      beginDate: "2020-01-01"
      }){
         created
      }
   }
}

При выполнении последнего из скриптов типа privilegeGroups-gen_XXXX.graphql суперпользователь admin получает привилегии, необходимые для администрирования приложения.

  mutation assignAdminRights_XX{
   admin_TENANT_OWNER: packet {
     updateOrCreateUserPrivileges(input: {
       subject: {entityId: "admin"}
         objType: "Tenant"
         objId: "SBT-TNT"
         tenant:"SBT-TNT"
         beginDate:"1970-01-01"
         initiator: {entityId: "admin"}
         sourceType: RAW
         sourceId: "admin"
         privilegeGroup: {entityId: "TENANT_OWNER"}
     }
     exist: {byKey: subject__entityId_privilegeGroup__entityId_objType_objId_sourceId_sourceType_substitution__entityId_substitution__rootEntityId_memberId}) {
              created
     }
   }
}
  mutation assignAdminRights_XX{
   admin_USER: packet {
     updateOrCreateUserPrivileges(input: {
       subject: {entityId: "admin"}
         objType: "Tenant"
         objId: "SBT-TNT"
         tenant:"SBT-TNT"
         beginDate:"1970-01-01"
         initiator: {entityId: "admin"}
         sourceType: RAW
         sourceId: "admin"
         privilegeGroup: {entityId: "USER"}
     }
     exist: {byKey: subject__entityId_privilegeGroup__entityId_objType_objId_sourceId_sourceType_substitution__entityId_substitution__rootEntityId_memberId}) {
              created
     }
   }
}
  mutation assignAdminRights_XX{
   admin_ADMIN: packet {
     updateOrCreateUserPrivileges(input: {
       subject: {entityId: "admin"}
         objType: "Tenant"
         objId: "SBT-TNT"
         tenant:"SBT-TNT"
         beginDate:"1970-01-01"
         initiator: {entityId: "admin"}
         sourceType: RAW
         sourceId: "admin"
         privilegeGroup: {entityId: "ADMIN"}
     }
     exist: {byKey: subject__entityId_privilegeGroup__entityId_objType_objId_sourceId_sourceType_substitution__entityId_substitution__rootEntityId_memberId}) {
              created
     }
   }
}

Автоматизированная установка с использованием Deploy Tools#

Предусловия#

Примечание

Для возможности установки данным инструментом инженер должен иметь необходимые знания и навыки в области настройки и применения Platform V DevOps Tools (DOT).

С описанием компонента Deploy Tools и его настройкой можно ознакомиться в соответствующей документации по продукту Platform V DevOps Tools (DOT).

Примечание

Рекомендуемая версия Jenkins Pipeline — D-01.050.070.

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

  1. Созданы следующие репозитории (минимально необходимый набор):

    • common (репозиторий с глобальными настройками стенда)

    • pipeline (репозиторий с установленными релизами скриптов развертывания)

  2. В Jenkins созданы директории и jobs:

    • Service - используется для обновления установленной версии pipeline и common

    • Deploy - используется для установки Projects

  3. В Jenkins созданы необходимые credentials:

    • Username with password - логин и пароль для работы с API Nexus, Bitbucket, Jenkins;

    Примечание

    В качестве ID необходимо указать user_pass_tech. При указании ID отличного от user_pass_tech, необходимо будет произвести дополнительную настройку в Service job (CUSTOM_USER_PASS_CREDS) и в файле environment.json.

    • SSH Username with private key (загрузка приватной части в Jenkins и публичной - в Bitbucket) - для SSH-доступа к Bitbucket;

    Примечание

    В качестве ID необходимо указать git_ssh_tech. При указании ID отличного от git_ssh_tech, необходимо будет указать созданный секрет в поле Credentials секции Pipeline настроек Service job. В дальнейшем потребуется также выполнить настройку в файле environment.json (GIT_CRED).

    • Secret text - секреты:

      • ose_token_cred_ift - секрет для доступа к API Kubernetes/OpenShift

    • Secret file - секреты:

      • vault_file_tech - секрет для дешифрования файла ansible/_password.conf

  4. Заполнение конфигурационных файлов:

    • jenkinsFile - список jobs, реконфигурацию которых запускает playbook сервисной job

    • _passwords.conf – шифрация secret файла паролем

  5. Реконфигурация созданных jobs для автоматической настройки пользовательского интерфейса

Последовательность действий#

Создание репозитория конфигураций#

Необходимо создать репозиторий для миграции и хранения конфигураций Projects. Репозиторий создается в той же проектной области, где находится common-репозиторий Deploy Tools. Common-репозиторий — git-репозиторий глобальных настроек (переменных), которые используются всеми компонентами Platform V в рамках блока/контура.

Имя репозитория формируется по маске CE_SUBDIVISION_CHANNEL_FPNAME_ENVIR, где:

  • CE - monosol, участвует в шаблоне на создание репозитория;

  • SUBDIVISION - platform_v, участвует в шаблоне на создание репозитория;

  • CHANNEL - std, участвует в шаблоне на создание репозитория;

  • ENVIR — dev, окружение, тип стенда (например: dev, st, ift, nt, psi и т. п.);

  • FPNAME - Projects, проект, для которого будет создан репозиторий;

Также укажите настройку блоков(шард):

  • blocks — блок/контур (например: b1, sb_sk и т. п.), в случае блочной структуры хранения конфигурации.

Значения параметров определяются в соответствии с конфигурацией Deploy Tools.

В файле version.conf указываем параметры для конфигурации Deploy Tools:

scriptsVersion=#1d7e44fdf33 #версия scripts
pipelineVersion=release/D-01.050.070 #версия pipeline
commonVersion=D-01.001.00-761 #версия common
subsystemsVersion=D-02.001.00-2 #версия subsystems

Далее в созданном репозитории нужно создать ветку BRANCH_NAME , имя ветки необходимо добавить в файл environment.json следующим образом:

"platformVersions": [
  "BRANCH_NAME"
],

Конфигурация common-репозитория#

Для установки Projects необходимо внести информацию в common-репозиторий стенда. Для этого нужно выполнить следующие действия:

В файл subsystems.json добавьте блок настроек для возможности установки Projects инструментами Deploy Tools согласно примеру ниже:

Пример минимальной конфигурации для указанной версии компонента Deploy Tools. Если версия отличается, смотрите инструкции компонента Deploy Tools.

{
  "Projects": {                      // наименование компонента Platform V
     "fpType": "bts",                // тип приложения для фильтрации в Jenkins job. Для выбора нескольких вариантов указываем в настройках job FP_TYPE_FILTER=bts, bfs
     "nexus_repo": "<заполнить>",    // репозиторий в хранилище Nexus
     "fpi_name_ose": "<заполнить>",  // наименование созданного namespace
     "fpi_name": "projects",         // название приложения в AENG
     "groupId": "<заполнить>",       // Group ID дистрибутива приложения в хранилище Nexus
     "artifactId": "<заполнить>",    // идентификатор maven артефакта
     "versionFilter": "2.*.*-"       // регулярное выражение для фильтрации версий артефактов
  }
}

Инициализация БД#

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

Для запуска скриптов инициализации БД необходимо настроить инструменты Deploy Tools.

  1. Укажите секрет vault_file_tech в файле environment.json.

    {
     "credentials": {
       "openshiftOpsPasswordsCred": "vault_file_tech",
       "ansible_vault_id_ops": "vault_file_tech"
     }
    }
    
  2. Укажите ссылку на репозиторий дистрибутива Projects в файле environment.json.

    {
     "efsReleaseRepo": "" // ссылка на свой репозиторий (оставить пустым)
    }
    
  3. Добавьте плейбук DB_UPDATE в список возможных сценариев развертывания, файл environment.json.

    {
      "playbooks_fpi": {
        "DB_UPDATE": {
          "id": 1
        }
      }
    }
    
  4. Добавьте плейбук HELM_DEPLOY и HELM_UNDEPLOY в список возможных сценариев развертывания, файл environment.json.

    {
     "playbooks_fpi": {
    
       "HELM_DEPLOY": {
         "id": 97
       },
       "HELM_UNDEPLOY": {
         "id": 98
       }
     }
    }
    
  5. Добавьте настройки для сценария использования плейбука HELM_DEPLOY, файл environment.json.

    {
      "dev": {
        "helm": {
          "timeout": "300s",
          "tests_enabled": false,
          "hooks_enabled": false,
          "tools": {
            "helm": "helm-v3.8.0",
            "kubectl": "kubectl_v1.22.7"
          }
        }
      }
    }
    
  6. Заполните параметры в файле multiClusters.json для установки Projects инструментами Deploy Tools согласно примеру ниже:

    Дополнительная информация о заполнении multiCluster.json размещена в инструкции компонента Deploy Tools.

    {
      "datacenters": {
        "psi": {
          "openshiftCluster": "[https://<api_dev_address>](https://<api_dev_address>/)", // адрес  Kubernetes/OpenShift кластера
          "openshiftSATokenCred": "ose_token_cred_ift",                                  // имя Jenkins credentials (тип - secret text), содержащего токен service учетной записи сервисного проекта Kubernetes/OpenShift кластера. Используется для доступа к API Kubernetes/OpenShift.
          "openshiftProjectName": "exampleProjectName-i-as-monosolution-solution",       // имя созданного namespace проекта в Kubernetes/OpenShift в кластере
          "openshiftNewRoute": "dummyNewRoute",                                          // параметр содержащий формулу, генерирующую ссылку для route манифеста
          "openshiftAppsDomain": "[<sh1_dev_address>](http://<sh1_dev_address>/)",       // суффикс домена для сервисов кластера. Значение этого параметра подставляется в параметр {{appsDomain}} в конфигурации развертывания Kubernetes/OpenShift в процессе развертывания.
          "openshiftRoutersFQDN": [
            "127.0.0.1"
          ],
          "overrides": [ ]                                                               // секция, определяющая тип кластера
        }
      }
    }
    
  7. Добавьте параметры в файл ansible/common.conf.yml, значения указаны в качестве примера:

    DB_SCHEMA_SUFFIX: "sbrprjct" # суффикс БД - уникальный идентификатор
    ...
    POSTGRES_DB_HOST: 127.0.0.1 # IP-адрес БД
    POSTGRES_DB_PORT: 5432      # порт подключения к БД
    POSTGRES_DB_NAME: sbrprjct  # имя БД
    POSTGRES_DB_URL: jdbc:postgresql://{{ POSTGRES_DB_HOST }}:{{ POSTGRES_DB_PORT }}/{{ POSTGRES_DB_NAME }} # базовая директория для хранения табличных пространств (опционально)
    POSTGRES_DB_TS_LOCATION: /pgdata/05/newdb_ts # табличное пространство для данных (наименование и расположение на файловой системе)
    POSTGRES_DB_TS_DATA: sbrprjct # имя созданной БД
    POSTGRES_DB_TS_DATA_LOCATION: "{{ POSTGRES_DB_TS_LOCATION }}/{{ POSTGRES_DB_TS_DATA }}"
    
  8. Добавьте учетную запись БД в ansible/_passwords.conf, под которой будут выполняться скрипты инициализации БД.

    Примечание

    Для шифрования и дешифрования файла _passwords.conf используются следующие команды. Обратите внимание, на то, что необходимо переименовать исходный файл с _passwords.conf на template. Это необходимо сделать из-за того, что результатом выполнения команды openssl не может быть тот же файл, что был получен на входе.

    • шифрование: openssl enc -aes-256-cbc -salt -out _passwords.conf  -in template  -md md5

    • дешифрование: openssl enc -aes-256-cbc -salt -in _passwords.conf  -out template -d  -md md5

    dataspace.main.db.user=<имя пользователя>
    dataspace.main.db.password=<пароль>
    
  9. Добавьте параметры в файл parameters/_extra.conf, значения указаны в качестве примера:

     dataspace.model.name=sberproject
     common.openshift.namespace=${global.multiClusters.openshiftProjectName}
     dataspace.main.db.schema=sbrprjct
    
  10. Добавьте параметры в файл parameters/common.conf.yml, значения указаны в качестве примера:

     registry: "{REGISTRY_URL}" #адрес registry
     registry_path: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registry
    
  11. Создайте директории табличных пространств на файловой системе БД.

    # директория, указанная в параметре POSTGRES_DB_TS_DATA_LOCATION
    mkdir -p /pgdata/data/05/sbrprjct
    chown postgres:postgres /pgdata/data/05/sbrprjct
    
Запуск скриптов миграции#
  1. Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.

  2. В меню слева нажмите на опцию «Build with parameters».

  3. Установите параметры сборки:

    • SUBSYSTEM: Projects;

    • DISTRIB_VERSION: <версия дистрибутива>;

    • OSE_CLUSTERS: <кластер K8s>;

    • Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;

    • PARAMS (набор playbook): <MIGRATION_FP_CONF> <Миграция конфигурационных файлов ФП>;

  4. Запустите сборку, нажав кнопку Build.

  5. После выполнения сборки в репозитории ФП в values.yaml замените стендозависимые параметры:

...
image:
  registryUrl: "{REGISTRY_URL}" #адрес registry
  registryProject: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registry
...
ingress:
...
  hosts:
    - host: '{HOST}'  #host, прослушиваемый ingress-controller
...
Запуск скриптов миграции конфигурационных файлов#
  1. Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.

  2. В меню слева нажмите на опцию «Build with parameters».

  3. Установите параметры сборки:

    • SUBSYSTEM: Projects;

    • DISTRIB_VERSION: <версия дистрибутива>;

    • OSE_CLUSTERS: <кластер K8s>;

    • Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;

    • PARAMS (набор playbook): <MIGRATION_FP_CONF>

  4. Запустите сборку, нажав кнопку Build.

После выполнения сборки в репозитории ФП проверьте на наличие корректной конфигурации файлов.

Запуск скриптов инициализации БД#
  1. Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.

  2. В меню слева нажмите на опцию «Build with parameters».

  3. Установите параметры сборки:

    • SUBSYSTEM: Projects;

    • DISTRIB_VERSION: <версия дистрибутива>;

    • OSE_CLUSTERS: <кластер K8s>;

    • Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;

    • PARAMS (набор playbook): <DB_UPDATE>

  4. Запустите сборку, нажав кнопку Build.

В результате выполнения будут созданы следующие объекты БД:

  • пользователь (с именем - dataspace.main.db.user и паролем - dataspace.main.db.password) и схема БД;

  • табличные пространства, указанные в параметрах: POSTGRES_DB_TS_DATA.

Проверка конфигурации#

Для проверки конфигурации нужно выполнить следующие действия:

  1. Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.

  2. В меню слева нажмите на опцию «Build with parameters».

  3. Установите параметры сборки:

    • SUBSYSTEM: Projects;

    • DISTRIB_VERSION: <версия дистрибутива>;

    • OSE_CLUSTERS: <кластер K8s>;

    • Репозиторий\ветка с настройками ФП:: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;

    • PARAMS (набор playbook): <FP_CONF_CHECK>

  4. Запустите сборку, нажав на кнопку «Build».

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

Выполнение установки#

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

  1. Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.

  2. В меню слева нажмите на опцию «Build with parameters».

  3. Установите параметры сборки:

    • SUBSYSTEM: Projects;

    • DISTRIB_VERSION: <версия дистрибутива>;

    • OSE_CLUSTERS: <кластер K8s>;

    • Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;

    • PARAMS (набор playbook): <HELM_DEPLOY>.

  4. Запустите сборку, нажав кнопку Build.

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

    Набор возможных playbooks зависит от конфигурации инструментов Deploy Tools.

Проверка результата#

Убедитесь в корректности установки, как описано в разделе Чек-лист валидации установки.

Установка в контейнере при помощи Docker-compose#

Внимание

Перед началом установки выполните действия, описанные в Подготовке окружения:

Предварительные настройки#

Для развертывания дистрибутива на сервере необходимо наличие установленных Docker/Docker-compose.

Последовательность действий#

  1. Перейдите в каталог, в который был распакован архив дистрибутива, и далее — в scripts/linux.

  2. Скопируйте шаблон файла переменных окружения:

    cp .env.template .env
    
  3. Отредактируйте файл .env, указав значения переменных. Обратите внимание на комментарии в данном файле. Переменные и их описание перечислены в разделе Docker ENV переменные компонента.

    Примечание

    Содержимое .env файла соответствует формату dotenv. Пример: BASE_IMAGE=alt:p10 IMAGE_NGINX=nginx:1.27

  4. (В первый раз или при необходимости) Выполните команду сборки образа из дистрибутива:

    docker-compose build
    
  5. Выполните команду запуска сервиса:

    docker-compose up -d
    

    Запущенные контейнеры будут готовы к работе примерно через 5 минут.

  6. Если данная версия устанавливается в первый раз. Выполните команду:

    docker-compose --profile qraphql up -d
    
  7. Если установлена чистая база, в .env файле переменные PG_HOST, PG_PASSWORD, DB_USER, DB_NAME, DB_SCHEMA, записать параметры. Выполните запуск скрипта:

    ./init_db.sh
    

Docker ENV переменные компонента#

Переменные компонента:

Переменная

Пример заполнения

Описание

DOCKER_REGISTRY_PATH

registry.example.com/path/to/images/

Путь к образу в docker registry

DOCKER_TAG

2.11.2

Тег образов

SCHEMA

https

Протокол HTTP или HTTPS, по которому инсталляция доступна снаружи

DOMAIN

example.com

Домен, по которому будет доступна инсталляция

KEYCLOAK_URL

https://example.com/auth

URL KeyCloak

KEYCLOAK_REALM

«onework»

Параметр Realm в KeyCloak

KEYCLOAK_CLIENT_ID

«onework-login»

Идентификатор OAuth клиента в сервисе аутентификации KeyCloak

KEYCLOAK_CLIENT_SECRET

secretvalue

Параметр аутентификации OAuth клиента client_secret из KeyCloak

DB_HOST

127.0.0.1

URL, по которому доступна БД для приложения

DB_PORT

5432

Port, по которому доступна БД для приложения

DB_USER

sbrprjct

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

DB_PASSWORD

password

Пароль пользователя БД

DB_NAME

sbrprjct

Имя БД

DB_SCHEMA

sbrprjct

Имя схемы БД

PROJECT_ADMIN_NAME

project_admin

Имя учетной записи в KeyCloak, которая будет добавлена в инсталляцию с правами администратора

BASE_IMAGE

alt:p10

Базовый образ, на основе которого собираются образы сервисов. Рекомендуется указывать оригинальный образ на базе ОС Альт 10

IMAGE_NGINX

nginx:1.27

Образ nginx сервиса

INFRA_NET_PREFIX

172.23.0

Подсеть для сервисов в Docker-compose

IMAGE_UID

«20000»

UID пользователя в Dockerfile

Необязательные переменные:

Переменная

Пример заполнения

Описание

PROJECT_JENKINS_URL

https://example.com/jenkins-ci/

Адрес Jenkins для интеграции

SMTP_HOST

localhost

Хост сервера SMTP для отправки почты

SMTP_PORT

1025

Порт сервера SMTP для отправки почты

SMTP_ALLOWED_DOMAIN

example.com

Домен, по которому будет доступна отправка почты

SMTP_FILTER

no-reply@example.com

Фильтр отправки почты

SMTP_MAILFROM

no-reply@example.com

Фильтр отправителя почты

Переменная DS_JVM_OPTION для настройки параметров запуска Java внутри контейнера (не переопределяйте без необходимости):

Переменная

Пример заполнения

DS_JVM_OPTION

«-XX:+AlwaysPreTouch -server -XX:InitialRAMPercentage=50.0 -XX:MaxRAMPercentage=70.0 -XX:+UseG1GC …(другие параметры)»

Переменные BASE_IMAGE_* образы, которыми собираются сервисы Projects (не переопределяйте без необходимости):

Переменная

Пример заполнения

BASE_IMAGE_DS_CORE

xxxxxxxxx.ru/xxx/ci90000026_dspc/dataspace-core:1.11.1-3

BASE_IMAGE_BACK

xxxxxxxxx.ru/xxx/ci90000318_sbtws/base_images/alt-p10-openjdk-11:20240725

BASE_IMAGE_GANTT

xxxxxxxxx.ru/xxx/ci90000260_sbrprjct/container-8-ubi-sbt/nodejs-16:8.8.3-234

BASE_IMAGE_UI

xxxxxxxxx.ru/xxx/ci90000260_sbrprjct/nginx-116:1-26

Проверка результата#

Убедитесь в корректности установки, как описано в разделе Чек-лист валидации установки.

Настройка интеграций#

Настройка интеграции с внешними сервисами происходит в процессе конфигурации параметров для конкретного внешнего сервиса в определенных ConfigMaps и Secrets. Необходимые файлы были созданы в разделе Ручная установка пакетным менеджером Helm.

Интеграция с таск-трекером#

При необходимости интеграции с таск-трекером передайте название таск-трекера в values.appConfig.services бэкенд сервиса и укажите название секрета (опционально):

  values:
    appConfig:
      {TASK_TRACKER_NAME}:
        secretName: "{TASK_TRACKER_SECRET}" # Имя секрета TLS

Интеграция с Jenkins#

Система позволяет произвести интеграцию с Jenkins для запуска job. Данная функциональность по умолчанию находится в режиме Заглушки «MOCK». Для включения интеграции сконфигурируйте в бэкенд следующий набор параметров:

sberproject:
    jenkins:
        type: IMPL
        url: {JENKINS_URL}
        optionalFolderPath: sre/test/
        installerName: Notifier
        timesleep: 20000
        countIntervals: 20
        mainFolderRepository: {REPOSITORY}

Передача конфиденциальных данных должна осуществляться через секрет. Ознакомьтесь с рекомендациями по передаче паролей и секретов в Kubernetes:

sberproject:
    jenkins:
        username: {USERNAME}
        token: {TOKEN}

Интеграция с KeyCloak#

Для защиты публичного API сервиса включите настройку в файле {PROJECT_BACKEND_MANIFEST}:

keycloak:
  auth-server-url: ""
  realm: ""
  resource: ""
  bearer-only: true
  credentials:
    secret: ""

Проверка происходит с использованием провайдера KeyCloak.

Интеграция с SMTP для отправки e-mail уведомлений#

Отправка уведомлений может осуществляться на основной e-mail пользователя.

  1. Сконфигурируйте сервис sberproject-backend:

    sberproject:
    services:
        notification: #название CronJob
        from: {noreply@example.ru}
        emailService: smtp #протокол передачи электронной почты
        emailsFilter:
            - user1@example.ru # Ограничивает список e-mail, на который будет что-то рассылаться. Удобно для тестовых стендов. Оставить пустым (без элементов) для отключения фильтрации
    spring:
    mail:
        host: {MAIL_HOST}
        port: {PORT}
        username: <username>
        password: <password>
        properties:
        mail:
        smtp:
            auth: true
            starttls:
            enable: true
    
  2. Если необходимо включить автоматическую рассылку уведомлений, настройте соответствующую CronJob - notification.

Для более подробной информации по конфигурации обратитесь к документации Springboot.

Интеграция с Secman/HashiCorp Vault#

Система позволяет произвести интеграцию с Secman/HashiCorp Vault для получения секретов. Для включения интеграции сконфигурируйте в backend и ds-core следующий набор параметров:

   secman: #секция настроек Secman/HashiCorp Vault
     enabled: false #флаг активации или деактивации Secman/HashiCorp Vault
     agentRunAsUser: ~ #имя пользователя агента
     agentRunAsGroup: ~ #имя группы агента
     image: #секция настроек расположения образа сервиса
       registry: '{REGISTRY_URL}' #адрес registry
       repository: '{REGISTRY_FOLDER_DOCKER_IMAGE_SECMAN}' #путь до расположения Secman/HashiCorp Vault в registry
       digestOrTag: '{VERSION_DOCKER_IMAGE}' # версия образа Secman/HashiCorp Vault
     noNamespace: true #объект без пространства имен

Для более подробной информации по конфигурации обратитесь к документации Secman/HashiCorp Vault.

Настройка CronJob backend сервиса#

  1. CronJob автоматической рассылки уведомлений - notification. Для включения добавьте в конфигурацию установки Helm chart sberproject-backend в секцию appConfig.jobs следующее:

    notification:
      enabled: true
      image: "{BASE_IMAGE}"
      cron: "*/5 * * * *"
    

    Где: notification - название CronJob; enabled - флаг активации или деактивации CronJob; image - базовый образ, на котором будет выполняться запуск CronJob; cron - настройка расписания планировщика задач. В данном примере CronJob автоматически запускается каждые 5 минут.

  2. CronJob автоматической рассылки уведомлений - checker. Для включения добавьте в конфигурацию установки Helm chart sberproject-backend в секцию appConfig.jobs следующее:

    checker:
      enabled: true
      image: "{BASE_IMAGE}"
      cron: "0 2 * * *"
    

    Где: checker - название CronJob; enabled - флаг активации или деактивации CronJob; image - базовый образ, на котором будет выполняться запуск CronJob; cron - настройка расписания планировщика задач. В данном примере CronJob автоматически запускается каждый день в 02:00.

  3. CronJob автоматического запуска синхронизации трудозатрат с таск-трекером - automaticsynctimesheet. Для включения добавьте в конфигурацию установки Helm chart sberproject-backend в секцию appConfig.jobs следующее:

    automaticsynctimesheet:
      enabled: true
      image: "{BASE_IMAGE}"
      cron: "0 4 * * *"
    

    Где: automaticsynctimesheet - название CronJob; enabled - флаг активации или деактивации CronJob; image - базовый образ, на котором будет выполняться запуск CronJob; cron - настройка расписания планировщика задач. В данном примере CronJob автоматически запускается день в 04:00.

  4. CronJob автоматического запуска процесса очистки логов работы CronJob синхронизации трудозатрат с таск-трекером - clearoldsynclogs. Для включения добавьте в конфигурацию установки Helm chart sberproject-backend в секцию appConfig.jobs следующее:

    clearoldsynclogs:
      enabled: true
      image: "{BASE_IMAGE}"
      cron: "0 4 * * *"
    

    Где: clearoldsynclogs - название CronJob; enabled - флаг активации или деактивации CronJob; image - базовый образ, на котором будет выполняться запуск CronJob; cron - настройка расписания планировщика задач. В данном примере CronJob автоматически запускается день в 04:00.

    Примечания

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

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

Публичные API#

Для обращения к публичным API необходимо наличие AccessToken в заголовке. Для получения AccessToken необходимо перейти по адресу http://localhost:8082/public/v1/auth

Список публичных API доступен по адресу swagger-ui.