Dựng status page tự host với Uptime Kuma trên VPS

Bạn đang chạy vài website, API hoặc game server, và cần một nơi tập trung để biết chúng còn sống hay đã chết. Dùng Uptime Robot (giới hạn 50 monitor free) hay Better Uptime (giá 20 USD/tháng) thì tốt, nhưng nếu muốn chủ động, không giới hạn monitor và dữ liệu nằm trên server của mình, Uptime Kuma là giải pháp. Một container Docker nhẹ, giao diện web đẹp, hỗ trợ HTTP(s), TCP, Ping, DNS, cả Docker Container Stats, và tích hợp Telegram/Email/Slack khi có sự cố. Bài này mình hướng dẫn dựng status page từ con số 0 trên VPS Linux, cụ thể là Ubuntu 24.04, nhưng cách làm tương tự cho Debian 12 hay AlmaLinux 9.
- Ngôn ngữ/Giao diện: hỗ trợ tiếng Việt, gọn đẹp, responsive.
- Loại monitor: HTTP(s), Ping, TCP, DNS, Docker Stats, Push, Steam Game Server, v.v.
- Cảnh báo: Telegram, Email (SMTP), Discord, Slack, Webhook, Pushover, Gotify…
- Yêu cầu tài nguyên: ~256 MB RAM, ~1 GB disk là chạy ngon.
- Lưu trữ dữ liệu: dùng SQLite, không cần DB riêng.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 (hoặc Debian 12, AlmaLinux 9), mình dùng gói VPS Linux của thueVPS với 2 GB RAM, 50 GB NVMe, IPv4 riêng Việt Nam.
- User sudo (non-root) đã cấu hình, hoặc SSH thẳng vào root.
- Một domain (hoặc subdomain) trỏ về IP VPS, ví dụ
status.tenmien.com, nếu chưa có, dùng IP tạm vẫn được. - Docker và Docker Compose (v2) đã cài, nếu chưa, mình cũng hướng dẫn bên dưới.
- Port 80 và 443 mở trên firewall (UFW hoặc firewalld).
Vì sao nên tự host Uptime Kuma thay vì dùng dịch vụ bên ngoài?
Dịch vụ giám sát bên thứ ba như Uptime Robot hay Pingdom thường giới hạn số lượng monitor ở gói free (50-100), và khi server của họ có vấn đề, bạn cũng chẳng kiểm soát được. Tự host Uptime Kuma cho bạn toàn quyền: thêm bao nhiêu monitor tùy thích, lưu lịch sử downtime không giới hạn, tích hợp cảnh báo vào hệ thống Telegram/Email của riêng bạn, và quan trọng nhất, dữ liệu không qua bên thứ ba. Container này nhẹ đến mức bạn để chung VPS với web app hay Docker Compose khác cũng không sao, miễn là tách port riêng.
Bước 1, Cài đặt Docker và Docker Compose
Nếu VPS bạn chưa có Docker, chạy nguyên block này:
# Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
# Cài các gói cần thiết
sudo apt install -y ca-certificates curl
# Thêm Docker GPG key và repository
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
# Cài Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Thêm user của bạn vào group docker (để chạy docker không cần sudo)
sudo usermod -aG docker $USER
# Kích hoạt Docker tự động khởi động cùng hệ thống
sudo systemctl enable docker
Sau lệnh này, đăng xuất (exit) và SSH lại để quyền group có hiệu lực. Kiểm tra:
docker --version
docker compose version
Output mong đợi dạng Docker version 27.x và Docker Compose version v2.x.
dnf thay apt; cách thêm repo khác một chút, nhưng logic hoàn toàn giống. Nếu VPS bạn chọn CentOS Stream, hãy dùng lệnh dnf config-manager.Bước 2, Tạo thư mục và chạy Uptime Kuma với Docker Compose
Chọn thư mục làm việc, ví dụ /opt/uptime-kuma:
mkdir -p /opt/uptime-kuma
cd /opt/uptime-kuma
nano docker-compose.yml
Dán nội dung sau vào docker-compose.yml:
version: '3'
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
restart: always
ports:
- "3001:3001"
volumes:
- ./data:/app/data
environment:
- NODE_ENV=production
Giải thích: container chạy trên port 3001 (cổng mặc định của Uptime Kuma). Volume ./data lưu toàn bộ cấu hình và database SQLite, muốn backup chỉ cần copy thư mục này.
Khởi động container:
docker compose up -d
Kiểm tra trạng thái:
docker compose ps
Output mong đợi: uptime-kuma Up 0.0.0.0:3001->3001/tcp.
Bây giờ bạn có thể truy cập http://IP_VPS:3001 từ trình duyệt. Nếu không vào được, kiểm tra firewall:
# Ubuntu/Debian
sudo ufw allow 3001/tcp
# AlmaLinux/Rocky
sudo firewall-cmd --add-port=3001/tcp --permanent
sudo firewall-cmd --reload
Bước 3, Cấu hình reverse proxy Nginx và HTTPS (Certbot)
Chạy trên port 3001 tạm thời ổn, nhưng để chuyên nghiệp và bảo mật, bạn nên gắn domain + HTTPS. Mình dùng Nginx làm reverse proxy, Certbot cho SSL miễn phí.
Cài Nginx:
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
Tạo file config cho subdomain (ví dụ status.tenmien.com):
sudo nano /etc/nginx/sites-available/uptime-kuma
Nội dung:
server {
listen 80;
server_name status.tenmien.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;
proxy_read_timeout 86400;
}
}
Kích hoạt site:
sudo ln -s /etc/nginx/sites-available/uptime-kuma /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Cài Certbot và lấy SSL:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d status.tenmien.com
Làm theo hướng dẫn (nhập email, chọn redirect HTTP→HTTPS). Certbot tự động sửa file config Nginx và gia hạn tự động. Kiểm tra:
sudo certbot renew --dry-run
Bây giờ truy cập https://status.tenmien.com sẽ thấy giao diện Uptime Kuma qua HTTPS.
Bước 4, Thiết lập monitor và status page
Vào giao diện Uptime Kuma, tạo tài khoản admin đầu tiên. Sau đó:
- Click Add new monitor → chọn loại HTTP(s) cho website, Ping cho server, TCP port cho dịch vụ (SSH port 22, database 3306,...).
- Nhập URL hoặc IP, đặt tên monitor. Bạn có thể để interval mặc định (60 giây) hoặc tăng lên 30 giây nếu muốn phát hiện sớm.
- Bật Notification, chọn Telegram Bot, Email, Discord tùy ý. Với Telegram bạn cần tạo bot qua
@BotFather, lấy token vàchat ID. - Kích hoạt Status page: qua tab "Status page", tạo một page mới, chọn các monitor muốn public, tùy chỉnh title, logo, custom CSS. Bạn có thể đặt page này ở chế độ public để khách hàng hoặc đồng nghiệp xem trạng thái hệ thống.
Giao diện status page mặc định đã khá đẹp: hiển thị uptime % theo tháng, lịch sử sự cố (incident), thời gian phản hồi trung bình. Nếu muốn tùy biến thêm, bạn vào "Advanced" trong phần Status page để thêm custom CSS (ẩn header, đổi màu sắc).
Bước 5, Cấu hình cảnh báo Telegram (chi tiết)
Đây là kênh cảnh báo phổ biến nhất với sysadmin. Các bước:
- Mở Telegram, tìm
@BotFather, gõ/newbot, đặt tên, lấy token dạng123456789:ABCdefGHIjkl.... - Tìm
@userinfobot, gõ/start→ nó trả vềchat IDcủa bạn (số nguyên âm hoặc dương). - Trong Uptime Kuma, vào Settings → Notifications → Add notification → chọn Telegram.
- Nhập bot token và chat ID. Test thử: click "Send Test", nếu Telegram nhận được tin nhắn test, thành công.
Mình để group chat của team để mọi người cùng nhận cảnh báo khi có sự cố. Lưu ý: nếu dùng group chat, chat ID là số âm (vd -123456789).
Xử lý lỗi thường gặp
Lỗi 1: Không truy cập được giao diện sau khi chạy docker
Kiểm tra container đã chạy chưa:
docker logs uptime-kuma
Nếu log hiện Listening on port 3001 nhưng vẫn không vào được → lỗi firewall như đã nói ở trên, hoặc bạn quên mở port trên VPS Control Panel (nếu có).
Lỗi 2: Reverse proxy Nginx trả 502 Bad Gateway
Nguyên nhân thường do Nginx không thể kết nối tới port 3001 trên localhost. Kiểm tra:
curl http://127.0.0.1:3001
Nếu không ra HTML → container chưa chạy, hoặc bạn sai port. Kiểm tra docker compose ps. Nếu vẫn lỗi, sửa proxy_pass thành http://localhost:3001 hoặc http://:3001.
Lỗi 3: Monitor báo down nhưng thực tế service vẫn chạy
Uptime Kuma đang dùng IP nào để ping/monitor? Nếu VPS của bạn có IPv4 riêng, dùng ping thường. Nếu monitor một server trong mạng nội bộ, hãy dùng TCP check thay vì HTTP. Cũng có thể do DNS chưa kịp resolve, hãy dùng IP thay tên miền.
Câu hỏi thường gặp
Uptime Kuma có tốn nhiều tài nguyên không?
Rất nhẹ. Với 10-20 monitor, container chỉ dùng ~150-250 MB RAM, CPU gần như không đáng kể. Bạn có thể chạy chung VPS với các dịch vụ khác, miễn là không cùng port 3001.
Có thể backup dữ liệu Uptime Kuma không?
Có. Dữ liệu nằm trong thư mục ./data. Bạn chỉ cần copy thư mục đó là đủ, hoặc dùng docker cp để trích xuất file SQLite. Mình thường dùng Rclone backup lên Google Drive, xem bài dùng Rclone backup VPS lên Google Drive để biết thêm.
Làm sao để gắn nhiều domain cho status page?
Bạn có thể tạo nhiều Status page trong Uptime Kuma, mỗi page gắn một subdomain khác nhau. Trên Nginx, chỉ cần tạo thêm file config tương tự với server_name khác, trỏ cùng proxy_pass.
Có hỗ trợ Docker Stats Monitor không?
Có. Uptime Kuma hỗ trợ monitor trạng thái container Docker (CPU, RAM, uptime) thông qua Docker Socket. Bạn cần mount socket vào container: thêm volumes: - /var/run/docker.sock:/var/run/docker.sock vào docker-compose.yml.
Tôi có thể public status page cho khách hàng xem không?
Hoàn toàn được. Khi tạo status page, bạn bật "Public", copy link và gửi cho khách hàng. Họ thấy uptime % và lịch sử sự cố, nhưng không thể chỉnh sửa. Giao diện mặc định rất chuyên nghiệp.
Bài viết liên quan
- Giám sát VPS với Prometheus và Grafana tự host
- Cách cài Docker trên VPS Ubuntu chi tiết từ A đến Z
- Cấu hình Nginx làm reverse proxy trên Ubuntu 24.04


