Skip to content
🎉 Launch sale:50% off everything over $22 — automatically applied at checkout· ends Aug 2Shop the sale →
DevOps AI ToolKit
Newsletter
← All packs & kits

📈 Monitor Every Docker Workload From One Observability Stack

Deploy dashboards, alerts, centralized logs, capacity planning, and notification workflows for Docker hosts and applications using a production-ready monitoring bundle — Prometheus or VictoriaMetrics, your choice. Now with optional AIOps incident summaries and container image-age hygiene.

One-time purchase · downloadable ZIP · Prometheus or VictoriaMetrics · Docker Compose v2

9
dashboards
65
alert rules
6
editions
2
backends
Supported environments

Six editions on one common core

Enable what you run — each edition adds targets, dashboards, and alerts.

Docker hosts

Host + daemon + container health, disk, certs, image age.

Docker Compose apps

Group by project, expected-service checks, HTTP/TCP probes, per-service dashboards.

GitLab runners

Runner availability, job concurrency/failures, cache & disk — off the official runner metrics.

Web-hosting servers

HTTP/HTTPS uptime, response time, status codes, TLS expiry, error rates.

GPU & AI workloads

NVIDIA DCGM: utilization, memory, temp, power, ECC/XID, AI-service health.

Small OpenStack

Control/compute hosts, Kolla containers, API probes, RabbitMQ/MariaDB/HAProxy.

Included components

A complete, pinned stack

  • Prometheus or VictoriaMetrics
  • Grafana (9 dashboards)
  • Alertmanager
  • node-exporter
  • cAdvisor
  • Blackbox exporter
  • Loki + Grafana Alloy
  • NVIDIA DCGM exporter
  • Image-age exporter + socket proxy
  • AI incident summary (optional)

Every image pinned to a specific tag; every long-running service health-checked. Comes up on a fresh Ubuntu 24.04 host with only Docker installed.

Dashboard previews

Nine dashboards, auto-provisioned

Docker Fleet Overview
Every host + container, up/down, utilization, active alerts.
Host & Container Detail
CPU/mem/disk/net, restarts, OOM, top containers.
Certificate Monitoring
Days-to-expiry and probe health for every endpoint.
Capacity Planning
7/30-day peaks, growth, projected headroom (estimates).
Actionable alerts

65 alert rules with runbook links

Each alert carries a severity, a plain-English cause, the current value, and a suggested action.

Host

Down, CPU/load, memory/swap, disk & inode space, disk latency, network errors/drops, clock skew, reboot.

Docker

Daemon down, container down/unhealthy, restart loops, OOM kills, data-root space, image age, expected-container-missing.

Certificates

TLS expiry at 30/14/7/3 days and expired.

Platform + editions

Target/Grafana/Loki down, rule-eval + config-reload failures, plus GPU, GitLab, and OpenStack alerts.

New in v1.1 · AIOps

Optional AI incident summaries — advisory, private by design

Turn a firing alert plus recent container logs into a readable root-cause summary. Disabled by default; you turn it on deliberately.

Secrets redacted first

Passwords, tokens, keys, connection strings, and PEM blocks are stripped before anything leaves the host. A preview endpoint shows the exact redacted payload before any model call.

Local-first or BYO key

Run it fully offline against your own Ollama so nothing leaves the machine, or bring an OpenAI/Anthropic key. Off by default; rate-limited; localhost-bound.

Advisory, never automated

Output is clearly labelled advisory and prompt-injection resistant. The service never executes remediation — a human always reviews and runs the suggestions.

Image-age hygiene

A bundled exporter flags stale and dangling container images, with warning/critical thresholds and alerts — so you catch workloads that quietly stopped getting rebuilt.

Read-only socket proxy

The image-age exporter reads Docker through a restricted, read-only socket proxy — never a raw docker.sock bind — so a compromised exporter can't start, stop, or exec anything.

monitorctl CLI

One friendly command over the whole lifecycle: ./monitorctl install · start · status · validate · backup · update · diagnostics. Works offline; never phones home.

Licensing

Pick a license tier

One-time purchase · 12 months of updates · full kit download on every tier.

Starter License
$19 once

One environment, the single-docker-host edition, core dashboards + alerts, image-age monitoring, and the installer. 12 months of updates.

  • One monitored environment
  • Single Docker Host edition
  • Core Grafana dashboards + core alert rules
  • Prometheus OR VictoriaMetrics backend
  • Image-age monitoring (read-only socket proxy)
  • monitorctl CLI + installation/validation scripts
  • Full documentation · 12 months of updates
