Развёртывание и запуск PTL
Пошаговое руководство по установке, настройке и запуску системы управления световыми модулями комплектации.
Требования
Для запуска PTL необходимы:
- Docker и Docker Compose (рекомендуется)
- Redis 7+ — хранение состояния модулей, подписки на события
- Сетевой доступ к контроллерам по протоколу Modbus TCP (порт 502)
Если планируется сборка без Docker:
- Go 1.25 или новее
- ОС: Linux (рекомендуется)
Конфигурация
Настройки задаются через JSON-файл. По умолчанию сервис ищет файл по пути /etc/fontera_ptl/config.json. Путь можно переопределить переменной APP_CONFIG или флагом -config.
Пример файла конфигурации
{
"controllers": [
{
"ip": "192.168.0.199",
"port": 502,
"start_id": 1,
"end_id": 30
}
],
"redis_url": "redis://127.0.0.1:6379",
"demo": false,
"debug": false,
"clean_ptl_on_startup": true,
"poll_interval_ms": 250,
"reconcile_interval_sec": 5
}
Основные параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
controllers | [] | Список контроллеров (см. ниже) |
redis_url | redis://127.0.0.1:6379 | Адрес подключения к Redis |
demo | false | Демо-режим без оборудования |
debug | false | Режим отладки |
log_level | info | Уровень журнала: debug, info, warn, error |
log_file | — | Путь к файлу журнала |
clean_ptl_on_startup | false | Сбросить все модули при старте |
api_host | 0.0.0.0 | Адрес прослушивания |
api_port | 8000 | Порт прослушивания |
Параметры фоновых процессов
| Параметр | По умолчанию | Описание |
|---|---|---|
poll_interval_ms | 250 | Интервал опроса оборудования (мс) |
poll_only_active | true | Опрашивать только активные модули |
reconcile_interval_sec | 5 | Интервал синхронизации состояния (сек.) |
apply_timeout_sec | 10 | Тайм-аут записи на контроллер (сек.) |
modbus_timeout_sec | 2 | Тайм-аут Modbus-соединения (сек.) |
broadcast_delay_ms | 1000 | Задержка широковещательных операций (мс) |
monitor_interval_sec | 5 | Интервал пинга контроллеров (сек.) |
task_concurrency | parallel | Режим выполнения задач: parallel или exclusive |
unit_degrade_threshold | 5 | Количество последовательных ошибок до статуса «degraded» |
unit_unreachable_threshold | 30 | Количество ошибок до статуса «unreachable» |
health_scan_interval_sec | 0 | Интервал сканирования здоровья всех модулей (0 = отключено) |
log_file | — | Путь к файлу журнала (по умолчанию — stdout) |
log_max_size_mb | 100 | Максимальный размер файла журнала (МБ) |
log_max_files | 5 | Количество ротируемых файлов журнала |
Настройка контроллеров
Каждый контроллер — это Ethernet-шлюз Modbus, к которому подключены световые модули. В массиве controllers описывается каждый шлюз и диапазон адресов его устройств.
{
"controllers": [
{
"ip": "192.168.0.199",
"port": 502,
"start_id": 1,
"end_id": 30,
"device_type": "2Sub_4Count"
},
{
"ip": "192.168.0.100",
"port": 502,
"start_id": 1,
"end_id": 102,
"device_type": "0Sub_6Count"
}
]
}
| Поле | Описание |
|---|---|
ip | IP-адрес контроллера |
port | Порт Modbus (обычно 502) |
start_id | Начальный адрес модуля |
end_id | Конечный адрес модуля (макс. 247) |
device_type | Тип устройства (см. ниже) |
Типы устройств
| Тип | Основное табло | Дополнительное |
|---|---|---|
2Sub_4Count | 4 разряда | 2 разряда |
0Sub_6Count | 6 разрядов | нет |
0Sub_4Count | 4 разряда | нет |
0Sub_3Count | 3 разряда | нет |
0Sub_2Count | 2 разряда | нет |
Запуск через Docker
Docker Compose (с Redis)
services: redis: image: redis:7-alpine ports: - "6379:6379" deploy: resources: limits: memory: 128M ptl: image: ptl-api:3.0 ports: - "8001:8000" environment: APP_CONFIG: /etc/fontera_ptl/config.json REDIS_URL: redis://redis:6379 volumes: - ./config.json:/etc/fontera_ptl/config.json:ro depends_on: - redis deploy: resources: limits: memory: 256M restart: unless-stopped
docker compose up -d
Сборка образа
# Через Makefile make docker # Или вручную docker build -t ptl-api:3.0 .
Запуск без Docker
# Сборка make build # Запуск ./bin/ptl-api -config ./config.json # С указанием хоста и порта ./bin/ptl-api -config ./config.json -host 0.0.0.0 -port 8000
Флаги командной строки
| Флаг | По умолчанию | Описание |
|---|---|---|
-config | /etc/fontera_ptl/config.json | Путь к файлу конфигурации |
-host | 0.0.0.0 | Адрес прослушивания |
-port | 8000 | Порт прослушивания |
Переменные окружения
| Переменная | По умолчанию | Описание |
|---|---|---|
APP_CONFIG | /etc/fontera_ptl/config.json | Путь к файлу конфигурации |
REDIS_URL | redis://127.0.0.1:6379 | Адрес подключения к Redis |
API_HOST | 0.0.0.0 | Адрес прослушивания |
API_PORT | 8000 | Порт прослушивания |
DEBUG | false | Режим отладки (true или 1) |
LOG_LEVEL | info | Уровень журнала |
Приоритет применения настроек (от низшего к высшему):
- Значения по умолчанию в коде
- JSON-файл конфигурации
- Переменные окружения
- Флаги командной строки
Вебхуки
Система может отправлять HTTP POST-уведомления о событиях на внешние URL. Вебхуки настраиваются глобально и/или для каждого контроллера отдельно.
Поддерживаемые события
| Событие | Описание |
|---|---|
button | Оператор нажал кнопку на PTL-модуле |
task_confirmed | Все модули задачи подтверждены |
task_completed | Задача завершена |
task_timeout | Задача не выполнена в срок |
task_cancelled | Задача отменена |
controller_online | Контроллер стал доступен |
controller_offline | Контроллер перестал отвечать |
Тайм-аут запроса — 5 секунд. Отправка выполняется асинхронно и не блокирует основной процесс.
Проверка работоспособности
# Быстрая проверка curl http://localhost:8000/_ping # Ответ: pong # Доступность контроллеров curl http://localhost:8000/alive # Ответ: # [ # {"controller_ip": "192.168.0.199", "controller_port": 502, "reachable": true}, # {"controller_ip": "192.168.0.100", "controller_port": 502, "reachable": false} # ] # Список контроллеров и статус curl http://localhost:8000/controllers # Метрики (Prometheus) curl http://localhost:8000/metrics
Фоновые процессы
PTL запускает несколько фоновых процессов для работы с оборудованием:
Опросчик (Poller)
Периодически считывает состояние модулей с контроллеров. Обнаруживает нажатия кнопок и публикует события.
- Интервал:
poll_interval_ms(по умолчанию 250 мс) - Если
poll_only_activeвключён — опрашиваются только модули с заданным целевым состоянием - Не запускается в демо-режиме
Синхронизатор (Reconciler)
Сравнивает целевое и фактическое состояние модулей. Если есть расхождение — записывает нужное значение на контроллер.
- Срабатывает по подписке или каждые
reconcile_interval_secсекунд - Тайм-аут записи:
apply_timeout_sec(по умолчанию 10 сек.)
Планировщик шины (Bus Scheduler)
Управляет очередью Modbus-операций записи для каждого контроллера. Один планировщик на каждый контроллер.
Демо-режим
Для тестирования без оборудования установите "demo": true в конфигурации. В этом режиме:
- Опрос оборудования отключён
- Modbus-подключения не создаются
- Состояние модулей хранится только в Redis
- Доступен эндпоинт
POST /pressдля эмуляции нажатия кнопки
Для быстрого старта. Включите демо-режим, чтобы протестировать интеграцию с АКС Комплекс до поставки оборудования.
Важные замечания
Redis обязателен. Без Redis сервис не запустится. Redis используется для хранения состояния, подписок на события и потоковой записи истории.
- Порт 502. Контроллеры работают по стандартному порту Modbus TCP. Убедитесь, что между сервером PTL и контроллерами нет сетевых ограничений.
- Адреса устройств. Максимум 247 устройств на контроллер (
end_id≤ 247). Диапазоны разных контроллеров могут пересекаться. - Очистка при старте. Параметр
clean_ptl_on_startupудаляет все записи состояния в Redis. Рекомендуется при первичной настройке. - Журналирование. По умолчанию журнал выводится в stdout. Для записи в файл укажите
log_file. Ротация — по размеру (100 МБ) и количеству (5 файлов). - Часовой пояс. В Docker-контейнере установлен
Europe/Moscow. - Ограничение памяти. В Docker Compose рекомендуется ограничение 256 МБ для сервиса и 128 МБ для Redis.