mirror of
https://github.com/vinzcamp8/MikroTik-Monitor-Container.git
synced 2025-08-04 18:04:27 +02:00
Update README.md
This commit is contained in:
parent
6546d319ae
commit
231e5bbe7b
1 changed files with 199 additions and 139 deletions
338
README.md
338
README.md
|
@ -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`
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
### 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/)
|
||||

|
||||
---
|
||||
|
||||
### 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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue