﻿# Установка ELMA365 stack

> [HTML Version](elma365-stack.html)

ELMA365 On-Premises можно установить в уже существующий Kubernetes-кластер. ELMA365 поставляется в виде Helm-чартов:

- **elma365-stack** — полный стэк ELMA365, включает в себя Helm-пакеты \[OBJECT\], \[OBJECT\] и \[OBJECT\]; 

- **elma365** — пакет приложения ELMA365; 

- **elma365-dbs** — набор баз данных и хранилищ, необходимых для работы ELMA365. Также есть возможность использовать собственные базы данных PostgreSQL, MongoDB, Redis, RabbitMQ, хранилище S3, указав строки подключения к ним \[OBJECT\] пакета **elma365**. При этом в файле \[OBJECT\] установку соответствующих компонентов можно отключить, выставив значение \[OBJECT\], например, для PostgreSQL** **\[OBJECT\]. Если все пять компонентов чарта будут выставлены в \[OBJECT\], установка этого чарта не требуется. О создании баз данных читайте в разделе [«Подготовка внешних баз данных»](postgresql.md); 

- **elma365-addons** — дополнения для ELMA365 Enterprise, включающие в себя систему маршрутизации (Service Mesh) **Linkerd**, систему мониторинга **Prometheus + Grafana**, а также **Descheduler**, **NodeLocal DNSCache** и модуль **Аудит безопасности**. 

````
начало внимание

````
Чарты **elma365-extension** больше не поддерживаются. Переход на чарты **elma365-dbs** с новыми версиями баз данных выполняется с помощью дампа и его восстановления.

````
конец внимание 

## ````
Требования к конфигурации Kubernetes

