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

📡 Sell managed monitoring under your own brand

Your clients want to know before their site goes down. This is the whole service in a box — a branded status page, dashboards, and alerting on infrastructure you own — with the scripts to onboard a client in an afternoon and the templates to charge monthly for it.

One-time purchase · full stack ZIP + Operator Handbook PDF · deploy for unlimited of your own clients

10
services, healthchecked
4
Grafana dashboards
14
alert rules
1
command to onboard
What's inside

The stack, the scripts, and the business playbook

Not a tutorial — runnable infrastructure and the templates to sell it.

The stack

10-service docker-compose — Prometheus, Grafana, Traefik (auto-TLS), Alertmanager, Uptime Kuma, Blackbox, node-exporter, plus optional Loki logs and S3 backups. Pinned tags, every service healthchecked, comes up clean on a fresh Ubuntu 24.04 VM.

Client provisioning

new-client.sh generates the admin + Grafana secrets, builds the bcrypt auth hash, renders .env and Alertmanager for one client in a single command. Refuses to clobber an existing client and backs up first.

Host agent

agent-install.sh installs node_exporter on a client server as a hardened systemd service — checksum-verified download, locked-down unit, optional firewall rule so only your monitoring VM can scrape it.

Dashboards & alerts

4 import-clean Grafana dashboards (fleet, per-host, endpoints/SSL, executive) and 14 alert rules — host down, disk fill prediction, OOM kills, endpoint down, SSL-cert expiry — routed to email/Slack/Telegram.

Operations runbooks

Upgrade, backup/restore, and troubleshooting runbooks written for the exact stack — plus a 44-item security checklist to work before every client goes live.

The business playbook

pricing-your-service (cost basis, models, example tiers, revenue math), a fill-in client proposal, and an SLA template. This is what turns the stack into recurring revenue.

Client-ready dashboards

Four dashboards, provisioned automatically

Import-clean JSON with a datasource variable — no hardcoded UIDs. They show up in Grafana on first boot.

Fleet Overview

Every host and endpoint at a glance — up/down, CPU/memory/disk pressure, and which alerts are firing right now.

Per-Host Detail

Drill into one server: CPU, memory, disk, network, load, filesystem fill, and predicted time-to-full.

Endpoints & SSL

HTTP probe latency, status codes, and days-until-expiry for every certificate you monitor.

Executive Summary

A client-friendly rollup — uptime, incident counts, and headline health for the monthly report.

The reason it's worth it

One stack. Recurring revenue.

A monitoring VM costs a few dollars a month. You charge per client, every month. The kit pays for itself on the first invoice.

Clients You charge Monthly revenue Annual
5 clients $100/mo $500/mo $6,000
10 clients $150/mo $1,500/mo $18,000
20 clients $200/mo $4,000/mo $48,000

Illustrative only — your pricing depends on your market and scope. The kit's pricing-your-service guide walks through cost basis, tiers, and how to land on your numbers.

Complete Kit
$99 $49.50 one-time

50% launch-sale price · applied automatically at checkout

The whole stack, the provisioning + agent scripts, every ops runbook, and the business playbook to sell it. Single-purchaser commercial license.

  • 10-service Docker stack — pinned tags, every service healthchecked, comes up on a fresh Ubuntu 24.04 VM
  • new-client.sh: generates secrets + renders .env + Alertmanager in one command
  • agent-install.sh: hardened node_exporter systemd install with checksum verification
  • 4 import-clean Grafana dashboards (datasource variable, no hardcoded UIDs)
  • Operations runbooks: upgrade, backup/restore, troubleshooting, security checklist
  • Business kit: pricing guide, client proposal template, SLA template
  • White-label rebrand.sh + branding guide
  • Kit ZIP + Operator Handbook PDF · deploy for unlimited of your own clients
Get SaaS-in-a-Box — $49.50

Secure checkout via Stripe · instant download · 14-day refund

See the depth

Sample: the deployment-models guide

One doc from the kit, in full — the honest tradeoffs of running it for one client vs. many.

You resell this stack to multiple clients. There are three realistic ways to lay that out on infrastructure. This doc covers all three with honest tradeoffs and the exact commands. Short version: one VM per client is the default and what we recommend — the other two exist for cost reasons and come with caveats you need to understand before you pick them.

Whatever you pick, the isolation primitive is the same: STACK_NAME in each client's .env becomes the Compose project name (name: ${STACK_NAME} in docker-compose.yml), which prefixes that client's networks (${STACK_NAME}_web, ${STACK_NAME}_internal) and volumes (${STACK_NAME}_prometheus_data, …). That's what keeps two stacks from ever sharing state.


Each client gets their own box: a dedicated droplet / EC2 instance / bare-metal VM that runs exactly one copy of the stack.