Get Starter — $19
Most popular Professional License
$39 $19.50 once

50% launch sale · auto-applied at checkout

Up to five environments, all Docker-focused editions, logs, capacity planning, notification integrations, upgrade automation, and the optional AI incident-summary service.

  • Up to 5 monitored environments
  • All Docker-focused editions (host, Compose app, web hosting)
  • Optional AI incident summaries — advisory, secret-redacted, local-first
  • Advanced dashboards + log monitoring (Loki/Alloy)
  • Capacity-planning dashboards + image-age monitoring
  • Email/Slack/Teams/webhook notification integrations
  • Upgrade automation (auto-rollback) · 12 months of updates
Get Professional — $19.50
Team License
$49 $24.50 once

50% launch sale · auto-applied at checkout

Internal team usage, up to twenty environments, every edition including GitLab, GPU, and OpenStack profiles, the AI incident-summary service, plus priority updates.

  • Internal team usage · up to 20 environments
  • ALL editions incl. GitLab runners, GPU/AI, and small OpenStack
  • Extended dashboards + all 65 alert rules
  • Optional AI incident summaries + image-age monitoring
  • Team documentation
  • Priority product updates
  • Everything in Professional
Get Team — $24.50

Secure checkout via Stripe · instant download · 14-day refund. Suggested pricing — configurable from the product catalog.

Managed setup (optional)

Want it installed and tuned for you?

A managed-setup engagement covers installation, environment review, alert customization, dashboard configuration, notification setup, and a validation report. Tell us about your environment and we'll scope it — no passwords or keys shared through the form.

Request managed setup
See the depth

Sample: the architecture guide

One doc from the bundle — how the dual-backend design fits together.

The Docker Monitoring and Alerting Bundle is a self-hosted observability stack for small infrastructure teams. It runs entirely on Docker Compose v2, ships with pinned images, and lets you pick one of two Prometheus-API-compatible metrics backends — Prometheus or VictoriaMetrics — without changing any dashboard or alert rule.

This document explains the components, how they fit together, the profile matrix, the network and exposure model, and where data and config live. For install steps see installation.md; for tuning see configuration.md.


Design goals

  • Dual backend, one config. Both backends speak PromQL and the Prometheus query API. The Grafana datasource is templated ($METRICS_DS_URL) behind a stable datasource uid: metrics, so every dashboard and every alert rule works unchanged on either backend.
  • Shared scrape + rules. VictoriaMetrics scrapes the same config/prometheus/prometheus.yml via its -promscrape.config flag, and vmalert evaluates the same alerts/**/*.yml rules that Prometheus does. You never maintain two copies.
  • Opt-in surface area. Compose profiles let you run only what you need: core + a backend, plus optional logs, blackbox probing, and a GPU exporter.
  • Safe by default. Every published port binds to ${BIND_ADDR:-127.0.0.1}. Every long-running service is health-checked. Every image tag is pinned.

Components

ComponentImage (pinned)RoleProfile
Grafanagrafana/grafana:13.1.1Dashboards, datasource + dashboard provisioningcore
Alertmanagerprom/alertmanager:v0.33.1Routes/deduplicates/inhibits alerts to notification channelscore
node-exporterquay.io/prometheus/node-exporter:v1.12.1Host CPU/mem/disk/network/systemd metricscore
cAdvisorghcr.io/google/cadvisor:v0.56.1Per-container CPU/mem/net/fs metricscore
Prometheusprom/prometheus:v3.13.1Metrics store + scraper + rule evaluationprometheus
VictoriaMetricsvictoriametrics/victoria-metrics:v1.139.0Metrics store + scraper (alternative backend)victoriametrics
vmalertvictoriametrics/vmalert:v1.139.0Evaluates alert rules against VictoriaMetricsvictoriametrics
blackbox-exporterprom/blackbox-exporter:v0.28.0HTTP/HTTPS/TCP/DNS/ICMP + TLS-expiry probingblackbox
Lokigrafana/loki:3.4.2Single-binary log store (filesystem)logs
Grafana Alloygrafana/alloy:v1.9.2Ships container + host logs to Lokilogs
DCGM exporternvcr.io/nvidia/k8s/dcgm-exporter:4.6.0-4.8.3-distrolessNVIDIA GPU metricsgpu

