This project is actually a proof of concept to demonstrate the following features:
This github repository describes a composite docker application consisting of "8" containers that can be deployed through BalenaCloud on any arm device (e.g. a Raspberry Pi 3 Model B+) running the balena OS.
So, this application consists of the following 8 docker containers (= TIG stack + 2x Node-RED + 2x MQTT broker + Nginx )
/nodered
)It is very easy to install this application using the BalenaCloud services through following steps:
git clone https://github.com/janvda/balena-node-red-mqtt-nginx-TIG-stack.git
(instead of directly cloning the repository it migh be better to fork the github repository and then clone this forked repository).cd balena-edge-device-monitoring
git remote add balena <USERNAME>@git.www.balena.io:<USERNAME>/<APPNAME>.git
git push balena master
(maybe you need to add the option --force
the first time you are deploying).The system resource monitoring is realized by the TIG stack and happens as follows:
The table below specifies the environment variables that can be set in the Balena Device Service Variables panel for the Telegraf Service. Note that the Default Value
is defined in docker-compose.yml
Name | Default Value | Description |
---|---|---|
interval | 60s |
Frequency at which metrics are collected |
flush_interval | 60s |
Flushing interval (should not set < interval ) |
The Grafana user interface can be accessed at port 3000 of the host OS.
The login and password is admin
.
The name of the dashboard is system metrics
.
Here below a screenshot of the system metrics
dashboard that is also provisioned by this application ( file is grafana\dashboards\system metrics.json
)
If you want to add a new Grafana dashboard then this can be done through following steps (Updating an existing dashboard can be done in a similar way):
View JSON
and copy the complete json file (don't use the grafana UI export
feature as this will template the datasource and will not work due to that).grafana\dashboards
with extension .json (e.g. mydashboard-02.json
)"graphTooltip"
by null
. E.g. "id": 1,
should be changed into "id": null,
git push balena master
)The application consists of 2 Node-RED containers:
<Host OS>:1880/node-red/
<Host OS>:1882/node-red-test/
Note that both Node-RED editors are protected by a user name and a hashed password that must be set through the environment variables USERNAME
and PASSWORD
. The Node-RED security page describes how a password hash can be generated. You can set these environment variables using your Balena dashboard either under:
Notes:
node-red-data
and node-red-test-data
are 2 named volumed used for the \data
folder of respectively node-red and node-red-test. Take care that the settings.js
is only copied during the initial deployment of the application. So when the application is redeployed e.g. due to changes, then the settings.js
is not recopied to the \data
folder. (see also How to copy a file to a named volume?)npm install
are not lost after a restart of the container, you must assure that they are installed in the \data
directory. So you must first do a cd \data
and then execute the npm install ....
command. This will assure that the node is correctly installed under folder \data\node_modules\
and that it will persist after restarts of the container.This application consist of 2 Mosquitto MQTT-brokers:
The data of the influxdb will be stored in the mount location \mnt\influxdb
.
The influxdb container is configured (see Dockerfile and my_entrypoint.sh) so that a USB drive (e.g. a USB memory stick) with label influxdb
will be mounted to this mount location. It is currently also expecting (see Dockerfile) that this USB drive is formatted in ext4
format.
If no USB drive (or memory stick) with label influxdb
is connected to the raspberry pi then the named volume influxdb-data
will be mounted to this location as is specified in the docker-compose.yml
file.
Notes
disk
metrics for this USB drive.The nginx container has been configured so that when you enable the Balena public device URL that you can access the following applications over the internet:
<public device URL>
<public device URL>\node-red
<public device URL>\node-red\ui
<public device URL>\node-red-test
<public device URL>\node-red-test\ui
In case you get a 502 Bad Gateway
error or a message like Cannot GET /node-red-test/
when trying to access the above public URLs then this might be fixed by restarting the nginx container !