Deploy nhiều app NodeJS trên cùng một VPS bằng Docker: an toàn, gọn, dễ vận hành
Chạy nhiều app NodeJS trên một VPS nghe đơn giản: cài Node, clone repo, pm2 start, xong. Nhưng rất nhanh sẽ gặp hỗn loạn: port đụng nhau, log khó đọc, SSL rối, update dễ downtime, một app lỗi kéo theo cả máy nghẹt tài nguyên. Quy mô nhỏ vẫn chịu được. Quy mô vừa → bắt đầu đau.
Giải pháp thực dụng nhất cho đa số team nhỏ, startup, freelancer: Docker + reverse proxy + tách mạng + quy ước deploy rõ ràng. Mục tiêu không phải “enterprise”, mà là: an toàn hơn, deploy nhanh hơn, rollback dễ hơn, quản lý đỡ mệt hơn.
Bài này đi thẳng vào mô hình triển khai nhiều app NodeJS trên cùng một VPS theo hướng ổn định, bảo mật cơ bản tốt, dễ bảo trì.
Vì sao nên dùng Docker thay vì chạy thẳng Node trên VPS?
Chạy thẳng nhiều app NodeJS trên OS host thường dẫn tới:
– Xung đột môi trường: app A cần Node 18, app B cần Node 20.
– Port lộn xộn: app nào cũng muốn 3000, 4000.
– Deploy khó chuẩn hóa: mỗi app một script.
– Rollback kém: update lỗi → sửa tay.
– Khó cô lập: app ăn RAM/CPU quá mức → ảnh hưởng app khác.
Docker giải quyết khá gọn:
– Mỗi app = một container → cô lập runtime.
– Image bất biến → build 1 lần, chạy ổn định.
– Port nội bộ riêng → reverse proxy route domain đúng app.
– Dễ CI/CD → docker compose pull && up -d.
– Rollback nhanh → quay lại image cũ.
Docker không tự làm hệ thống “an toàn tuyệt đối”. Nhưng nó tạo nền tốt để bạn kiểm soát tốt hơn.
Kiến trúc nên dùng: 1 reverse proxy, nhiều app container
Mô hình khuyến nghị:
– 1 VPS
– 1 reverse proxy container: Nginx, Traefik, hoặc Caddy
– N app NodeJS, mỗi app một container
– Database:
– tốt nhất: tách VPS/managed DB
– chấp nhận được: DB container riêng, không public port
– Docker network riêng
– SSL terminate tại reverse proxy
Luồng chuẩn:
– User vào app1.example.com
– Reverse proxy nhận request
– Proxy route tới container app1
– App xử lý
– Response trả về qua proxy
Lợi ích lớn:
– Chỉ mở public 80/443
– App NodeJS không cần public port ra Internet
– SSL tập trung một chỗ
– Domain/subdomain mapping rõ ràng
Cấu trúc thư mục nên gọn, chuẩn ngay từ đầu
Trên VPS, nên thống nhất kiểu tổ chức:
/opt/apps/
reverse-proxy/
app-a/
app-b/
app-c/
Mỗi app nên có:
– Dockerfile
– docker-compose.yml hoặc nằm trong compose tổng
– .env
– thư mục volume nếu cần log/upload
– restart: unless-stopped → tự khởi động lại
– expose thay vì ports → chỉ mở nội bộ Docker
– giới hạn RAM/CPU → app lỗi không kéo sập VPS
– dùng external network chung cho proxy + app
Tạo network 1 lần:
docker network create web
Reverse proxy: mảnh ghép quan trọng nhất
Nếu muốn dễ nhất, Caddy rất đáng dùng vì tự cấp SSL. Nếu muốn phổ biến hơn, chọn Nginx + Certbot. Nếu muốn tự động routing mạnh, chọn Traefik.
App có endpoint /health → deploy an toàn hơn nhiều.
Khi nào mô hình này đủ, khi nào nên nâng cấp?
Mô hình 1 VPS + Docker phù hợp nếu:
– 2-10 app nhỏ/vừa
– traffic chưa quá lớn
– team ít người
– cần tối ưu chi phí
– muốn deploy nhanh, quản lý đơn giản
Nên nghĩ tới nhiều VPS, orchestrator, hoặc managed platform khi:
– cần high availability
– cần auto-scaling
– traffic tăng mạnh
– yêu cầu zero-downtime chặt
– nhiều người cùng vận hành
Đừng “Kubernetes quá sớm”. Nhiều trường hợp chỉ làm hệ thống phức tạp hơn.
Kết luận
Deploy nhiều app NodeJS trên cùng một VPS không khó. Khó ở chỗ giữ nó gọn, an toàn, dễ sống cùng lâu dài. Công thức thực tế nhất thường là:
– Docker để cô lập app
– Docker Compose để quản lý
– Reverse proxy để route domain + SSL
– Firewall + SSH key + DB không public để giảm rủi ro
– Giới hạn tài nguyên + backup + monitoring để tránh sự cố lan rộng
Nếu làm đúng từ đầu, bạn sẽ có một hệ thống:
– deploy nhanh
– thêm app dễ
– rollback gọn
– ít port hở
– dễ debug hơn nhiều so với chạy tay từng app
Tóm ngắn: 1 VPS vẫn đủ mạnh và chuyên nghiệp, miễn là bạn triển khai có quy ước, có cô lập, có bảo mật tối thiểu. Không cần quá nhiều công cụ. Cần đúng công cụ, đúng cấu trúc, đúng kỷ luật vận hành.