Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
3a3c4f3
new
hanz0m4 May 22, 2024
7624828
Add files via upload
hanz0m4 May 22, 2024
31fed25
Rename mqtt.json to vms/server/infra/grafana/provisioning/dashboard/m…
hanz0m4 May 22, 2024
5d4cd8d
Update README.md
hanz0m4 May 22, 2024
8ed990b
Create docker-compose.yml
hanz0m4 May 22, 2024
0d858ac
Delete vms/gateway/mosquitto/mosquitto.conf
hanz0m4 May 22, 2024
02514af
Delete guide/manual.md
hanz0m4 May 22, 2024
43fba52
Add files via upload
hanz0m4 May 22, 2024
5e8c477
Rename Dockerfile.jpeg to assets /images/Dockerfile.jpeg
hanz0m4 May 22, 2024
afddd0a
Rename Grafana on.jpg to assets /images/Grafana on.jpg
hanz0m4 May 22, 2024
5ba6efa
Rename InfluxDB в графана.jpg to assets /images/InfluxDB в графана.jpg
hanz0m4 May 22, 2024
e2d83bf
Rename docker-compose для client.jpg to assets /images/docker-compose…
hanz0m4 May 22, 2024
afa1dea
Rename docker-compose для gateway.jpg to assets /images/docker-compos…
hanz0m4 May 22, 2024
a18edf6
Rename mosquitto.conf.jpg to assets /images/mosquitto.conf.jpg
hanz0m4 May 22, 2024
04652ef
Rename mqqt.jpg to assets /images/mqqt.jpg
hanz0m4 May 22, 2024
30275e4
Rename telegraf.jpg to assets /images/telegraf.jpg
hanz0m4 May 22, 2024
f27b077
Rename Запуск брокера.jpeg to assets /images/Запуск брокера.jpeg
hanz0m4 May 22, 2024
35d221d
Rename Графана.jpg to assets /images/Графана.jpg
hanz0m4 May 22, 2024
7385e87
Rename Изменение main.jpeg to assets /images/Изменение main.jpeg
hanz0m4 May 22, 2024
cb9e075
Rename Образы.jpg to assets /images/Образы.jpg
hanz0m4 May 22, 2024
7923e5d
Rename Коннект к брокеру.jpeg to assets /images/Коннект к брокеру.jpeg
hanz0m4 May 22, 2024
c3e3002
Rename Отображение данных.jpg to assets /images/Отображение данных.jpg
hanz0m4 May 22, 2024
f5c3617
Rename Создание класса.jpeg to assets /images/Создание класса.jpeg
hanz0m4 May 22, 2024
9b3f20a
Rename Создание образа.jpeg to assets /images/Создание образа.jpeg
hanz0m4 May 22, 2024
14c6f44
Rename Сенсоры и графики.jpg to assets /images/Сенсоры и графики.jpg
hanz0m4 May 22, 2024
cd7281a
Rename DockerTask.png to imagesDockerTask.png
hanz0m4 May 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 123 additions & 55 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,63 +1,131 @@
# Введение
Данная практика посвещена базовым принципам Docker. Для выполнения практики необходимо использовать 3 виртуальные машины Linux.
Данная практика посвещена базовым принципам Docker. Для выполнения практики необходимо развернуть контейнеры на локальном хосте.

# Задание

Необходимо развернуть следующую систему:

![image](assets/images/DockerTask.png)

Симуляторы сенсоров, развернутые в докер контейнерах, публикуют сообщения на Mqtt брокер. Сервис Consumer подписывается на все сообщение,
опубликованные в брокере, и заносит их в базу данных временных рядов. Сервис dashboard отображает графики полученных данных от сервисов.

Для выполнения данного задания необходимо:
1. Использовать три виртуальные машины из предыдущей практики. Установить на каждой docker и docker-compose.

2. Linux A.
1. Разработать скрипты - симулятор технологических данных. Создать класс Sensor, а также наследников этого класса (указать 4 реально существующих типа датчиков, например, температура, давление, потребляемый ток).
2. В основной программе реализовать клиента, который подключается к mqtt брокеру и публикует сообщения.
3. Конфигурацию типов датчиков вывести через переменные среды
4. Запуск реализовать с помощью докер контейнеров. Для запуска нескольких типов использовать docker-compose.
5. В итоге сделать 4 типа датчиков, запустить 6 контейнеров разных типов, где задается:
* тип датчика
* название датчика
* дискретность публикации сообщений
* (ДОП ЗАДАЧА, НЕОБЯЗАТЕЛЬНО) тип формулы (подумайте как можно через конфигурацию повлиять на характер генерации нового числа)
* в формуле предусмотрите в качестве операнда дату вашего рождения (например умножение на год рождения или месяц)
* (ДОП ЗАДАЧА, НЕОБЯЗАТЕЛЬНО) тип топика (json формат (topic - /sensor/type, value {"name":"sensor1", "value": 22.4} ) или значение в конкретный топик (topic - /sensor/type/value, value - 22.4))
6. Залить на свою страницу в докерхаб созданный image контейнера в публичный репозиторий.