Система устанавливается при помощи Helm в Kubernetes-кластер, который содержит следующие компоненты: **ingress-nginx контроллер**, **coredns**, **rbac**, **storageclass**. Поддерживаемые версии Kubernetes и Helm смотрите в статье [«Системные требования ELMA365 On-Premises»](elma365-enterprise-on-premises.md#kubernetes). 

Кроме того, должно быть разрешено проксирование из подов во внешнюю сеть.

## Установка ELMA365 с помощью чарта elma365-stack

1. Добавьте репозиторий Helm ELMA365 и извлеките список переменных пакета приложения со всеми необходимыми компонентами в файл:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm show values elma365/elma365-stack > values-elma365-stack.yaml

2. ````
Заполните переменные в файле \[OBJECT\], заменив как минимум следующие параметры:

- \[OBJECT\] — домен (FQDN) или IP-адрес, по которому будет доступна система; 

- \[OBJECT\] — электронная почта администратора; 

- \[OBJECT\] — пароль администратора;

- \[OBJECT\] — строка подключения к БД PostgreSQL;

- \[OBJECT\] — строка подключения к БД MongoDB для приложения; 

- \[OBJECT\] — строка подключения к БД MongoDB для сервера авторизации; 

- \[OBJECT\] — строка подключения к Redis; 

- \[OBJECT\] — строка подключения к RabbitMQ; 

- \[OBJECT\] — метод запросов к S3; 

- \[OBJECT\] — имя пользователя S3;

- \[OBJECT\] — пароль для пользователя S3; 

- \[OBJECT\] — бакет S3; 

- \[OBJECT\] — адрес S3; 

- \[OBJECT\] — регион S3; 

- \[OBJECT\] — включение SSL S3. 

3. Если требуется создать отдельный \[OBJECT\], укажите его во всех командах установки.

4. Сохраните файл \[OBJECT\] для последующих обновлений.

## Установка баз данных

1. При использовании своих баз данных установку встроенных баз можно пропустить, изменив значение в параметре \[OBJECT\] на \[OBJECT\] в файле \[OBJECT\]. В случае использования одной или нескольких внешних баз, например, PostgreSQL, можно пропустить его установку, изменив параметр \[OBJECT\] на \[OBJECT\].

2. Выполните установку баз данных. На этом шаге необходимо отключить установку приложения ELMA365 следующей командой (обратите внимание на параметр \[OBJECT\]):

````
helm upgrade --install elma365-stack elma365/elma365-stack \\  
\-f values-elma365-stack.yaml \\  
 --set global.elma365.enabled=false \\  
 --timeout=30m --wait \\  
 \[-n namespace\]

## ````
Установка приложения ELMA365

1. Если необходимо восстановить дамп, перед установкой ELMA365 вы можете воспользоваться утилитой [elma365-backupper](database-backup-and-recovery.md) или выполнить скрипт \[OBJECT\] из чарта **elma365**.

Пример выполнения скрипта:

````
helm pull elma365/elma365-stack --untar  
./elma365-stack/charts/elma365/elma365db.sh --restore --path /backup/path/ \\  
\[--kubeconfig /path/to/config --context prod\] \[-n namespace\]

2. ````
Выполните установку приложения ELMA365 командой:

````
helm upgrade --install elma365-stack elma365/elma365-stack \\  
\-f values-elma365-stack.yaml \\  
\--timeout=30m --wait \[-n namespace\]

3. ````
Для создания дампа можно воспользоваться утилитой [elma365-backupper](database-backup-and-recovery.md) или выполнить скрипт \[OBJECT\] из чарта **elma365.**

Пример использования скрипта:

````
helm pull elma365/elma365-stack --untar  
./elma365-stack/charts/elma365/elma365db.sh --dump --path /backup/path/ \\  
\[--kubeconfig /path/to/config --context prod\] \[-n namespace\]

## ````
Установка средств мониторинга (опционально)

1. В файле \[OBJECT\] отключите неиспользуемые компоненты, изменив значение в параметрах \[OBJECT\], \[OBJECT\], \[OBJECT\] и \[OBJECT\] на \[OBJECT\], так как для их установки необходимы предварительные настройки.

2. В параметрах \[OBJECT\] и \[OBJECT\] укажите требуемый \[OBJECT\] для сервиса мониторинга (например, \[OBJECT\]), адрес, по которому будет доступен сервис мониторинга и включите дэшборды, изменив значение в параметре \[OBJECT\] на \[OBJECT\].

3. Создайте \[OBJECT\] для сервиса мониторинга командой:

````
kubectl create namespace monitoring

4. ````
Выполните установку следующей командой (обратите внимание на параметр \[OBJECT\]):

````
helm upgrade --install elma365-stack elma365/elma365-stack \\  
 -f values-elma365-stack.yaml \\  
 --set global.elma365-addons.enabled=true \\  
 --timeout=30m --wait \\  
  \[-n namespace\]

## ````
Установка Linkerd и автомасштабирование сервисов (опционально)

Linkerd — это выделенный уровень инфраструктуры, который помогает обрабатывать связь между сервисами, автоматически шифровать соединения, обрабатывать повторные запросы и тайм-ауты, использовать телеметрию (коэффициент успешности, задержки) и т. д.

1. Сгенерируйте сертификаты с помощью \[OBJECT\], выполнив команды ниже. Linkerd требует сертификат привязки доверия и сертификаты эмитента с соответствующим ключом для поддержки взаимных TLS-соединений между сервисами, для всех сертификатов требуется алгоритм** ECDSA P-256**.

````
\# Создать закрытый ключ CA  
openssl ecparam -name prime256v1 -genkey -noout -out ca-private.pem  
  
\# Создать открытый ключ CA  
openssl ec -in ca-private.pem -pubout -out ca-public.pem  
  
\# Создать самоподписанный сертификат CA  
openssl req -x509 -new -key ca-private.pem -days 365 \\  
 -out ca.crt -subj "/CN=root.linkerd.cluster.local"  
\# Создать закрытый ключ эмитента  
openssl ecparam -name prime256v1 -genkey -noout -out issuer-private.pem  
  
\# Создать открытый ключ эмитента  
openssl ec -in issuer-private.pem -pubout -out issuer-public.pem  
  
\# Создать запрос на подпись сертификата  
openssl req -new -key issuer-private.pem -out issuer.csr \\  
 -subj "/CN=identity.linkerd.cluster.local" \\  
 -addext basicConstraints=critical,CA:TRUE  
  
\# Создать сертификат эмитента, подписав запрос  
openssl x509 \\  
    -extfile /etc/ssl/openssl.cnf \\  
    -extensions v3\_ca \\  
    -req \\  
    -in issuer.csr \\  
    -days 180 \\  
    -CA ca.crt \\  
    -CAkey ca-private.pem \\  
    -CAcreateserial \\  
    -extensions v3\_ca \\  
    -out issuer.crt  
\# Удалить запрос на подпись сертификата  
rm issuer.csr

2. ````
В файле \[OBJECT\] отключите неиспользуемые компоненты, изменив значение в параметрах \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\] и \[OBJECT\] на \[OBJECT\], так как для их установки необходимы предварительные настройки.

