Back to articles
Technology Insight

Xây dựng kiến trúc High Availability (HA) cho Strapi CMS với 3 Node VPS Hetzner và HAProxy

May 29, 2026

Giới thiệu về bài toán mở rộng hệ thống với Strapi CMS

Trong kỷ nguyên số hiện nay, Headless CMS đã trở thành xu hướng tất yếu nhờ tính linh hoạt, khả năng tách biệt hoàn toàn giữa cơ sở dữ liệu và giao diện hiển thị (Frontend). Trong số các framework nổi bật, Strapi chiếm ưu thế lớn nhờ mã nguồn mở, khả năng tùy biến cao dựa trên Node.js. Tuy nhiên, khi lượng truy cập từ các ứng dụng Frontend, Mobile App tăng đột biến, một instance Strapi chạy trên một máy chủ đơn lẻ sẽ dễ dàng rơi vào trạng thái quá tải, tạo ra điểm nghẽn duy nhất (Single Point of Failure - SPOF).

Để giải quyết bài toán này, việc xây dựng một kiến trúc High Availability (HA - Tính sẵn sàng cao) là bắt buộc đối với các doanh nghiệp lớn. Bài viết này sẽ hướng dẫn bạn từng bước thiết kế và triển khai cụm hệ thống Strapi HA vững chắc sử dụng 3 Node VPS từ nhà cung cấp Hetzner và bộ cân bằng tải mạnh mẽ HAProxy.

Tại sao lại chọn Hetzner và HAProxy cho hạ tầng HA?

Hetzner Cloud nổi tiếng trong cộng đồng công nghệ nhờ hiệu năng phần cứng vượt trội (đặc biệt là các dòng chip AMD EPYC) đi kèm mức chi phí tối ưu nhất thị trường châu Âu. Bên cạnh đó, tính năng Hetzner Private Networks giúp các VPS giao tiếp nội bộ với độ trễ cực thấp và bảo mật tuyệt đối.

Mặt khác, HAProxy là giải pháp cân bằng tải (Load Balancer) mã nguồn mở tiêu chuẩn công nghiệp, có khả năng xử lý hàng triệu kết nối đồng thời với lượng tài nguyên tiêu thụ cực thấp. Sự kết hợp giữa Hetzner và HAProxy mang lại một nền tảng hạ tầng vừa kinh tế, vừa có khả năng chịu tải cực kỳ ấn tượng.

Kiến trúc tổng quan của hệ thống Strapi High Availability

Mô hình chuẩn hóa cho cụm 3 Node VPS Hetzner được phân bổ chức năng như sau:

  • Node 1 (Load Balancer): Cài đặt HAProxy đóng vai trò phân phối luồng traffic (HTTP/HTTPS) đến các node phía sau, đồng thời theo dõi sức khỏe (Health Check) của các instance Strapi.
  • Node 2 & Node 3 (Strapi Application Nodes): Chạy các thực thể ứng dụng Strapi giống hệt nhau, kết nối chung về một cơ sở dữ liệu và phân vùng lưu trữ media tập trung.
Lưu ý quan trọng: Bản chất của Strapi là một ứng dụng State-less nếu chúng ta cấu hình đúng cách. Điều này có nghĩa là mọi trạng thái dữ liệu (Database) và tệp tin đa phương tiện (Media Uploads) phải được lưu trữ độc lập ở bên ngoài các Node ứng dụng này.

Các bước chuẩn bị tiền đề trước khi cấu hình

Trước khi bắt tay vào cấu hình chi tiết, bạn cần chuẩn bị sẵn các thành phần cốt lõi sau để đảm bảo dữ liệu đồng bộ giữa các node Strapi:

  1. Cơ sở dữ liệu tập trung (Centralized Database): Sử dụng dịch vụ Managed Database (PostgreSQL/MySQL) hoặc dựng một cụm DB Cluster riêng biệt. Tuyệt đối không dùng SQLite nội bộ trên từng Node.
  2. Lưu trữ Media tập trung (Shared Storage): Vì Strapi lưu trữ ảnh/video được upload lên thư mục cục bộ theo mặc định, bạn cần chuyển cấu hình sang sử dụng AWS S3, Cloudflare R2 hoặc giải pháp MinIO để cả Node 2 và Node 3 đều nhìn thấy cùng một tài nguyên dữ liệu.
  3. Mạng nội bộ (Hetzner Private Network): Tạo một mạng LAN ảo trên dashboard của Hetzner (ví dụ dải IP: 10.0.0.0/24) và gán cả 3 VPS vào mạng này để tối ưu tốc độ truyền tải nội bộ.

Cấu hình HAProxy cân bằng tải cho cụm Strapi

Truy cập vào Node 1 qua SSH để tiến hành cài đặt và cấu hình HAProxy. Đây sẽ là cổng chào duy nhất đón nhận mọi yêu cầu từ người dùng.

Thực hiện cài đặt HAProxy trên hệ điều hành Ubuntu/Debian bằng lệnh:

