Update README.md

This commit is contained in:
vinzcamp8 2025-05-27 12:26:52 +02:00 committed by GitHub
parent 6546d319ae
commit 231e5bbe7b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

338
README.md
View file

@ -1,159 +1,219 @@
# MikroTik Monitoring with Grafana Dashboard
Grafana Dashboard in MikroTik Container to monitor a MikroTik device (using SNMP).\
[See preview images](#dashboard-screen).
In this project we will use MikroTik Container to monitor the MikroTik itself (using SNMP).\
Using it reduce the costs and complexity derived from using/deploying a dedicated machine for the same objective.
A self-contained monitoring stack (Grafana + Prometheus + SNMP Exporter) deployed inside a MikroTik RouterOS v7+ container environment to collect and visualize device metrics using SNMP.
DISCLAIMER: [MikroTik Container](https://help.mikrotik.com/docs/display/ROS/Container) is a MikroTik feature available from RouterOS v7, you can [update](https://help.mikrotik.com/docs/display/ROS/Upgrading+and+installation#:~:text=using%20this%20method.-,Manual%20upgrade%20process,-First%20step%20%2D%20visit) yours if lower.
> This solution leverages the [MikroTik Container](https://help.mikrotik.com/docs/display/ROS/Container) feature introduced in RouterOS v7 to avoid the need for external servers.
We can monitor MikroTik using 3 Containers (SNMP Exporter + Prometheus + Grafana).\
[SNMP Exporter](https://hub.docker.com/r/prom/snmp-exporter), [Prometheus](https://hub.docker.com/r/prom/prometheus) and [Grafana](https://hub.docker.com/r/grafana/grafana) are a well known stack of tools that enable to monitor any type of device with appropriate configurations.\
In this scenario the metrics are retrieved in real time with SNMP, Prometheus act as timeseries database with query and Grafana had that sweet dashboards.
---
In my configuration I have a MikroTik RouterBoard L009UiGS (ARM) with ROS v7.12 but the steps are very general and almost equal for every version.
# Setup steps
First of all Enable SNMP on MikroTik in IP->SNMP, tick the box and leave others as default.
## 1. MikroTik activate Container feature
First of all we have to activate the *Container* package on MikroTik, to default it is disabled.\
To check if it is also activated in WinBox, open *New Terminal* and run:
`system/device-mode/pr`\
After the mode (e.g. `mode: enterprise`) should be compare the string `container: yes`\
If you have already activated it, go next to the step 2.\
Else if not you have to **download, install and activate the package**.
## Table of Contents
1. **Download**
- Go to https://mikrotik.com/download/archive
- Select your ROS version
- Download the *all_packages* zip of your architecture
- You can see your architecture in WinBox `System->Resources`
* [Overview](#overview)
* [Prerequisites](#prerequisites)
* [Step-by-Step Setup](#step-by-step-setup)
* [1. Enable SNMP on MikroTik](#1-enable-snmp-on-mikrotik)
* [2. Enable Container Support](#2-enable-container-support)
* [3. Configure VETH and Network](#3-configure-veth-and-network)
* [4. Prepare Configuration Files](#4-prepare-configuration-files)
* [5. Define Environment Variables and Mounts](#5-define-environment-variables-and-mounts)
* [6. Deploy and Start Containers](#6-deploy-and-start-containers)
* [Accessing the Services](#accessing-the-services)
* [Known Issues & Troubleshooting](#known-issues--troubleshooting)
* [References](#references)
2. **Install**
- From the downloaded zip extract file *"container-X.Y.npk"* and upload it inside *Files* in MikroTik (you can Drag and Drop the file inside WinBox)
- Now *System->Reboot* the MikroTik in order to install the package
- After that you can already see *Container* features on the left bar of WinBox but you still cannot use it until you activate it.
---
3. **Activate**
- In WinBox, open *New Terminal* and run:
- `system/device-mode/update container=yes`
- After that you have to shutdown the MikroTik as explained in the CLI, turning power off or pressing button of MikroTik device, otherwise the activation is stopped.
- If the activation worked after the boot you can check running in New Terminal `system/device-mode/pr` again as above.
## Overview
## 2. MikroTik VETH interfaces configuration
Note: After each following step press before *Apply* and then *OK* buttons.
1. Go to *Bridge* and in *Bridge* tab create a *New Interface*
- Name: docker
- Leave the rest of fields as default
2. Go to *IP->Addresses* add a *New Address*
- Address: 192.168.50.1/24
- Network: 192.168.50.0
- Interface select "docker"
3. Go to *IP->Firewall* in *NAT* tab create a *New NAT Rule*
- Chain select "srcnat"
- Src. Address: 192.168.50.0/24
- (This is the *Addresses* of the *Bridge* "docker")
- Go to *Action* tab and as *Action* select "masquerade"
4. Go to *Interfaces* and in *VETH* tab add 3 *Interfaces* (*Copy* the first to speed up the process)
1. *New Interface* for **Grafana**
- Name: grafana
- Address: 192.168.50.100/24
- Gateway: 192.168.50.1
2. *New Interface* for **SNMP Exporter**
- Name: snmp_exporter
- Address: 192.168.50.101/24
- Gateway: 192.168.50.1
3. *New Interface* for **Prometehus**
- Name: prometheus
- Address: 192.168.50.102/24
- Gateway: 192.168.50.1
5. Go to *Bridge* and in *Ports* tab **create a *New Bridge Port* for each *VETH interface*** (grafana, snmp_exporter, prometheus) created above and select *"docker"* as Bridge.
- (In order to Bridge all the interfaces on the same subnet LAN)
This project demonstrates how to deploy a complete monitoring stack directly on a MikroTik router using containers. It consists of:
## 3. Configuration files
Prepare configuration files for containers.
1. Download the 3 folders (grafana, prometheus and snmp) from the repository.
2. Modify files as follow:
- grafana/provisioning/datasource.yml
- url: http://192.168.50.102:9090
- (or your prometheus VETH IP)
- prometheus/prometheus.yml
- in *job_name MikroTik* change targets to your Mikrotik ip (MikroTik IP where SNMP is enabled)
- in *replacement* put the snmp_exporter VETH IP: 192.168.50.101:9116
3. Finally load the 3 folders in MikroTik ***Files***.
* **SNMP Exporter** for retrieving SNMP metrics.
* **Prometheus** as the time-series database and metrics scraper.
* **Grafana** for dashboard visualization.
## 4. MikroTik Containers configuration
First of all we have to to set the Environment variables and Mount path to volume for our Containers.
1. Go to *Container* and in **Envs** tab.\
The Envs interest only the grafana container, we define this 3 envs for it:
- Name: `grafana`, Key: `GF_SECURITY_ADMIN_USE`, Value: `admin`
- Name: `grafana`, Key: `GF_SECURITY_ADMIN_PASSWORD`, Value: `mikrotik`
- Name: `grafana`, Key: `GF_SECURITY_SIGN_UP`, Value: `false`
All components run within the MikroTik device itself, avoiding the cost and complexity of external infrastructure.
2. Go to *Container* and in **Mounts** tab.\
Note: all *src path* is at your choice e.g. path to an external usb drive attached to MikroTik.
There are one Mount for each container:
- Name: `grafana`, Src: `/usb1/grafana/provisioning`, Dst: `/etc/grafana/provisioning/`
- Name: `prometheus`, Src: `/usb1/prometheus`, Dst: `/etc/prometheus`
- Name: `snmp`, Src: `/usb1/snmp`, Dst: `/etc/snmp_exporter`
![Grafana Dashboard Screenshot](https://github.com/IgorKha/Grafana-Mikrotik/blob/master/readme/screen.png)
3. Finally, go to *Container* and in **Container** tab press *Config* button
- Registry URL: https://registry-1.docker.io
- Tmp Dir: /pull
- (This path is at your choice e.g. path to an external usb drive attached to MikroTik)
---
4. Now in tab Container we can create a container for each VETH created before.\
Note: in each container the `Root Dir` path field is at your choice (e.g. path to an external usb drive attached to MikroTik e.g. `/usb1/grafana_dir`).\
**After you fill out the fields of each container press *Apply* and wait for download/extracting of the container until in status appear *"stopped"* (if it appear is all OK) then go to create the next container, else if appear status: "*error*", *Copy* the container, delete the old, and re-try to *Apply*.**
- New Container for Grafana
- Remote Image: grafana/grafana:9.1.0
- Interface select *"grafana"*
- Envslist: grafana
- Mounts select "*grafana*"
- Root Dir: /usb1/grafana_dir
- (Tick *Logging* and *Start On Boot* boxes if you want)
- New Container for Prometheus
- Remote Image: prom/prometheus:latest
- Interface select *"prometheus"*
- Cmd: --config.file=/etc/prometheus/prometheus.yml
- Root Dir: /usb1/prometheus_dir
- Mounts select *"prometheus"*
- (Tick *Logging* and *Start On Boot* boxes if you want)
- New Container for SNMP Exporter
- Remote Image: prom/snmp-exporter:latest
- Interface select *"snmp_exporter"*
- Cmd: --config.file=/etc/snmp_exporter/snmp.yml
- Root Dir: /usb1/snmp_dir
- Mounts select *"snmp"*
- (Tick *Logging* and *Start On Boot* boxes if you want)
## Prerequisites
## 5. Start Container
After all you can Start and Stop the container using the respective button.\
Start all containers in order (SNMP Exporter, Prometheus and Grafana) and enjoy.
* MikroTik RouterOS **v7+** with **Container** feature support.
* A device with sufficient resources (e.g., RouterBoard L009UiGS ARM).
* Basic familiarity with WinBox or CLI.
* External storage (e.g., USB drive) recommended for container volumes.
![containers](container_image.png)
### Link
If you configured the VETH interfaces and other as above, then:
- Grafana: [192.168.50.100:3000](192.168.50.100:3000)
- admin:mikrotik
- Prometheus: [192.168.50.102:9090](192.168.50.102:9090)
- SNMP Exporter: [192.168.50.101:9116](192.168.50.101:9116)
---
Obv, you should assure that they are reachable from your host.
# Possible issues
- In some version for ARM Grafana show "No data" to interface in and out:
- Rapid solution: edit the dashboard, edit the query, change $scrap_intervall to 30s or others. (after you modify the ether1 all other will change automatically)
- Solution: from grafana 9.1.0 the problem was resolved
- Container store is created only the first time that the Apply button is pressed
- Possible issue: mikrotik container create a directory instead of container store
- If you create or remove container with same Root Dir of another the conflicts is coming to you!
- Be careful before removing container, when you do it the relative Root Dir is eliminated (even container store)
- Be careful before press Apply button delete all the container that you want to eliminate
- When Start the container check in Files if the Root Dir is created as "container store" type, if not there was a problem (starting the container will fail with "execve: No such file or directory"), copy the container setup and change the Root Dir until the container is started correctly
## Step-by-Step Setup
Thanks [@IgorKha](https://github.com/IgorKha/) for [configuration files](https://github.com/IgorKha/Grafana-Mikrotik/) and [Dashboard](https://grafana.com/grafana/dashboards/14420-mikrotik-monitoring/).
### 1. Enable SNMP on MikroTik
Special thanks to my MikroTik teacher @rolando.
* Navigate to **IP > SNMP**
* Enable SNMP (tick the checkbox), leave defaults.
## Dashboard screen
Screen by [@IgorKha](https://github.com/IgorKha/)
![dashboard](https://github.com/IgorKha/Grafana-Mikrotik/blob/master/readme/screen.png)
---
### 2. Enable Container Support
#### a. Check if Container is enabled:
From a **New Terminal** in WinBox:
```bash
/system/device-mode/print
```
Ensure the output includes `container: yes`.
#### b. If not enabled:
1. **Download**:
* Visit [MikroTik Download Archive](https://mikrotik.com/download/archive)
* Select your RouterOS version and architecture (from WinBox in System > Resources)
* Download the `all_packages` ZIP
2. **Install**:
* Extract `container-*.npk` from the ZIP
* Upload it to **Files** via WinBox
* Reboot the device
3. **Activate**:
* Run: `system/device-mode/update container=yes`
* Perform a full shutdown (unplug power or press the power button of the physical device)
* Verify again with: `system/device-mode/print`
---
### 3. Configure VETH and Network
> After each step press Apply and then OK buttons.
#### a. Create a Docker bridge:
1. **Bridge > Bridge**: Add new interface named `docker`, leave defaults
2. **IP > Addresses**: Add Address `192.168.50.1/24`, Network `192.168.50.0`, Interface `docker`
3. **IP > Firewall > NAT**:
* Chain: `srcnat`
* Src. Address: `192.168.50.0/24`
* Action: `masquerade`
#### b. Add VETH interfaces:
* Interface → VETH tab, add 3 interfaces (Name → Address, Gateway):
* `grafana``192.168.50.100/24`, `192.168.50.1`
* `snmp_exporter``192.168.50.101/24`, `192.168.50.1`
* `prometheus``192.168.50.102/24`, `192.168.50.1`
#### c. Bridge the interfaces:
* Bridge > Ports: Create a **New Bridge Port** for each VETH interface and add it to the `docker` bridge.
---
### 4. Prepare Configuration Files
1. Clone this repository and extract `grafana/`, `prometheus/`, `snmp/` folders.
2. Edit the following:
* **Grafana Datasource** (`grafana/provisioning/datasources.yml`):
```yaml
url: http://192.168.50.102:9090 # change it according with your prometheus VETH IP
```
* **Prometheus Config** (`prometheus/prometheus.yml`):
* `static_configs.targets`: use your MikroTik LAN IP
* `relabel_configs.replacement`: `192.168.50.101:9116` (change it according with your snmp_exporter VETH IP)
3. Upload `grafana/`, `prometheus/`, `snmp/` folders to MikroTik via **Files**.
---
### 5. Define Environment Variables and Mounts
#### a. Container > Envs (Grafana only):
| Key | Value |
| ----------------------------- | -------- |
| GF\_SECURITY\_ADMIN\_USER | admin |
| GF\_SECURITY\_ADMIN\_PASSWORD | mikrotik |
| GF\_SECURITY\_SIGN\_UP | false |
#### b. Container > Mounts:
> Use your own `src path` (e.g. path to an external usb drive attached to MikroTik)
| Container | Src Path | Dst Path |
| ---------- | ---------------------------- | ---------------------------- |
| grafana | `/usb1/grafana/provisioning` | `/etc/grafana/provisioning/` |
| prometheus | `/usb1/prometheus` | `/etc/prometheus` |
| snmp | `/usb1/snmp` | `/etc/snmp_exporter` |
---
### 6. Deploy and Start Containers
#### a. Configure Container settings:
**Container > Container > Config:**
* Registry URL: `https://registry-1.docker.io`
* Tmp Dir: `/pull` (customizable e.g. path to an external usb drive attached to MikroTik)
#### b. Create containers:
> After you fill out the fields of each container press Apply and **wait for download/extracting** until in status appear `stopped` (if it appear is all OK) then go to create the next container. If it shows `error`, Copy the container, delete the old, and re-try to Apply.
**Container > New Container**
| Container | Remote Image | Interface | Others |
| ----------------- | --------------------------- | --------------- | -------------------------------------------------------------------- |
| **Grafana** | `grafana/grafana:9.1.0` | `grafana` | Envslist `grafana`, Mounts `grafana`, Root Dir `/usb1/grafana_dir` |
| **Prometheus** | `prom/prometheus:latest` | `prometheus` | Cmd: `--config.file=/etc/prometheus/prometheus.yml`, Mounts `prometheus`, Root Dir `/usb1/prometheus_dir`|
| **SNMP Exporter** | `prom/snmp-exporter:latest` | `snmp_exporter` | Cmd: `--config.file=/etc/snmp_exporter/snmp.yml`, Mounts `snmp`, Root Dir `/usb1/snmp_dir` |
> `Root Dir` is customizable e.g. path to an external usb drive attached to MikroTik
---
## Accessing the Services
> Ensure to start containers in order (SNMP Exporter, Prometheus and Grafana) and enjoy.
> Start and Stop the container using the respective button.
> Ensure the router and host are on the same LAN or routing is configured properly.
| Service | URL |
| ------------- | -------------------------------------------------------- |
| Grafana | [http://192.168.50.100:3000](http://192.168.50.100:3000) |
| Prometheus | [http://192.168.50.102:9090](http://192.168.50.102:9090) |
| SNMP Exporter | [http://192.168.50.101:9116](http://192.168.50.101:9116) |
Grafana credentials: `admin / mikrotik`
---
## Known Issues & Troubleshooting
* **Grafana “No Data” Bug on ARM**:
* Try increasing `$scrape_interval` to 30s in the dashboard query.
* Fixed in Grafana ≥ 9.1.0
* **Container Store Errors**:
* Ensure container root dirs are unique.
* Deleting a container deletes its root directory.
* Always verify the root dir is marked as `container store` in Files. (and **not as `directory`**)
* **Startup Failures**:
* If container fails with `execve: No such file or directory`, verify paths, mounts, and retry with a different root dir.
---
## References
* Configuration and dashboard by [@IgorKha](https://github.com/IgorKha/): [Dashboard #14420](https://grafana.com/grafana/dashboards/14420-mikrotik-monitoring/)
* Special thanks to @rolando for guidance on MikroTik world.