Reverse Proxy

Szybki start

Uruchom reverse proxy przez Docker Compose albo lokalnie z Go. Endpointy, pierwsze requesty i opcjonalne stacki monitoringu.

Docker Compose (najszybciej)#

bash
cd reverse-proxy
ADMIN_TOKEN=change-me docker compose up --build
EndpointOpis
http://localhost:8080Reverse proxy
http://localhost:8080/healthzLiveness proxy
http://localhost:8080/metricsMetryki Prometheus
http://localhost:8080/admin/backendsAdmin API (wymaga tokenu)

Opcjonalne stacki:

bash
docker compose --profile monitoring up -d
docker compose --profile redis up -d
  • monitoring → Prometheus :9090, Grafana :3000
  • redis → Redis dla rozproszonego rate limitingu

Lokalny development#

  1. Przetestuj i zbuduj
    bash
    go test ./...
    go build -o proxy ./cmd/server
    
  2. Uruchom z konfiguracją
    bash
    ./proxy -config config/config.yaml
    
  3. Wystaw demo backendy
    Domyślna konfiguracja oczekuje backendów na localhost:8081 i localhost:8082:
    bash
    docker run --rm -p 8081:80 nginx:alpine
    docker run --rm -p 8082:80 nginx:alpine
    

Pierwsze requesty#

bash
curl http://localhost:8080/healthz

curl http://localhost:8080/

curl -H "Authorization: Bearer change-me" http://localhost:8080/admin/backends

Odpowiedź admin API:

json
{
  "backends": [
    { "url": "http://localhost:8081", "healthy": true, "admin_down": false, "in_flight": 0 },
    { "url": "http://localhost:8082", "healthy": true, "admin_down": false, "in_flight": 0 }
  ]
}

Wyłączenie backendu z rotacji#

bash
curl -X POST -H "Authorization: Bearer change-me" \
  http://localhost:8080/admin/backends/0/down

curl -X POST -H "Authorization: Bearer change-me" \
  http://localhost:8080/admin/backends/0/up

Sprawdzenie metryk#

bash
curl http://localhost:8080/metrics | grep proxy_requests_total
text
proxy_requests_total{method="GET",route="healthz",backend="",status="200"} 1
proxy_requests_total{method="GET",route="",backend="http://localhost:8081",status="200"} 3

ADMIN_TOKEN jest wymagany

Bez ADMIN_TOKEN admin API nie jest serwowane wcale (fail-closed). Ustaw silny token przez zmienną środowiskową, nie w pliku YAML.

Co dalej?#