When to pick it: almost always. Any client big enough to pay for monitoring, any client with compliance or data-isolation expectations, and any time you want a clean blast-radius story ("your monitoring is on your own server, nobody else's data touches it"). This is what new-client.sh targets by default.

Why it's the default:

  • Strongest isolation — separate kernel, separate resources, separate IP, separate everything. A runaway Prometheus on client A cannot starve client B.
  • Simplest failure story — reboot, resize, snapshot, or destroy one client without touching another.
  • Traefik owns ports 80/443 on that box outright — no contention, Let's Encrypt HTTP-01 just works.
  • Per-client billing maps cleanly to per-client infra cost.

Cost: one small VM per client (this stack runs comfortably on ~2 vCPU / 4 GB for a handful of monitored hosts; add RAM/disk for long PROM_RETENTION or the logs profile). That's the price of the isolation.

Deploy:

# On a fresh Ubuntu 24.04 VM with Docker installed:
cd stack
../multi-client/new-client.sh          # generates .env (secrets, admin hash, alertmanager.yml)
../white-label/rebrand.sh --name "Acme Corp" --logo ./acme.png \
     --color "#3b82f6" --domain monitoring.acme.example.com
docker compose up -d                    # core
docker compose --profile backup up -d   # + backups (recommended for prod)

Because there's only one stack on the box, plain docker compose (which reads .env in the current dir) is all you need.


Model 2 — Shared host, multiple isolated stacks (cost-efficient for small clients)

One VM runs several clients, each as its own Compose project. They share the kernel and the machine's resources, but each client still gets separate Docker networks and volumes — no shared monitoring data.

When to pick it: several small, low-stakes clients (a couple of monitored hosts each) where a full VM per client isn't worth it, and where you're comfortable that "same box, separate stacks" is enough isolation for them. Good for internal projects, trials, and price-sensitive clients.

How isolation works: you drive each client from a per-client env file and an explicit project name. The project name prefixes networks + volumes, so the stacks never collide:

# Keep one env file per client, e.g. clients/acme.env, clients/globex.env
# (each sets its own STACK_NAME, DOMAIN, passwords, etc.)
docker compose -p acme   --env-file clients/acme.env   up -d
docker compose -p globex --env-file clients/globex.env up -d

# Operate them independently:
docker compose -p acme ps
docker compose -p globex logs -f prometheus
docker compose -p acme --profile backup up -d

Set -p to the same value as that file's STACK_NAME (the -p flag wins over the name: field, so keep them identical to avoid confusion).

The Traefik / ports 80+443 caveat — read this

The shipped docker-compose.yml binds Traefik to host ports 80 and 443:

ports:
  - "80:80"
  - "443:443"

Only one process can own port 80 (and 443) on a host. So you cannot naively bring up two full stacks on the same box — the second one's Traefik fails to bind. You have two honest ways to resolve it:

  1. One shared front proxy (recommended for shared-host). Run a single reverse proxy (one shared Traefik, or Caddy/nginx) that owns 80/443 on the host, and have each client stack's services sit behind it instead of each stack running its own internet-facing Traefik. This is the clean answer, but it's setup you add yourself — the kit ships a per-stack Traefik, not a shared one — and all clients' TLS then terminates in one place (a shared blast radius for the proxy).

  2. Distinct host ports per stack. Override the port mapping so each client's Traefik uses different host ports (e.g. client A 80/443, client B 8080/8443). This is simple to state but has a real gotcha: Let's Encrypt HTTP-01 needs port 80, and only one stack can own it. The others can't complete the HTTP-01 challenge, so you'd have to switch those to the DNS-01 challenge (a Traefik config change + DNS-provider API credentials). Workable, but more moving parts than it looks.

If either of those feels like too much operational surface for the money you're saving, that's exactly the signal to use Model 1 instead. This tension is why one-VM-per- client is the default.

Resource sizing: size the shared box for the sum of its tenants. Each client stack runs its own Prometheus, Grafana, Uptime Kuma, Alertmanager, and exporters — that adds up. Budget roughly per-client what a solo stack uses (~1–1.5 GB RAM baseline per stack, more with the logs profile and long retention), plus headroom. Keep PROM_RETENTION modest on shared boxes and watch disk — every client's TSDB lives on the same volume group.


The tempting "efficient" idea: run one Prometheus / Grafana / Alertmanager and separate clients only by labels (a client="acme" label on every series, Grafana folders/orgs per client, routing by label in Alertmanager).

