Uptime Kuma vs Netdata vs Prometheus: What Should You Run on a Small Server?
"I just want to know the server isn't dead. What do I install?"
If you run one or two VPS boxes—or a handful of on-prem servers in a corner of the office—you've probably had that incident where a service died overnight and you only found out in the morning. SaaS like Datadog bills per host per month, which hurts for a solo developer. Search free self-hosted tools and Uptime Kuma, Netdata, and Prometheus all show up looking roughly the same, and you hit choice paralysis.
This post does not explain concepts like "what is monitoring." The goal is to pick which of the three is the right answer for your situation (server count, metrics you need, ops bandwidth) in five minutes, then copy-paste through install and alert wiring. Conclusion first.
| Criterion | Uptime Kuma | Netdata | Prometheus + Grafana |
|---|---|---|---|
| Install difficulty | ★☆☆ (one docker command) | ★☆☆ (one-line kickstart) | ★★★ (compose, multiple components) |
| Resource usage | Very light (~100MB) | Medium (200–400MB by default) | High (watch disk/memory blow-up) |
| Alert channels | 90+ (Telegram/Slack/Discord, etc.) | Many (email/Slack/Telegram) | Many via Alertmanager |
| Metric retention | External status & response time only (SQLite) | Short-term by default; long-term with dbengine | 15-day TSDB by default, adjustable |
| Dashboard quality | Simple & intuitive (up/down-centric) | Very detailed, real-time (per-second) | Best-in-class (Grafana, infinitely customizable) |
| Best for | 1 to dozens of endpoints | A single server to a few | Multiple servers, long-term ops |
At-a-Glance Comparison + Recommendation Branches by Scenario
If the table above doesn't click, find your case in the three branches below.
① You only want up/down + alerts → Uptime Kuma
- You're this person: "I just need to know if the website/API is alive, and get a Telegram ping if it dies."
- What you give up: no internal system metrics like CPU, memory, or disk. Kuma is an outside-in watcher that probes with ping/HTTP from the outside.
② Real-time detailed metrics on a single server → Netdata
- You're this person: "I want to inspect CPU, disk I/O, and network on one box at second-level granularity."
- What you give up: it's weak for long-term trend analysis across multiple servers on one screen (nodes stay siloed without cloud integration). Default memory usage isn't light either.
③ Multiple servers + long-term metrics, graphs, and scale → Prometheus + Grafana
- You're this person: "I have 3+ servers, I want disk trends from 6 months ago, and I want to manage alert rules as code."
- What you give up: the install and ops learning curve. Lots of components, and you manage disk yourself.
Field note: I ran Kuma alone when I had 2 servers, then added Prometheus as I grew to 5. If I'd installed Prometheus from day one, the ops burden would have made me abandon monitoring altogether. Starting small is almost always the right answer.
5-Minute Install + Alert Integration (Copy-Paste Guides for All Three)
Uptime Kuma — one docker command
docker run -d --restart=always \
-p 3001:3001 \
-v uptime-kuma:/app/data \
--name uptime-kuma \
louislam/uptime-kuma:1Open http://SERVER_IP:3001 in a browser → create an account → register URLs to watch via Add New Monitor. For alerts, go to Settings → Notifications → Setup Notification:
- Telegram: Create a bot with
@BotFather, paste the Bot Token you get, then confirm the Chat ID viahttps://api.telegram.org/bot<TOKEN>/getUpdatesand enter it. - Slack: Paste the Slack Incoming Webhook URL as-is.
After registering, hit the Test button and the first alert arrives immediately.
Netdata — one-line install
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh && \
sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetryOnce installed, the dashboard is live at http://SERVER_IP:19999. For alerts, edit /etc/netdata/health_alarm_notify.conf:
# 슬랙
SEND_SLACK="YES"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXX/YYY/ZZZ"
DEFAULT_RECIPIENT_SLACK="#alerts"
# 텔레그램
SEND_TELEGRAM="YES"
TELEGRAM_BOT_TOKEN="123456:ABC-DEF..."
DEFAULT_RECIPIENT_TELEGRAM="-1001234567890"Save, then sudo systemctl restart netdata. To test: sudo su -s /bin/bash netdata then /usr/libexec/netdata/plugins.d/alarm-notify.sh test.
Prometheus + Grafana — docker-compose
# docker-compose.yml
services:
prometheus:
image: prom/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=15d'
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prom-data:/prometheus
ports: ["9090:9090"]
node_exporter:
image: prom/node-exporter
ports: ["9100:9100"]
alertmanager:
image: prom/alertmanager
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
ports: ["9093:9093"]
grafana:
image: grafana/grafana
ports: ["3000:3000"]
volumes:
- grafana-data:/var/lib/grafana
volumes:
prom-data:
grafana-data:# prometheus.yml
global:
scrape_interval: 30s
rule_files:
- alert.rules.yml
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node_exporter:9100']# alert.rules.yml
groups:
- name: basic
rules:
- alert: InstanceDown
expr: up == 0
for: 1m
labels: { severity: critical }
annotations: { summary: "인스턴스 {{ $labels.instance }} 다운" }
- alert: DiskAlmostFull
expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) > 0.8
for: 5m
labels: { severity: warning }
annotations: { summary: "디스크 80% 초과" }# alertmanager.yml
route:
receiver: 'slack'
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
channel: '#alerts'
# 텔레그램을 쓰려면 아래로 교체
# telegram_configs:
# - bot_token: '123456:ABC-DEF...'
# chat_id: -1001234567890After docker compose up -d, in Grafana (:3000, admin/admin) add Prometheus as a data source and import dashboard ID 1860 (Node Exporter Full). Done.
Reality Check: Resource Overhead & Common Pitfalls
All three are "free," but operating cost differs. On a 1-core/1GB VPS:
- Prometheus disk blow-up: Even the default 15-day retention can swell to several GB if metric cardinality is high. Bump
scrape_intervalfrom 15s to 30s and cap with--storage.tsdb.retention.time=15d(orretention.size=2GB). On a 1GB VPS, Prometheus+Grafana together is tight—make sure you have swap. - Netdata memory footprint: Default 1-second collection is not actually light. In
/etc/netdata/netdata.conf, set[db] update every = 2and capdbengine multihost disk space MBin dbengine mode to keep RAM under ~200MB. - Uptime Kuma's limit: It does not collect system metrics like CPU/RAM/disk itself. Forget that it's external-watch only and you'll wander around wondering "why isn't the disk alert firing?"
There's a broader industry shift toward OpenTelemetry, but that's still overkill for a 1–5 server setup. The node_exporter + Grafana combo is the de facto standard and is enough.
Conclusion: A Staged Growth Path + One-Line Recommendation
The most common, robust combo is Kuma (external watch) + Netdata or Prometheus (internal metrics) in parallel. Kuma answers "is the service up?" from the user side; Netdata/Prometheus cover internal resource health.
Follow this growth path:
- 1–2 servers: Start with Uptime Kuma → get alerted when something dies.
- Need detailed metrics: Add Netdata → real-time diagnosis on a single server.
- 3+ servers and long-term trends: Bring in Prometheus+Grafana. Expose Netdata at
http://SERVER_IP:19999/api/v1/allmetrics?format=prometheusso Prometheus can scrape it as-is—the two tools connect naturally.
One-line prescription
- "I only need to know if it's dead" → Uptime Kuma
- "I want to go deep on one box" → Netdata
- "Multiple hosts, long-term, scale" → Prometheus + Grafana
References: Official Docs
The primary source for the behavior, settings, and errors covered here is the official documentation below. Check there for version-specific options and exact behavior.
FAQ
Q. Can Uptime Kuma show CPU and memory too? A. Not by default. Kuma is an external watcher that checks liveness via ping/HTTP, so for internal system metrics you need Netdata or Prometheus (node_exporter) alongside it.
Q. If I have to pick only one of Netdata or Prometheus? A. If you have 1–2 servers and the goal is real-time diagnosis, pick Netdata. If you have 3+ servers and need long-term trends plus alert rules as code, go Prometheus+Grafana.
Q. Can I install all three on a single 1GB VPS? A. Not recommended. Prometheus+Grafana alone is already memory-tight. On 1GB, Kuma + Netdata (collection interval tuned to 2 seconds) is a realistic ceiling.
Nodelog는 모든 콘텐츠의 내용과 출처를 공개 전에 검토합니다. 환경(OS·버전)에 따라 결과가 달라질 수 있는 기술 정보는 공식 문서와 함께 확인하며, 검토 기준과 정정 원칙은 편집 정책에서 안내합니다. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.
Comments
Be the first to comment.