Only one of prometheus / victoriametrics runs at a time — they are two implementations of the same job.


Data flow

                         scrape (pull, 30s)
   node-exporter :9100  ─────────────┐
   cAdvisor      :8080  ─────────────┤
   blackbox      :9115  ─────────────┤        ┌──────────────────────────┐
   dcgm-exporter :9400  ─────────────┼───────▶│  METRICS BACKEND         │
   edition exporters    ─────────────┘        │  Prometheus :9090        │
                                              │      OR                  │
                                              │  VictoriaMetrics :8428   │
                                              └───────┬──────────┬───────┘
                                                      │          │
                              PromQL query (uid=metrics)         │ rule eval
                                                      │          │ (Prometheus
                                              ┌───────▼──────┐   │  internal, or
                                              │  Grafana     │   │  vmalert :8880)
                                              │  :3000       │   │
                                              └───────┬──────┘   ▼
                                                      │   ┌──────────────┐
                              LogQL query (uid=logs)  │   │ Alertmanager │
                                              ┌───────▼─┐ │ :9093        │
   containers/host logs ──push──▶ Loki :3100 ─┤ (dash-  │ └──────┬───────┘
        via Alloy                             │  boards)│        │ route/group/
                                              └─────────┘        │ inhibit
                                                                 ▼
                                         email · Slack · Teams · webhook
                                         (+ Discord/PagerDuty/Opsgenie)
  • Scrape → store: The backend pulls metrics from each exporter every 30s (global.scrape_interval) and stores them locally in a TSDB.
  • Store → Grafana: Grafana queries the backend through the metrics datasource. Because the datasource type is prometheus and VictoriaMetrics is Prometheus-API compatible, dashboards do not know or care which backend answers.
  • Store → alerts: With the Prometheus backend, Prometheus evaluates the rule files itself. With the VictoriaMetrics backend, vmalert evaluates the same rule files against VictoriaMetrics. Either way, firing alerts are pushed to Alertmanager, which groups, inhibits, and routes them to channels.
  • Logs (optional): Alloy discovers Docker containers and tails host syslog, then pushes to Loki. Grafana queries Loki through the logs datasource.

Profile matrix

Profiles are Compose's mechanism for opt-in services. You always run core plus exactly one backend, and add the rest as needed.

ProfileBrings upNotes
coregrafana, alertmanager, node-exporter, cadvisorAlways required
prometheusprometheusMetrics backend — pick this or victoriametrics
victoriametricsvictoriametrics, vmalertMetrics backend — pick this or prometheus
logsloki, alloyCentralized logs
blackboxblackbox-exporterEndpoint uptime + TLS-expiry probing
gpudcgm-exporterNVIDIA GPU metrics; needs NVIDIA Container Toolkit
# Prometheus backend, core only
docker compose --profile core --profile prometheus up -d

# VictoriaMetrics backend, plus logs and blackbox
docker compose --profile core --profile victoriametrics --profile logs --profile blackbox up -d

scripts/install.sh selects the right profiles from METRICS_BACKEND and the --enable-logs / edition flags, so you rarely type these by hand.


Editions

The bundle ships six editions — opinionated target/alert/dashboard bundles for a common shape of infrastructure:

single-docker-host · docker-compose-application · gitlab-runners · web-hosting-server · gpu-ai-workloads · small-openstack

An edition never edits vendor files. It registers exporter targets under config/prometheus/targets/edition-*.yml (file_sd, auto-reloaded) and its alert rules live under the matching alerts/<category>/ directory. See configuration.md for enabling editions.


Ports

All published ports bind to ${BIND_ADDR} (default 127.0.0.1). Internal-only services are not published at all — they are reached over the monitoring Docker network by service name.

ServiceContainer portPublished?Default host port
Grafana3000yes3000
Prometheus9090yes (prometheus backend)9090
VictoriaMetrics8428yes (vm backend)8428
vmalert8880yes (vm backend)8880
Alertmanager9093yes9093
Loki3100yes (logs)3100
node-exporter9100no (network-internal)
cAdvisor8080no (network-internal)
blackbox-exporter9115no (network-internal)
Alloy12345no (network-internal)
DCGM exporter9400no (network-internal)

Ports are configurable via *_PORT variables in .env. See security.md before changing BIND_ADDR.


