Skip to main content
Quay lại Blog

Monitoring Docker trên VPS — Portainer, Uptime Kuma và cAdvisor (stack ~300MB RAM)

· One min read
Vu Nguyen
Java / Backend Engineer

Backup volume xong mà không ai báo khi container chết thì vẫn là chạy mù. Bài này là stack monitoring Docker tôi hay dựng trên VPS: Portainer (quản lý), Uptime Kuma (uptime + alert), cAdvisor (CPU/RAM) — kèm docker stats khi cần nhìn nhanh.

Sau khi deploy vài stack Compose trên VPS, tôi từng chỉ SSH vào gõ docker ps — cho đến một đêm MySQL container restart loop mà website vẫn “có vẻ” lên vì cache CDN. Từ đó tôi coi monitoring không phải luxury: ít nhất phải biết cái gì đang chạy, URL còn trả 200 không, và ai đang ăn RAM.

:::tip Ảnh minh họa Bấm vào hình để xem full màn hình (Esc để thoát). :::

Ba câu hỏi — ba công cụ

Câu hỏiCông cụCổng mặc định
Container/stack đang thế nào? Log? Restart?Portainer CE9443 (HTTPS)
Site/API còn sống? Ai báo khi down?Uptime Kuma3001
Container nào ngốn CPU/RAM/disk I/O?cAdvisor8080
Ba lớp bổ sung nhau — không thay thế hoàn toàn SSH và docker compose CLI.

:::info Đã dùng Dockge? Nếu bạn ưu tiên compose trên disk + UI gọn, xem bài Dockge — quản lý Docker Compose homelab. Vẫn có thể chạy Uptime Kuma + cAdvisor song song; Portainer là tùy chọn khi cần GUI “toàn quyền” Docker. :::

Tại sao không chỉ docker ps?

Healthcheck và events — biết container unhealthy trước khi user báo sập site.
KhiChỉ CLI+ Monitoring stack
2–3 containerỔnHơi thừa
10+ service, vài VPSDễ sótDashboard + lịch sử uptime
Team không SSHKhó chia sẻPortainer read-only cho người không terminal
3h sáng container chếtKhông ai biếtKuma ping Telegram

Không monitoring = biết sự cố khi user đã phàn nàn.

1. Portainer CE — mắt nhìn toàn Docker

Portainer là GUI cho Docker: container, image, volume, network, compose stack, log, console, stats.

Compose tối thiểu

mkdir-portainer.sh
mkdir -p ~/monitoring/portainer
cd ~/monitoring/portainer
portainer-compose.yaml
services:
portainer:
image: portainer/portainer-ce:2.27.3
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data

volumes:
portainer_data:
portainer-up.sh
docker compose up -d
  • docker.sock: Portainer điều khiển engine trên host.
  • portainer_data: user, settings.
  • Truy cập: https://<IP-VPS>:9443

:::caution Tài khoản admin Tạo admin trong ~5 phút sau lần start đầu. Quá hạn, Portainer khóa setup — docker compose restart rồi tạo lại. :::

Tôi hay dùng: Containers → Logs / Stats; Stacks → paste docker-compose.yml deploy thử; Inspect khi debug env sai.

2. Uptime Kuma — “còn sống không?”

Uptime Kuma (cùng tác giả Dockge) self-host, UI đẹp: HTTP(S), TCP, ping, Docker container, keyword, SSL expiry.

uptime-kuma-compose.yaml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- uptime_data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
uptime_data:

http://<IP>:3001 → tạo admin → Add New Monitor:

  1. HTTP(s) — URL production (https://blog.example.com), interval 60s, keyword hoặc status 200.
  2. TCP — MySQL 3306, Redis 6379 nếu expose nội bộ.
  3. Docker — container name (cần socket RO).

Settings → Notifications: Telegram (@BotFather + Chat ID) hoặc Discord webhook → Test trước khi gắn monitor.

Status Pages — slug /status public cho team/khách (giống status page SaaS, nhưng trên VPS của bạn).

3. cAdvisor — metrics từng container

cAdvisor (Google) trả lời: container này dùng bao nhiêu CPU/RAM/network/disk? Endpoint /metrics cho Prometheus sau này.

cadvisor-compose.yaml
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.51.0
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
devices:
- /dev/kmsg:/dev/kmsg

http://<IP>:8080Docker Containers → chọn tên → biểu đồ realtime.

:::note Nâng cao Combo chuẩn production: cAdvisor → Prometheus → Grafana. Bài này dừng ở cAdvisor UI; khi cần alert trên metric, thêm Prometheus sau. :::

4. Một file Compose — chạy cả ba

monitoring-dir.sh
mkdir -p ~/monitoring
cd ~/monitoring
monitoring-stack-compose.yaml
services:
portainer:
image: portainer/portainer-ce:2.27.3
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data

uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- uptime_data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:ro

cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.51.0
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
devices:
- /dev/kmsg:/dev/kmsg

volumes:
portainer_data:
uptime_data:
monitoring-up.sh
docker compose up -d
Dịch vụURL
Portainerhttps://<IP>:9443
Uptime Kumahttp://<IP>:3001
cAdvisorhttp://<IP>:8080

RAM gộp thường ~200–300MB — chấp nhận được trên VPS 2–4GB nếu bạn coi đó là “hệ thần kinh” của homelab.

5. Bảo mật — đừng để lộ thẳng ra Internet

:::warning Production Ba cổng trên là admin surface. Nên:

  • Reverse proxy (NPM, Traefik, Caddy) + HTTPS + auth.
  • Firewall: chỉ VPN/Tailscale hoặc IP admin.
  • Bind local: "127.0.0.1:3001:3001" nếu chỉ proxy qua tunnel. :::

Tham khảo bài Tailscale mesh VPN nếu bạn muốn vào panel không mở port public.

6. docker stats — kiểm tra nhanh không deploy gì

docker-stats.sh
docker stats --no-stream
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
`docker stats` realtime — bước đầu khi chưa deploy Portainer/cAdvisor.

Không có history, không alert — nhưng cứu được 80% câu “ai đang full RAM?”.

docker-system-df.sh
docker system df
Disk bị image/volume cũ chiếm — `docker system df` trước khi mua thêm SSD.

Chọn gì cho homelab của bạn?

Thực tế: tôi hay chạy cả ba vì vai trò khác nhau; nếu chỉ một VPS nhỏ, ưu tiên Uptime Kuma (alert) + docker stats (debug), thêm Portainer khi mệt CLI.

Tổng kết

  • Portainer — quản lý, log, stack, stats trong browser.
  • Uptime Kuma — monitor + Telegram/Discord + status page.
  • cAdvisor — resource per container, bước đệm Prometheus/Grafana.
  • Compose một file — dựng nhanh; khóa bằng proxy/firewall/VPN.

Giờ stack Docker của bạn có “mắt”: biết container sống/chết, URL còn 200, và ai đang đốt CPU — trước khi inbox đầy tin nhắn “web sập rồi anh ơi”.