3. В параметрах \[OBJECT\] укажите требуемый \[OBJECT\] для сервиса Linkerd (например, \[OBJECT\]), содержимое сертификатов, ключа и срок действия сертификата \[OBJECT\]. Обратите внимание, значение должно соответствовать дате истечения срока действия сертификата эмитента.

````
identityTrustAnchorsPEM: |  
    -----BEGIN CERTIFICATE-----  
    содержимое сертификата ca.crt  
    -----END CERTIFICATE-----  
  identity:  
    issuer:  
      crtExpiry: 2023-03-30T05:28:39Z  
      tls:  
        crtPEM: |  
          -----BEGIN CERTIFICATE-----  
          содержимое сертификата issuer.crt  
          -----END CERTIFICATE-----  
        keyPEM: |  
          -----BEGIN EC PRIVATE KEY-----  
          содержимое сертификата issuer-private.pem  
          -----END EC PRIVATE KEY-----

4. ````
Включите автомасштабирование сервисов, изменив значение в параметре \[OBJECT\] на \[OBJECT\].

5. Выполните установку следующей командой (обратите внимание на параметр \[OBJECT\]):

````
helm upgrade --install elma365-stack elma365/elma365-stack \\  
 -f values-elma365-stack.yaml --set global.elma365-addons.enabled=true \\  
 --timeout=30m --wait \[-n namespace\]

6. ````
Добавьте аннотацию на \[OBJECT\] с приложением ELMA365 для автоматической инъекции контейнеров Linkerd-proxy в сервисы ELMA365 командой:

````
kubectl annotate namespace default linkerd.io/inject=enabled

7. ````
Перезапустите все сервисы командой:

````
kubectl rollout restart deploy \[-n namespace\] \&\& kubectl rollout restart ds \[-n namespace\]

## ````
Установка NodeLocal DNS Cache (опционально)

Установка NodeLocal DNS Cache позволяет снизить нагрузку по DNS-запросам в кластере Kubernetes и повысить стабильность преобразования DNS-имён. Это позволит избежать правил DNAT, connection tracking и ограничений по количеству соединений.

1. Получите IP-адрес сервиса **kube-dns**:

````
kubectl get svc kube-dns -n kube-system -o jsonpath=\{.spec.clusterIP\}

2. ````
В файле \[OBJECT\] отключите неиспользуемые компоненты, изменив значение в параметрах \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\] и \[OBJECT\] на \[OBJECT\], так как для их установки необходимы предварительные настройки.

3. В параметрах \[OBJECT\] укажите следующие параметры:

- \[OBJECT\] — домен кластера;

- \[OBJECT\] — IP-адрес сервиса **kube-dns**;

- \[OBJECT\] — локальный IP-адрес для NodeLocal DNS Cache.

4. Выполните установку командой (обратите внимание на параметр \[OBJECT\]):