3. Linux B
1. Развернуть mosquitto брокер с помощью docker. Настроить проброс портов, необходимый для работы приложения.
2. Настроить конфигурационный файл для брокера. Использовать volume для подгрузки файла в докер.
3. В файрволе открыть порт, необходимый для работы брокера.
4. Linux C
1. Развернуть influxdb (1.8 версия), telegraf, grafana с помощью docker-compose
2. Настроить подписку телеграфа на mqtt топики брокера
3. Сохранять все сообщения в influxdb
4. В grafana вывести дашборды с текущими значениями всех датчиков и агрегированными показаниями (среднее значение по всем датчикам) - сделать скриншот
5. Необходимо создать volume для каждого контейнера с конфигурационными файлами. (ДОП ЗАДАЧА, НЕОБЯЗАТЕЛЬНО) При пересоздании контейнеров конфигурация дашбордов должна сохранится (без самих данных).
6. В конфигурационных файлах ссылаться по alias контейнеров (не по ip адресам)
5. При загрузки задания в гит репозиторий создать две ветки develop и master. В master загрузить только readme - задание.
В ветку develop - загружаем сделанное задание. Как только отправляете мне на проверку задание, создаете пул реквест в ветку мастер и назначаете меня ревьювером. Таким образом я смогу комментировать ваш репозиторий.
6. Оформить инструкцию в виде Markdown файла. Приложить конфигурационные файлы в репозиторий.
Критерием успеха выполнения задания будет являтся также написанная инструкция по запуску ваших контейнеров. То есть, если я загружу с докерхаба ваш image, запущу docker-compose файлы на своих виртуальных машинах, и при этом смогу зайти в интерфейс и посмотреть дашборд с потоком данных, то задание выполнено.

Репозиторий оформить следующим образом:
- root
- assets
- images - картинки для отчета
- vms
- client
- simulator - код симулятора и докерфайл
- gateway
- mosquitto - папка с конфигом для mosquitto + sh скрипт по запуску докера
- server
- grafana - конфиги для тома графаны
- influxdb - конфиги для тома инфлукса
- telegraf - конфиги для тома телеграфа
- docker-compose.yml

- report.md - Отчет markdown

