Môi trường staging là một bản chạy thử của phần mềm, dựng giống hệ thống thật (production) về mã, cấu hình và hạ tầng, nhưng dùng cơ sở dữ liệu riêng và không phục vụ khách thật. Mọi bản mới được đưa lên staging, đo ở đó, rồi mới đưa đúng bản đã đo sang production. Phần mềm doanh nghiệp phải có staging vì phần lớn sự cố đến từ chính các lần thay đổi: sách Site Reliability Engineering của Google ghi khoảng 70% sự cố ngừng dịch vụ do thay đổi trên hệ thống đang chạy. Không có staging, mỗi lần sửa lỗi là một lần thử nghiệm trên dữ liệu thật của công ty.
Bài này viết cho người mua và người vận hành phần mềm. Phần sau kể bốn sự cố ALODEV gặp trên phần mềm nội bộ của chính mình khi ranh giới giữa staging và production bị lẫn, và các chốt chặn được thêm sau mỗi lần.
Staging nằm ở đâu giữa máy lập trình viên và hệ thống thật
| Môi trường | Ai dùng | Dữ liệu | Dùng để làm gì |
|---|---|---|---|
| Máy lập trình viên (local) | Người viết mã | Dữ liệu mẫu tự tạo | Viết và thử nhanh từng phần |
| Bản xem thử (preview) | Đội làm, đôi khi khách | Tuỳ cấu hình, có khi dùng chung dữ liệu thật | Xem giao diện, duyệt nhanh |
| Staging | Đội làm và người duyệt phía khách | Cơ sở dữ liệu riêng, bản sao hoặc dữ liệu mẫu | Đo đầy đủ bản sắp phát hành |
| Production | Nhân viên và khách thật | Dữ liệu thật | Vận hành hằng ngày, chỉ nhận bản đã đo |
Chỗ dễ nhầm nhất là bản xem thử. Nhiều đơn vị gọi bất cứ địa chỉ nào khác production là staging, trong khi bản đó vẫn đọc và ghi vào cơ sở dữ liệu thật. ALODEV từng có đúng cấu hình này: cuối tháng 8/2026, bản xem thử của phần mềm nội bộ AIO dùng chung cơ sở dữ liệu với production, nên mọi thao tác thử trên đó đều ghi vào chấm công và lương thật của nhân viên. Staging thật của AIO dùng một cơ sở dữ liệu tên khác hẳn (workwatch_staging) trên cùng máy chủ Postgres.

Bốn sự cố khi ranh giới bị lẫn
Các sự việc dưới đây đều ghi trong kho mã ALODEV AIO, kèm ngày và cách chặn. Không có sự việc nào do mã nghiệp vụ viết sai; tất cả nằm ở đường đi từ staging sang production.
Trước 26/08: staging và production dùng chung một tệp chạy
Backend của AIO là một tệp chạy biên dịch từ Go. Trước ngày 26/08/2026, tiến trình staging và tiến trình production cùng chạy một tệp duy nhất, chỉ khác biến môi trường. Build bản thử cho staging là ghi đè luôn tệp của production, và lần khởi động lại production kế tiếp (do máy chủ khởi động lại hay tiến trình tự hồi phục) sẽ âm thầm đưa mã chưa duyệt ra cho cả công ty. Cách chặn: tách hai tệp riêng, và sau mỗi lần khởi động lại staging thì đối chiếu dấu vân tay tệp production để chắc nó không đổi.
30/08: đưa bản mới lên thì dữ liệu thật bị ghi đè
Lệnh đưa giao diện từ staging sang production đồng bộ cả thư mục dữ liệu, nơi lưu trạng thái thật như ai đã gửi lịch làm việc tuần nào. Thư mục đó bên staging chứa dữ liệu thử. Kết quả: sau mỗi lần phát hành, nhân viên đã gửi lịch bỗng hiện thành chưa gửi, và chức năng khoá lịch trông như hỏng, dù logic khoá vẫn đúng. Cách chặn: script phát hành luôn loại trừ thư mục dữ liệu, bất kể ai chạy.
06/09: production trả mã 200 nhưng mọi nút đều chết
Một bản build thiếu tệp tĩnh (JavaScript, CSS) được đồng bộ lên production. Trang vẫn trả mã 200, vẫn hiện chữ, nhưng không nút nào bấm được. Sự cố kéo dài hai tiếng vì kiểm tra qua tên miền đi qua Cloudflare trả bản đã lưu, báo mọi thứ bình thường. Cách chặn: script từ chối đồng bộ nếu thư mục tệp tĩnh rỗng, và kiểm tra sức khoẻ đọc thẳng ở máy chủ gốc thay vì qua tên miền.
18/09: bản được đưa lên không phải bản đã đo
Lúc 20:42 staging được dựng thành bản b0f61b5f-2040, đo đầy đủ, rồi được đưa lên production lúc 21 giờ. Lúc 21:30, một phiên làm việc khác dựng đè staging thành bản mới. Lần đó may mắn trót lọt, nhưng nếu lệnh phát hành chạy chậm nửa tiếng, production sẽ nhận một bản không ai đo, và mọi phép kiểm sau phát hành vẫn báo đạt vì chúng kiểm bản mới. Cách chặn: lệnh phát hành bắt buộc nêu đúng dấu build đã đo, và từ chối nếu không tìm thấy dấu đó trong thư mục sắp chép.

