Deploy NodeJS bằng Docker lên VPS xong không đồng nghĩa hệ thống đã ổn. Nhiều app chạy tốt vài giờ đầu, rồi bắt đầu lộ vấn đề: RAM tăng dần, CPU spike, disk đầy vì log, container restart liên tục, hoặc request treo nhưng không ai biết vì sao. Lúc này, khác biệt giữa một hệ thống “chạy được” và một hệ thống “vận hành được” nằm ở giám sát log + tài nguyên.
Nếu bạn đang chạy NodeJS bằng Docker trên một VPS nhỏ 1–2 GB RAM, việc theo dõi sau deploy càng quan trọng. Chỉ một memory leak nhỏ, một endpoint bị spam, hoặc cấu hình log sai cũng đủ làm VPS chậm toàn bộ, thậm chí chết tiến trình.
Bài này tập trung vào cách giám sát thực tế, dễ áp dụng: xem log đúng cách, theo dõi CPU/RAM/disk/container, thiết lập cảnh báo cơ bản, và xử lý nhanh khi có sự cố.
Vì sao phải giám sát ngay sau deploy?
Sau deploy, có 3 lớp rủi ro chính:
– Ứng dụng NodeJS → lỗi runtime, exception, memory leak, quá nhiều kết nối DB, request timeout.
– Docker/container → restart loop, image lỗi, log phình to, giới hạn tài nguyên không phù hợp.
– VPS/hệ điều hành → đầy disk, swap bị dùng mạnh, CPU quá tải, network bất thường.
Không giám sát → lỗi chỉ được phát hiện khi:
– user báo chậm,
– API chết,
– SSH lag,
– hoặc VPS tự treo.
Giám sát tốt → bạn biết:
– app có đang xử lý request ổn không,
– tài nguyên tăng bất thường ở đâu,
– log nào là tín hiệu lỗi thật,
– thời điểm cần scale hoặc tối ưu.
Theo dõi log Docker đúng cách
Xem log container nhanh
Cách nhanh nhất:
docker ps
docker logs -f <container_name>
– docker ps → xem container đang chạy.
– docker logs -f → theo dõi log realtime.
Nếu muốn xem 100 dòng gần nhất:
docker logs --tail 100 <container_name>
Nếu cần kèm timestamp:
docker logs -t <container_name>
Đây là cách đủ tốt cho debug nhanh sau deploy.
Log gì nên có trong app NodeJS?
Một app production tối thiểu nên log các nhóm sau:
– App startup → app chạy cổng nào, env nào.
– HTTP access log → method, URL, status, thời gian xử lý.
– Error log → stack trace, context.
– System event → DB connect/disconnect, job fail, external API timeout.
Ví dụ các log hữu ích:
– Server started on port 3000
– GET /api/orders 200 32ms
– Mongo connection failed
– Unhandled error: ...
Điểm quan trọng: log phải có cấu trúc, không nên console.log bừa bãi. Thực tế nên dùng:
– pino
– winston
– hoặc ít nhất format JSON/log rõ ràng
Log cấu trúc → dễ grep, dễ đẩy sang hệ thống tập trung sau này.
Quản lý kích thước log Docker
Một lỗi phổ biến: container chạy lâu ngày, log file Docker tăng liên tục → đầy ổ đĩa VPS.
Kiểm tra dung lượng:
docker system df
du -sh /var/lib/docker/containers/*
Bạn sẽ thấy:
– CPU %
– Memory usage
– Network I/O
– Block I/O
– PIDs
Ý nghĩa thực tế:
– CPU cao liên tục → loop nặng, query chậm, traffic tăng, job nền lỗi.
– RAM tăng dần không giảm → nghi memory leak, cache không kiểm soát, giữ object quá lâu.
– Network tăng đột biến → traffic thật, bot scan, hoặc app gọi external service quá nhiều.
– PIDs tăng bất thường → tiến trình con bị sinh quá mức.
Nếu chỉ xem một container:
docker stats <container_name>
Dấu hiệu NodeJS có vấn đề tài nguyên
Các pattern hay gặp:
– RAM tăng từ từ theo thời gian → memory leak.
– CPU spike mỗi vài phút → cron/job xử lý nặng.
– CPU cao + response chậm → code sync/blocking event loop.
– RAM chạm ngưỡng VPS → hệ điều hành dùng swap → app chậm toàn hệ thống.
NodeJS rất nhạy với RAM trên VPS nhỏ. Nếu container không giới hạn, nó có thể ăn hết tài nguyên máy.
Kết quả:
– app không chiếm toàn bộ RAM VPS
– tránh 1 container kéo sập cả máy
Lưu ý: giới hạn quá chặt → app bị kill hoặc chậm. Cần đo thật bằng docker stats rồi chỉnh dần.
Theo dõi tài nguyên VPS: đừng chỉ nhìn container
Container ổn chưa chắc VPS ổn. Bạn cần xem cả máy chủ.
Các lệnh cơ bản nên dùng
htop
free -h
df -h
uptime
Ý nghĩa:
– htop → xem process nào ăn CPU/RAM
– free -h → RAM/swap còn bao nhiêu
– df -h → ổ đĩa còn trống không
– uptime → load average toàn hệ thống
Cần chú ý gì?
– Disk gần đầy → log Docker, file upload, backup cũ.
– Swap bị dùng nhiều → RAM thiếu, app sẽ chậm rõ rệt.
– Load average cao kéo dài → CPU quá tải hoặc I/O nghẽn.
– Nhiều process lạ → cần kiểm tra bảo mật hoặc job ngoài dự kiến.
Một kịch bản rất hay gặp:
– app chạy tốt,
– log không rotate,
– vài ngày sau disk 100%,
– Docker lỗi ghi log,
– app bắt đầu restart.
Giám sát disk → tránh lỗi kiểu này.
Cảnh báo cơ bản: không cần quá phức tạp
Nếu hệ thống nhỏ, chưa cần Prometheus/Grafana ngay. Bạn vẫn nên có cảnh báo tối thiểu.
Mức tối thiểu nên có
– RAM vượt 80%
– Disk vượt 80%
– container restart
– app trả nhiều lỗi 5xx
– VPS không phản hồi
Công cụ đơn giản
– Uptime Kuma → theo dõi uptime, HTTP status, ping.
– Netdata → giám sát realtime CPU/RAM/disk/network rất dễ triển khai.
– pm2 monit → hữu ích nếu không chạy hoàn toàn qua Docker, nhưng với Docker thì ưu tiên giám sát container/VPS.
Netdata → cho bạn dashboard gần như tức thì, rất hợp để phát hiện spike tài nguyên.
Quy trình kiểm tra nhanh sau mỗi lần deploy
Một checklist ngắn nhưng cực hữu ích:
1. Kiểm tra container có lên không
docker ps
2. Xem log startup
docker logs --tail 100 <container_name>
3. Test endpoint chính
curl http://localhost:3000/health
4. Theo dõi tài nguyên 5–10 phút đầu
docker stats
5. Kiểm tra RAM, disk VPS
free -h
df -h
6. Xác nhận log rotation đã bật
→ tránh đầy disk sau vài ngày.
Quy trình này chỉ mất vài phút nhưng giúp phát hiện đa số lỗi sớm.
Khi phát hiện bất thường, xử lý theo thứ tự nào?
Đừng sửa ngẫu hứng. Hãy đi theo thứ tự:
1. App có đang sống không?
– container running?
– health endpoint còn trả về?
– log có lỗi mới không?
2. Lỗi thuộc app hay VPS?
– app crash → xem exception
– VPS đầy RAM/disk → xử lý hạ tầng trước
3. Tài nguyên nào đang là nút thắt?
– CPU?
– RAM?
– disk?
– network?
4. Lỗi có lặp lại không?
– sau mỗi deploy?
– theo khung giờ?
– khi traffic tăng?
Cách tiếp cận này giúp bạn tránh “restart cho đỡ” nhưng không giải quyết gốc rễ.
Kết luận
Deploy NodeJS bằng Docker lên VPS là bước đầu. Muốn hệ thống chạy ổn định lâu dài, bạn cần coi giám sát log và tài nguyên là một phần bắt buộc của vận hành.
Tối thiểu, hãy làm 4 việc:
– xem log container thường xuyên
– bật log rotation
– theo dõi CPU/RAM/disk bằng docker stats, htop, df -h
– thiết lập cảnh báo uptime/tài nguyên cơ bản
Khi có thói quen này, bạn sẽ phát hiện lỗi trước khi người dùng báo, tối ưu VPS tốt hơn, và biết chính xác lúc nào cần nâng cấu hình, sửa code, hoặc scale hệ thống.
Nếu hệ thống của bạn đang nhỏ, đừng chờ đến khi có Prometheus/Grafana mới bắt đầu. Chỉ cần docker logs, docker stats, htop, và một dashboard như Netdata/Uptime Kuma, bạn đã có nền tảng giám sát đủ thực tế để vận hành NodeJS trên VPS an toàn hơn rất nhiều.