Getting Started — football-booking-go-services
Hướng dẫn cài đặt môi trường, cấu hình, và chạy Go services ở local cũng như production.
Yêu cầu hệ thống
| Tool | Version | Kiểm tra |
|---|---|---|
| Go | ≥ 1.23 | go version |
| Docker + Docker Compose | ≥ 24 | docker version |
| Make | any | make --version |
| golangci-lint (optional, cho lint) | ≥ 1.60 | golangci-lint --version |
Quan trọng: Shared infra stack (
football-booking-infras/docker-compose/stateful-stack.local.yml) phải đang chạy trước vì nó là owner củafootball-booking-network. Go services chỉ join network đó — xemfootball-booking-infras/docker-compose/README.md.
1. Clone và cài đặt dependencies
git clone https://github.com/sangtrandev00/football-booking-go-services.git
cd football-booking-go-services
# Tải tất cả Go dependencies và tạo go.sum
go mod tidy
2. Cấu hình environment
# Copy file mẫu
cp deployments/.env.example deployments/.env
# Mở và điền các giá trị thực
nano deployments/.env
Các biến bắt buộc phải điền:
# Redis password (lấy từ NestJS .env)
REDIS_PASSWORD=...
# PostgreSQL (lấy từ NestJS .env)
DB_ADMIN_PASSWORD=...
# MinIO credentials (nếu dùng document-worker)
MINIO_ACCESS_KEY=...
MINIO_SECRET_KEY=...
# ClickHouse password (nếu dùng analytics-pipeline)
CLICKHOUSE_PASSWORD=...
# Payment webhooks
VNPAY_HASH_SECRET=...
STRIPE_WEBHOOK_SECRET=...
3. Chạy local (development)
Option A — Docker Compose (khuyến nghị)
# Đảm bảo NestJS stack đang chạy và network đã tồn tại
docker network ls | grep football-booking-network
# Build images từ source và start tất cả 4 services
make dev
# Hoặc chỉ start một service cụ thể
docker compose -f deployments/docker-compose.yml up -d document-worker
# Xem logs realtime
docker compose -f deployments/docker-compose.yml logs -f document-worker
# Stop
make dev-down
Option B — Chạy trực tiếp (không cần Docker)
Cách này yêu cầu các service infrastructure (Kafka, Redis, Postgres...) đang chạy và accessible từ local machine.
# Compile tất cả services
make build
# Chạy từng service (mỗi terminal riêng)
KAFKA_BROKERS=localhost:9092 \
MINIO_ENDPOINT=localhost:9000 \
MINIO_ACCESS_KEY=minioadmin \
MINIO_SECRET_KEY=minioadmin \
./bin/document-worker
KAFKA_BROKERS=localhost:9092 \
REDIS_HOST=localhost \
REDIS_PASSWORD=your_password \
DB_HOST=localhost \
DB_PASSWORD=your_password \
./bin/availability-engine
KAFKA_BROKERS=localhost:9092 \
CLICKHOUSE_DSN=clickhouse://default:password@localhost:9000/football_analytics \
./bin/analytics-pipeline
KAFKA_BROKERS=localhost:9092 \
VNPAY_HASH_SECRET=your_secret \
STRIPE_WEBHOOK_SECRET=whsec_... \
./bin/webhook-receiver
4. Kiểm tra services đang chạy
Mỗi service expose một health endpoint:
# document-worker
curl http://localhost:3010/health
# → {"status":"ok","uptime":"1m30s"}
# availability-engine (WebSocket + health)
curl http://localhost:3011/health
# analytics-pipeline
curl http://localhost:3012/health
# webhook-receiver
curl http://localhost:3013/health
Test WebSocket connection (availability-engine):
# Cần wscat: npm install -g wscat
wscat -c "ws://localhost:3011/ws?fieldId=field-123"
# Khi có booking event → server push: {"fieldId":"field-123","date":"2025-01-15","eventType":"booking.created"}
Test webhook (webhook-receiver):
# VNPay IPN test (signature sẽ invalid → trả RspCode 97, nhưng endpoint hoạt động)
curl -X POST http://localhost:3013/webhooks/vnpay/ipn \
-d "vnp_TxnRef=TEST123&vnp_Amount=100000&vnp_ResponseCode=00&vnp_SecureHash=invalid"
# Stripe (cần Stripe CLI để tạo signature hợp lệ)
stripe trigger payment_intent.succeeded --webhook-endpoint http://localhost:3013/webhooks/stripe
5. Development workflow
Chạy tests
# Toàn bộ
go test ./...
# Một package cụ thể
go test ./internal/availability/checker/...
# Với coverage report
go test -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
Lint
make lint
# hoặc
golangci-lint run ./...
Build tất cả binaries
make build
# Output: bin/document-worker, bin/availability-engine, ...
Thêm feature mới
Rule: Không tạo service mới — thêm vào đúng bucket.
├── Thêm generator mới (vd: Word doc)? → internal/document/generator/
├── Thêm booking event mới? → pkg/events/booking.go + consumer tương ứng
├── Thêm analytics metric? → internal/analytics/transformer/ + writer
├── Thêm payment provider mới? → internal/webhook/handler/ + verifier/
Khi NestJS thêm Kafka topic mới → phải update pkg/events/topics.go để đồng bộ.
6. Production deployment
Production deploy qua GitOps/ArgoCD (.github/workflows/cd.yml), giống hệt cách
football-booking-backend-k3s deploy — không còn SSH + docker-compose trực tiếp lên VM nữa.
CI/CD tự động (GitHub Actions)
Push lên branch main sẽ tự động:
- Detect service nào thay đổi (dựa trên
cmd/,internal/,pkg/changed files) - Build + push Docker image đa kiến trúc lên GHCR (
ghcr.io/footballbookingteam100/go-<service>) - Commit image tag mới vào
football-booking-gitops(envs/production/go-services/<service>.yaml) - ArgoCD (ApplicationSet
football-booking-go-services) tự động phát hiện thay đổi và sync Deployment tương ứng lên K3s cluster (namespacefootball-booking)
Secrets cần thiết trong GitHub repo settings:
GITOPS_TOKEN # PAT với quyền Contents: Read and write vào football-booking-gitops
GITHUB_TOKEN (build/push GHCR) đã có sẵn tự động, không cần tạo thêm.
Deploy thủ công / rollback
# Trigger sync ngay (không cần đợi ArgoCD tự poll ~3 phút)
argocd app sync go-document-worker
# Rollback bằng git (cách GitOps chuẩn)
git log --oneline -- envs/production/go-services/document-worker.yaml # (trong repo gitops)
git revert <commit> && git push
Xem thêm football-booking-gitops/docs/argocd-guide.md.
7. Troubleshooting
Service không kết nối được Kafka
# Kiểm tra network
docker network inspect football-booking-network | grep -E "Name|IPv4"
# Kiểm tra Kafka broker accessible từ trong container
docker exec go-document-worker wget -qO- http://kafka:9092 2>&1 || echo "Kafka not reachable"
# Xem consumer group lag
docker exec kafka kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group go-document-worker-group \
--describe
WebSocket không nhận được update
# Kiểm tra consumer group đang consume
docker exec kafka kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group go-availability-engine-group \
--describe
# Xem logs hub
docker compose -f deployments/docker-compose.yml logs -f availability-engine
ClickHouse schema chưa được tạo
# Chạy migration thủ công
CLICKHOUSE_DSN=clickhouse://default:password@localhost:9000/football_analytics \
./scripts/migrate-clickhouse.sh
Traces không xuất hiện trong SigNoz
# Kiểm tra OTEL collector reachable
docker exec go-document-worker wget -qO- http://otel-collector:4317 2>&1
# Log OTEL error trong service
docker compose -f deployments/docker-compose.yml logs document-worker | grep -i otel
8. Port reference
| Service | Port | Protocol | Accessible từ |
|---|---|---|---|
| document-worker | 3010 | HTTP /health |
Docker network only |
| availability-engine | 3011 | HTTP + WebSocket | 127.0.0.1 (api-gateway proxy) |
| analytics-pipeline | 3012 | HTTP /health |
Docker network only |
| webhook-receiver | 3013 | HTTP POST | 127.0.0.1 (Nginx routes VNPay/Stripe) |