Điểm chung của bốn sự việc: staging không có tác dụng gì nếu đường sang production không đảm bảo thứ được chép sang đúng là thứ đã đo. Câu ghi trong kho mã tóm lại bài học này là định danh bằng nội dung, đừng định danh bằng vị trí: đưa bản b0f61b5f-2040 lên production, thay vì đưa thư mục staging lên production.
Mã 200 không chứng minh phần mềm chạy được
Ngày 09/09/2026, đội AIO đo được bản staging đang chạy có màn lịch khu quản trị bị lỗi phía trình duyệt, trong khi máy chủ vẫn trả mã 200 và tệp tĩnh vẫn đủ. Mọi kiểm tra tự động chỉ nhìn mã trả về đều báo xanh cho một màn đã chết. Vì vậy quy trình của AIO yêu cầu mở thật các màn quan trọng trên staging bằng trình duyệt tự động, đếm lỗi trong console, trước khi được phát hành. Staging là nơi duy nhất làm được việc này mà không ảnh hưởng người dùng.

Dữ liệu trên staging: bản sao thật hay dữ liệu mẫu
Staging của AIO được dựng lại bằng một script chỉ đọc từ production: xoá cơ sở dữ liệu staging, chép toàn bộ từ production sang, rồi khởi động lại. Script có chốt chặn đầu tiên là nếu tên cơ sở dữ liệu đích trùng nguồn thì dừng ngay. Cách này cho staging dữ liệu giống thật nhất, nên lỗi do dữ liệu lạ lộ ra trước khi phát hành.
Cái giá là staging chứa dữ liệu thật của nhân viên: lương, chấm công, thông tin cá nhân. Staging vì vậy phải được bảo vệ như production: không mở công khai, không cấp tài khoản cho người ngoài, không dùng để trình diễn. Khi cần trình diễn hoặc cần số liệu dày để xem giao diện, ALODEV đổ dữ liệu giả vào staging, và luật cứng là dữ liệu giả không bao giờ được ghi vào production, vì một dòng giả ở đó không phân biệt được với dòng thật khi tính lương.
Khi nào KHÔNG cần staging riêng
- Trang giới thiệu tĩnh hoặc trang đích không có dữ liệu người dùng. Bản xem thử trên một địa chỉ riêng là đủ, miễn là không có biểu mẫu gửi vào hệ thống thật.
- Phần mềm thuê bao (SaaS) do nhà cung cấp vận hành. Staging là việc của họ; phía công ty nên có một tài khoản thử hoặc môi trường sandbox để thử cấu hình mới.
- Công cụ nội bộ dùng một lần, dữ liệu có thể tạo lại dễ dàng. Khi đó bản sao lưu trước mỗi lần sửa quan trọng hơn staging.
- Nguồn lực quá mỏng để giữ staging giống production. Một staging lệch xa production (khác phiên bản cơ sở dữ liệu, khác cấu hình) cho cảm giác an toàn giả; tốt hơn là đầu tư vào sao lưu và khả năng lùi bản nhanh.
Ngay website alodev.vn cũng từng chạy không có staging riêng cho phần giao diện, và đã trả giá: một phiên chạy chế độ phát triển ngay trong thư mục đang phục vụ production làm tiến trình web khởi động lại hơn 17 nghìn lần. Từ đó quy định của kho website ghi rõ bản xem thử phải chạy ở thư mục tách riêng.
Những câu nên hỏi đơn vị làm phần mềm
- Staging dùng cơ sở dữ liệu nào, khác production thế nào, và ai được truy cập.
- Bản đưa lên production được định danh thế nào: bằng một mã phiên bản cụ thể hay bằng câu nói chung chung là bản mới nhất.
- Trước mỗi lần phát hành, những gì được đo trên staging, và ai ký xác nhận.
- Nếu bản mới lỗi, lùi về bản cũ mất bao lâu, và bản sao lưu gần nhất cách đó bao lâu.
- Dữ liệu thử có bao giờ được ghi vào production không, và điều gì chặn việc đó.
Câu hỏi thường gặp
Staging là gì?
Staging là môi trường chạy thử dựng giống hệ thống thật nhưng có dữ liệu riêng, dùng để đo bản phần mềm sắp phát hành trước khi đưa đúng bản đó lên production.
Staging khác môi trường test và UAT thế nào?
Môi trường test thường dành cho kiểm thử tự động của đội làm, cấu hình có thể khác production. UAT là bước người dùng phía khách nghiệm thu, và thường được làm ngay trên staging vì đó là môi trường giống thật nhất.
Có staging thì tốn gấp đôi chi phí máy chủ không?
Không nhất thiết. Staging không phục vụ tải thật nên có thể chạy trên cùng máy chủ hoặc máy nhỏ hơn, miễn là dùng cơ sở dữ liệu riêng và tệp chạy riêng. Staging của ALODEV AIO chạy cùng máy chủ Postgres với production nhưng ở cơ sở dữ liệu khác tên.
Dữ liệu staging nên lấy từ đâu?
Chép từ production bằng script chỉ đọc cho dữ liệu giống thật nhất, hoặc dùng dữ liệu mẫu khi cần trình diễn. Nếu chép từ production thì staging phải được bảo vệ như production vì chứa dữ liệu thật.
Website WordPress có cần staging không?
Website có bán hàng, có biểu mẫu thu thông tin khách hoặc cập nhật plugin thường xuyên thì nên có. Nhiều nhà cung cấp hosting WordPress có sẵn chức năng tạo bản staging; nhớ tắt gửi email và thanh toán thật trên bản đó.





