Build1 distinct publisher3 min readUpdated
A dev.to Compose file pits Prometheus, Grafana, Loki, Promtail and Uptime Kuma against per-tag APM pricing. The pitch is sound; the printed config quietly hands you the durability problem.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A dev.to walkthrough published a full Docker Compose file for a self-hosted observability stack: Prometheus with Node Exporter and cAdvisor for metrics, Promtail shipping container logs into Loki, Grafana on top, Uptime Kuma for external HTTP checks, all behind a Caddy reverse proxy [s1c4][s1c5][s1c6][s1c14]. It matters because of what it replaces: the author frames it against APM platforms where adding custom tags, ingestion volume or retained log indices can turn a $200/mo budget into a $2,000/mo invoice [s1c1][s1c2], a factor of ten [s1c3].
That is the trade being offered. Instead of a bill that moves with cardinality, you get a VPS bill, and the author claims the stack runs reliably on 4GB to 8GB of RAM for dozens of microservices [s1c7]. The rest of the cost shows up in the config, so read it.
The shape is eight long-running services [s1c15] and six named volumes [s1c17], with only Caddy publishing to the host on ports 80 and 443 [s1c14]; the other seven sit on an internal bridge network with no host ports [s1c16]. Every image is version-pinned, from Prometheus v2.51.0 and Loki 3.0.0 to Uptime Kuma 1.23.13-alpine [s1c8]. That is the right default, and it means the upgrade calendar is now yours.
Prometheus scrapes every 15 seconds against exactly three jobs: itself, node-exporter and cAdvisor [s1c10]. Retention is 30 days on a local volume [s1c9]. Application-level metrics are not in the box; you add scrape targets yourself. Loki runs with auth_enabled false, filesystem chunk storage, replication factor 1 and an in-memory ring [s1c11], which is a single-host deployment with no redundancy behind it. The printed Loki config also carries no compactor or retention section [s1c19], so log volume grows until you write one. The vendor charged you for retained indices; here the same decision arrives as a disk that fills up.
Alerting is the gap worth naming. The prometheus.yml in the article contains only global settings and scrape_configs, with no alerting or rule_files entries [s1c18]. The only notification path shipped is Uptime Kuma's external checks, which can fire to Telegram, Discord or webhooks [s1c6]. So a saturated disk or a stalled scrape on the monitoring host itself will not page anyone unless an external HTTP check happens to fail as a side effect.
Two more items for the risk register. The Grafana admin password sits in plaintext in the Compose environment block as ChangeThisSecurePassword!, with sign-ups disabled [s1c12]. And cAdvisor runs privileged, with /dev/kmsg and read-only mounts of / and /var/lib/docker [s1c13], while Promtail reads /var/log and /var/lib/docker/containers read-only [s1c20]. This box sees everything on the host, so treat it as production infrastructure rather than a side project.
None of that invalidates the argument. Promtail into Loki genuinely avoids ElasticSearch-class overhead, per the author [s1c5], and predictable cost has real operational value. But the honest comparison is not $2,000 against zero. It is a variable vendor bill against a fixed VPS bill plus retention policy, backups, TLS, upgrades and an alerting layer that this Compose file does not include [s1c18][s1c19].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The stack provides system metrics and dashboards via Prometheus plus Node Exporter and cAdvisor, visualised in Grafana.
The stack provides structured log aggregation with Promtail shipping container logs to Loki, described as avoiding heavy ElasticSearch overhead.
Uptime Kuma provides external uptime and HTTP checks with Telegram, Discord and webhook incident alerts.
All images are version-pinned in the Compose file: caddy:2-alpine, prom/prometheus:v2.51.0, prom/node-exporter:v1.7.0, gcr.io/cadvisor/cadvisor:v0.49.1, grafana/loki:3.0.0, grafana/promtail:3.0.0, grafana/grafana:10.4.0, louislam/uptime-kuma:1.23.13-alpine.
Prometheus is started with --storage.tsdb.retention.time=30d, --storage.tsdb.path=/prometheus and --web.enable-lifecycle, with the prometheus-data named volume mounted at /prometheus.
The prometheus.yml sets scrape_interval and evaluation_interval to 15s and defines three scrape jobs: prometheus (localhost:9090), node-exporter (node-exporter:9100) and cadvisor (cadvisor:8080).
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Config fully printed, economics unsourced
The primary artifact is quoted in full - eight Compose services, prometheus.yml, loki-config.yaml and the Caddyfile - so every structural claim about services, ports, volumes, pins, retention flags and privileges can be checked directly against the text. Evidence quality collapses on the two claims that carry the headline: the 4GB-8GB footprint and the $2,800-$29,000 savings range come with no measurement, workload definition or vendor pricing citation, and one config-level assertion in the ledger is contradicted by the article's own limits_config block.
No deployment evidence
The supplied material is one authored tutorial. There is no release announcement, deployment report, download or install count, third-party usage disclosure or benchmark - the referenced community dashboard IDs describe what the reader should import, not evidence that anyone runs this stack. Adoption cannot be scored without inventing facts.
'Ultimate' pitch outruns the printed config
The framing - 'Ultimate' stack, runs reliably on a modest VPS, $2,800-$29,000+ annual savings - is stronger than what the artifact demonstrates. The configuration it ships has no metric alerting, no compactor behind its declared 30d Loki retention, an inline Grafana admin password, a privileged cAdvisor and six unbacked local volumes, and the savings and footprint figures are unmeasured. The gap is one of overstated completeness rather than fabrication: the components and wiring genuinely do what the feature bullets say.
Cost framing feeds a paid stack pack
The article opens by dramatising commercial APM billing and closes by promoting SelfHostStack and a $29 'Self-Hosted Starter Stack Pack' whose advertised contents - security hardening, automated backups, reverse proxy blueprints - are precisely the gaps left open in the free recipe. That alignment between the omissions and the product creates a strong commercial incentive around the cost and completeness claims; the underlying config listing is still independently checkable, which is why this is not scored higher.
Single publisher, but artifact is verifiable
Confidence in the structural findings is high because the whole artifact is reproduced and can be read line by line. Confidence in the story overall is capped by a one-source, one-publisher cluster with no independent corroboration, no adoption signal, and an author with a commercial stake in the comparison - plus one ledger claim that the source text itself contradicts.
build
One alert, two causes, four green dashboards: the day the stack agreed and was wrong1 distinct publisher
build
An empty Detected fields panel is a Loki capacity incident that has not billed yet1 distinct publisher
build
A Prometheus that had written nothing for hours passed every health check1 distinct publisher
build
Five pods green, GPU at 99 percent, queue up 70x: the Kubernetes dashboard is the wrong instrument1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026