Triển khai Nền tảng
VENI-AI là một nền tảng Cloud-Native. Mọi thành phần đều được đóng gói (containerized) và điều phối bằng Kubernetes (K8s), tuân theo các nguyên tắc triển khai độc lập cho từng Hệ thống Tự trị (SCS).
☸️ Kiến trúc Kubernetes
Nền tảng được triển khai dưới dạng một liên minh các dịch vụ. Shell đóng vai trò là bộ điều phối, trong khi các Satellite chạy như các lát cắt dọc (vertical slices) độc lập.
🏗️ 1. Chiến lược Container hóa
Mỗi ứng dụng (API và UI) được đóng gói dưới dạng một Docker image.
- Build nhiều giai đoạn (Multi-Stage): Chúng tôi sử dụng
oven/bun:1-alpinecho môi trường runtime cuối cùng để giảm thiểu kích thước image và diện tích bề mặt bảo mật. - Môi trường Runtime: Chúng tôi sử dụng mô hình
env-config.jscho các UI. Các biến nhưVITE_API_URLkhông được "đóng cứng" vào bản build; chúng được tiêm qua kịch bảndocker-entrypoint.shkhi container khởi động dựa trên các biến môi trường của K8s.
🧩 2. Quản lý bằng Kustomize
Chúng tôi sử dụng Kustomize để quản lý các cấu hình theo từng môi trường (Dev, UAT, Prod) mà không cần lặp lại các tệp manifest.
| Thư mục | Mục đích |
|---|---|
base/ | Các bản triển khai (deployments), dịch vụ (services) và tài khoản dịch vụ (service accounts) tiêu chuẩn. |
overlays/dev/ | Giới hạn tài nguyên thấp, Registry local, LoadBalancer để truy cập dễ dàng hơn. |
overlays/prod/ | Tính sẵn sàng cao (replicas > 2), tự động mở rộng pod (HPA) và chứng chỉ TLS. |
🚀 3. Vòng đời CI/CD
Luồng triển khai của chúng tôi được tự động hóa hoàn toàn qua GitHub Actions.
- Tích hợp liên tục (CI): Với mỗi PR, chúng tôi chạy kiểm tra lỗi (linting), unit test và kiểm tra bản build.
- Quảng bá Image:
- Đẩy mã lên nhánh
developsẽ kích hoạt build và đẩy lên Dev Registry với tag:dev-latest. - Gắn tag Git (ví dụ:
v1.2.0) sẽ kích hoạt build và đẩy lên Production Registry.
- Đẩy mã lên nhánh
- Triển khai GitOps: Luồng tự động cập nhật tag image trong overlay Kustomize tương ứng và chạy
kubectl apply -k.
🔄 4. Vòng đời Cơ sở dữ liệu trong K8s
Để duy trì tính tự chủ của SCS, việc cập nhật schema (migrations) phải chạy song song với việc cập nhật mã nguồn.
Mô hình InitContainer
Mỗi bản triển khai API đều bao gồm một initContainer để chạy kịch bản migration của Drizzle. Container ứng dụng chính sẽ chỉ khởi động nếu quá trình migration thành công.
# Trích đoạn đơn giản của Deployment Spec
spec:
initContainers:
- name: db-migrate
image: veni-api-image:v1.2.0
command: ["bun", "run", "dist/scripts/migrate.js"]
envFrom:
- secretRef: { name: db-credentials }📡 5. Ingress & Điều hướng Toàn cục
Nginx Ingress Controller là cổng vào duy nhất. Nó xử lý:
- Chấm dứt SSL/TLS: Sử dụng Cert-Manager cho các chứng chỉ Let's Encrypt.
- Điều hướng theo Path/Host: Điều hướng
api.veni.ai/auth/*đến Shell vàapi.veni.ai/hrm/*đến Satellite HRM. - Chính sách CORS: Cho phép các yêu cầu chéo nguồn (cross-origin) bắt buộc cho Module Federation.
Giám sát
Tất cả các bản triển khai K8s đều được giám sát qua Prometheus và Loki. Tham khảo trang Dịch vụ Hệ thống để biết thêm chi tiết.