````
helm upgrade --install elma365-stack elma365/elma365-stack \\  
 -f values-elma365-stack.yaml --set global.elma365-addons.enabled=true \\  
 --timeout=30m --wait \[-n namespace\]

## ````
Установка Kyverno (опционально)

**Kyverno** позволяет управлять специфическими конфигурациями среды независимо от конфигураций ресурсов, применять передовые методы настройки для своих кластеров, в частности, путём блокировки или изменения запросов API.

### Политика добавления пользовательских сертификатов CA во все контейнеры

В некоторых случаях требуется доверять пользовательским сертификатам CA. Kyverno позволяет автоматически монтировать их в контейнеры. Политика добавляет том, содержащий сертификат, ко всем контейнерам с меткой **tier=elma365**.

1. Создайте **ConfigMap** с сертификатом корневого CA.

````
kubectl create configmap elma365-onpremise-ca --from-file=/etc/ssl/certs/rootCA.pem  \[-n namespace\]

2. ````
В файле \[OBJECT\] включите Kyverno, изменив значение параметра \[OBJECT\] на \[OBJECT\]. Затем отключите неиспользуемые компоненты, изменив значение у дополнения в параметре \[OBJECT\] на \[OBJECT\], так как для их установки необходимы предварительные настройки.

3. В параметрах \[OBJECT\] укажите требуемый \[OBJECT\] для сервиса Kyverno,** **например, \[OBJECT\]. Затем включите политику добавления сертификатов, изменив значение в параметре \[OBJECT\] на \[OBJECT\], укажите имя **ConfigMap** с сертификатом корневого CA. В параметре \[OBJECT\] укажите список \[OBJECT\], в которых будет применена политика добавления сертификатов. 

4. Создайте \[OBJECT\] для сервиса Kyverno командой:

````
kubectl create namespace kyverno