P.S. опираться можно на данную [статью](https://coderlessons.com/articles/programmirovanie/raspberry-pi-iot-datchiki-influxdb-mqtt-i-grafana)
Симуляторы сенсоров, развернутые в докер контейнерах, публикуют сообщения на Mqtt брокер. Сервис Consumer подписывается на все сообщение, опубликованные в брокере, и заносит их в базу данных временных рядов. Сервис dashboard отображает графики полученных данных от сервисов.

# Решение
# Настройка в client'e

В начале работы нам необходимо создать еще один класс датчиков в файле `sensor.py`, было решено добавить датчик влажности (humidity). Датчик гененрирует процет влажности в пределах от 30% до 70%.


<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/ebe95e94-b891-49d5-afd8-58c921add801">
</p>


Мы добавили датчик, теперь внесем измнения и в файл 'main.py'

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/1a637313-11e8-4849-89a7-83fcbe4f9d6f">
</p>

С датчиками готово. Настроим Dockerfile:

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/9c8d09fc-98fe-470a-8bab-b78968176684">
</p>

Докерфайл готов. Можем перейти к следующему шагу - настройка requirements.

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/2649cca7-6fea-4900-90bd-2a8be88b8c81">
</p>

Теперь сбилдим образ

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/e0ba0144-83b7-4617-9158-555b45051f1a">
</p>

# Настройка gateway (mqtt-брокер)

Для начала создадим файл mosquitto.conf.

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/92982076-8cb7-4063-83b2-1cd8ecedccec">
</p>

Далее создаём файл docker-compose.yml

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/3bfadad6-f96c-4fc2-8916-744e4298d66e">
</p>

Запускаем и видим, что, брокер работает

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/3aa3d40a-77d3-473f-ba96-02df4ac2b454">
</p>

Подправим наш 'docker-compose.yml' в client'e

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/97d55dc1-0d8e-4bf2-85a7-c552b0980223">
</p>

Обновим docker-compose командой 'docker-compose up'
Присоедимся к брокеру и увидим ответ от брокера

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/3b7399c2-8477-4886-b09f-eb9b3342b23c">
</p>

# Настройка server'a

В первую очередь настроим telegraf, так как он получает данные с mqqt-брокера, а затем сохраняются в InfluxDB и визуализируются в Grafana. В 'telegraf.conf' необходимо настроить следующее:

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/4dccf819-ef25-4e3a-a9aa-df0e8427ad3e">
</p>

Теперь telegraf читает данные с 1883 порта по IP 192.168.0.112

Посмотрим работу наших образов

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/aca322b5-a72b-463b-8469-2aeb6fb1e975">
</p>

Поднимем Grafana на 3000 порту

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/c4ffde76-da9f-417c-bc0e-cd4a80816c08">
</p>

Залогинимся

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/dacd6be0-1693-4903-aad7-298e4187df4a">
</p>

Посмотрим на отображение данных, имеется ли оно

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/460709b3-ae81-484f-a5b1-d1ccf4b5a435">
</p>

Все работает, можем приступить к настройке графиков

# Настройка графиков

Посмотрим, что мы видим InfluxDB в Grafana

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/fb0002e4-f504-4c48-b5e0-d1d3974fed0f">
</p>

Все ок, переходим к выводу графиков. Нам нужно вывести все наши сенсоры (Pressure, Temperature, Humidity, Current)

<p align="center">
<img src="https://github.com/hanz0m4/DockerPractice/assets/166024789/765833de-aab5-4567-9762-a637efa2e6fe">
</p>

Все готово, на этом наше задание выполнено.

Binary file added assets /images/Dockerfile.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/Grafana on.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/InfluxDB в графана.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/docker-compose для client.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/docker-compose для gateway.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
Binary file added assets /images/mosquitto.conf.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/mqqt.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/telegraf.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/Графана.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/Запуск брокера.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/Изменение main.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets /images/Образы.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
114 changes: 0 additions & 114 deletions guide/manual.md

This file was deleted.

29 changes: 18 additions & 11 deletions vms/client/simulator/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,30 @@ version: "3"

services:
temp_sensor:
image: antonaleks/data-simulator
image: hanz0m4/data-simulator
environment:
- SIM_HOST=192.168.1.1
- SIM_NAME=TIRCAHL24
- SIM_PERIOD=5
- SIM_HOST=192.168.0.112
- SIM_NAME=TEMPER1
- SIM_PERIOD=4
- SIM_TYPE=temperature
pressure_sensor:
image: antonaleks/data-simulator
image: hanz0m4/data-simulator
environment:
- SIM_HOST=192.168.1.1
- SIM_NAME=PIRCAHL11
- SIM_PERIOD=10
- SIM_HOST=192.168.0.112
- SIM_NAME=PRESS1
- SIM_PERIOD=6
- SIM_TYPE=pressure
current_sensor:
image: antonaleks/data-simulator
image: hanz0m4/data-simulator
environment:
- SIM_HOST=192.168.1.1
- SIM_HOST=192.168.0.112
- SIM_NAME=A0_CURRENT
- SIM_PERIOD=1
- SIM_PERIOD=8
- SIM_TYPE=current
humidity:
image: hanz0m4/data-simulator
environment:
- SIM_HOST=192.168.0.112
- SIM_NAME=HUMID1
- SIM_PERIOD=4
- SIM_TYPE=humidity
13 changes: 13 additions & 0 deletions vms/client/simulator/entity/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,16 @@ def generate_new_value(self):
import math
self.value = math.sin(self.step)
self.step = self.step + 1


class Humidity(Sensor):
step = 0

def __init__(self,name):
super().__init__(name)
self.type = "humidity"

def generate_new_value(self):
self.value = 30+40*random.random()
self.step = self.step + 5

2 changes: 1 addition & 1 deletion vms/client/simulator/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
name = "sensor" if "SIM_NAME" not in environ.keys() else environ["SIM_NAME"]
period = 1 if "SIM_PERIOD" not in environ.keys() else int(environ["SIM_PERIOD"])
type_sim = "temperature" if "SIM_TYPE" not in environ.keys() else environ["SIM_TYPE"]
sensors = {"temperature": Temperature, "pressure": Pressure, "current": Current}
sensors = {"temperature": Temperature, "pressure": Pressure, "current": Current, "humidity": Humidity}


def on_publish(client, userdata, result): # create function for callback
Expand Down
9 changes: 9 additions & 0 deletions vms/gateway/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
version: "3"
services:
broker:
image: eclipse-mosquitto
container_name: broker
volumes:
- ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
ports:
- "1883:1883"
2 changes: 0 additions & 2 deletions vms/gateway/mosquitto/mosquitto.conf

This file was deleted.

Loading