Установка#
В руководстве приведены инструкции по установке Projects.
Для распаковки дистрибутива воспользуйтесь Solution-merger и Solution-unpacker Jenkins jobs продукта Platform V Devops Tools.
Выбор способа установки#
Возможны следующие варианты установки приложения:
ручная установка пакетным менеджером Helm
автоматизированная установка с помощью Platform V DevOps Tools
Порядок установки#
Ручная установка пакетным менеджером 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
Создайте 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>Создайте 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/"Создайте 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 #объект без пространства именСоздайте 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Создайте 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}" #название конфигурационного файла
Создайте 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 и внешними сервисами"Создайте 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} #пароль электронной почтыПри необходимости интеграции с таск-трекером создайте манифест секрета в 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}
Последовательность действий#
Создайте отдельное пространство имен для установки сервисов Projects, где
{PROJECT_NAMESPACE}- название namespace, например, sbrprjct:kubectl create namespace {PROJECT_NAMESPACE}Создайте секрет для скачивания 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}"}]}'Выполните установку из файла манифеста
{CUSTOM_LOGBACK_CM_MANIFEST}, созданного на шаге 1 раздела Ручная установка пакетным менеджером Helm. Замените следующий элемент соответствующим значением:{CUSTOM_LOGBACK_CM_MANIFEST}.yaml- имя файла конфигурации установки configmap.
kubectl apply -f {CUSTOM_LOGBACK_CM_MANIFEST}.yaml -n {PROJECT_NAMESPACE}Выполните установку из файла манифеста
{DB_MAIN_SECRET_MANIFEST}секрета в кластер, созданного на шаге 7 раздела Ручная установка пакетным менеджером Helm. Замените следующий элемент соответствующим значением:{DB_MAIN_SECRET_MANIFEST}.yaml- имя файла конфигурации установки секрета.
kubectl apply -f {DB_MAIN_SECRET_MANIFEST}.yaml -n {PROJECT_NAMESPACE}Выполните установку из файла манифеста
{BACKEND_COMMON_SECRET_MANIFEST}секрета в кластер, созданного на шаге 8 раздела Ручная установка пакетным менеджером Helm. Замените следующий элемент соответствующим значением:{BACKEND_COMMON_SECRET_MANIFEST}.yaml- имя файла конфигурации установки секрета:
kubectl apply -f {BACKEND_COMMON_SECRET_MANIFEST}.yaml -n {PROJECT_NAMESPACE}Выполните установку из файла манифеста
{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}Выполните установку из файла манифеста
{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 chartsberproject-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}Выполните установку из файла манифеста
{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}Выполните установку из файла манифеста
{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}Перейдите на endpoint URL
https://{HOST}/sberproject-ds-core-unsecure/graphiql.Для импорта данных в Projects проинициализируйте данные в соответствии со следующим списком:
Вставьте данные из файла
workspaceInit.graphqlв форму и поочередно примените все стадии.Вставьте данные из файла
workflowStages.graphqlв форму и поочередно примените все стадии.Вставьте данные из файлов
initializationData*.graphqlв форму и поочередно примените все стадии.
Файлы содержат данные справочников, настроек конфигураций, календари и прочую информацию, необходимую для работы Projects. Данные файлы находятся в директории
db/дистрибутива, в архиве со скриптами инициализации БД.В папке
04_privilegeGroups-genсодержатся файлы для инициализации ролевой модели. Они именованы по типуprivilegeGroups-gen_XXXX.graphql, где XXXX - порядковый номер файла. Необходимо применить их все в порядке возрастания порядкового номера. Вставьте данные из каждого файла в форму и поочередно примените все стадии.Вставьте данные из файла
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.
Созданы следующие репозитории (минимально необходимый набор):
common (репозиторий с глобальными настройками стенда)
pipeline (репозиторий с установленными релизами скриптов развертывания)
В Jenkins созданы директории и jobs:
Service - используется для обновления установленной версии pipeline и common
Deploy - используется для установки Projects
В 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
Заполнение конфигурационных файлов:
jenkinsFile - список jobs, реконфигурацию которых запускает playbook сервисной job
_passwords.conf – шифрация secret файла паролем
Реконфигурация созданных 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.
Укажите секрет vault_file_tech в файле environment.json.
{ "credentials": { "openshiftOpsPasswordsCred": "vault_file_tech", "ansible_vault_id_ops": "vault_file_tech" } }Укажите ссылку на репозиторий дистрибутива Projects в файле environment.json.
{ "efsReleaseRepo": "" // ссылка на свой репозиторий (оставить пустым) }Добавьте плейбук DB_UPDATE в список возможных сценариев развертывания, файл environment.json.
{ "playbooks_fpi": { "DB_UPDATE": { "id": 1 } } }Добавьте плейбук HELM_DEPLOY и HELM_UNDEPLOY в список возможных сценариев развертывания, файл environment.json.
{ "playbooks_fpi": { "HELM_DEPLOY": { "id": 97 }, "HELM_UNDEPLOY": { "id": 98 } } }Добавьте настройки для сценария использования плейбука 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" } } } }Заполните параметры в файле 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": [ ] // секция, определяющая тип кластера } } }Добавьте параметры в файл 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 }}"Добавьте учетную запись БД в 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=<пароль>Добавьте параметры в файл parameters/_extra.conf, значения указаны в качестве примера:
dataspace.model.name=sberproject common.openshift.namespace=${global.multiClusters.openshiftProjectName} dataspace.main.db.schema=sbrprjctДобавьте параметры в файл parameters/common.conf.yml, значения указаны в качестве примера:
registry: "{REGISTRY_URL}" #адрес registry registry_path: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registryСоздайте директории табличных пространств на файловой системе БД.
# директория, указанная в параметре POSTGRES_DB_TS_DATA_LOCATION mkdir -p /pgdata/data/05/sbrprjct chown postgres:postgres /pgdata/data/05/sbrprjct
Запуск скриптов миграции#
Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.
В меню слева нажмите на опцию «Build with parameters».
Установите параметры сборки:
SUBSYSTEM: Projects;
DISTRIB_VERSION: <версия дистрибутива>;
OSE_CLUSTERS: <кластер K8s>;
Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;
PARAMS (набор playbook): <MIGRATION_FP_CONF> <Миграция конфигурационных файлов ФП>;
Запустите сборку, нажав кнопку Build.
После выполнения сборки в репозитории ФП в values.yaml замените стендозависимые параметры:
...
image:
registryUrl: "{REGISTRY_URL}" #адрес registry
registryProject: "{REGISTRY_FOLDER_DOCKER_IMAGE}" #путь до расположения проекта в registry
...
ingress:
...
hosts:
- host: '{HOST}' #host, прослушиваемый ingress-controller
...
Запуск скриптов миграции конфигурационных файлов#
Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.
В меню слева нажмите на опцию «Build with parameters».
Установите параметры сборки:
SUBSYSTEM: Projects;
DISTRIB_VERSION: <версия дистрибутива>;
OSE_CLUSTERS: <кластер K8s>;
Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;
PARAMS (набор playbook): <MIGRATION_FP_CONF>
Запустите сборку, нажав кнопку Build.
После выполнения сборки в репозитории ФП проверьте на наличие корректной конфигурации файлов.
Запуск скриптов инициализации БД#
Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.
В меню слева нажмите на опцию «Build with parameters».
Установите параметры сборки:
SUBSYSTEM: Projects;
DISTRIB_VERSION: <версия дистрибутива>;
OSE_CLUSTERS: <кластер K8s>;
Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;
PARAMS (набор playbook): <DB_UPDATE>
Запустите сборку, нажав кнопку Build.
В результате выполнения будут созданы следующие объекты БД:
пользователь (с именем - dataspace.main.db.user и паролем - dataspace.main.db.password) и схема БД;
табличные пространства, указанные в параметрах: POSTGRES_DB_TS_DATA.
Проверка конфигурации#
Для проверки конфигурации нужно выполнить следующие действия:
Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.
В меню слева нажмите на опцию «Build with parameters».
Установите параметры сборки:
SUBSYSTEM: Projects;
DISTRIB_VERSION: <версия дистрибутива>;
OSE_CLUSTERS: <кластер K8s>;
Репозиторий\ветка с настройками ФП:: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;
PARAMS (набор playbook): <FP_CONF_CHECK>
Запустите сборку, нажав на кнопку «Build».
После выполнения сборки проанализируйте лог на предмет наличия некорректной конфигурации.
Выполнение установки#
Для установки ПО необходимо выполнить следующие действия при запуске Job-развертывания:
Перейдите к job Jenkins, предназначенной для развертывания (установки) Projects.
В меню слева нажмите на опцию «Build with parameters».
Установите параметры сборки:
SUBSYSTEM: Projects;
DISTRIB_VERSION: <версия дистрибутива>;
OSE_CLUSTERS: <кластер K8s>;
Репозиторий\ветка с настройками ФП: <основная ветка конфигурации в соответствии с настройками Deploy Tools>;
PARAMS (набор playbook): <HELM_DEPLOY>.
Запустите сборку, нажав кнопку Build.
После завершения выполнения сборки необходимо проверить, что лог не содержит ошибок.
Набор возможных playbooks зависит от конфигурации инструментов Deploy Tools.
Проверка результата#
Убедитесь в корректности установки, как описано в разделе Чек-лист валидации установки.
Установка в контейнере при помощи Docker-compose#
Внимание
Перед началом установки выполните действия, описанные в Подготовке окружения:
Установить СПО (oauth2-proxy, keycloak, postgreSQL);
настроить СПО:
oauth2-proxy - пример настройки описан в подразделе Настройка реверс прокси;
keycloak - пример настройки описан в подразделе Настройка KeyCloak;
БД - пример создания базы данных описан в подразделе Подготовка базы данных.
Предварительные настройки#
Для развертывания дистрибутива на сервере необходимо наличие установленных Docker/Docker-compose.
Последовательность действий#
Перейдите в каталог, в который был распакован архив дистрибутива, и далее — в
scripts/linux.Скопируйте шаблон файла переменных окружения:
cp .env.template .envОтредактируйте файл
.env, указав значения переменных. Обратите внимание на комментарии в данном файле. Переменные и их описание перечислены в разделе Docker ENV переменные компонента.Примечание
Содержимое
.envфайла соответствует формату dotenv. Пример: BASE_IMAGE=alt:p10 IMAGE_NGINX=nginx:1.27(В первый раз или при необходимости) Выполните команду сборки образа из дистрибутива:
docker-compose buildВыполните команду запуска сервиса:
docker-compose up -dЗапущенные контейнеры будут готовы к работе примерно через 5 минут.
Если данная версия устанавливается в первый раз. Выполните команду:
docker-compose --profile qraphql up -dЕсли установлена чистая база, в .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 пользователя.
Сконфигурируйте сервис
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Если необходимо включить автоматическую рассылку уведомлений, настройте соответствующую 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 сервиса#
CronJob автоматической рассылки уведомлений -
notification. Для включения добавьте в конфигурацию установки Helm chartsberproject-backendв секциюappConfig.jobsследующее:notification: enabled: true image: "{BASE_IMAGE}" cron: "*/5 * * * *"Где:
notification- название CronJob;enabled- флаг активации или деактивации CronJob;image- базовый образ, на котором будет выполняться запуск CronJob;cron- настройка расписания планировщика задач. В данном примере CronJob автоматически запускается каждые 5 минут.CronJob автоматической рассылки уведомлений -
checker. Для включения добавьте в конфигурацию установки Helm chartsberproject-backendв секциюappConfig.jobsследующее:checker: enabled: true image: "{BASE_IMAGE}" cron: "0 2 * * *"Где:
checker- название CronJob;enabled- флаг активации или деактивации CronJob;image- базовый образ, на котором будет выполняться запуск CronJob;cron- настройка расписания планировщика задач. В данном примере CronJob автоматически запускается каждый день в 02:00.CronJob автоматического запуска синхронизации трудозатрат с таск-трекером -
automaticsynctimesheet. Для включения добавьте в конфигурацию установки Helm chartsberproject-backendв секциюappConfig.jobsследующее:automaticsynctimesheet: enabled: true image: "{BASE_IMAGE}" cron: "0 4 * * *"Где:
automaticsynctimesheet- название CronJob;enabled- флаг активации или деактивации CronJob;image- базовый образ, на котором будет выполняться запуск CronJob;cron- настройка расписания планировщика задач. В данном примере CronJob автоматически запускается день в 04:00.CronJob автоматического запуска процесса очистки логов работы CronJob синхронизации трудозатрат с таск-трекером -
clearoldsynclogs. Для включения добавьте в конфигурацию установки Helm chartsberproject-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.