> For the complete documentation index, see [llms.txt](https://utm-1.gitbook.io/utm-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/brokery-soobshenii/kafka/instansy/razvertyvanie-na-utm-mb4-11.md).

# Развертывание на utm-mb4-11

## Предварительная подготовка

### Репозиторий в GitHub

Необходимо создать приватный репозиторий mb-projects на GitHub.

В аккаунте GitHub должен быть прописан публичный SSH ключ для доступа к GitHub.

Склонировать репозиторий mb-projects **на рабочую станцию где ведется разработка.**

### Linux cервер развертывания

<details>

<summary>Настройка Linux сервера развертывания Apache Kafka</summary>

На Linux сервере развертывания должно быть:

* [Установка docker](broken://pages/ifHKmuwJEVM1AshToieI)

```bash
docker --version
# Docker version 29.1.2, build 890dcca
```

* Установлен Git

```bash
git --version
# git version 2.43.0
```

* Группы доступа

```bash
# Группа доступа к проектам GitHub
sudo addgroup utm-github
# Добавить пользователей в группу
sudo usermod -aG utm-github maxim
sudo usermod -aG utm-github andrew
```

* Папки

```bash
# Создать папку
sudo mkdir -p /srv/github/utenkov-maxim
# Права на доступ к папке
sudo chmod -R 0775 /srv/github/utenkov-maxim
# Владелец папки
sudo chown -R root:utm-github /srv/github/utenkov-maxim
# Добавить линк в домашней папке к папке /srv/github/utenkov-maxim
ln -s /srv/github $HOME/github
```

* Настройка доступа к GitHub по SSH

Скопировать в папку $HOME/.ssh пару SSH ключей доступа к GitHub

```bash
# Права на доступ к папке
sudo chmod 600 ~/.ssh/id_ed25519_github_utenkov-maxim
# Настроить config для SSH
sudo nano ~/.ssh/config
```

Добавить следующее содержимое:

```ssh-config
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github_utenkov-maxim
    IdentitiesOnly yes
```

</details>

## Подготовка файлов проекта

Предварительно должен быть склонирован репозиторий mb-projects из GitHub.

В папке `mb-projects` создать папку проекта `utm-kafka/docker` и создать следующие файлы:

**compose.yaml**

<details>

<summary>Содержимое файла compose.yaml</summary>

```yaml
volumes:
  utm-cp-kafka37-data:
  utm-cp-kafka37-metadata:
  utm-kafka41-data:
  utm-kafka41-metadata:

services:
  # Apache Confluent Kafka 3.7
  utm-cp-kafka37:
    image: confluentinc/cp-kafka:7.7.7
    hostname: utm-cp-kafka37
    container_name: utm-cp-kafka37
    restart: always
    profiles: ["manual"]    # Для запуска: docker compose --profile manual up -d utm-cp-kafka37
    environment:
      ###########################################################
      # Логины / пароли
      ###########################################################
      KAFKA_ADMIN1_USER: ${KAFKA_ADMIN1_USER}
      KAFKA_ADMIN1_PASS: ${KAFKA_ADMIN1_PASS}
      KAFKA_USER1_USER: ${KAFKA_USER1_USER}
      KAFKA_USER1_PASS: ${KAFKA_USER1_PASS}
      KAFKA_USER2_USER: ${KAFKA_USER2_USER}
      KAFKA_USER2_PASS: ${KAFKA_USER2_PASS}
      KAFKA_EXPORTER_USER: ${KAFKA_EXPORTER_USER}
      KAFKA_EXPORTER_PASS: ${KAFKA_EXPORTER_PASS}

      ###########################################################
      # Включение режима KRaft
      ###########################################################
      KAFKA_KRAFT_MODE: true                                      # Такого парамтера не существует в стандартной Kafka (утверждает яндекс). Вместо этого нужно выполнить 6 пунктов:
      KAFKA_PROCESS_ROLES: broker,controller                      # 1. Определите роли узлов
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093            # 2. Задайте кворум контроллеров
      KAFKA_NODE_ID: 1                                            # 3. Назначьте уникальные node.id для каждого узла.
                                                                  # 4. Укажите директорию для метаданных (metadata.log.dir). Задано через KAFKA_OPTS
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER                 # 5. Настройте listeners для контроллера (controller.listener.names. Задаёт имена слушателей (listeners), используемых контроллером кластера в режиме KRaft
                                                                  # 6. Удалите зависимости от ZooKeeper (не указывайте zookeeper.connect)

      ###########################################################
      # Включение SASL_PLAINTEXT
      ###########################################################
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN                        # Разрешённые механизмы SASL
      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN           # Механизм аутентификации для межброкерных соединений
              # не указывать, т.к. или этот параметр или KAFKA_INTER_BROKER_LISTENER_NAME        #KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT        # Протокол для внутренней связи (должен совпадать с KAFKA_INTER_BROKER_LISTENER_NAME)     
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:SASL_PLAINTEXT,LAN:PLAINTEXT    # Сопоставляем имена с протоколами
      KAFKA_OPTS: >-
        -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
        -Dmetadata.log.dir=/var/lib/kafka/metadata
        -DHOSTNAME=utm-cp-kafka37
        -javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-1.5.0.jar=9191:/opt/jmx-exporter/kafka-jmx-config.yaml
      #  -javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-0.18.0.jar=9191:/opt/jmx-exporter/kafka-jmx-config.yaml
      # -Dcom.sun.management.jmxremote=true
      # -Dcom.sun.management.jmxremote.port=9096
      # -Dcom.sun.management.jmxremote.authenticate=false
      # -Dcom.sun.management.jmxremote.ssl=false
      # -Djava.rmi.server.hostname=localhost
      # -Djava.rmi.server.port=9096
      # KAFKA_AUTHORIZER_CLASS_NAME: org.apache.kafka.image.authorization.Authorizer      # Класса авторизатора в Apache Kafka. Указанное значение - современная реализация для режима KRaft (без ZooKeeper)
      # KAFKA_AUTHORIZER_CLASS_NAME: org.apache.kafka.common.security.authorizer.StandardAuthorizer
      # KAFKA_OPTS: "-Dsuper.users=User:${KAFKA_ADMIN1_USER},User: ${KAFKA_USER1_USER},User:${KAFKA_EXPORTER_USER}"
      # KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"                # Управляет поведением авторизатора, когда для запрашиваемого ресурса нет явных ACL‑правил

      ###########################################################
      # Основные параметры
      ###########################################################
      CLUSTER_ID: 'cp37kMegBDbLU59wm3QxrF'     
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://localhost:9093,EXTERNAL://0.0.0.0:9094,LAN://0.0.0.0:9095      # На каких сетевых интерфейсах и портах брокер Kafka «слушает» входящие соединения
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://192.168.4.11:9094,LAN://192.168.4.11:9095           # Это конечная точка, которую клиент Kafka будет отправлять и прослушивать    
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT                 # Задаёт имя слушателя (listener), используемого для внутренней коммуникации между брокерами в кластере
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1                   # Фактор репликации для внутреннего топика __consumer_offsets_v2
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1           # Фактор репликации для внутреннего топика __transaction_state
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1                      # Минимальное число синхронных реплик (ISR, In‑Sync Replicas) для партиций внутреннего топика __transaction_state
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0                   # Задержка перед стартом первого ребаланса в новой группе консьюмеров
      KAFKA_NUM_PARTITIONS: 3                                     # Количество партиций по умолчанию для вновь создаваемых топиков
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 1   # Коэффициент репликации для темы состояния группы общего доступа
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 1              # Переопределяет min.insync.replicas для темы состояния группы общего доступа
      KAFKA_LOG_DIRS: /var/lib/kafka/data                         # Определяет директории, где Kafka хранит файлы логов (данные топиков)
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: false                      # Управляет автоматическим созданием топиков в кластере
      KAFKA_LOG_RETENTION_HOURS: 168                              # Определяет максимальное время хранения сегментов логов (в часах) для топиков Kafka

      ###########################################################
      # Служебные параметры
      ###########################################################
      KAFKA_HEAP_OPTS: '-Xmx2G -Xms2G'                            # Настройка размера кучи (heap) JVM, в которой работает брокер Kafka

    volumes:
      - utm-cp-kafka37-data:/var/lib/kafka/data
      - utm-cp-kafka37-metadata:/var/lib/kafka/metadata
      - ./kafka_server_jaas.conf:/etc/kafka/kafka_server_jaas.conf
      - ./jmx-exporter:/opt/jmx-exporter
    ports:
      - "9092:9092"
      - "9093:9093"
      - "9094:9094"
      - "9095:9095"
      - "9191:9191"   # Мониторинг
    healthcheck:
      test: ["CMD", "kafka-topics", "--list", "--bootstrap-server", "localhost:9092"]
      interval: 30s
      retries: 5
      timeout: 10s


  # Apache Kafka 4.1
  utm-kafka41:
    image: apache/kafka:4.1.1
    hostname: utm-kafka41
    container_name: utm-kafka41
    restart: always
    environment:
      ###########################################################
      # Логины / пароли
      ###########################################################
      KAFKA_ADMIN1_USER: ${KAFKA_ADMIN1_USER}
      KAFKA_ADMIN1_PASS: ${KAFKA_ADMIN1_PASS}
      KAFKA_USER1_USER: ${KAFKA_USER1_USER}
      KAFKA_USER1_PASS: ${KAFKA_USER1_PASS}
      KAFKA_USER2_USER: ${KAFKA_USER2_USER}
      KAFKA_USER2_PASS: ${KAFKA_USER2_PASS}
      KAFKA_EXPORTER_USER: ${KAFKA_EXPORTER_USER}
      KAFKA_EXPORTER_PASS: ${KAFKA_EXPORTER_PASS}

      ###########################################################
      # Включение режима KRaft
      ###########################################################
      KAFKA_KRAFT_MODE: true                                      # Такого парамтера не существует в стандартной Kafka (утверждает яндекс). Вместо этого нужно выполнить 6 пунктов:
      KAFKA_PROCESS_ROLES: broker,controller                      # 1. Определите роли узлов
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:19093            # 2. Задайте кворум контроллеров
      KAFKA_NODE_ID: 1                                            # 3. Назначьте уникальные node.id для каждого узла.
                                                                  # 4. Укажите директорию для метаданных (metadata.log.dir). Задано через KAFKA_OPTS
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER                 # 5. Настройте listeners для контроллера (controller.listener.names. Задаёт имена слушателей (listeners), используемых контроллером кластера в режиме KRaft
                                                                  # 6. Удалите зависимости от ZooKeeper (не указывайте zookeeper.connect)

      ###########################################################
      # Включение SASL_PLAINTEXT
      ###########################################################
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN                        # Разрешённые механизмы SASL
      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN           # Механизм аутентификации для межброкерных соединений
              # не указывать, т.к. или этот параметр или KAFKA_INTER_BROKER_LISTENER_NAME        #KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT        # Протокол для внутренней связи (должен совпадать с KAFKA_INTER_BROKER_LISTENER_NAME)      
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:SASL_PLAINTEXT,LAN:PLAINTEXT    # Сопоставляем имена с протоколами
      KAFKA_OPTS: >-
        -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
        -Dmetadata.log.dir=/var/lib/kafka/metadata
        -DHOSTNAME=utm-kafka41
        -javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-1.5.0.jar=9192:/opt/jmx-exporter/kafka-jmx-config.yaml
      # -javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-0.18.0.jar=9192:/opt/jmx-exporter/kafka-jmx-config.yaml
      # -Dcom.sun.management.jmxremote=true
      # -Dcom.sun.management.jmxremote.port=19096
      # -Dcom.sun.management.jmxremote.authenticate=false
      # -Dcom.sun.management.jmxremote.ssl=false
      # -Djava.rmi.server.hostname=localhost
      # -Djava.rmi.server.port=19096
      # KAFKA_AUTHORIZER_CLASS_NAME: org.apache.kafka.image.authorization.Authorizer      # Класса авторизатора в Apache Kafka. Указанное значение - современная реализация для режима KRaft (без ZooKeeper)
      # KAFKA_AUTHORIZER_CLASS_NAME: org.apache.kafka.common.security.authorizer.StandardAuthorizer
      # KAFKA_OPTS: "-Dsuper.users=User:${KAFKA_ADMIN1_USER},User: ${KAFKA_USER1_USER},User:${KAFKA_EXPORTER_USER}"
      # KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"                # Управляет поведением авторизатора, когда для запрашиваемого ресурса нет явных ACL‑правил

      ###########################################################
      # Основные параметры
      ###########################################################
      CLUSTER_ID: 'a411ihTyNdP54XyQ95hGwm'     
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:19092,CONTROLLER://localhost:19093,EXTERNAL://0.0.0.0:19094,LAN://0.0.0.0:19095      # На каких сетевых интерфейсах и портах брокер Kafka «слушает» входящие соединения
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:19092,EXTERNAL://192.168.4.11:19094,LAN://192.168.4.11:19095            # Это конечная точка, которую клиент Kafka будет отправлять и прослушивать
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT                 # Задаёт имя слушателя (listener), используемого для внутренней коммуникации между брокерами в кластере
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1                   # Фактор репликации для внутреннего топика __consumer_offsets_v2
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1           # Фактор репликации для внутреннего топика __transaction_state
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1                      # Минимальное число синхронных реплик (ISR, In‑Sync Replicas) для партиций внутреннего топика __transaction_state
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0                   # Задержка перед стартом первого ребаланса в новой группе консьюмеров
      KAFKA_NUM_PARTITIONS: 3                                     # Количество партиций по умолчанию для вновь создаваемых топиков
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 1   # Коэффициент репликации для темы состояния группы общего доступа
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 1              # Переопределяет min.insync.replicas для темы состояния группы общего доступа
      KAFKA_LOG_DIRS: /var/lib/kafka/data                         # Определяет директории, где Kafka хранит файлы логов (данные топиков)
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: false                      # Управляет автоматическим созданием топиков в кластере
      KAFKA_LOG_RETENTION_HOURS: 168                              # Определяет максимальное время хранения сегментов логов (в часах) для топиков Kafka

      ###########################################################
      # Служебные параметры
      ###########################################################
      KAFKA_HEAP_OPTS: '-Xmx2G -Xms2G'                            # Настройка размера кучи (heap) JVM, в которой работает брокер Kafka

    volumes:
      - utm-kafka41-data:/var/lib/kafka/data
      - utm-kafka41-metadata:/var/lib/kafka/metadata
      - ./kafka_server_jaas.conf:/etc/kafka/kafka_server_jaas.conf
      - ./jmx-exporter:/opt/jmx-exporter
    ports:
      - "19092:19092"
      - "19093:19093"
      - "19094:19094"
      - "19095:19095"
      - "9192:9192"   # Мониторинг
    healthcheck:
      test: ["CMD", "kafka-topics", "--list", "--bootstrap-server", "localhost:19092"]
      interval: 30s
      retries: 5
      timeout: 10s

  # Provectus Kafka UI
  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: utm-kafka-ui
    restart: always
    depends_on:
      # - utm-cp-kafka37
      - utm-kafka41
    ports:
      - '8080:8080'
    environment:
      DYNAMIC_CONFIG_ENABLED: 'false'        # Возможность динамического изменения настроек топиков и брокеров через веб‑интерфейс
      # DYNAMIC_CONFIG_LOCATION: "/etc/kafkaui/dynamic_config.yaml"     # Альтернатива переменным окружения для конфигурации Kafka UI
      AUTH_TYPE: LOGIN
      SPRING_SECURITY_USER_NAME: ${KAFKA_UIADMIN_USER}
      SPRING_SECURITY_USER_PASSWORD: ${KAFKA_UIADMIN_PASS}

      # Кластер 0. Подключение к utm-cp-kafka37 в режиме SASL_PLAINTEXT (по логину/паролю)
      KAFKA_CLUSTERS_0_NAME: utm-cp-kafka37-sasl-admin
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: 192.168.4.11:9094
      KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL: SASL_PLAINTEXT
      KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM: PLAIN
      KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG: >
        org.apache.kafka.common.security.plain.PlainLoginModule required
        username="${KAFKA_ADMIN1_USER}"
        password="${KAFKA_ADMIN1_PASS}";

      # Кластер 1. Подключение к utm-cp-kafka37 в режиме PLAINTEXT (без авторизации)
      KAFKA_CLUSTERS_1_NAME: utm-cp-kafka37-plaintext
      KAFKA_CLUSTERS_1_BOOTSTRAPSERVERS: 192.168.4.11:9095
      KAFKA_CLUSTERS_1_PROPERTIES_SECURITY_PROTOCOL: PLAINTEXT

      # Кластер 2. Подключение к utm-kafka41 в режиме SASL_PLAINTEXT (по логину/паролю)
      KAFKA_CLUSTERS_2_NAME: utm-kafka41-sasl-admin
      KAFKA_CLUSTERS_2_BOOTSTRAPSERVERS: 192.168.4.11:19094
      KAFKA_CLUSTERS_2_PROPERTIES_SECURITY_PROTOCOL: SASL_PLAINTEXT
      KAFKA_CLUSTERS_2_PROPERTIES_SASL_MECHANISM: PLAIN
      KAFKA_CLUSTERS_2_PROPERTIES_SASL_JAAS_CONFIG: >
        org.apache.kafka.common.security.plain.PlainLoginModule required
        username="${KAFKA_ADMIN1_USER}"
        password="${KAFKA_ADMIN1_PASS}";

      # Кластер 3. Подключение к utm-kafka41 в режиме PLAINTEXT (без авторизации)
      KAFKA_CLUSTERS_3_NAME: utm-kafka41-plaintext
      KAFKA_CLUSTERS_3_BOOTSTRAPSERVERS: 192.168.4.11:19095
      KAFKA_CLUSTERS_3_PROPERTIES_SECURITY_PROTOCOL: PLAINTEXT
```

</details>

**.env**

<details>

<summary>Содержимое файла <strong>.env</strong></summary>

```apache
KAFKA_ADMIN1_USER=admin
KAFKA_ADMIN1_PASS=<пароль для пользователя admin>

KAFKA_USER1_USER=maxim
KAFKA_USER1_PASS=<пароль для пользователя maxim>

KAFKA_USER2_USER=andrew
KAFKA_USER2_PASS=<пароль для пользователя andrew>

KAFKA_EXPORTER_USER=exporter
KAFKA_EXPORTER_PASS=<пароль для пользователя exporter>

KAFKA_UIADMIN_USER=uiadmin
KAFKA_UIADMIN_PASS=<пароль для пользователя uiadmin>
```

</details>

**kafka\_server\_jaas.conf**

<details>

<summary>Содержимое файла kafka_server_jaas.conf</summary>

```json
KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="<пароль для пользователя admin>"
    user_admin="<пароль для пользователя admin>"
    user_maxim="<пароль для пользователя maxim>"
    user_andrew="<пароль для пользователя andrew>"
    user_exporter="<пароль для пользователя exporter>";
};

KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="<пароль для пользователя admin>";
};
```

</details>

В папке `mb-projects` создать папку проекта `utm-kafka/docker-kafka-exporter` и создать следующие файлы:

**compose.yaml**

<details>

<summary>Содержимое файла <strong>compose.yaml</strong></summary>

```yaml
services:
  rabbitmq-exporter:
    image: kbudde/rabbitmq-exporter:v1.4
    restart: always
    container_name: rabbitmq-exporter-utm-rabbitmq4
    environment:
      - RABBIT_URL=http://${RABBITMQ_USER_EXPORTER}:${RABBITMQ_USER_EXPORTER_PASSWORD}@192.168.4.11:15672
      - RABBIT_USER=${RABBITMQ_USER_EXPORTER}
      - RABBIT_PASS=${RABBITMQ_USER_EXPORTER_PASSWORD}
      - PUBLISH_PORT=9419
    ports:
      - "9419:9419"
```

</details>

**.env**

<details>

<summary>Содержимое файла <strong>.env</strong></summary>

```apache
# Exporter for Prometheus
KAFKA_EXPORTER_USER=exporter
KAFKA_EXPORTER_PASS=<пароль для пользователя exporter>
```

</details>

Сделать коммит в GitHub со всеми изменениями в репозитории mb-projects.

## Запуск Docker контейнера с Apache Kafka (2 сервера) и Provectus Kafka UI

<details>

<summary>Выполнение запуска Docker контейнера с Apache Kafka (2 сервера) и Provectus Kafka UI</summary>

Подключение репозитория mb-projects:

```bash
# Перейти в общую папку
cd  ~/github/utenkov-maxim
# Выполнить клонирование репозитория
git clone git@github.com:utenkov-maxim/mb-projects.git
# Перейти в папку репозитория mb-projects
cd mb-projects/utm-kafka/docker
```

Обновление репозитория:

```bash
# Перейти в папку репозитория mb-projects
cd  ~/github/utenkov-maxim/mb-projects
# Получить свежие данные из репозитория
git pull
# Перейти в папку проекта 
cd  ~/github/utenkov-maxim/mb-projects/utm-kafka/docker
```

Запустить контейнеры

```bash
# Запустить utm-kafka41
docker compose up -d

# Запустить utm-cp-kafka37
docker compose --profile manual up -d utm-cp-kafka37
```

Проверки:

```bash
# Посмотреть запущенные контейнеры
docker ps

# Посмотреть каталог с volume с данными БД который примонтирован к контейнеру
sudo su
cd /var/lib/docker/volumes/docker_utm-cp-kafka37-data
cd /var/lib/docker/volumes/docker_utm-cp-kafka37-metadata
cd /var/lib/docker/volumes/docker_utm-kafka41-data
cd /var/lib/docker/volumes/docker_utm-kafka41-metadata
```

Дополнительные команды:

```bash
# Логи запуска контейнера
docker logs utm-cp-kafka37
docker logs utm-kafka41
docker logs utm-kafka-ui

# Остановить utm-kafka41
docker compose down

# Остановить utm-cp-kafka37
docker compose --profile manual down utm-cp-kafka37

# Остановить контейнер
docker stop utm-cp-kafka37
docker stop utm-kafka41
docker stop utm-kafka-ui

# Войти во внутрь контейнера
docker exec -it utm-cp-kafka37 bash
docker exec -it utm-kafka41 bash

# Список всех контейнеров, включая остановленные
docker ps -a

# Удалить контейнер
docker rm utm-cp-kafka37
docker rm utm-kafka41
docker rm utm-kafka-ui

# Список volumes
docker volume ls

# Удалить volume
docker volume rm docker_utm-cp-kafka37-data
docker volume rm docker_utm-cp-kafka37-metadata
docker volume rm docker_utm-kafka41-data
docker volume rm docker_utm-kafka41-metadata

# Перезапуск контейнера
docker restart utm-cp-kafka37
docker restart utm-kafka41
docker restart utm-kafka-ui
```

</details>

Provectus Kafka UI: <http://192.168.4.11:8080/>

Метрики мониторинга:

* <http://192.168.4.11:9191/metrics>
* <http://192.168.4.11:9192/metrics>

## Дополнительная настройка Apache Kafka

<details>

<summary>Действия после первого запуска Docker контейнера с Apache Kafka</summary>

После первоначального запуска в Docker контейнеров utm-cp-kafka37 и utm-kafka41 выполняется первоначальная инициализация серверов Kafka. При этом используются данные из файла `kafka_server_jaas.conf`

Создаются пользователи:

* admin
* maxim
* andrew
* exporter

После инициализации можно сменить пароли для этих пользователей.

Для этого необходимо войти в docker контейнеры командой docker exec и поменять пароли в файле kafka\_server\_jaas.conf

</details>

## Настройка Prometheus и Grafana

Настройка Prometheus и Grafana [описана тут](/utm-docs/dokumentaciya/utm-it/resheniya/monitoring/prometheus/monitoring-rabbitmq.md)
