-
Создаём папку для приложения (
/sensor-sim). -
Далее подготавливаем файлы самого приложения:
requirements.txtв одну строку:paho-mqtt.Dockerfileдля сборки образа и установки зависимости.- Сам скрипт
sensor.py, в котором описан базовый класс Sensor и его наследники. Чтение конфигурации происходит из env-переменных.
-
Далее необходимо собрать образ и опубликовать его на Docker Hub:
docker login
docker build -t aleksandr/sensor-sim:latest .
docker push aleksandr/sensor-sim:latest- После этого создаём
docker-compose.ymlдля запуска контейнеров из опубликованного образа.
Каждый контейнер имеет свои env-переменные: SENSOR_TYPE, SENSOR_NAME и т.д.
Получаем такую картину:
- Создаём папку для MQTT Broker (
/mosquitto). - Далее подготавливаем конфиг и
docker-compose.yml - Также запускаем контейнер и проверяем открытость порта 1883:
В MQTT Explorer можно увидеть, что значения с сенсоров поступают корректно:
- Создаём подобную структуру папок:
server/
├── docker-compose.yml
├── influxdb/
│ ├── influxdb.conf
│ ├── data/
│ ├── meta/
│ └── wal/
├── telegraf/
│ └── telegraf.conf
├── grafana/
│ ├── provisioning/
│ │ ├── datasources/
│ │ │ └── default.yaml
│ │ └── dashboards/
│ │ ├── default.yaml
│ │ └── dashboard.json- После запуска контейнера
influxdbсоздаем базу данных вручную при помощи:
CREATE database sensors
USE sensors
CREATE USER telegraf WITH PASSWORD 'telegraf' WITH ALL PRIVILEGES- И конфигурируем
telegraf.conf, изменив:
[[outputs.influxdb]]
urls = ["http://influxdb:8086"] # здесь уже указан alias
database = "sensors"
username = "telegraf"
password = "telegraf"
[[inputs.mqtt_consumer]]
servers = ["tcp://192.168.0.150:1883"] # IP ВМ с MQTT
topics = ["/sensor/+"]
data_format = "value"
data_type = "float"- В
docker-compose.ymlфайле указываем одну сеть для всех контейнеров и указываем отдельно именнованые тома для Grafana и InfluxDB, также монтируем для обоих контейнеров ранее написанные конфиги. - После
docker-compose up -dнеобходимо зайти наhttp://192.168.0.149:3000(где уже ожидает графический интерфейс Grafana) и сконфигурировать вручную дашборд, предварительно добавив источник данных из InfluxDB. - JSON созданного дашборда экспортируем и сохраняем в
.../grafana/provisioning/dashboards/dashboard.json. - Перезапускаем контейнер с Grafana.
- Данные генерируются на vmA (работы сенсоров), поступают на vmB (MQTT Broker), а далее поступают на vmC (считываются Telegraf и сохраняются в InfluxDB), отображение же уже происходит в Grafana на заранее сконфигурированном дашборде.
- У всех контейнеров также реализовано сохранение настроек при помощи
restart: unless-stoppedвdocker-compose.yml.
Финальные результаты работы:
Представленные скриншоты подтверждают работоспособность системы. Все необходимые файлы приложены в репозитории.