5. ````
Выполните установку следующей командой (обратите внимание на параметр \[OBJECT\]:

````
helm upgrade --install elma365-stack elma365/elma365-stack \\  
\-f values-elma365-stack.yaml --set global.elma365-addons.enabled=true \\  
\--timeout=30m --wait \[-n namespace\]

6. ````
Перезапустите все сервисы командой:

````
kubectl rollout restart deploy \[-n namespace\] \&\& kubectl rollout restart ds \[-n namespace\]

## ````
Обновление версии ELMA365

1. Обновите список чартов в репозитории, выполнив команду:

````
helm repo update

2. ````
Используйте файл \[OBJECT\], сохранённый на этапе установки, а затем выполните команду:

````
helm upgrade --install elma365-stack elma365/elma365-stack -f values-elma365-stack.yaml --timeout=30m --wait \[-n namespace\]

````
В случае изменения строк подключения (сonnection strings) к БД при обновлении приложения перезапустите все сервисы командой:

````
kubectl default rollout restart deploy \[-n namespace\] \&\& kubectl default rollout restart ds \[-n namespace\]

## ````
Удаление чарта elma365

Для удаления пакета ELMA365 посмотрите список установленных релизов, а затем выполните команду удаления:

````
helm list \[-n namespace\]  
helm uninstall elma365-stack \[-n namespace\] 

## ````
Параметры чарта elma365-stack



| | | |
|------|------|------|
| **Имя** | **Описание** | **Значение по умолчанию** |
| **Глобальные параметры ** | | 
| \[OBJECT\] | Включить установку приложения ELMA365 | \[OBJECT\] |
| \[OBJECT\] | Включить установку баз данных | \[OBJECT\] |
| \[OBJECT\] | Включить PostgreSQL в установку баз данных | \[OBJECT\] |
| \[OBJECT\] | Включить MongoDB в установку баз данных | \[OBJECT\] |
| \[OBJECT\] | Включить Redis в установку баз данных | \[OBJECT\] |
| \[OBJECT\] | Включить RabbitMQ в установку баз данных | \[OBJECT\] |
| \[OBJECT\] | Включить MinIO для S3 хранилища в установку баз данных | \[OBJECT\] |
| \[OBJECT\] | Включить Elasticsearch в установку баз данных (включается для ELMA Bot) | \[OBJECT\] |
| \[OBJECT\] | Включить установку дополнений для ELMA365 | \[OBJECT\] |
| \[OBJECT\] | Включить Prometheus в установку дополнений для ELMA365 (перед установкой необходимо создать \[OBJECT\]) | \[OBJECT\] |
| \[OBJECT\] | Включить Grafana в установку дополнений для ELMA365 | \[OBJECT\] |
| \[OBJECT\] | Включить Linkerd в установку дополнений для ELMA365 | \[OBJECT\] |
| \[OBJECT\] | Включить Descheduler в установку дополнений для ELMA365 (необходимо не менее 3 узлов в кластере) | \[OBJECT\] |
| \[OBJECT\] | Включить NodeLocal DNS Cache в установку дополнений для ELMA365 | \[OBJECT\] |
| \[OBJECT\] | Включить сервис **Аудит безопасности** в установку дополнений для ELMA365 | \[OBJECT\] |
| **Глобальные параметры ELMA365 ** | | 
| \[OBJECT\] | Домен (FQDN) или IP-адрес, по которому будет доступна система | \[OBJECT\] |
| \[OBJECT\] | Включение \[OBJECT\] в ingress (значение берётся из \[OBJECT\]). | \[OBJECT\] |
| \[OBJECT\] | Включение https | \[OBJECT\] |
| \[OBJECT\] | Имя секрета с сертификатами для работы https | \[OBJECT\] |
| \[OBJECT\] | Включение сертификата корневого CA для работы https с самоподписанным сертификатом | \[OBJECT\] |
| \[OBJECT\] | Имя конфигмапы с сертификатом корневого CA для работы https с самоподписанным сертификатом | \[OBJECT\] |
| \[OBJECT\] | Аннотации для ingress | \[OBJECT\] |
| \[OBJECT\] | Включение автомасштабирования сервисов | \[OBJECT\] |
| \[OBJECT\] | Минимальное количество реплик | 1 |
| \[OBJECT\] | Максимальное количество реплик | 9 |
| \[OBJECT\] | Включение дэшбордов для Grafana | \[OBJECT\] |
| \[OBJECT\] | Адрес для registry  | \[OBJECT\] |
| \[OBJECT\] | Адрес для registry | " " |
| \[OBJECT\] | Секрет с правами доступа к приватному registry, должен быть создан вручную, зашифрованный в Base64 | \[OBJECT\] |
| **Дополнительные параметры ** | | 
| \[OBJECT\] | Максимальное количество подключений к главному узлу PostgreSQL в пуле незанятых подключений | 50 |
| \[OBJECT\] | Максимальное количество открытых подключений к главному узлу PostgreSQL из пула | 150 |
| \[OBJECT\] | Максимальное время жизни подключения к главному узлу PostgreSQL из пула | 1m |
| \[OBJECT\] | Максимальное количество подключений к репликам PostgreSQL в пуле незанятых подключений | 50 |
| \[OBJECT\] | Максимальное количество открытых подключений к репликам PostgreSQL из пула | 150 |
| \[OBJECT\] | Максимальное время жизни подключения к репликам PostgreSQL из пула | 5m |
| \[OBJECT\] | Максимальный размер ответов | 8388608 |
| \[OBJECT\] | Максимальная задержка между попытками установки GRPC-соединения | 2s |
| \[OBJECT\] | Количество секунд, которое отводится всему Job на выполнение | 3000 |
| \[OBJECT\] | Количество секунд, которое отводится Job на выполнение создания компании | 1800 |
| \[OBJECT\] | Количество секунд, которое отводится Job на выполнение миграции | 3000 |
| **Общие параметры ** | | 
| \[OBJECT\] | Включить режим отладки платформы | \[OBJECT\] |
| \[OBJECT\] | Электронная почта администратора | \[OBJECT\] |
| \[OBJECT\] | Пароль администратора | test |
| \[OBJECT\] | Язык установленной системы, возможные варианты: ru-RU, en-US, sk-SK | ru-RU |
| \[OBJECT\] | Язык установленной системы, возможные варианты: ru-RU, en-US, sk-SK | ru-RU |
| **Строки подключения (сonnection strings) для подключения к БД** | | 
| \[OBJECT\] | Строка подключения к БД PostgreSQL | \[OBJECT\]  |
| \[OBJECT\] | Имя секрета со строкой подключения к БД PostgreSQL, зашифрованной в Base64 (ключ PSQL\_URL) | " " |
| \[OBJECT\] | Строка подключения к БД PostgreSQL только для чтения | " " |
| \[OBJECT\] | Имя секрета со строкой подключения к БД PostgreSQL только для чтения, зашифрованной в Base64 (ключ RO\_POSTGRES\_URL) | " " |
| \[OBJECT\] | Строка подключения к БД MongoDB для приложения | \[OBJECT\] |
| \[OBJECT\] | Имя секрета со строкой подключения к БД MongoDB для приложения, зашифрованной в Base64 (ключ MONGO\_URL) | " " |
| \[OBJECT\] | Строка подключения к БД MongoDB для сервера авторизации | \[OBJECT\] |
| \[OBJECT\] | Имя секрета со строкой подключения к БД MongoDB для сервера авторизации | " " |
| \[OBJECT\] | Строка подключения к Redis | \[OBJECT\] |
| \[OBJECT\] | Имя секрета со строкой подключения к Redis, зашифрованной в Base64 (ключ REDIS\_URL) | " " |
| \[OBJECT\] | Строка подключения к RabbitMQ | \[OBJECT\] |
| \[OBJECT\] | Имя секрета со строкой подключения к RabbitMQ, зашифрованной в Base64 (ключ AMQP\_URL) | " " |
| \[OBJECT\] | Метод запросов | PUT |
| \[OBJECT\] | Имя пользователя | \[OBJECT\] |
| \[OBJECT\] | Пароль для пользователя | \[OBJECT\] |
| \[OBJECT\] | Список бакетов | \[OBJECT\] |
| \[OBJECT\] | Адрес S3  | \[OBJECT\] |
| \[OBJECT\] | Регион | \[OBJECT\] |
| \[OBJECT\] | Включение SSL | "\[OBJECT\]" |
| \[OBJECT\] | Имя секрета с подключением к S3 хранилищу файлов, зашифрованной в Base64<br>  # (ключи S3\_BACKEND\_ADDRESS, S3\_REGION, S3\_KEY, S3\_SECRET, S3\_BUCKET, S3\_SSL\_ENABLED, S3\_UPLOAD\_METHOD) | " " |
| **Настройки для подключения к SMTP-серверу отправки почты** | | 
| \[OBJECT\] | Адрес SMTP-сервера | " " |
| \[OBJECT\] | Порт SMTP-сервера | " " |
| \[OBJECT\] | Адрес отправителя электронной почты | " " |
| \[OBJECT\] | Пользователь для авторизации на SMTP-сервере | " " |
| \[OBJECT\] | Пароль для авторизации на SMTP-сервере | " " |
| \[OBJECT\] | Используется ли шифрование | \[OBJECT\] |
| **Глобальные параметры сервиса «Аудит безопасности» ** | | 
| \[OBJECT\] | Строка подключения к БД PostgreSQL | \[OBJECT\] |
| \[OBJECT\] | Адрес для registry  | \[OBJECT\] |
| \[OBJECT\] | Секрет с правами доступа к приватному registry, должен быть создан вручную, зашифрованный в Base64 | \[OBJECT\] |
