2024-08-05 14:24:49 +02:00
# MikroTik Monitoring with Grafana Dashboard
2025-05-27 12:26:52 +02:00
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.
> 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.
---
## Table of Contents
* [Overview ](#overview )
* [Prerequisites ](#prerequisites )
2025-05-27 12:31:25 +02:00
* [Setup ](#setup )
2025-05-27 12:26:52 +02:00
* [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 )
---
## Overview
This project demonstrates how to deploy a complete monitoring stack directly on a MikroTik router using containers. It consists of:
* **SNMP Exporter** for retrieving SNMP metrics.
* **Prometheus** as the time-series database and metrics scraper.
* **Grafana** for dashboard visualization.
All components run within the MikroTik device itself, avoiding the cost and complexity of external infrastructure.

---
## Prerequisites
* 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.
---
2025-05-27 12:30:54 +02:00
## Setup
2025-05-27 12:26:52 +02:00
### 1. Enable SNMP on MikroTik
* Navigate to **IP > SNMP**
* Enable SNMP (tick the checkbox), leave defaults.
---
### 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` ):
2025-06-01 10:44:58 +02:00
* `static_configs.targets` : _use your MikroTik LAN IP_
2025-05-27 12:26:52 +02:00
* `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` |
2025-06-03 09:59:45 +02:00
| **Prometheus** | `prom/prometheus:v2.53.0` | `prometheus` | Cmd: `--config.file=/etc/prometheus/prometheus.yml` , Mounts `prometheus` , Root Dir `/usb1/prometheus_dir` |
| **SNMP Exporter** | `prom/snmp-exporter:v0.26.0` | `snmp_exporter` | Cmd: `--config.file=/etc/snmp_exporter/snmp.yml` , Mounts `snmp` , Root Dir `/usb1/snmp_dir` |
2025-05-27 12:26:52 +02:00
> `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.