ADR-0007: Tách 2 tầng reverse proxy — NestJS API Gateway vs Nginx hạ tầng
- Status: Accepted
- Date: ~2026-06-27 (backfilled 2026-07-25)
- Supersedes: —
- Superseded by: —
Bối cảnh
Ngoài các business API (user/booking/payment...), hệ thống còn có nhiều
admin/observability tool cần expose qua HTTP (SigNoz, PgAdmin, Mongo
Express, Redis Commander, Kafka UI). Nếu để api-gateway (NestJS) route
luôn cả những tool này thì gateway business phải gánh thêm concern không
liên quan (routing tới UI tĩnh, không cần auth/rate-limit business).
Quyết định
Tách rõ 2 tầng proxy:
- Application API Gateway (NestJS, port 3000): chỉ route business API tới các microservice, giữ nguyên các concern auth/rate-limit/validation (ADR-0001, ADR-0005)
- Infrastructure Reverse Proxy (Nginx): chỉ route tới admin/observability tool (SigNoz, PgAdmin, Mongo Express, Redis Commander, Kafka UI), xử lý CORS/static đơn giản, tách biệt hoàn toàn khỏi business gateway
Lựa chọn khác đã cân nhắc
- Gộp mọi route (business + infra tool) vào cùng NestJS gateway: đơn giản hoá chỉ còn 1 tầng, nhưng làm gateway business phình to với logic không liên quan tới nghiệp vụ, khó reason về security boundary (business API cần auth chặt, infra tool dev-only không cần) — loại.
- Expose thẳng từng tool qua port riêng, không qua proxy: đơn giản nhất nhưng khó quản lý tập trung CORS/TLS/domain khi lên K3s ingress — loại.
Hệ quả
- Được: business gateway (NestJS) không phình to vì infra tooling; có thể bật/tắt/đổi domain cho infra tool độc lập với gateway business.
- Đánh đổi: có 2 điểm cấu hình routing cần đồng bộ (NestJS proxy config +
Nginx conf); tại thời điểm backfill ADR này, vị trí file Nginx
(
config/signoz/nginx.conf) vẫn đặt theo tên 1 tool cụ thể (SigNoz) dù đang route nhiều tool khác — xem đề xuất cấu trúc lại trongdocs/REVERSE-PROXY-ARCHITECTURE.md(chưa triển khai, cần ADR mới nếu áp dụng).