Uptime Kuma là công cụ giám sát website và máy chủ mã nguồn mở, giao diện đẹp, dễ dùng, có thể tự cài trên VPS thay cho các dịch vụ giám sát trả phí. Bài viết này hướng dẫn cài Uptime Kuma trên VPS Ubuntu 24.04 bằng Docker Compose, đặt sau Nginx có SSL Let's Encrypt và cấu hình gửi cảnh báo qua Telegram khi website ngừng hoạt động.
Chuẩn bị
- Một VPS Ubuntu 24.04 với quyền sudo. Nên là VPS riêng, không phải máy chủ đang chạy website cần giám sát. Nếu chưa có, bạn có thể xem các deal VPS giá rẻ trên canhdeal.vn.
- Một tên miền phụ, ví dụ
status.example.com, đã trỏ bản ghi A về IP của VPS. - Đã thực hiện các bước bảo mật cơ bản: tạo user sudo, đăng nhập bằng SSH key, bật UFW.
Cấu hình 1 vCPU, 1GB RAM thường đủ cho vài chục monitor. Nhà cung cấp nào cũng được, miễn là ở khác hạ tầng với máy chủ bạn cần theo dõi.
Bước 1: Cài Docker và Docker Compose
Cài Docker từ kho chính thức của Docker:
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Kiểm tra cài đặt:
sudo docker --version
sudo docker compose version
Hướng dẫn chi tiết hơn về Docker có trong bài Cài Docker và Docker Compose trên Ubuntu.
Bước 2: Tạo file compose cho Uptime Kuma
Tạo thư mục cài đặt:
sudo mkdir -p /opt/uptime-kuma
cd /opt/uptime-kuma
sudo nano compose.yaml
Dán nội dung sau. Đây là file compose chính thức của dự án, chỉ sửa phần cổng để gắn vào 127.0.0.1:
services:
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- ./data:/app/data
ports:
- "127.0.0.1:3001:3001"
Vì sao không để "3001:3001" như mặc định? Khi publish cổng, Docker tự thêm luật iptables riêng và có thể vượt qua UFW, khiến cổng 3001 lộ ra Internet dù bạn không mở trong UFW. Gắn vào 127.0.0.1 thì chỉ Nginx trên cùng máy truy cập được.
Lưu ý từ nhà phát triển: thư mục data phải nằm trên ổ cục bộ, Uptime Kuma không hỗ trợ hệ thống file mạng như NFS.
Khởi động container:
sudo docker compose up -d
sudo docker compose ps
curl -I http://127.0.0.1:3001
Nếu lệnh curl trả về mã HTTP (thường là 302 chuyển hướng tới trang thiết lập), Uptime Kuma đã chạy.
Bước 3: Cài Nginx làm reverse proxy
sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/uptime-kuma
Nội dung file (thay status.example.com bằng tên miền của bạn):
server {
listen 80;
listen [::]:80;
server_name status.example.com;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Hai dòng Upgrade và Connection là bắt buộc vì giao diện Uptime Kuma dùng WebSocket. Thiếu chúng, trang sẽ tải mãi không xong.
sudo ln -s /etc/nginx/sites-available/uptime-kuma /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Mở cổng web trên UFW:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw status
Bước 4: Cài SSL Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d status.example.com
Certbot sẽ tự thêm cấu hình HTTPS và chuyển hướng HTTP sang HTTPS. Gói certbot trên Ubuntu đã có timer tự gia hạn, kiểm tra bằng:
sudo systemctl list-timers | grep certbot
sudo certbot renew --dry-run
Bước 5: Tạo tài khoản và monitor đầu tiên
- Truy cập
https://status.example.com. Lần đầu, Uptime Kuma hỏi loại cơ sở dữ liệu; với nhu cầu thông thường, chọn SQLite tích hợp là đủ. - Tạo tài khoản quản trị với mật khẩu mạnh. Sau đó vào Settings > Security bật xác thực hai lớp (2FA).
- Bấm Add New Monitor, chọn loại phù hợp:
- HTTP(s): kiểm tra website trả về mã 2xx.
- HTTP(s) - Keyword: kiểm tra trang có chứa một từ khóa, phát hiện trường hợp web trả 200 nhưng hiện trang lỗi.
- TCP Port: kiểm tra cổng như 22 (SSH), 3306 (MySQL nếu mở ra ngoài).
- Ping: kiểm tra máy chủ còn phản hồi.
- DNS: kiểm tra bản ghi tên miền.
- Đặt Heartbeat Interval khoảng 60 giây và Retries 2 đến 3 lần để tránh báo động giả khi mạng chập chờn.
Với monitor HTTP(s), Uptime Kuma còn có tùy chọn cảnh báo khi chứng chỉ SSL sắp hết hạn, rất hữu ích nếu bạn quên kiểm tra certbot.
Bước 6: Nhận cảnh báo qua Telegram
- Trên Telegram, nhắn cho
@BotFather, gõ/newbotvà làm theo hướng dẫn để lấy Bot Token. - Nhắn một tin bất kỳ cho bot vừa tạo (hoặc thêm bot vào nhóm).
- Trong Uptime Kuma, vào Settings > Notifications > Setup Notification, chọn Telegram, dán Bot Token. Bấm nút lấy Chat ID tự động hoặc nhập Chat ID thủ công.
- Bấm Test để thử, sau đó bật Default enabled và Apply on all existing monitors nếu muốn áp dụng cho mọi monitor.
Ngoài Telegram, Uptime Kuma hỗ trợ hơn 90 kênh thông báo như Discord, Slack, email SMTP, Pushover, Gotify.
Bước 7: Tạo trang trạng thái công khai (tùy chọn)
Vào Status Pages > New Status Page, đặt tên và đường dẫn, rồi chọn các monitor muốn hiển thị. Trang này giúp khách hàng tự xem dịch vụ có đang gặp sự cố hay không. Chỉ đưa lên những monitor phù hợp, không công khai IP hay cổng nội bộ.
Sao lưu và cập nhật Uptime Kuma
Toàn bộ cấu hình, lịch sử và tài khoản nằm trong thư mục /opt/uptime-kuma/data. Cách sao lưu an toàn là dừng container rồi nén thư mục:
cd /opt/uptime-kuma
sudo docker compose stop
sudo tar -czf /root/uptime-kuma-$(date +%F).tar.gz data
sudo docker compose start
Nên chép file sao lưu sang nơi khác, ví dụ bằng rclone như bài sao lưu VPS tự động.
Để cập nhật lên bản mới nhất trong nhánh 2.x:
cd /opt/uptime-kuma
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune -f
Lỗi thường gặp
- Trang hiện "Cannot connect to the socket server": thiếu hai dòng
Upgrade,Connectiontrong cấu hình Nginx, hoặc Cloudflare chưa bật WebSocket. - 502 Bad Gateway: container chưa chạy, kiểm tra bằng
sudo docker compose logs -f. - Báo động giả liên tục: tăng số lần Retries, tăng timeout, hoặc kiểm tra tường lửa máy chủ đích có chặn IP của VPS giám sát không.