From 6f0174a811479b05a6fc3521dcdaf88c987dd85c Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:42:16 +0300 Subject: [PATCH 01/24] Create client --- vm/client | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 vm/client diff --git a/vm/client b/vm/client new file mode 100644 index 0000000..a393901 --- /dev/null +++ b/vm/client @@ -0,0 +1,4 @@ +FROM python:alpine3.19 +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt From 6b7e320b3b8c6438963fd80b1b8ae9bffe0f5a7b Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:42:46 +0300 Subject: [PATCH 02/24] Delete vm/client --- vm/client | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 vm/client diff --git a/vm/client b/vm/client deleted file mode 100644 index a393901..0000000 --- a/vm/client +++ /dev/null @@ -1,4 +0,0 @@ -FROM python:alpine3.19 -WORKDIR /app -COPY requirements.txt . -RUN pip install -r requirements.txt From 86a5d414af98fb75baf6f653f18c50a7da08b84f Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:43:31 +0300 Subject: [PATCH 03/24] Create Dockerfile --- vm/client/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 vm/client/Dockerfile diff --git a/vm/client/Dockerfile b/vm/client/Dockerfile new file mode 100644 index 0000000..a393901 --- /dev/null +++ b/vm/client/Dockerfile @@ -0,0 +1,4 @@ +FROM python:alpine3.19 +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt From dee7371283f00ae1d93ba256cc9c9916415ef06e Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:43:59 +0300 Subject: [PATCH 04/24] Delete vm/client directory --- vm/client/Dockerfile | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 vm/client/Dockerfile diff --git a/vm/client/Dockerfile b/vm/client/Dockerfile deleted file mode 100644 index a393901..0000000 --- a/vm/client/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM python:alpine3.19 -WORKDIR /app -COPY requirements.txt . -RUN pip install -r requirements.txt From 19e44d632f7f1d6efcd5376a91aee130ed99af41 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:44:39 +0300 Subject: [PATCH 05/24] Create t --- vm/t | 1 + 1 file changed, 1 insertion(+) create mode 100644 vm/t diff --git a/vm/t b/vm/t new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/vm/t @@ -0,0 +1 @@ + From ca7f71c65835bb306b3b338cc5f1b290a1336f90 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:45:13 +0300 Subject: [PATCH 06/24] Create Dockerfile --- vm/client/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 vm/client/Dockerfile diff --git a/vm/client/Dockerfile b/vm/client/Dockerfile new file mode 100644 index 0000000..a393901 --- /dev/null +++ b/vm/client/Dockerfile @@ -0,0 +1,4 @@ +FROM python:alpine3.19 +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt From 0831a8c2b49597bdf476cdd0c274bb3983bd7402 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:45:28 +0300 Subject: [PATCH 07/24] Delete vm/t --- vm/t | 1 - 1 file changed, 1 deletion(-) delete mode 100644 vm/t diff --git a/vm/t b/vm/t deleted file mode 100644 index 8b13789..0000000 --- a/vm/t +++ /dev/null @@ -1 +0,0 @@ - From c317720d8b3afacafeade5a3ecc9bc46b2788f60 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 20:54:48 +0300 Subject: [PATCH 08/24] Create docker-compose.yml --- vm/server/docker-compose.yml | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 vm/server/docker-compose.yml diff --git a/vm/server/docker-compose.yml b/vm/server/docker-compose.yml new file mode 100644 index 0000000..b82fc3d --- /dev/null +++ b/vm/server/docker-compose.yml @@ -0,0 +1,38 @@ +version: "3" +services: + influxdb: + image: influxdb:1.8 + container_name: influxdb + volumes: + - ./influxdb/scripts:/docker-entrypoint-initdb.d + - influx_data:/var/lib/influxdb + networks: + - server-net + telegraf: + image: telegraf + container_name: telegraf + volumes: + - ./telegraf:/etc/telegraf:ro + restart: unless-stopped + networks: + - server-net + grafana: + image: grafana/grafana + container_name: grafana + volumes: + - grafana_data:/var/lib/grafana + - ./grafana/:/etc/grafana/ + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + restart: unless-stopped + ports: + - 3000:3000 + networks: + - server-net +volumes: + influx_data: {} + grafana_data: {} +networks: + server-net: {} From dc808945f4984ef20327b2b4af0feddb2d098c79 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 21:50:15 +0300 Subject: [PATCH 09/24] Create dicker-compose.yml --- vm/client/dicker-compose.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 vm/client/dicker-compose.yml diff --git a/vm/client/dicker-compose.yml b/vm/client/dicker-compose.yml new file mode 100644 index 0000000..d2fd238 --- /dev/null +++ b/vm/client/dicker-compose.yml @@ -0,0 +1,31 @@ +version: "3" + +services: + temp_sensor: + image: luyda/sensor-sim + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=TEMP1 + - SIM_PERIOD=2 + - SIM_TYPE=temperature + pressure_sensor: + image: luyda/sensor-sim + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=PRESS1 + - SIM_PERIOD=2 + - SIM_TYPE=pressure + current_sensor: + image: luyda/sensor-sim + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=CURRENT1 + - SIM_PERIOD=2 + - SIM_TYPE=current + co_sensor: + image: polinazhirakova/data-simulator + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=CO1 + - SIM_PERIOD=2 + - SIM_TYPE=carbon_oxid From d8306100dc63c88579fe72740d520af99acdb1b6 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 21:51:14 +0300 Subject: [PATCH 10/24] Delete vm/client/dicker-compose.yml --- vm/client/dicker-compose.yml | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 vm/client/dicker-compose.yml diff --git a/vm/client/dicker-compose.yml b/vm/client/dicker-compose.yml deleted file mode 100644 index d2fd238..0000000 --- a/vm/client/dicker-compose.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: "3" - -services: - temp_sensor: - image: luyda/sensor-sim - environment: - - SIM_HOST=192.168.0.101 - - SIM_NAME=TEMP1 - - SIM_PERIOD=2 - - SIM_TYPE=temperature - pressure_sensor: - image: luyda/sensor-sim - environment: - - SIM_HOST=192.168.0.101 - - SIM_NAME=PRESS1 - - SIM_PERIOD=2 - - SIM_TYPE=pressure - current_sensor: - image: luyda/sensor-sim - environment: - - SIM_HOST=192.168.0.101 - - SIM_NAME=CURRENT1 - - SIM_PERIOD=2 - - SIM_TYPE=current - co_sensor: - image: polinazhirakova/data-simulator - environment: - - SIM_HOST=192.168.0.101 - - SIM_NAME=CO1 - - SIM_PERIOD=2 - - SIM_TYPE=carbon_oxid From 5498e12fd1f7a1b6dd8c2db294ae74be9ba40e68 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 21:52:05 +0300 Subject: [PATCH 11/24] Create docker-compose.yml --- vm/client/docker-compose.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 vm/client/docker-compose.yml diff --git a/vm/client/docker-compose.yml b/vm/client/docker-compose.yml new file mode 100644 index 0000000..d2fd238 --- /dev/null +++ b/vm/client/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3" + +services: + temp_sensor: + image: luyda/sensor-sim + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=TEMP1 + - SIM_PERIOD=2 + - SIM_TYPE=temperature + pressure_sensor: + image: luyda/sensor-sim + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=PRESS1 + - SIM_PERIOD=2 + - SIM_TYPE=pressure + current_sensor: + image: luyda/sensor-sim + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=CURRENT1 + - SIM_PERIOD=2 + - SIM_TYPE=current + co_sensor: + image: polinazhirakova/data-simulator + environment: + - SIM_HOST=192.168.0.101 + - SIM_NAME=CO1 + - SIM_PERIOD=2 + - SIM_TYPE=carbon_oxid From 26bcc03df99ec57e0aa41f7b3ab1a722b6caf842 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 21:55:06 +0300 Subject: [PATCH 12/24] Create sensor.py --- vm/client/enity/sensor.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 vm/client/enity/sensor.py diff --git a/vm/client/enity/sensor.py b/vm/client/enity/sensor.py new file mode 100644 index 0000000..44be47b --- /dev/null +++ b/vm/client/enity/sensor.py @@ -0,0 +1,21 @@ +import paho.mqtt.client as paho +from os import environ +import time +from entity.sensor import * +broker = "localhost" if "SIM_HOST" not in environ.keys() else environ["SIM_HOST"] +port = 1883 if "SIM_PORT" not in environ.keys() else environ["SIM_PORT"] +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, "carbon_oxid": CO} +def on_publish(client, userdata, result): # create function for callback + print(f"data published {userdata}") + pass +sensor = sensors[type_sim](name=name) +client1 = paho.Client(sensor.name) # create client object +client1.on_publish = on_publish # assign function to callback +client1.connect(broker, port) # establish connection +while True: + sensor.generate_new_value() + ret = client1.publish("sensors/" + sensor.type + "/" + sensor.name, sensor.get_data()) # publish + time.sleep(period) From bf190cc970e0985e7190dfaa1b8c14ce78a1efb9 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 21:56:53 +0300 Subject: [PATCH 13/24] Update sensor.py --- vm/client/enity/sensor.py | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/vm/client/enity/sensor.py b/vm/client/enity/sensor.py index 44be47b..db58e87 100644 --- a/vm/client/enity/sensor.py +++ b/vm/client/enity/sensor.py @@ -1,21 +1,14 @@ -import paho.mqtt.client as paho -from os import environ -import time -from entity.sensor import * -broker = "localhost" if "SIM_HOST" not in environ.keys() else environ["SIM_HOST"] -port = 1883 if "SIM_PORT" not in environ.keys() else environ["SIM_PORT"] -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, "carbon_oxid": CO} -def on_publish(client, userdata, result): # create function for callback - print(f"data published {userdata}") - pass -sensor = sensors[type_sim](name=name) -client1 = paho.Client(sensor.name) # create client object -client1.on_publish = on_publish # assign function to callback -client1.connect(broker, port) # establish connection -while True: - sensor.generate_new_value() - ret = client1.publish("sensors/" + sensor.type + "/" + sensor.name, sensor.get_data()) # publish - time.sleep(period) + import math + self.value = math.sin(self.step) + self.step = self.step + 1 + +class CO(Sensor): + step = 0 + + def __init__(self,name): + super().__init__(name) + self.type = "carbon oxid" + + def generate_new_value(self): + self.value = self.step * 1e6 + self.step = self.step + 0.001 From 76e09cc9f0afc5a594a603cf559825474b48e9fb Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 21:58:14 +0300 Subject: [PATCH 14/24] Create main.py --- vm/client/main.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 vm/client/main.py diff --git a/vm/client/main.py b/vm/client/main.py new file mode 100644 index 0000000..38198d8 --- /dev/null +++ b/vm/client/main.py @@ -0,0 +1,21 @@ +import paho.mqtt.client as paho +from os import environ +import time +from entity.sensor import * +broker = "localhost" if "SIM_HOST" not in environ.keys() else environ["SIM_HOST"] +port = 1883 if "SIM_PORT" not in environ.keys() else environ["SIM_PORT"] +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, "carbon_oxid": CO} +def on_publish(client, userdata, result): + print(f"data published {userdata}") + pass +sensor = sensors[type_sim](name=name) +client1 = paho.Client(sensor.name) +client1.on_publish = on_publish +client1.connect(broker, port) +while True: + sensor.generate_new_value() + ret = client1.publish("sensors/" + sensor.type + "/" + sensor.name, sensor.get_data()) + time.sleep(period) From 28356b45f97d6811e4a85d48b0fb6c4bcd1c9a98 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 21:59:25 +0300 Subject: [PATCH 15/24] Create requirements.txt --- vm/client/requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 vm/client/requirements.txt diff --git a/vm/client/requirements.txt b/vm/client/requirements.txt new file mode 100644 index 0000000..13e9d8e --- /dev/null +++ b/vm/client/requirements.txt @@ -0,0 +1 @@ +paho_mqtt==1.6.1 From cf1b3c5950435a9f94287fbe97d247700e2f87e9 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 22:01:03 +0300 Subject: [PATCH 16/24] Create gateway --- vm/gateway | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 vm/gateway diff --git a/vm/gateway b/vm/gateway new file mode 100644 index 0000000..272426b --- /dev/null +++ b/vm/gateway @@ -0,0 +1,40 @@ +version: "3" +services: + influxdb: + image: influxdb:1.8 + container_name: influxdb + volumes: + - ./influxdb/scripts:/docker-entrypoint-initdb.d + - influx_data:/var/lib/influxdb + networks: + - server-net + telegraf: + image: telegraf + container_name: telegraf + volumes: + - ./telegraf:/etc/telegraf:ro + restart: unless-stopped + networks: + - server-net + grafana: + image: grafana/grafana + container_name: grafana + volumes: + - grafana_data:/var/lib/grafana + - ./grafana/:/etc/grafana/ + # - ./grafana/provisioning/dashboards/default.yaml:/etc/grafana/provisioning/dashboards/main.yaml + + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + restart: unless-stopped + ports: + - 3000:3000 + networks: + - server-net +volumes: + influx_data: {} + grafana_data: {} +networks: + server-net: {} From dc9344ef8b5a12641558b3b3db9f776dd4f3ba18 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 22:01:18 +0300 Subject: [PATCH 17/24] Delete vm/gateway --- vm/gateway | 40 ---------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 vm/gateway diff --git a/vm/gateway b/vm/gateway deleted file mode 100644 index 272426b..0000000 --- a/vm/gateway +++ /dev/null @@ -1,40 +0,0 @@ -version: "3" -services: - influxdb: - image: influxdb:1.8 - container_name: influxdb - volumes: - - ./influxdb/scripts:/docker-entrypoint-initdb.d - - influx_data:/var/lib/influxdb - networks: - - server-net - telegraf: - image: telegraf - container_name: telegraf - volumes: - - ./telegraf:/etc/telegraf:ro - restart: unless-stopped - networks: - - server-net - grafana: - image: grafana/grafana - container_name: grafana - volumes: - - grafana_data:/var/lib/grafana - - ./grafana/:/etc/grafana/ - # - ./grafana/provisioning/dashboards/default.yaml:/etc/grafana/provisioning/dashboards/main.yaml - - environment: - - GF_SECURITY_ADMIN_USER=admin - - GF_SECURITY_ADMIN_PASSWORD=admin - - GF_USERS_ALLOW_SIGN_UP=false - restart: unless-stopped - ports: - - 3000:3000 - networks: - - server-net -volumes: - influx_data: {} - grafana_data: {} -networks: - server-net: {} From a6ed4a85f0e299e0ff4fd1ea163f72e02cee6160 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 22:02:27 +0300 Subject: [PATCH 18/24] Create docker-compose.yml --- vm/gateway/docker-compose.yml | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 vm/gateway/docker-compose.yml diff --git a/vm/gateway/docker-compose.yml b/vm/gateway/docker-compose.yml new file mode 100644 index 0000000..7775348 --- /dev/null +++ b/vm/gateway/docker-compose.yml @@ -0,0 +1,39 @@ +version: "3" +services: + influxdb: + image: influxdb:1.8 + container_name: influxdb + volumes: + - ./influxdb/scripts:/docker-entrypoint-initdb.d + - influx_data:/var/lib/influxdb + networks: + - server-net + telegraf: + image: telegraf + container_name: telegraf + volumes: + - ./telegraf:/etc/telegraf:ro + restart: unless-stopped + networks: + - server-net + grafana: + image: grafana/grafana + container_name: grafana + volumes: + - grafana_data:/var/lib/grafana + - ./grafana/:/etc/grafana/ + + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + restart: unless-stopped + ports: + - 3000:3000 + networks: + - server-net +volumes: + influx_data: {} + grafana_data: {} +networks: + server-net: {} From cb7f5329b9579f368a67ea0400bd9acebb76a12e Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 22:05:15 +0300 Subject: [PATCH 19/24] Update docker-compose.yml --- vm/gateway/docker-compose.yml | 40 +++++------------------------------ 1 file changed, 5 insertions(+), 35 deletions(-) diff --git a/vm/gateway/docker-compose.yml b/vm/gateway/docker-compose.yml index 7775348..3aa4263 100644 --- a/vm/gateway/docker-compose.yml +++ b/vm/gateway/docker-compose.yml @@ -1,39 +1,9 @@ version: "3" services: - influxdb: - image: influxdb:1.8 - container_name: influxdb + broker: + image: eclipse-mosquitto + container_name: broker volumes: - - ./influxdb/scripts:/docker-entrypoint-initdb.d - - influx_data:/var/lib/influxdb - networks: - - server-net - telegraf: - image: telegraf - container_name: telegraf - volumes: - - ./telegraf:/etc/telegraf:ro - restart: unless-stopped - networks: - - server-net - grafana: - image: grafana/grafana - container_name: grafana - volumes: - - grafana_data:/var/lib/grafana - - ./grafana/:/etc/grafana/ - - environment: - - GF_SECURITY_ADMIN_USER=admin - - GF_SECURITY_ADMIN_PASSWORD=admin - - GF_USERS_ALLOW_SIGN_UP=false - restart: unless-stopped + - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf ports: - - 3000:3000 - networks: - - server-net -volumes: - influx_data: {} - grafana_data: {} -networks: - server-net: {} + - "1883:1883" From f9c73724badd0eeb7f1ff8d7ad5cdd5fc56a1584 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 23:23:37 +0300 Subject: [PATCH 20/24] Create mqtt.json --- vm/server/grafana/provisioning/mqtt.json | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 vm/server/grafana/provisioning/mqtt.json diff --git a/vm/server/grafana/provisioning/mqtt.json b/vm/server/grafana/provisioning/mqtt.json new file mode 100644 index 0000000..6a2a7c4 --- /dev/null +++ b/vm/server/grafana/provisioning/mqtt.json @@ -0,0 +1,48 @@ +[global_tags] + +[agent] + interval = "10s" + round_interval = true + metric_batch_size = 1000 + collection_jitter = "0s" + flush_interval = "10s" + flush_jitter = "0s" + precision = "0s" + hostname = "" + omit_hostname = false + +[[outputs.influxdb]] + urls = ["http://influxdb:8086"] + database = "sensors" + skip_database_creation = true + username = "telegraf" + password = "telegraf" + +[[inputs.cpu]] + percpu = true + totalcpu = true + collect_cpu_time = false + report_active = false + +[[inputs.disk]] + ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"] + +[[inputs.diskio]] + +[[inputs.kernel]] + +[[inputs.mem]] + +[[inputs.processes]] + +[[inputs.swap]] + +[[inputs.system]] + +[[inputs.mqtt_consumer]] + servers = ["tcp://192.168.0.101:1883"] + topics = [ + "sensors/#" + ] + data_format = "value" + data_type = "float" From 21643e018494e7c888403c3dfab66e162dfd4515 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 23:24:37 +0300 Subject: [PATCH 21/24] Delete vm/server/grafana/provisioning/mqtt.json --- vm/server/grafana/provisioning/mqtt.json | 48 ------------------------ 1 file changed, 48 deletions(-) delete mode 100644 vm/server/grafana/provisioning/mqtt.json diff --git a/vm/server/grafana/provisioning/mqtt.json b/vm/server/grafana/provisioning/mqtt.json deleted file mode 100644 index 6a2a7c4..0000000 --- a/vm/server/grafana/provisioning/mqtt.json +++ /dev/null @@ -1,48 +0,0 @@ -[global_tags] - -[agent] - interval = "10s" - round_interval = true - metric_batch_size = 1000 - collection_jitter = "0s" - flush_interval = "10s" - flush_jitter = "0s" - precision = "0s" - hostname = "" - omit_hostname = false - -[[outputs.influxdb]] - urls = ["http://influxdb:8086"] - database = "sensors" - skip_database_creation = true - username = "telegraf" - password = "telegraf" - -[[inputs.cpu]] - percpu = true - totalcpu = true - collect_cpu_time = false - report_active = false - -[[inputs.disk]] - ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"] - -[[inputs.diskio]] - -[[inputs.kernel]] - -[[inputs.mem]] - -[[inputs.processes]] - -[[inputs.swap]] - -[[inputs.system]] - -[[inputs.mqtt_consumer]] - servers = ["tcp://192.168.0.101:1883"] - topics = [ - "sensors/#" - ] - data_format = "value" - data_type = "float" From 4e5cfdf79d7b4bb1a6cf550fdf66fd5f0b6fc74c Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Thu, 29 May 2025 23:26:15 +0300 Subject: [PATCH 22/24] Create telegraf.conf --- vm/server/telegraf/telegraf.conf | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 vm/server/telegraf/telegraf.conf diff --git a/vm/server/telegraf/telegraf.conf b/vm/server/telegraf/telegraf.conf new file mode 100644 index 0000000..6a2a7c4 --- /dev/null +++ b/vm/server/telegraf/telegraf.conf @@ -0,0 +1,48 @@ +[global_tags] + +[agent] + interval = "10s" + round_interval = true + metric_batch_size = 1000 + collection_jitter = "0s" + flush_interval = "10s" + flush_jitter = "0s" + precision = "0s" + hostname = "" + omit_hostname = false + +[[outputs.influxdb]] + urls = ["http://influxdb:8086"] + database = "sensors" + skip_database_creation = true + username = "telegraf" + password = "telegraf" + +[[inputs.cpu]] + percpu = true + totalcpu = true + collect_cpu_time = false + report_active = false + +[[inputs.disk]] + ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"] + +[[inputs.diskio]] + +[[inputs.kernel]] + +[[inputs.mem]] + +[[inputs.processes]] + +[[inputs.swap]] + +[[inputs.system]] + +[[inputs.mqtt_consumer]] + servers = ["tcp://192.168.0.101:1883"] + topics = [ + "sensors/#" + ] + data_format = "value" + data_type = "float" From 3f19e26c9c1c4bc4e8592a0dc9b47b428f70e631 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Fri, 30 May 2025 00:06:30 +0300 Subject: [PATCH 23/24] Create REPORT.md --- REPORT.md | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 REPORT.md diff --git a/REPORT.md b/REPORT.md new file mode 100644 index 0000000..ef0bd97 --- /dev/null +++ b/REPORT.md @@ -0,0 +1,130 @@ +# Отчёт по работе №2: Практика Docker +**Цель:** создать систему мониторинга системы датчиков с использованием Docker, Mosquitto, InfluxDB, Telegraf и Grafana на трёх виртуальных машинах (далее ВМ). + +## Подготовка ВМ +1. Взяты три ВМ из работы №1 (предварительно настроены в формате client, server, gateway). +2. Необходимо установить на каждую ВМ Docker и Docker Compose посредством: +```shell +sudo apt update +sudo apt upgrade -y +sudo apt install -y docker.io +sudo systemctl enable docker +sudo systemctl start docker +docker --version +sudo usermod -aG docker $USER +sudo apt install -y docker-compose +docker-compose --version +``` + +# Шаг 1: Разработка Simulator для генерации данных + +В файле `sensor.py` создаем четвертыht типf датчиков. + +Далее в файле `main.py` реализовуем клиента, который подключается к mqtt брокеру и публикует сообщения. + +В `Dockerfile`, необходимом для того, что создать образ, указываем следуюещие инструкции: + +``` Dockerfile +FROM python:alpine3.19 +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt +COPY . . +CMD ["python", "main.py"] +``` + +Инструкция `FROM` инициализирует новый этап сборки и устанавливает базовый образ для последующих инструкций. `WORKDIR` создает рабочий каталог для последующих инструкций `Dockerfile`. Инструкция `COPY` копирует файл *requirements.txt* из источника в указанное место внутри образа. +Инструкция `RUN`задает команды, которые следует выполнить и поместить в новый образ контейнера. `RUN` описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. + +Содержимое файла *requirements.txt* приведено ниже: +`paho_mqtt==1.6.1` + +*paho_mqtt* предоставляет клиентский класс, который позволяет приложениям подключаться к MQTT-брокеру для публикации сообщений. + +После проделанных выше опреаций можно создать образ командой: + +`docker build -t luyda/sensor-sim . ` + +Таким способом мы создали образ, из которого можно развернуть контейнер. + +# Шаг 2: Запуск Mosquitto брокера + +Для настройки протокола MQTT необходимо создать конфигурационный файл *mosquitto.conf* со следующим содержимымы: + +```c +listener 1883 +allow_anonymous true +``` +Для более удобного запуска брокера создадим файл *docker-compose.yml*. + +Теперь создав контейнер (из Шага 1), получим следующее: + +Логи контейнера: + +Брокер же отображает присоединившегося клиента. + +Теперь можно запустить несколько датчиков. Но перед этим необходимо прописать *docker-compose.yml*: + +С помощью команды `docker compose up` запустим контейнеры: + + +При этом брокер отображает: + +# Шаг 3: Получение данных от симулятора +Первоначально необходимо настроить Telegraf, который подписывается на MQTT, где датчики публикуют данные. Данные будут сохраняться в InfluxDB. Отображение информации с датчиков будет происходить при помощи Grafana. + +## Telegraf +Перед использованием Telegram необходимо настроить его. +Для этого создадим конфигурационный файл *telegraf.conf* +Тем самым мы настраиваем Telegraf на чтение данных с машины IP адрес которой 192.168.0.101 через порт 1883. + +Настройка Telegraf на этом завршена. + +## InfluDB + +Для создания базы данных необходимо в конфигурационном файле *influxdb-init.iql* прописать следующее: +```sql +CREATE database sensors +CREATE USER telegraf WITH PASSWORD 'telegraf' WITH ALL PRIVILEGES +``` + +## Grafana + +Данные для отображения датчиков берутся из InfluxDB. +Для настройки в конфигурационном файле необходимо прописать следующее: +```yaml +apiVersion: 1 +datasources: + - name: InfluxDB_v1 + type: influxdb + access: proxy + database: sensors + user: telegraf + url: http://influxdb:8086 + jsonData: + httpMode: GET + secureJsonData: + password: telegraf +``` + +Для запуска всех трех контенйеров воспользуемся docker-compose. создадим файл docker-compose.yml + +После чего можно выполнить команду `docker compose up` + +# Настройка дашборда +После запуска всех необходимых контейнеров, в браузере переходим по `192.168.0.101:3000` + +Для проверки соединения перейдем в Menu -> Connections -> Data sources. Находим в истончиках InfluxDB и проверяем подключение: + +После переходим через Меню в раздел Dashboards, где создаем собственный дашбоард. + +Для отображения информации с датчиков необходимо создать запрос (query). + +После создания необходимо количества графиков, отображающих инфомрацию с Simluator, экспортируем дашборд как JSON-файл. + +Для этого находим функцию `Share` -> ``Export` -> `Save to file`. Сохраненный файл помещаем в папку `vms\server\infra\grafana\provisioning\dashboards\mqtt.json` + +# Пример выполненной работы + + + From 4be4cc9aef3afcd63480222cc723fdba07191d97 Mon Sep 17 00:00:00 2001 From: Liudmi1a Date: Fri, 30 May 2025 02:08:21 +0300 Subject: [PATCH 24/24] Update REPORT.md --- REPORT.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/REPORT.md b/REPORT.md index ef0bd97..eaa4faa 100644 --- a/REPORT.md +++ b/REPORT.md @@ -57,18 +57,18 @@ allow_anonymous true ``` Для более удобного запуска брокера создадим файл *docker-compose.yml*. -Теперь создав контейнер (из Шага 1), получим следующее: - -Логи контейнера: +Теперь создав контейнер посмотрим его логи: +![example_run_logs](https://github.com/user-attachments/assets/79529d5e-a1a1-4f9a-bb6e-ae171fc12bc2) Брокер же отображает присоединившегося клиента. +![mqtt-docker_run](https://github.com/user-attachments/assets/ac0feb01-6071-4bf4-8a9c-e969bd2aea44) Теперь можно запустить несколько датчиков. Но перед этим необходимо прописать *docker-compose.yml*: -С помощью команды `docker compose up` запустим контейнеры: - +С помощью команды `docker compose up` запустим контейнеры. При этом брокер отображает: +![mqtt-docker-compose](https://github.com/user-attachments/assets/67cae960-53c8-42cc-a962-8eb575bdbbed) # Шаг 3: Получение данных от симулятора Первоначально необходимо настроить Telegraf, который подписывается на MQTT, где датчики публикуют данные. Данные будут сохраняться в InfluxDB. Отображение информации с датчиков будет происходить при помощи Grafana. @@ -115,10 +115,13 @@ datasources: После запуска всех необходимых контейнеров, в браузере переходим по `192.168.0.101:3000` Для проверки соединения перейдем в Menu -> Connections -> Data sources. Находим в истончиках InfluxDB и проверяем подключение: +![grafana-influxdb-test](https://github.com/user-attachments/assets/db9150a7-259a-4186-94d3-167383dd9e25) После переходим через Меню в раздел Dashboards, где создаем собственный дашбоард. +![grafana-new-view](https://github.com/user-attachments/assets/ee1b4398-b5e2-4910-b340-9d1a33185fb5) Для отображения информации с датчиков необходимо создать запрос (query). +![query](https://github.com/user-attachments/assets/3dbd7945-7190-470d-bf3c-f6f1b537e77e) После создания необходимо количества графиков, отображающих инфомрацию с Simluator, экспортируем дашборд как JSON-файл. @@ -126,5 +129,6 @@ datasources: # Пример выполненной работы +![dashboard](https://github.com/user-attachments/assets/f94c4469-4ef2-4c4a-b2bb-9b2c7464bd79)