Данная инструкция описывает установку в среде Docker комбинированного экземпляра, в котором в одном контейнере работают два компонента:
Инструкция описывает только комбинированный образ 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) |
Пример используемой версии образа:
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присутствовать обязан — без него ЛМ ЧЗ не запустится.
Подготовить каталоги экземпляров можно двумя способами: использовать готовый архив (рекомендуется) или создать структуру вручную.
Скачайте архив с преднастроенными папками и docker-compose для двух совмещённых экземпляров и распакуйте его в каталог на жёстком диске (например на диск D:).
В архиве уже подготовлено:
docker-compose.yaml с двумя сервисами lmcz-esm1 и lmcz-esm2 (преднастроенные порты и тома);regime1 и regime2 со структурой config, data, logs и каталогом esp/{config,logs};ext.ini в config каждого экземпляра.После распаковки достаточно при необходимости отредактировать порты/имена и перейти к запуску (раздел «Первый запуск»).
Создайте рабочий каталог для развёртывания (например D:\regime).
Создайте структуру каталогов экземпляра. В 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. В готовом архиве он уже есть; при ручной подготовке используйте тот же пустой шаблон, что и для «голого» ЛМ ЧЗ. Содержимое шаблона:
[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. Можно загрузить заранее:
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):
docker load -i regime-esm_2.5.1-721_1.6.3.0.tgz
Шаг 3. Проверьте, что образ появился и тег совпадает с указанным в docker-compose.yaml:
docker images
Тег загруженного образа обязан точно совпадать со значением
image:вdocker-compose.yaml, иначе при запуске Compose снова попытается скачать образ из реестра. При необходимости переименуйте образ:docker tag <загруженный_image_id> registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0
Если нужного файла нет в списке (например, для новой версии образа), его можно подготовить на любой машине с доступом к реестру:
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:
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 — имя контейнера;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 |
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:
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 для каждого экземпляра:
image: registry.itida.ru/regime-esm:2.5.1-721_1.6.3.0
- "5063:5063"
- "50063:50063"
- ./regime1/esp/config:/etc/esp/lmcontroller
- ./regime1/esp/logs:/var/log/esp
Порт и тома ЛМ ЧЗ (config/data/logs) оставьте без изменений.
Шаг 4. Получите совмещённый образ (раздел «Получение образа») и запустите контейнеры:
docker compose up -d
При старте Контроллер сгенерирует config.yml и сертификаты в esp/config, а ЛМ ЧЗ продолжит работать с уже имеющейся базой и настройками.
docker-compose.yaml:cd D:\regime-esm
Убедитесь, что образ доступен (раздел «Получение образа») и каталоги подготовлены.
Запустите развёртывание и дождитесь его завершения:
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-утилита — см. Утилита добавления ККТ к ЕСМ/ТС ПИоТ.
# Статус контейнеров
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-файлом:
docker compose pull # либо загрузка готового файла образа — см. «Получение образа», вариант Б
docker compose stop
docker compose up -d
При закрытом реестре вместо
docker compose pullзагрузите новый образ из готового файла (docker load), как описано в разделе «Получение образа», вариант Б.
Состояние экземпляра целиком хранится в его каталоге. Для бэкапа при остановленном контейнере сохраните каталог экземпляра:
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 смонтирован и доступен на запись. |