Network model

  • A single user-defined bridge network, ${COMPOSE_PROJECT_NAME:-docker-monitoring}_net, connects every service. Services address each other by name (prometheus:9090, loki:3100, blackbox-exporter:9115).
  • Only the published services (table above) are reachable from the host, and only on BIND_ADDR. Exporters stay entirely inside the network.
  • To reach Grafana from a workstation, use an SSH tunnel or a reverse proxy you control — do not flip BIND_ADDR to 0.0.0.0 without a firewall/VPN in front. See security.md.

Where data and config live

Named volumes (managed by Docker, survive down/up, captured by backup.sh):

  • prometheus_data/prometheus (TSDB)
  • victoriametrics_data/victoria-metrics-data
  • grafana_data/var/lib/grafana (dashboards state, users, org)
  • alertmanager_data/alertmanager (silences, notification log)
  • loki_data/loki (log chunks + index)
  • alloy_data/var/lib/alloy/data (positions)

Bind mounts (your config, read-only into containers, version-controlled):

  • ./config/grafana/provisioning → datasource + dashboard providers
  • ./dashboards → dashboard JSON, mounted read-only into Grafana
  • ./config/prometheus/prometheus.yml → shared scrape/rules config
  • ./config/prometheus/targets/ → file_sd targets (auto-reload)
  • ./alerts/ → alert + recording rules
  • ./config/alertmanager/alertmanager.yml → routing
  • ./config/loki/loki-config.yml, ./config/blackbox/blackbox.yml, ./config/alloy/config.alloy

Host mounts for collection (read-only): node-exporter mounts /, cAdvisor mounts /, /sys, /var/run, /var/lib/docker, and Alloy mounts /var/log, /var/lib/docker/containers, and the Docker socket. The security implications of the socket and host mounts are covered in security.md.


Shared building blocks

The compose file factors out three anchors applied across services:

  • Loggingjson-file with max-size: 10m, max-file: 3 (bounded log growth).
  • Restart${RESTART_POLICY:-unless-stopped}.
  • Securityno-new-privileges:true on every service that can accept it. cAdvisor, Alloy, and the DCGM exporter need extra host access and are documented as exceptions in security.md.

Read the full documentation overview →

Questions

Prometheus or VictoriaMetrics — do I have to choose up front?

You pick one with METRICS_BACKEND (or the installer flag), but you can switch later: dashboards and alerts are PromQL-compatible and reference a datasource variable, so nothing is rebuilt. VictoriaMetrics scrapes the same config and vmalert evaluates the same rules.

What exactly do I download?

A single ZIP: the docker-compose stack, all service config, 9 Grafana dashboards, 65 alert + 14 recording rules, the six editions, the image-age exporter, the optional AI incident-summary service, the monitorctl CLI, notification templates, full docs, and the automation scripts (install, configure, validate, upgrade, backup, restore, support-bundle). Instant download after checkout.

How does the AI incident summary work — and is my data safe?

It is optional and OFF by default. When you enable it, a firing alert plus recent container logs are turned into an advisory root-cause summary. Secrets (passwords, tokens, keys, connection strings, PEM blocks) are redacted before anything leaves the host, and a preview endpoint shows the exact redacted payload before any model is called. Run it fully local with Ollama so nothing leaves your machine, or bring your own OpenAI/Anthropic key. Output is advisory only — the service never runs remediation commands.

What do I need to run it?

A Linux host with Docker Engine and Docker Compose v2. That is it — no Kubernetes, no managed cloud. Ports bind to localhost by default; you expose Grafana via an SSH tunnel or a reverse proxy you control.

How are the editions gated across licenses?

Every download includes the full kit. Your license tier defines how many environments and which editions you are licensed to run (see LICENSE.md) — Starter is one environment + the single-docker-host edition; Professional adds the Docker-focused editions, logs, and capacity planning; Team adds GitLab, GPU, and OpenStack.

Will it stay current?

Images are pinned, and your license includes 12 months of updates (priority on Team). The included upgrade script backs up, applies the new pinned images, validates, and auto-rolls-back if validation fails.

Is it secure by default?

Yes — pinned images, localhost binds, secrets only in .env, and a support-bundle generator that redacts credentials before you share diagnostics. See the security guide in the bundle.

Refund policy?

If it is not useful, email james.joyner@devopsaitoolkit.com within 14 days for a full refund.