Hosted monitoring for your entire stack

Stop checking if it's still up.

Every DockTail host and service in one view. Cloud ties container health, Docker events, and Tailscale serve state into incidents you can act on.

Same DockTail agent · one environment variable · no second binary

No monitors to define

You already wrote the config.

Every docktail.* label you've already written is a monitor definition. Cloud never asks you for a URL, a port, or an interval — the target is read from Docker, on the host, on every pass.

What you wrote docker-compose.yml
grafana:
  image: grafana/grafana:11.3.0
  labels:
    - docktail.service.enable=true
    - docktail.service.name=grafana
    - docktail.service.port=3000
What Cloud watches live
grafana on prod-01
grafana.tailnet.ts.net
target
172.18.0.4:3000 from docker
check
tcp · every 30s
vantages
local · tailnet
project
monitoring

Nothing to keep in sync

Start a labeled container and it's watched on the next pass. Remove it and its monitor retires with it. No dashboard to prune.

New hosts bring their catalog

Set the key on another machine and every service it publishes describes itself — FQDN, image, ports, compose project, Funnel exposure.

Cloud cannot aim a probe

Config picks the shape of a check — TCP or HTTP, a path, an expected status. The destination always comes from the agent's own Docker discovery.

The useful distinction

Two vantages. One answer.

A plain uptime check has one opinion: down. Cloud probes the container from inside the host and asks the Tailscale control plane whether the service is actually published — then reads the two answers together.

Local check up, tailnet serving.

All clear

The container answers on its own Docker IP, and the control plane lists the service as advertised and approved. Latency is recorded either way, so a service that answers slowly is flagged as slow rather than quietly counted as fine.

● up · 8ms · approved
Local check up, tailnet not serving.

Exposure problem

The app is healthy and nobody can reach it. Tailscale is not publishing the service — it's waiting for approval in the admin console, this host never advertised it, or the definition is gone. Restarting the app fixes nothing.

● local up · unapproved
Local check down, tailnet serving.

Container problem

The service is still advertised and approved, so re-publishing it is wasted effort. The process behind it stopped answering — and the Docker event that killed it is already attached.

● refused · exit 137 · oom
Local check down, tailnet not serving.

Both at once

Nothing answers locally and the control plane doesn't list the service either. Usually a deploy that never came up, or a definition removed while its container was already down — there is nothing running to restart.

● local down · not_advertised

When a host says nothing at all

A dead machine can't page you.

Detection runs in Cloud, so it keeps working whether your machine does or not. Agents report their view of the tailnet every 30 seconds — when the heartbeats stop, Cloud already knows whether that device is still there.

Agent down

Peers still see prod-01 online in their netmap. The machine is fine — the DockTail process isn't.

Host down

No peer sees the device any more — last seen 4m ago. The machine itself is gone.

Incidents

The alert already contains the answer.

You don't get a red dot and a graph to interpret. You get the failure, the vantages that disagreed, and the last thing the container said before it died.

Evidence, not a graph

Exit code, OOM kill, restart count, health transition — the Docker event that caused the outage, attached to the outage it caused.

Logs from the moment it broke

Captured when the failure fires, not scraped minutes later from a container that has already restarted. Bearer tokens, passwords, API keys and private-key blocks are redacted on the host, then capped at 40 lines and 8 KiB. Opt-in per workspace or per service.

Delivered where you already are

Slack, Telegram, ntfy, webhook, email — recoveries included, so you know it's over without going to look.

grafana on prod-01
incident #182 · opened 14:22:09
container problem
  1. 14:22:07docker event die · exit 137
  2. 14:22:07docker event oom · killed by docker
  3. 14:22:11local check refused · 172.18.0.4:3000
  4. 14:22:11tailnet advertised · approved — exposure is fine
  5. 14:22:12alert slack #ops · telegram
Log tail · captured at failure 40 lines · 8 KiB cap
14:22:04 lvl=eror msg="query failed" ds=prometheus
  14:22:05 lvl=info msg="alerting refresh" auth=[redacted]
  14:22:06 fatal: runtime: out of memory
  14:22:06   goroutine stack exceeds 1000000000-byte limit
14:26:40 · recovered confirmed after 2 consecutive checks

The whole machine

And the rest of the box.

Services aren't the only thing that goes wrong. Every host reports its own vitals over the same connection — CPU, memory, swap, load average, and temperature where the hardware exposes it.

No metrics stack

No node_exporter, no Prometheus, no scrape config, no second dashboard. The agent reads /proc and /sys itself and sends the numbers down the connection it already holds.

Every container, not just the published ones

A read-only inventory of everything else running on the host — image, state, ports, CPU and memory — with opt-in failure alerts on the ones that matter to you.

Fleet 3 hosts · 28 services · 35 containers
prod-01
connected 14d 3h
cpu 34%
mem 6.1 / 16 GB
load 0.82 · 0.74 · 0.61 61 °C 12 services 9 other containers
db-01 under pressure
connected 62d 11h
cpu 81%
mem 29.4 / 32 GB
load 4.10 · 3.88 · 3.42 79 °C 6 services 11 other containers
edge-01 cpu 12% mem 2.4 / 8 GB 10 services 15 other containers

Setup

One key. Fleet-wide monitoring.

Create a workspace key, add one environment variable, and restart DockTail. Hosts register themselves by Docker engine identity.

docker-compose.yml
services:
  docktail:
    environment:
      - DOCKTAIL_CLOUD_KEY=dtc_7f3a...c91e
Read the agent setup →

Privacy

Nothing hidden.

The software next to your containers should be inspectable. The data it sends should stay yours.

Open-source agent

The whole DockTail client — Cloud reporting included — is open source.

Encrypted in transit

Everything to Cloud rides an encrypted WebSocket (WSS).

Logs stay under your control

Incident log capture is bounded and configurable for the whole workspace or individual services.

Your Tailscale quota stays yours

Cloud asks exactly one credentialed host per tailnet, and every agent enforces its own 60-second floor no matter what Cloud requests.

Paid plans

Plans that grow with your fleet.

Flat pricing by host count. Services are not metered — a host reports every service it publishes.

Homelab

A few machines you care about.

$5 / month
or $30 billed yearly
  • Monitor 2 hosts
  • 30-day check history
  • 1 alert channel
  • Single operator
Try free for 30 days
Most Popular

Team

Shared operations across a growing fleet.

$29 / month
or $299 billed yearly
  • Monitor 10 hosts
  • 30-day check history
  • 5 alert channels + email
  • Team members and roles
Try free for 30 days

Business

More capacity for larger environments.

$99 / month
or $999 billed yearly
  • Up to 100 hosts (30 included)
  • 365-day health history
  • 15 alert channels + email
  • Advanced alert routing
  • Team members and roles
  • Priority email support
Get started
One environment variable

Start monitoring your fleet.

Set DOCKTAIL_CLOUD_KEY on the DockTail agent you already run. Every host and service shows up in the dashboard — no second binary, nothing dialing in.

Open DockTail Cloud