# Комплект приложения. Комплект группы

## Комплект приложений (Appkit)

**Комплект приложений** указывается для группы ресурсов и определяет перечень артефактов, необходимых для разворачивания системы Global ERP:

- Дистрибутив сервера приложений Global ERP (globalserver)
- Образ прикладного решения (applib)
- Набор конфигураций для сервисов кластера (profile)

Опционально в комплект приложений также входит:

- Исходный код для отладки прикладного решения (appsrc)

Комплект приложений хранится [на системном хранилище](./030_achitecture.md#хранение-файлов) в виде zip-архивов (globalserver.zip, applib.zip, profile.zip и, опционально, appsrc.zip) вместе с хэш-суммами, которые могут подготавливаться утилитой nscli.

Путь к комплекту приложений на системном хранилище и хэш-суммы также хранятся в ConfigMap группы ресурсов, что используется подами серверов приложения для определения текущей версии комплекта приложений.

Изменить комплект приложений можно при помощи команд:

**nsctl:** [`./resgroup.sh switch_appkit`](appendix/nsctl/resgroup.md#switch_appkit)

**nscli:** [`./appkit.sh switch`](appendix/nscli/appkit.md#switch)

### Дистрибутив сервера приложений (globalserver)

Предоставляется вендором.

### Образ прикладного решения (applib)

Формируется во время сборки прикладного проекта.

### Набор конфигураций для сервисов кластера (profile)

Профиль (profile) используется контейнерами для конфигурации служб. Внутри архива лежат директории, названия которых соответствуют конфигурируемой службе. Внутри каждой такой директории в свою очередь лежат каталоги статических файлов (`static`) и шаблонов (`template`).

Некоторые конфигурационные файлы можно свободно редактировать, такие обычно поставляются в nscli в папке `default/profile`, которая используется утилитой для создания профиля по умолчанию.

В профиле с шаблонами конфигурационных файлов находятся:

- Конфигурация сервера приложений `globalserver/template/config/global3.config.xml`
- Конфигурация сборщика телеметрии `globalserver/template/config/otel-sdk.config.yaml` и `globalserver/template/config/otel-globalserver.config.yaml`
- Конфигурация менеджера заданий `globalscheduler/template/config/quartz.properties`
- Конфигурация проектных настроек системных логов `globalscheduler/template/config/logback-LoggerContext-ext.xml`
- Конфигурация проектных настроек логов сессии `globalscheduler/template/config/logback-LoggerContext-session-ext.xml`

### Исходный код для отладки прикладного решения (appsrc)

Вместе с образом прикладного решения (applib) могут формироваться и исходные коды проекта (appsrc), необходимые для облачной отладки прикладного решения.

### Состояния комплекта приложений

Комплект приложений бывает в трех состояних:

- `stopped` - остановлен, серверы приложений не работают
- `started` - запущен, серверы приложений работают [в нормальном режиме](https://docs.global-system.ru/as/dev/spec/server/server_modes.html#id3)
- `drained` - осушен, серверы приложений работают [в сервисном режиме](https://docs.global-system.ru/as/dev/spec/server/server_modes.html#id4) (то есть пользователи не могут подключиться к серверу)

Переключение состояний возможно при помощи команд:

**nscli:**

- [`./appkit.sh start`](appendix/nscli/appkit.md#start)
- [`./appkit.sh stop`](appendix/nscli/appkit.md#stop)

## Комплект группы (Groupkit)

**Комплект группы** указывается для группы ресурсов и определяет перечень вспомогательных артефактов:

- Архив с дополнительными библиотеками (libs)
- Архив с дополнительными шрифтами (fonts)
- Файлы JDK для переопределения (java)

Наличие всех компонентов не обязательно.

Вы можете добавить собственные шрифты, которые будут затем использоваться при создании документа: добавьте их в комплект группы по пути `fonts`.
Вы можете использовать java для добавления хранилища собственных сертификатов cacerts: добавьте их в комплект группы по пути `java/jre/lib/security/cacerts`.

Комплект группы также хранится на [системном хранилище](./030_achitecture.md#хранение-файлов), а в ConfigMap группы ресурсов сохраняются путь и контрольные суммы компонентов (если они зафиксированы через `switch_remote`/`switch_local`). Изменения в комплекте группы требуют перезапуска всех подов.

Обычно комплект группы не требуется.

Переключить комплект группы можно командой nsctl [`./resgroup.sh switch_groupkit`](appendix/nsctl/resgroup.md#switch_groupkit) или через nscli [`./groupkit.sh`](appendix/nscli/groupkit.md):

```bash
./groupkit.sh push --namespace my-namespace --source workspace/groupkit --destination groupkit/v1
./groupkit.sh switch_remote --config-path ./config.yaml --resgroup my-resgroup --namespace my-namespace --remote-groupkit groupkit/v1
```

`push` для GroupKit работает по той же модели, что и для AppKit: по умолчанию hash-файлы локально пересчитываются и перезаписываются, а при указании `--validate-local-hashes` существующие `.sha1/.sha256` валидируются и не перезаписываются.

## Управление комплектами

Управление комплектами выполняется при помощи команды nscli [`./appkit.sh`](appendix/nscli/appkit.md)

### Создать комплект с минимальным профилем

Создадим комплект с пользовательским профилем по умолчанию в директории `workspace/kit`.

```bash
./appkit.py prepare_profile --appkit-dir workspace/kit
```

Получаем следующую структуру:

```text
workspace/kit
└── profile
    ├── globalscheduler
    │   └── template
    │       └── config
    │           └── quartz.properties
    └── globalserver
        └── template
            └── config
                ├── global3.config.xml
                ├── logback-LoggerContext-ext.xml
                └── logback-LoggerContext-session-ext.xml
```

### Упаковать комплект и пересчитать хэши

Давайте добавим компонентов комплекта и упакуем комплект в директории `workspace/kit`.

Новая структура комплекта:

```text
workspace/kit
├── applib.zip
├── globalserver.zip
├── java
│   └── jre
│       └── lib
│           └── security
│               └── cacerts
└── profile
    ├── globalscheduler/...
    └── globalserver/...
```

```{note}
Как можно заметить, в комплекте лежат дистрибутивы globalserver.zip и applib.zip, а также профиль и файлы Java в отдельных папках. Итоговый комплект можно использовать и как комплект приложения, и как комплект группы.
```

Выполним:

```bash
./appkit.py refresh_hash --source workspace/kit
```

Все компоненты комплекта, хранящиеся в отдельной папке, теперь упакованы в zip-архивы. Рядом с zip-архивами лежат файлы со значениями хэш-сумм.

### Отправить комплект на системное хранилище

Давайте отправим этот комплект на системное хранилище по пути `mykit/v1`.

```bash
./appkit.py push --namespace my-namespace --source workspace/kit --destination mykit/v1
```

```{tip}
Предварительно запускать `./appkit.py refresh_hash` необязательно: по умолчанию `./appkit.py push` сам пересчитает и перезапишет `.sha1/.sha256` рядом с архивами.

Если нужно использовать заранее подготовленные hash-файлы из CI/CD и не перезаписывать их, добавьте флаг `--validate-local-hashes`.
```

Теперь вы должны увидеть этот комплект в контейнере nsctl в папке `~/nsctl/workspace/mnt/sys/mykit/v1`.

### Обновить GlobalERP

Сменим комплект приложения и обновим базу данных.

```bash
./appkit.py switch_and_upgrade --namespace my-namespace --resgroup my-resgroup --remote_appkit mykit/v1
```

```{attention}
После выполнения команды, комплект приложений [остается в осушенном состоянии](#состояния-комплекта-приложений).
```

### Включить GlobalERP

Сделаем GlobalERP снова доступной для пользователей через вывод комплекта приложений из осушенного состояния.

```bash
./appkit.py start --namespace my-namespace --resgroup my-resgroup
```