sudo apt update && sudo apt install haproxy -y

Sau khi cài đặt thành công, chỉnh sửa file cấu hình cốt lõi tại đường dẫn /etc/haproxy/haproxy.cfg. Cấu hình phân phối tải theo thuật toán Round Robin kết hợp cơ chế kiểm tra trạng thái hoạt động (health check):

frontend strapi_front
    bind *:80
    # Nếu có SSL: bind *:443 ssl crt /etc/ssl/certs/your_domain.pem
    mode http
    default_backend strapi_nodes

backend strapi_nodes
    mode http
    balance roundrobin
    option httpchk GET /_health
    http-check expect status 200
    cookie SERVERID insert indirect nocache
    server strapi-node-2 10.0.0.2:1337 check cookie strapi-node-2
    server strapi-node-3 10.0.0.3:1337 check cookie strapi-node-3

Trong đoạn cấu hình trên, tham số cookie SERVERID cực kỳ quan trọng đối với Strapi. Nó kích hoạt tính năng Sticky Sessions (Session Affinity), đảm bảo một admin khi đăng nhập vào trang quản trị (Strapi Admin Dashboard) sẽ được giữ cố định tại một Node trong suốt phiên làm việc, tránh lỗi mất token hoặc xung đột session khi thực hiện cập nhật nội dung.

Khởi động lại dịch vụ để áp dụng cấu hình mới:

sudo systemctl restart haproxy

Cấu hình và triển khai Strapi trên các Node ứng dụng

Tại Node 2 và Node 3, chúng ta sẽ tiến hành deploy mã nguồn Strapi. Bạn cần đảm bảo phiên bản Node.js và mã nguồn trên cả hai máy chủ là hoàn toàn đồng nhất. Cách tốt nhất là đóng gói ứng dụng bằng Docker hoặc quản lý quy trình bằng PM2.

Cấu hình file môi trường .env trên cả hai node phải trỏ chung về một database và cấu hình chung một chuỗi mã hóa khóa bảo mật (App Keys, JWT Secret, Admin JWT Secret):

HOST=0.0.0.0
PORT=1337
APP_KEYS=key1,key2,key3,key4
API_TOKEN_SALT=your_api_token_salt
ADMIN_JWT_SECRET=your_admin_jwt_secret
JWT_SECRET=your_jwt_secret

# Database tập trung
DATABASE_CLIENT=postgres
DATABASE_HOST=10.0.0.10
DATABASE_PORT=5432
DATABASE_NAME=strapi_db
DATABASE_USERNAME=strapi_user
DATABASE_PASSWORD=secure_password

Sau khi khởi chạy Strapi bằng PM2 thông qua lệnh pm2 start server.js --name strapi-app, hệ thống sẽ mở port 1337 nội bộ. HAProxy ở Node 1 sẽ tự động nhận diện trạng thái "Healthy" thông qua endpoint /_health và bắt đầu điều hướng lưu lượng truy cập.

Kiểm tra tính chịu lỗi và vận hành thực tế

Để chứng minh kiến trúc High Availability hoạt động hoàn hảo, bạn có thể thực hiện một bài kiểm tra chịu lỗi đơn giản (Failover Test):

Đầu tiên, truy cập trang quản trị Strapi thông qua IP công khai hoặc tên miền trỏ về Node 1 (HAProxy). Sau đó, tiến hành tắt thủ công dịch vụ Strapi trên Node 2 (giả lập kịch bản Node 2 gặp sự cố phần cứng đột xuất):

pm2 stop strapi-app

Ngay lập tức, hãy quay lại trình duyệt và tải lại trang hoặc thực hiện các thao tác thêm/sửa nội dung. Bạn sẽ nhận thấy hệ thống vẫn hoạt động mượt mà không hề xảy ra tình trạng gián đoạn hay xuất hiện lỗi 502. Kiểm tra log của HAProxy, bạn sẽ thấy thiết bị đã tự động cô lập Node 2 và chuyển toàn bộ tải sang Node 3 chỉ trong vài mili-giây.

Kết luận

Việc thiết kế hạ tầng High Availability cho Strapi CMS trên hạ tầng VPS Hetzner kết hợp HAProxy không chỉ giúp hệ thống của doanh nghiệp loại bỏ hoàn toàn rủi ro sập nguồn đơn điểm (SPOF) mà còn tối ưu hóa tài nguyên phần cứng tới mức tối đa. Khi lượng truy cập tiếp tục tăng trưởng trong tương lai, bạn chỉ cần đơn giản bổ sung thêm Node 4, Node 5 vào cấu hình backend của HAProxy mà không cần phải thay đổi cấu trúc cốt lõi của ứng dụng. Đây chính là bệ phóng hạ tầng vững chắc giúp chiến lược phát triển nội dung số của bạn luôn vận hành thông suốt và bền bỉ.

Xây dựng kiến trúc High Availability (HA) cho Strapi CMS với 3 Node VPS Hetzner và HAProxy | DPTCloud