Переключение темы
Введение
Данная инструкция описывает установку в среде Docker комбинированного экземпляра, в котором в одном контейнере работают два компонента:
- ЛМ ЧЗ (Локальный Модуль «Честный знак») — работа с маркированными товарами, проверки оффлайн по разрешительному режиму;
- Контроллер ЛМ ЧЗ (от "АО "ЕСП""") — шлюз для кассы, предоставляющий REST и gRPC (TLS) интерфейсы.
Инструкция описывает только комбинированный образ registry.itida.ru/regime-esm. Установка «голого» ЛМ ЧЗ (без контроллера), требования к системе, порядок установки Docker и Docker Compose, а также общие принципы работы с архивом преднастроенных папок подробно описаны в отдельной статье:
ИНФОРМАЦИЯ
Базовая установка ЛМ ЧЗ, требования к ОС и установка Docker: Установка Локального Модуля Честного знака в docker
ВНИМАНИЕ
Важно: Инструкция предполагает, что Docker и Docker Compose уже установлены и вы обладаете базовыми навыками работы с ними. Порядок установки Docker — см. статью по ссылке выше.
Состав комбинированного образа
Образ registry.itida.ru/regime-esm содержит внутри одного контейнера два компонента, которые стартуют совместно и взаимодействуют между собой по localhost:
| Компонент | Назначение | Порт внутри контейнера |
|---|---|---|
| ЛМ ЧЗ (regime / yenisei) | Локальный модуль «Честный знак», внутренний REST и веб-интерфейс, БД CouchDB | 5995 |
| Контроллер ЛМ (lmcontroller) | REST и gRPC (TLS) для кассы | 5063 (REST), 50063 (gRPC) |
Пример используемой версии образа:
yml
image: registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0где 2.5.1-721 — версия ЛМ ЧЗ, 1.6.3.0 — версия Контроллера ЛМ.
Структура каталогов экземпляра
Структура каталогов экземпляра полностью совпадает со структурой «голого» ЛМ ЧЗ (config, data, logs), но дополняется каталогом esp для Контроллера — он добавляется рядом, существующие каталоги ЛМ ЧЗ не меняются. Это упрощает переход с уже установленного «голого» ЛМ ЧЗ (см. раздел «Переход с голого образа ЛМ ЧЗ»).
regime-esm/ # рабочий каталог (содержимое архива)
├── docker-compose.yaml
├── regime1/ # экземпляр 1
│ ├── config/ # → /opt/regime/etc (конфиг ЛМ ЧЗ: ext.ini)
│ │ └── ext.ini # пустой шаблон из архива
│ ├── data/ # → /opt/yenisei/data (база CouchDB; при первом старте пустой)
│ ├── logs/ # → /var/log/regime (логи ЛМ ЧЗ)
│ └── esp/ # каталог Контроллера ЛМ (новое относительно голого образа)
│ ├── config/ # → /etc/esp/lmcontroller (config.yml + сертификаты; пустой)
│ └── logs/ # → /var/log/esp (логи Контроллера)
└── regime2/ # экземпляр 2 — аналогичная структураВНИМАНИЕ
Важно: каталоги data и esp/config создаются пустыми. База ЛМ ЧЗ инициализируется автоматически при первом старте, а Контроллер сам сгенерирует config.yml и набор сертификатов (ca.crt, ca.pem, server.crt, server.pem) в esp/config. Файл же config/ext.ini присутствовать обязан — без него ЛМ ЧЗ не запустится.
Подготовка каталога нового экземпляра
Подготовить каталоги экземпляров можно двумя способами: использовать готовый архив (рекомендуется) или создать структуру вручную.
Способ 1. Готовый архив (рекомендуется)
Скачайте архив с преднастроенными папками и docker-compose для двух совмещённых экземпляров и распакуйте его в каталог на жёстком диске (например на диск D:).
В архиве уже подготовлено:
docker-compose.yamlс двумя сервисамиlmcz-esm1иlmcz-esm2(преднастроенные порты и тома);- каталоги
regime1иregime2со структуройconfig,data,logsи каталогомesp/{config,logs}; - пустой шаблон
ext.iniвconfigкаждого экземпляра.
После распаковки достаточно при необходимости отредактировать порты/имена и перейти к запуску (раздел «Первый запуск»).
Способ 2. Создание структуры вручную
Создайте рабочий каталог для развёртывания (например
D:\regime).Создайте структуру каталогов экземпляра. В PowerShell:
powershell
$base = "regime1"
New-Item -ItemType Directory -Force -Path `
"$base\config", "$base\data", "$base\logs", `
"$base\esp\config", "$base\esp\logs" | Out-Null- Положите пустой шаблон
ext.iniвregime1\config\.
Пустой конфиг ЛМ ЧЗ (ext.ini)
ЛМ ЧЗ не запустится без файла ext.ini. В готовом архиве он уже есть; при ручной подготовке используйте тот же пустой шаблон, что и для «голого» ЛМ ЧЗ. Содержимое шаблона:
ini
[api]
login = admin
password = admin
[remote]
service_url = https://rsapi.crpt.ru
proxy_host =
proxy_port =
proxy_user =
proxy_password =Скопируйте файл ext.ini из архива в regime1\config\ext.ini.
ИНФОРМАЦИЯ
ЛМ ЧЗ при первом старте сам дополнит ext.ini остальными параметрами (идентификатор экземпляра, реквизиты БД и т.п.) и зашифрует логины и пароли. Вручную дописывать ничего не нужно — окончательная настройка и активация выполняются после старта (см. раздел «Инициализация ЛМ ЧЗ»).
Получение образа
Перед запуском образ registry.itida.ru/regime-esm:<версия> должен присутствовать на хосте. Возможны два варианта.
Вариант А. Загрузка из реестра (основной)
Если хост имеет доступ к registry.itida.ru, образ подтянется автоматически при docker compose up -d. Можно загрузить заранее:
bash
docker pull registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0Вариант Б. Загрузка из готового файла (при региональных блокировках / белых списках)
Если целевой хост не может скачать образ из реестра (региональные блокировки интернета, белые списки, закрытый периметр), используйте заранее подготовленный файл образа — отдельный ПК с доступом к реестру при этом не требуется.
Шаг 1. Скачайте файл образа нужной версии:
| Версия (ЛМ ЧЗ + Контроллер) | Файл образа |
|---|---|
2.5.1-721_1.6.3.0 | Скачать (.tgz, ~180 МБ) |
Шаг 2. Загрузите образ из скачанного файла на целевом хосте (Docker сам распакует gzip):
bash
docker load -i regime-esm_2.5.1-721_1.6.3.0.tgzШаг 3. Проверьте, что образ появился и тег совпадает с указанным в docker-compose.yaml:
bash
docker imagesВНИМАНИЕ
Тег загруженного образа обязан точно совпадать со значением image: в docker-compose.yaml, иначе при запуске Compose снова попытается скачать образ из реестра. При необходимости переименуйте образ:
bash
docker tag <загруженный_image_id> registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0Как самостоятельно сделать файл образа
Если нужного файла нет в списке (например, для новой версии образа), его можно подготовить на любой машине с доступом к реестру:
bash
docker pull registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0
docker save registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0 | gzip > regime-esm_2.5.1-721_1.6.3.0.tgzПолученный файл regime-esm_<версия>.tgz переносится на целевой хост и загружается командой docker load -i (шаги 2–3 выше).
Файл docker-compose.yaml для одного экземпляра
Создайте в рабочем каталоге файл docker-compose.yaml:
yml
services:
lmcz-esm1:
image: registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0
container_name: lmcz-esm1
restart: always
ports:
- "5997:5995" # ЛМ ЧЗ (regime), внутренний REST / веб-интерфейс
- "5063:5063" # Контроллер ЛМ, REST (порт для кассы)
- "50063:50063" # Контроллер ЛМ, gRPC (TLS, основной порт для кассы)
volumes:
- ./regime1/config:/opt/regime/etc # конфиг ЛМ ЧЗ (ext.ini)
- ./regime1/data:/opt/yenisei/data # база данных ЛМ ЧЗ (CouchDB/yenisei)
- ./regime1/logs:/var/log/regime # логи ЛМ ЧЗ
- ./regime1/esp/config:/etc/esp/lmcontroller # config.yml + сертификаты Контроллера
- ./regime1/esp/logs:/var/log/esp # логи КонтроллераПорты указываются в формате хост:контейнер:
5997:5995— веб-интерфейс/REST ЛМ ЧЗ, доступен поhttp://<адрес_хоста>:5997;5063:5063— REST Контроллера (к нему обращается касса);50063:50063— gRPC Контроллера по TLS (основной канал кассы).
Внутренние порты контейнера (правая часть: 5995, 5063, 50063) менять не нужно — при размещении нескольких экземпляров меняются только host-порты (левая часть).
Развертывание нескольких экземпляров на одном хосте
На одном хосте можно поднять несколько комбинированных экземпляров. Для каждого экземпляра нужно сделать уникальными три вещи:
container_name— имя контейнера;- host-порты (левая часть в
ports) — не должны пересекаться между собой и с другими службами; - каталоги томов — отдельный каталог под каждый экземпляр.
Внутренние порты контейнера остаются прежними.
Рекомендуемая схема портов
| Экземпляр | Каталог | container_name | ЛМ ЧЗ (web) | Контроллер REST | Контроллер gRPC |
|---|---|---|---|---|---|
| 1 | regime1 | lmcz-esm1 | 5997:5995 | 5063:5063 | 50063:50063 |
| 2 | regime2 | lmcz-esm2 | 5998:5995 | 5064:5063 | 50064:50063 |
| 3 | regime3 | lmcz-esm3 | 5999:5995 | 5065:5063 | 50065:50063 |
Пример docker-compose.yaml на два экземпляра
yml
services:
lmcz-esm1:
image: registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0
container_name: lmcz-esm1
restart: always
ports:
- "5997:5995"
- "5063:5063"
- "50063:50063"
volumes:
- ./regime1/config:/opt/regime/etc
- ./regime1/data:/opt/yenisei/data
- ./regime1/logs:/var/log/regime
- ./regime1/esp/config:/etc/esp/lmcontroller
- ./regime1/esp/logs:/var/log/esp
lmcz-esm2:
image: registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0
container_name: lmcz-esm2
restart: always
ports:
- "5998:5995"
- "5064:5063"
- "50064:50063"
volumes:
- ./regime2/config:/opt/regime/etc
- ./regime2/data:/opt/yenisei/data
- ./regime2/logs:/var/log/regime
- ./regime2/esp/config:/etc/esp/lmcontroller
- ./regime2/esp/logs:/var/log/espИНФОРМАЦИЯ
Для каждого экземпляра заранее создайте свой каталог (regime1, regime2, …) по структуре из раздела «Структура каталогов экземпляра» и положите в config/ext.ini пустой шаблон.
Переход с голого образа ЛМ ЧЗ
Если у вас уже развёрнут «голый» ЛМ ЧЗ (по базовой инструкции), переход на совмещённый образ выполняется без перестроения каталогов — структура config/data/logs сохраняется как есть, к каждому экземпляру лишь добавляется каталог esp, а в docker-compose.yaml меняется образ и добавляются порты и тома Контроллера.
ВНИМАНИЕ
Перед началом сделайте резервную копию всего рабочего каталога (regime1, regime2 с их config/data/logs). В них хранится активированный ЛМ ЧЗ и база данных.
Шаг 1. Остановите текущие контейнеры в каталоге с docker-compose.yaml:
bash
docker compose downШаг 2. Из готового архива скопируйте каталог esp (с подкаталогами config и logs) в каждый каталог экземпляра — рядом с существующими config/data/logs:
regime1\esp\config
regime1\esp\logs
regime2\esp\config
regime2\esp\logsКаталоги config, data, logs не трогайте — они остаются с вашими данными.
Шаг 3. Отредактируйте docker-compose.yaml для каждого экземпляра:
- замените образ на совмещённый:yml
image: registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0 - добавьте проброс портов Контроллера (каждому экземпляру — свои уникальные host-порты, см. таблицу портов):yml
- "5063:5063" - "50063:50063" - добавьте два тома Контроллера:yml
- ./regime1/esp/config:/etc/esp/lmcontroller - ./regime1/esp/logs:/var/log/esp
Порт и тома ЛМ ЧЗ (config/data/logs) оставьте без изменений.
Шаг 4. Получите совмещённый образ (раздел «Получение образа») и запустите контейнеры:
bash
docker compose up -dПри старте Контроллер сгенерирует config.yml и сертификаты в esp/config, а ЛМ ЧЗ продолжит работать с уже имеющейся базой и настройками.
Первый запуск
- Откройте командную строку или PowerShell и перейдите в каталог с
docker-compose.yaml:
cmd
cd D:\regime-esmУбедитесь, что образ доступен (раздел «Получение образа») и каталоги подготовлены.
Запустите развёртывание и дождитесь его завершения:
bash
docker compose up -dЧто произойдёт при первом старте:
- ЛМ ЧЗ считает пустой
ext.ini, инициализирует базу CouchDB вdata, дозаполнитext.iniи зашифрует логины/пароли. - Контроллер сгенерирует
config.ymlи сертификаты вesp/config, поднимет REST (5063) и gRPC (50063). До настройки ЛМ ЧЗ статус будетnot_configured— это нормально.
После успешного развёртывания запущенные контейнеры отобразятся в Docker Desktop, а в каталоге regime1/esp/config/ появятся config.yml и сертификаты.
Инициализация ЛМ ЧЗ
Окончательная настройка и инициализация ЛМ ЧЗ выполняется экземпляром ТС ПИоТ. Оркестратор ЕСМ опрашивает контроллер ЛМ ЧЗ, тот в свою очередь получает статус ЛМ ЧЗ и при статусе "Не сконфигурирован" сам выполняет метод SafeInit, которая и запускает процедуру инициализации ЛМ ЧЗ.
Логин/пароль по умолчанию — admin / admin. Дальнейшее подключение к Айтида iMark выполняются по общей инструкции: Подключение локального модуля к Айтида iMark.
ИНФОРМАЦИЯ
Для добавления кассы (ККТ) к экземпляру ЕСМ/ТС ПИоТ предусмотрена отдельная GUI-утилита — см. Утилита добавления ККТ к ЕСМ/ТС ПИоТ.
Проверка работоспособности
bash
# Статус контейнеров
docker compose ps
# Логи конкретного экземпляра
docker compose logs -f lmcz-esm1Логи также доступны в смонтированных каталогах на хосте:
- ЛМ ЧЗ:
regime1/logs/regime.log,yenisei.log; - Контроллер:
regime1/esp/logs/lmcontroller/lmcontroller.log.
Признаки нормального старта в логе Контроллера:
Сервер REST слушает порт 5063
Сервер gRPC v2.1 слушает порт 50063
Статус ЛМ ЧЗ 2.0 получен: версия=2.5.1-721, статус=not_configured, режим=activeОбновление
Для обновления версии измените тег образа в image: файла docker-compose.yaml на новый, затем выполните в каталоге с compose-файлом:
bash
docker compose pull # либо загрузка готового файла образа — см. «Получение образа», вариант Б
docker compose stop
docker compose up -dИНФОРМАЦИЯ
При закрытом реестре вместо docker compose pull загрузите новый образ из готового файла (docker load), как описано в разделе «Получение образа», вариант Б.
Резервное копирование
Состояние экземпляра целиком хранится в его каталоге. Для бэкапа при остановленном контейнере сохраните каталог экземпляра:
bash
docker compose stop lmcz-esm1
# скопировать каталог regime1 целиком (config, data, esp/config)
docker compose start lmcz-esm1Критично важны для восстановления:
config/ext.ini— настроенный и зашифрованный конфиг ЛМ ЧЗ;data— база данных ЛМ ЧЗ;esp/config—config.ymlи сертификаты Контроллера.
Типовые проблемы
| Симптом | Причина и решение |
|---|---|
| Контейнер ЛМ ЧЗ не стартует / падает сразу | Отсутствует ext.ini в config. Положите пустой шаблон. |
docker compose up пытается скачать образ и падает по сети | Нет доступа к registry.itida.ru. Загрузите образ из готового файла (раздел «Получение образа», вариант Б) и проверьте совпадение тега. |
После docker load Compose всё равно тянет образ из реестра | Тег загруженного образа не совпадает с image: в compose. Переименуйте через docker tag. |
Порт занят (bind: address already in use) | Конфликт host-портов между экземплярами или с другими службами. Назначьте уникальные host-порты. |
Статус not_configured в логах | Нормально до инициализации ЛМ ЧЗ со стороны ТС ПИоТ. |
Каталог esp/config пуст, сертификаты не появились | Контроллер не стартовал. Проверьте esp/logs/lmcontroller/lmcontroller.log и что каталог esp/config смонтирован и доступен на запись. |
