GitOps source of truth for the Football Booking platform — manages Kubernetes deployments via ArgoCD + Helm.
Architecture
GitHub Repos (CI) This Repo (CD) K3s Cluster
───────────────── ────────────── ───────────
football-booking-backend push ───▶ envs/production/backend/ ArgoCD sync ──▶ football-booking ns
football-booking-chatbot push ───▶ envs/production/chatbot/ ArgoCD sync ──▶ football-booking ns
football-booking-go-service push ───▶ envs/production/go-services/ ArgoCD sync ──▶ football-booking ns
Repository Structure
football-booking-gitops/
├── charts/
│ ├── backend-service/ # Shared Helm chart — NestJS microservices
│ │ ├── Chart.yaml
│ │ ├── values.yaml # Default values
│ │ └── templates/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── ingress.yaml
│ │ └── hpa.yaml
│ ├── python-service/ # Shared Helm chart — Python services
│ │ ├── Chart.yaml
│ │ ├── values.yaml
│ │ └── templates/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── hpa.yaml
│ └── go-service/ # Shared Helm chart — Go services
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── hpa.yaml
├── envs/
│ └── production/
│ ├── backend/ # One file per NestJS service
│ │ ├── api-gateway.yaml
│ │ ├── user-service.yaml
│ │ ├── field-service.yaml
│ │ ├── booking-service.yaml
│ │ ├── payment-service.yaml
│ │ └── notification-service.yaml
│ ├── chatbot/
│ │ └── chatbot.yaml
│ └── go-services/ # One file per Go service
│ ├── document-worker.yaml
│ ├── availability-engine.yaml
│ ├── analytics-pipeline.yaml
│ └── webhook-receiver.yaml
├── argocd/
│ ├── namespace.yaml # football-booking namespace
│ ├── applicationset-backend.yaml
│ ├── applicationset-chatbot.yaml
│ └── applicationset-go-services.yaml
└── docs/
└── argocd-guide.md
Services Overview
| Service |
Port |
Image |
Ingress |
| api-gateway |
3000 |
ghcr.io/ORG/api-gateway |
✓ api.football-booking.local |
| user-service |
3001 |
ghcr.io/ORG/user-service |
— |
| field-service |
3002 |
ghcr.io/ORG/field-service |
— |
| booking-service |
3003 |
ghcr.io/ORG/booking-service |
— |
| payment-service |
3004 |
ghcr.io/ORG/payment-service |
— |
| notification-service |
3005 |
ghcr.io/ORG/notification-service |
— |
| chatbot-service |
3006 |
ghcr.io/ORG/chatbot-service |
✓ chatbot.football-booking.local |
| go-document-worker |
3010 |
ghcr.io/ORG/go-document-worker |
— (Kafka consumer nội bộ) |
| go-availability-engine |
3011 |
ghcr.io/ORG/go-availability-engine |
✓ ws.football-booking.local |
| go-analytics-pipeline |
3012 |
ghcr.io/ORG/go-analytics-pipeline |
— (Kafka consumer nội bộ) |
| go-webhook-receiver |
3013 |
ghcr.io/ORG/go-webhook-receiver |
✓ webhooks.football-booking.local |
How It Works
- Developer pushes code to a service repo (
football-booking-backend or football-booking-chatbot)
- GitHub Actions CI builds a Docker image and pushes to GHCR with the git SHA as tag
- CI commits an image tag update to this repo (
envs/production/<service>.yaml)
- ArgoCD detects the change and syncs the updated service to the K3s cluster automatically
Quick Reference
# Check ArgoCD sync status
kubectl get applications -n argocd
# Manually trigger sync for a service
argocd app sync api-gateway
# Rollback a service to previous version
git revert <commit> # in this repo — ArgoCD will auto-sync
git push
# Get initial ArgoCD admin password
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
| Repo |
Role |
football-booking-backend-k3s |
NestJS monorepo — 6 microservices |
football-booking-chatbot-service-k3s |
Python chatbot service |
football-booking-go-service-k3s |
Go monorepo — 4 services (document-worker, availability-engine, analytics-pipeline, webhook-receiver) |
football-booking-infras |
Ansible — K3s cluster + stateful infra + ArgoCD provisioning |
football-booking-gitops |
This repo — Helm charts + ArgoCD config |