From 680a23b3fb914a5f363bda57b2dd38ab97b4e0b5 Mon Sep 17 00:00:00 2001 From: Luftmensch Date: Thu, 3 Sep 2026 16:34:39 +0700 Subject: [PATCH] docs: add Caddy reverse proxy example for audit service --- Caddyfile.example | 292 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 Caddyfile.example diff --git a/Caddyfile.example b/Caddyfile.example new file mode 100644 index 0000000..a611932 --- /dev/null +++ b/Caddyfile.example @@ -0,0 +1,292 @@ +# ╔═══════════════════════════════════════════════════════════════════╗ +# ║ CADDY REVERSE PROXY — Thay thế Traefik baremetal ║ +# ║ Server: Ubuntu 26.04 | Backend: 192.168.10.101 ║ +# ║ CDN: Cloudflare (Proxy mode, SSL = Full Strict) ║ +# ╚═══════════════════════════════════════════════════════════════════╝ + +# ═══════════════════════════════════════════════════════════════ +# GLOBAL OPTIONS +# Thay thế: traefik.yml (global, entryPoints, certificatesResolvers, log) +# ═══════════════════════════════════════════════════════════════ +{ + # Email ACME/Let's Encrypt + email lhuydung26@lhdsin.net + + # Cấu hình xin SSL (Let's Encrypt) tự động qua DNS của Cloudflare cho toàn bộ hệ thống + acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN} + + # Bật Prometheus metrics + metrics + + # Admin API + admin localhost:2019 + + # TỰ ĐỘNG nhận Real Client IP từ Cloudflare Proxy (yêu cầu plugin caddy-cloudflare-ip) + servers { + trusted_proxies cloudflare + trusted_proxies_strict + } +} + +# ═══════════════════════════════════════════════════════════════ +# METRICS ENDPOINT +# Thay thế: entryPoints.metrics (port :8084) + metrics.prometheus +# Prometheus scrape target: http://:8084/metrics +# ═══════════════════════════════════════════════════════════════ +:8084 { + metrics /metrics +} + +# ═══════════════════════════════════════════════════════════════ +# SNIPPET: Authentik Forward Auth +# Thay thế: middlewares.authentik-auth.forwardAuth (dashboard.yml) +# Dùng lại bằng: import authentik +# +# ⚠️ LƯU Ý: URI kết thúc bằng /auth/caddy (KHÔNG phải /auth/traefik) +# Cần cập nhật Proxy Provider trong Authentik admin panel +# ═══════════════════════════════════════════════════════════════ +(authentik) { + forward_auth http://192.168.10.101:9000 { + uri /outpost.goauthentik.io/auth/caddy + + # Headers Authentik trả về sau xác thực thành công + # Caddy sẽ forward tới backend service + copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version + + trusted_proxies private_ranges + } +} + +# ═══════════════════════════════════════════════════════════════ +# SNIPPET: Access Log chuẩn (tái sử dụng) +# Thay thế: accessLog (traefik.yml) +# ═══════════════════════════════════════════════════════════════ +(access_log) { + log { + output file /var/log/caddy/access-{args[0]}.log { + roll_size 100MiB + roll_keep 5 + roll_keep_for 168h + } + format json + } +} + +# ╔═══════════════════════════════════════════════════════════════════╗ +# ║ SITE BLOCKS — Thay thế toàn bộ thư mục dynamic/ ║ +# ╚═══════════════════════════════════════════════════════════════════╝ + +# ─────────────────────────────────────────────────────────────── +# 1. AUTHENTIK SSO +# Thay thế: dynamic/authentik.yml +# Backend: http://192.168.10.101:9000 +# Bao gồm: Web UI + WebSocket (/ws/) + Outpost paths +# ─────────────────────────────────────────────────────────────── +sso.lhdsin.net { + reverse_proxy http://192.168.10.101:9000 + + tracing { + span sso + } + + import access_log sso +} + +# ─────────────────────────────────────────────────────────────── +# 2. GRAFANA (bảo vệ bởi Authentik Forward Auth) +# Thay thế: dynamic/grafana.yml + authentik-outpost-apps.yml (grafana-outpost-router) +# Backend: http://192.168.10.101:3002 +# +# ⚠️ Phải dùng route {} để đảm bảo thứ tự thực thi: +# 1. Outpost callback (KHÔNG qua auth → tránh redirect loop) +# 2. Forward Auth kiểm tra xác thực +# 3. Reverse proxy tới Grafana +# ─────────────────────────────────────────────────────────────── +dash.lhdsin.net { + route { + # Outpost callback — ⚠️ KHÔNG gắn forward_auth ở đây! + reverse_proxy /outpost.goauthentik.io/* http://192.168.10.101:9000 + + # Forward Auth → Authentik kiểm tra session + import authentik + + # Backend Grafana + reverse_proxy http://192.168.10.101:3002 + } + + tracing { + span grafana + } + + import access_log grafana +} + +# ─────────────────────────────────────────────────────────────── +# 3. HOME ASSISTANT +# Thay thế: dynamic/hass.yml +# Backend: http://192.168.10.101:8123 +# Caddy tự động xử lý WebSocket upgrade (không cần cấu hình thêm) +# ─────────────────────────────────────────────────────────────── +hass.lhdsin.net { + reverse_proxy http://192.168.10.101:8123 + + tracing { + span hass + } + + import access_log hass +} + +# ─────────────────────────────────────────────────────────────── +# 4. NAS / SYNOLOGY DSM (Backend HTTPS với self-signed cert) +# Thay thế: dynamic/nas.yml +# Backend: https://192.168.10.101:5001 +# +# tls_insecure_skip_verify: Bỏ qua xác thực SSL backend +# Thay thế: serversTransports.insecureBackendTransport.insecureSkipVerify +# ─────────────────────────────────────────────────────────────── +nas.lhdsin.net { + reverse_proxy https://192.168.10.101:5001 { + transport http { + tls_insecure_skip_verify + } + # Ép DSM luôn phục vụ giao diện Desktop + header_up User-Agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + } + tracing { + span nas + } + import access_log nas +} + +# ─────────────────────────────────────────────────────────────── +# 5. OPENSPEEDTEST +# Thay thế: qBittorrent (đã tạm dừng) +# Backend: http://192.168.10.101:3000 +# ─────────────────────────────────────────────────────────────── +speed.lhdsin.net { + # Public hoàn toàn, không đi qua Authentik + # Tắt flush buffer và cấu hình lại request_buffers để sửa lỗi Upload ảo của OpenSpeedtest + reverse_proxy http://192.168.10.101:3010 { + flush_interval -1 + request_buffers 35MiB + } + + tracing { + span speedtest + } + + import access_log speedtest +} + +# ─────────────────────────────────────────────────────────────── +# 6. SHLINK (URL Shortener) +# Thay thế: dynamic/shlink.yml +# Backend: http://192.168.10.101:8082 +# ─────────────────────────────────────────────────────────────── +link.lhdsin.net { + reverse_proxy http://192.168.10.101:8082 + + tracing { + span shlink + } + + import access_log shlink +} + +# ─────────────────────────────────────────────────────────────── +# 7. VAULTWARDEN +# Thay thế: dynamic/vaults.yml +# Backend: http://192.168.10.101:11001 +# +# Caddy tự động xử lý WebSocket upgrade cho /notifications/hub +# Không cần router riêng như Traefik (vaults-websocket-router) +# ─────────────────────────────────────────────────────────────── +vaults.lhdsin.net { + reverse_proxy http://192.168.10.101:11001 + + tracing { + span vaultwarden + } + + import access_log vaults +} + +# ─────────────────────────────────────────────────────────────── +# 8. SHLINK WEB CLIENT (Bảo vệ bởi Authentik Forward Auth) +# Domain: shl.lhdsin.net +# Backend: http://192.168.10.101:8083 +# ─────────────────────────────────────────────────────────────── +shl.lhdsin.net { + route { + # Outpost callback — KHÔNG gắn forward_auth ở đây để tránh lỗi redirect loop + reverse_proxy /outpost.goauthentik.io/* http://192.168.10.101:9000 + # Forward Auth → Authentik kiểm tra session + import authentik + # Backend Shlink Web Client + reverse_proxy http://192.168.10.101:8083 + } + tracing { + span shlink-web + } + import access_log shlink-web +} + +# ─────────────────────────────────────────────────────────────── +# 9. KIBANA (Bảo vệ bởi Authentik Forward Auth) +# Domain: elk.lhdsin.net +# Backend: http://192.168.10.101:5601 +# ─────────────────────────────────────────────────────────────── +elk.lhdsin.net { + route { + # Outpost callback — KHÔNG gắn forward_auth ở đây để tránh lỗi redirect loop + reverse_proxy /outpost.goauthentik.io/* http://192.168.10.101:9000 + + # Forward Auth → Authentik kiểm tra session + import authentik + + # Backend Kibana + reverse_proxy http://192.168.10.101:5601 + } + tracing { + span kibana-web + } + import access_log kibana-web +} + +# ─────────────────────────────────────────────────────────────── +# 10. Gitea +# Backend: http://192.168.10.101:3005 +# ─────────────────────────────────────────────────────────────── + +git.lhdsin.net { + reverse_proxy http://192.168.10.101:3005 + + tracing { + span gitea + } + import access_log gitea +} + +# ─────────────────────────────────────────────────────────────── +# 11. AUDIT HARDENING TOOL +# Public URL: https://audit.lhdsin.net/audit/ +# Backend: http://192.168.10.101:8888 +# handle_path loại bỏ prefix /audit trước khi chuyển tới FastAPI. +# ─────────────────────────────────────────────────────────────── +audit.lhdsin.net { + redir / /audit/ 308 + redir /audit /audit/ 308 + + handle_path /audit/* { + reverse_proxy http://192.168.10.101:8888 + } + + respond 404 + + tracing { + span audit-hardening-tool + } + + import access_log audit-hardening-tool +} \ No newline at end of file