Trong quá trình triển khai ứng dụng, ai cũng từng gặp tình huống: deploy xong thì web chết vài giây, hoặc người dùng đang thao tác thì bị “Connection Refused”.
Điều này xảy ra khi ứng dụng cũ bị dừng trước khi bản mới sẵn sàng phục vụ.
Giải pháp cho vấn đề này gọi là Zero Downtime Deployment – triển khai bản cập nhật mà người dùng không hề bị gián đoạn.
Với các nền tảng CI/CD truyền thống như Docker Swarm, Kubernetes hay GitHub Actions, việc đạt Zero Downtime cần khá nhiều bước cấu hình. Nhưng nếu bạn đang sử dụng Dokploy, thì tin vui là bạn có thể đạt được điều đó chỉ với vài cú click chuột — mà vẫn đảm bảo an toàn, chuyên nghiệp như hệ thống production thực thụ.

Zero Downtime là gì?
Zero Downtime là quá trình triển khai trong đó:
-
Phiên bản cũ vẫn tiếp tục phục vụ người dùng.
-
Phiên bản mới được build, deploy, và test trong nền.
-
Chỉ khi bản mới “healthy”, hệ thống mới chuyển traffic sang nó.
-
Sau cùng, container cũ được tắt dần mà không làm gián đoạn người dùng.
Dokploy có hỗ trợ Zero Downtime không?
Câu trả lời là có, và Dokploy hỗ trợ khá “sạch”.
Mỗi khi bạn deploy một ứng dụng:
-
Dokploy build image mới → push lên Docker Registry.
-
Sau đó triển khai container mới song song với bản cũ.
-
Khi healthcheck đạt trạng thái healthy, Dokploy sẽ tự động hoán đổi route, đưa traffic sang container mới.
-
Container cũ chỉ bị dừng sau khi traffic được chuyển hết.
Tất cả đều diễn ra tự động trong background, giúp bạn không cần viết script phức tạp.
Chuẩn bị môi trường
Để áp dụng được Zero Downtime, bạn cần:
|
Thành phần |
Yêu cầu |
|---|---|
|
Dokploy version |
≥ 0.5.0 |
|
Ứng dụng |
Chạy bằng Docker container |
|
Healthcheck |
Có endpoint kiểm tra /health hoặc /status |
|
Deployment Settings |
Rolling Update được bật |
Ví dụ thực tế: Node.js demo
Tạo ứng dụng Node.js đơn giản
Tạo file server.js:
import express from "express";
const app = express();
const PORT = process.env.PORT || 3000;
// version này giúp ta phân biệt giữa bản cũ và bản mới
const VERSION = process.env.APP_VERSION || "1.0";
app.get("/", (req, res) => {
res.send(`Hello from version ${VERSION}`);
});
app.get("/health", (req, res) => {
res.send("OK");
});
app.listen(PORT, () => console.log(`App running on port ${PORT}`));
Tạo file Dockerfile:
FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 ENV APP_VERSION=1.0 HEALTHCHECK --interval=10s --timeout=3s --start-period=5s \ CMD curl -f http://localhost:3000/health || exit 1 CMD ["node", "server.js"]
Deploy lên Dokploy
-
Vào Dokploy → New App → chọn Node.js.
-
Kết nối repository GitHub/GitLab chứa project.
-
Trong tab Deployment Settings, bật:
-
Rolling Update
-
“Wait for healthcheck before removing old container”
-
Max Parallel Deploy = 1
-
-
Deploy lần đầu → ứng dụng version 1.0 hoạt động.
Mở trình duyệt truy cập domain, bạn sẽ thấy:
“Hello from version 1.0”
Cập nhật ứng dụng
Bây giờ bạn đổi ENV APP_VERSION=2.0 trong Dockerfile, commit và push code lên Git.
Dokploy sẽ tự động:
-
Build image mới (v2.0)
-
Khởi chạy container mới song song
-
Chờ /health trả “OK”
-
Chuyển toàn bộ traffic sang container mới
-
Dừng container cũ an toàn
Khi bạn refresh trình duyệt:
“Hello from version 2.0”
và trong suốt quá trình đó, website không hề downtime.
Bên trong Dokploy: cơ chế Rolling Update
Cấu trúc hoạt động cơ bản của Dokploy có thể hình dung như sau:
+-----------------------+
| Container cũ (v1.0) |
| - status: running |
| - serving traffic |
+-----------------------+
|
| Dokploy build image mới
v
+-----------------------+
| Container mới (v2.0) |
| - status: starting |
| - waiting healthcheck|
+-----------------------+
|
| Khi healthcheck = OK
v
Dokploy chuyển traffic -> v2.0
|
| Container cũ stop
v
+-----------------------+
| Chỉ còn v2.0 active |
+-----------------------+
Đây chính là cốt lõi của Zero Downtime Rolling Update.
Một số lỗi thường gặp & cách khắc phục
|
Vấn đề |
Nguyên nhân |
Giải pháp |
|---|---|---|
|
App bị downtime vài giây |
Chưa bật rolling update hoặc thiếu healthcheck |
Bật rolling update, thêm /health endpoint |
|
Container mới bị kill sớm |
Healthcheck fail hoặc timeout quá ngắn |
Tăng start-period hoặc interval trong Dockerfile |
|
Deploy không update version |
Image bị cache |
Tick “Force build” trong Dokploy |
|
Deploy chậm |
Build image quá nặng |
Dùng .dockerignore, cache layer hợp lý |
Mẹo tối ưu cho Zero Downtime Production
-
Dùng Tag image theo version
Ví dụ my-app:1.0.0, my-app:1.0.1, tránh “latest” để dễ rollback.
-
Thêm Healthcheck chính xác
Endpoint /health chỉ nên trả về “OK” khi app thực sự ready (DB connected, cache warm, …).
-
Giữ log container cũ vài phút
Dokploy cho phép giữ log container cũ để debug nếu bản mới lỗi.
-
Sử dụng Auto Rollback (sắp ra mắt)
Trong phiên bản Dokploy sắp tới, nếu healthcheck fail sau deploy, Dokploy sẽ tự rollback về bản ổn định trước đó.
Tổng kết
Triển khai Zero Downtime từng là bài toán phức tạp trong CI/CD. Nhưng với Dokploy, mọi thứ trở nên dễ dàng hơn bao giờ hết:
-
Không cần viết script phức tạp.
-
Không cần load balancer thủ công.
-
Chỉ cần cấu hình đúng Healthcheck + Rolling Update.
Kết quả:
Mỗi lần bạn cập nhật ứng dụng, người dùng không hề nhận ra có bản deploy mới – đúng tinh thần “Always On” của production chuyên nghiệp.
Dokploy không chỉ là một nền tảng deploy dễ dùng, mà còn mang lại khả năng “Enterprise-grade” cho các team nhỏ.
Khi kết hợp CI/CD với Zero Downtime, bạn sẽ có pipeline chuyên nghiệp, an toàn, và đáng tin cậy như những công ty công nghệ lớn.







