The Problem: Docker on Hetzner VPS - Great, but Blind?
Hetzner provides excellent value for virtual private servers, making it a popular choice for developers deploying Docker containers. However, the default Hetzner Cloud interface offers limited insights into the actual performance of your Dockerized applications. You only see aggregate CPU and RAM usage of the entire VPS, not the individual containers. This makes troubleshooting performance bottlenecks a nightmare. How do you know if your app is slow because of network latency, a CPU-hogging container, or a memory leak?
Without proper monitoring, you're flying blind.
The "Hard" Way: Manual Configuration with cAdvisor, Prometheus, and Grafana
Traditionally, monitoring Docker containers on a VPS involved a complex setup using tools like cAdvisor, Prometheus, and Grafana.
cAdvisor (Container Advisor): You'd first need to deploy cAdvisor as a Docker container itself. This tool collects resource usage and performance characteristics from running containers.
Terminal docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ gcr.io/cadvisor/cadvisor:latestPrometheus: Next, you'd install and configure Prometheus to scrape metrics from cAdvisor's HTTP endpoint. This involves editing
prometheus.ymlto define the scrape target.YAML scrape_configs: - job_name: 'cadvisor' static_configs: - targets: ['your_hetzner_vps_ip:8080']Grafana: Finally, you'd set up Grafana, create a data source pointing to your Prometheus instance, and import or build dashboards to visualize the metrics.
This process is time-consuming, requires a deep understanding of each tool, and involves maintaining complex configuration files. It's a PhD in DevOps just to see if your app is healthy!
The Simpler Way: Host Monitoring, Uptime Checks and Heartbeats with Sentinely
Sentinely does not replace cAdvisor's per-container breakdown. What it does is cover the three things that actually page you on a single Hetzner box, without running a monitoring stack next to your app:
Install the Sentinely agent on the host. In Sentinely, open Pulse → Add server, generate an agent API key, and run the displayed command over SSH:
Terminal curl -fsSL https://sentinely.app/install.sh | sudo bash -s -- --key YOUR_API_KEYThe agent reports host-level CPU, memory, disk, network, load, services, processes and open ports. Because it pushes data out, you don't open any inbound ports on the VPS.
Add an uptime check for each public container. A Ping monitor on
https://your-app.example.com/healthtells you when the container stops answering, which is usually what you care about.Add a heartbeat for containers that run jobs. If a worker or scheduled container should finish every hour, have it send a heartbeat when it succeeds. Sentinely alerts you when the heartbeat is late:
Terminal curl -fsS -X POST -H "Content-Type: application/json" -d '{"status":"ok"}' https://sentinely.app/api/beat/YOUR_TOKEN
For a per-container view while debugging, docker stats on the host is still the quickest tool.
Key Metrics to Watch
When running Docker on a Hetzner VPS, watch these host-level signals:
- CPU usage and load: sustained high load usually means one container is starving the others.
- Memory and swap: the kernel OOM killer will stop containers silently when memory runs out.
- Disk usage: images, volumes and logs fill disks faster than you expect. Alert well before 90%.
- Network I/O: unexpected spikes can mean a runaway client or abuse.
- Endpoint health: an uptime check per public service confirms containers are actually serving traffic.
Conclusion
Full container observability with cAdvisor, Prometheus and Grafana is powerful but heavy for a single VPS. Sentinely covers the host, the endpoints and the scheduled jobs with one agent and a few monitors. Start a 14-day trial and connect your first Hetzner server.