This kit deliberately does not do this, and you shouldn't build it on top of this kit. Reasons:

  • No hard isolation. All clients' metrics live in one TSDB and one Grafana. One bad dashboard query, one mis-scoped permission, one label typo, and client A can see client B's data. Isolation-by-convention breaks under human error.
  • Shared blast radius. One Prometheus OOMs → every client is blind at once. One upgrade or config mistake takes down the whole fleet.
  • Painful per-client operations. No clean per-client backup/restore, retention, offboarding, or "reset just this client" — everything is entangled in shared volumes.
  • White-labeling fights you. Grafana root URL, branding, and the public status page are per-instance in this stack; a single shared instance can't cleanly present as each client's own branded platform, which is the whole product.

Per-client isolation (Models 1 and 2) is the safer default, and it's why this kit is built around STACK_NAME-scoped projects rather than a single multi-tenant instance. (A future Kubernetes/Helm add-on is noted as out of scope in stack/compose.profiles.md; even that keeps per-client isolation.)


Decision table

Client profileBudgetIsolation needsPick
Any paying client of meaningful sizeCan afford a small VMStandard-to-strictModel 1 — VM per client
Compliance / sensitive data / "our own server" askAnyStrictModel 1 — VM per client
Several tiny clients (1–2 hosts each), low stakesTight"Separate data is fine, shared box OK"Model 2 — shared host
Internal projects / trials / demosMinimalLowModel 2 — shared host
"Just make it cheap, one instance for everyone"MinimalYou think lowReconsider — use Model 2, not Model 3
Regulated, multi-tenant SaaS-grade separationAnyVery strictModel 1 (never Model 3)

Rule of thumb: start every client on Model 1. Drop to Model 2 only when you have a cluster of genuinely small clients and you've accepted the shared-host caveats above. Skip Model 3.


DNS — required for every client, every model

Regardless of model, each client needs these five subdomains, all A-record'd to the public IP of the VM their stack runs on (the same IP for all five):

status.<client-domain>     # public status page (Uptime Kuma)
grafana.<client-domain>    # dashboards
metrics.<client-domain>    # Prometheus (admin basic-auth)
alerts.<client-domain>     # Alertmanager (admin basic-auth)
traefik.<client-domain>    # Traefik dashboard (admin basic-auth)

<client-domain> is the DOMAIN value in that client's .env. TLS certificates are issued automatically by Traefik via Let's Encrypt's HTTP-01 challenge on port 80, so DNS must resolve before you bring the stack up, and port 80 must be reachable from the internet. On a shared host, remember only one stack's Traefik can own port 80 — see the Model 2 caveat above.

Free download · 368-page PDF

Free: the monitoring security checklist + a real dashboard

500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.

  • The 44-item monitoring security checklist (PDF) — hardening for every client you run
  • A real Grafana dashboard from the kit (import-clean JSON) to try in your own Grafana
  • Plus one practical DevOps email a week (no spam)

Single opt-in · unsubscribe anytime · no spam.

Who built this

Assembled from the same open-source monitoring stack that runs real production infrastructure — pinned to specific versions, healthchecked end to end, and validated so the compose file comes up clean on a fresh VM. The runbooks and the security checklist exist because operating this for real is where the sharp edges live.

— DevOps AI ToolKit · about

Questions

Who is this for?

MSPs, consultants, and freelance DevOps who want to offer "managed monitoring" as a recurring service under their own brand — without building the stack, dashboards, alerts, and runbooks from scratch. You buy it once and deploy it for unlimited clients of your own.

What exactly do I get?

A ZIP with the full docker-compose stack, all service config, the provisioning and agent-install scripts, 4 Grafana dashboards, 14 alert rules, the ops runbooks, and the business templates (pricing, proposal, SLA) — plus a branded Operator Handbook PDF. Instant download after checkout.

What do I need to run it?

A Linux VM (Ubuntu 24.04 recommended) with a public IP and Docker installed, and a domain you can point subdomains at. The stack handles TLS automatically via Traefik + Let's Encrypt. That's it — no Kubernetes, no managed cloud services required.

Is it really white-label?

Yes — rebrand.sh sets each client's name, logo, color, and domain, and the status page + dashboards are served on the client's own subdomains. One honest caveat: Grafana OSS limits full logo replacement (the branding guide lists exactly what you can and can't change); the public status page and email branding are fully yours.

Can I run several clients on one server?

Yes. The default and recommended model is one VM per client for the cleanest isolation, but you can also run multiple isolated stacks on one host. The deployment-models guide (sampled on this page) covers the tradeoffs and the exact commands.

How do updates work?

Your download link stays live — re-download whenever the kit is updated (new pinned versions, added dashboards, etc.). The upgrade runbook walks through bumping image tags safely.

What license is this?

A single-purchaser commercial license: deploy it for unlimited clients of your own, modify it, and rebrand it. You just can't resell or republish the kit itself. The bundled open-source components keep their own upstream licenses.

Refund policy?

If it isn't useful, email james.joyner@devopsaitoolkit.com within 14 days for a full refund.