football-booking-infra-k3s
Infrastructure-as-Code cho hệ thống Football Booking — tự động hóa toàn bộ quá trình provision và deploy lên cụm K3s 3 node bằng Ansible + Helm.
📋 Xem SERVICES.md để biết danh mục đầy đủ tất cả repo trong hệ thống (mục đích, tech stack, docs, CI/CD).
Kiến trúc tổng quan
┌─────────────────────────────────────────────────────┐
│ MASTER NODE │
│ │
│ Docker Compose — stateful services │
│ ├── PostgreSQL 16 (port 5432) │
│ ├── MongoDB 7 (port 27017) │
│ ├── Redis (port 6379) │
│ ├── Kafka + Zookeeper (port 9092/9093) │
│ ├── Keycloak (port 8080) │
│ └── OmniRoute LLM (port 20128) │
│ │
│ Docker Compose — observability │
│ ├── ClickHouse + SigNoz (metrics/traces/logs) │
│ ├── OpenTelemetry Collector │
│ ├── LangFuse (LLM observability) │
│ └── MinIO (blob storage cho LangFuse) │
│ │
├─────────────────────────────────────────────────────┤
│ WORKER NODE 1 & 2 │
│ │
│ K3s Workloads — Helm charts │
│ ├── api-gateway (NestJS) │
│ ├── user-service (NestJS) │
│ ├── field-service (NestJS) │
│ ├── booking-service (NestJS) │
│ ├── payment-service (NestJS) │
│ ├── notification-service (NestJS) │
│ ├── chatbot-service (Python/FastAPI) │
│ └── nginx-ingress (load balancer) │
└─────────────────────────────────────────────────────┘
Luồng request: Client → nginx-ingress → api-gateway → microservices → stateful services
Tech Stack
| Layer | Tool | Vai trò |
|---|---|---|
| Orchestration | K3s v1.29.4 | Lightweight Kubernetes, 3 node (1 master + 2 worker) |
| Provisioning | Ansible | Cài đặt OS, K3s, Docker, deploy toàn bộ services |
| Secret management | Ansible Vault | Encrypt secrets trước khi commit |
| App deploy | Helm 3 | Deploy stateless NestJS/chatbot workloads lên K3s |
| Stateful services | Docker Compose | PostgreSQL, MongoDB, Redis, Kafka, Keycloak trên master |
| CI/CD | GitHub Actions | Reusable workflows, deploy qua SSH + helm upgrade --atomic |
| Networking | nginx-ingress | Route traffic từ ingress vào api-gateway |
| CNI | Flannel VXLAN | Pod networking giữa các nodes |
| Observability | SigNoz + LangFuse | APM traces/metrics + LLM call tracking |
| LLM routing | OmniRoute | Multi-provider router (Groq / Gemini / Anthropic) |
Cấu trúc thư mục
football-booking-infra-k3s/
├── ansible.cfg # Cấu hình mặc định Ansible (inventory, SSH key)
├── secrets/
│ └── vault.yml # ⚠ Secrets (PHẢI encrypt trước khi commit)
├── inventory/
│ ├── utm/ # Môi trường local (UTM VM, 192.168.64.x)
│ │ ├── hosts.ini
│ │ └── group_vars/
│ └── oracle/ # Môi trường Oracle Cloud (IP thật)
│ ├── hosts.ini
│ └── group_vars/
├── playbooks/
│ ├── site.yml # Full provision từ đầu (chạy 1 lần)
│ ├── deploy.yml # Re-deploy tất cả apps
│ └── deploy_service.yml # Deploy thủ công 1 service cụ thể
├── roles/
│ ├── common/ # OS baseline: swap, sysctl, UFW, packages
│ ├── docker/ # Cài Docker Engine + Compose plugin
│ ├── k3s_master/ # Cài K3s server, lấy node-token
│ ├── k3s_worker/ # Join cluster bằng token từ master
│ ├── kubeconfig/ # Fetch kubeconfig về máy local
│ ├── stateful_stack/ # Deploy Docker Compose stacks lên master
│ ├── helm_apps/ # Deploy Helm charts lên K3s
│ └── ingress/ # Cài nginx-ingress controller
├── helm/
│ ├── backend/ # Shared chart cho 6 NestJS services
│ ├── chatbot/ # Chart riêng cho chatbot (Python)
│ └── ingress/ # Ingress routing rules
├── docker-compose/
│ ├── stateful-stack.yml # PostgreSQL, MongoDB, Redis, Kafka, Keycloak, OmniRoute
│ ├── observability-stack.yml # SigNoz, LangFuse, ClickHouse, MinIO
│ ├── config/ # otel-collector-config.yaml
│ └── init-scripts/ # PostgreSQL & MongoDB init scripts
├── .github/workflows/
│ ├── cd-backend.yml # Reusable: deploy 1 backend service
│ ├── cd-chatbot.yml # Reusable: deploy chatbot service
│ ├── _example-caller-backend.yml # Template copy vào backend app repo
│ ├── _example-caller-chatbot.yml # Template copy vào chatbot app repo
│ └── README.md # Hướng dẫn setup GitHub Actions
└── scripts/
├── check-before-commit.sh # Kiểm tra security trước khi commit
├── setup-utm-network.sh # Cấu hình network UTM local
└── verify-cluster.sh # Kiểm tra cluster sau khi provision
Môi trường
| Env | Inventory | Nodes | Mục đích |
|---|---|---|---|
utm-local |
inventory/utm |
192.168.64.10/.11/.12 | Phát triển local qua UTM (macOS) |
oracle |
inventory/oracle |
140.238.x.x (masked) | Production trên Oracle Cloud VMs |
Quickstart
1. Yêu cầu
# macOS
brew install ansible helm kubectl
pip3 install ansible-lint
# Tạo SSH key cho cluster
ssh-keygen -t ed25519 -f ~/.ssh/utm_k3s -C "utm-k3s"
2. Cấu hình secrets
# Copy template và điền giá trị thật
cp secrets/vault.yml secrets/vault.yml.plain # chỉ để tham khảo
# Chỉnh sửa secrets/vault.yml, thay tất cả CHANGE_ME
# Sau đó encrypt:
ansible-vault encrypt secrets/vault.yml
ansible-vault encrypt roles/stateful_stack/vars/vault.yml
# Lưu vault password vào file local (không commit)
echo "your-vault-password" > ~/.vault_pass
chmod 600 ~/.vault_pass
3. Provision cluster từ đầu (chạy 1 lần)
# Kiểm tra kết nối SSH
ansible all -i inventory/utm -m ping
# Provision toàn bộ
ansible-playbook -i inventory/utm playbooks/site.yml \
--vault-password-file ~/.vault_pass
4. Kiểm tra cluster
export KUBECONFIG=~/.kube/football-k3s.yaml
kubectl get nodes
kubectl get pods -n football-booking
CI/CD với GitHub Actions
Deploy tự động khi push code vào app repo:
git push (app repo)
→ GitHub Actions CI: build Docker image → push Docker Hub
→ Gọi reusable workflow từ repo này
→ SSH vào master → helm upgrade --atomic
→ K3s rolling update (tự rollback nếu fail)
Setup chi tiết: .github/workflows/README.md
Deploy thủ công:
ansible-playbook -i inventory/oracle playbooks/deploy_service.yml \
-e "service=user-service" \
-e "image_tag=abc1234" \
--vault-password-file ~/.vault_pass
Security
# Chạy trước mỗi lần git commit
./scripts/check-before-commit.sh
Script kiểm tra:
- Vault files đã encrypt chưa
- Không có private key content trong tracked files
- Không có hardcoded passwords
- Không có kubeconfig hoặc .vault_pass bị staged
Quan trọng:
secrets/vault.ymlphải luôn ở dạng encrypted ($ANSIBLE_VAULT;1.1;AES256) trước khi commit. Xem hướng dẫn chi tiết trongARCHITECTURE.md.
Tài liệu
| File | Nội dung |
|---|---|
docs/ARCHITECTURE.md |
Architecture guide (English) |
docs/ARCHITECTURE.vi.md |
Kiến trúc chi tiết, vai trò từng component (Tiếng Việt) |
docs/READING_GUIDE.md |
Sequential reading & debug map (English) |
docs/READING_GUIDE.vi.md |
Hướng dẫn đọc tuần tự + debug map (Tiếng Việt) |
.github/workflows/README.md |
Setup GitHub Actions CI/CD |
Related Repositories
| Repo | Mô tả |
|---|---|
football-booking-backend-boilerplate |
NestJS microservices (6 services) |
football-booking-chatbot-service |
Python/FastAPI chatbot service |