[{"data":1,"prerenderedAt":552},["ShallowReactive",2],{"doc:\u002Freverse-proxy":3,"surround:\u002Freverse-proxy":311,"navigation":320},{"id":4,"title":5,"body":6,"description":303,"extension":304,"meta":305,"navigation":306,"path":307,"seo":308,"stem":309,"__hash__":310},"docs\u002F02.reverse-proxy\u002F01.index.md","Przegląd",{"type":7,"value":8,"toc":287},"minimark",[9,14,40,44,49,80,84,112,116,140,144,163,167,179,183,193,196,200,237,241,277,281],[10,11,13],"h2",{"id":12},"czym-jest-reverse-proxy","Czym jest Reverse Proxy?",[15,16,17,18,22,23,27,28,31,32,35,36,39],"p",{},"Reverse Proxy to lekki, produkcyjny reverse proxy napisany w ",[19,20,21],"strong",{},"Go",", zbudowany na ",[24,25,26],"code",{},"net\u002Fhttp\u002Fhttputil",". Powstał jako projekt portfolio pod role ",[19,29,30],{},"Go Backend Developer",", ",[19,33,34],{},"Platform Engineer"," i ",[19,37,38],{},"SRE"," — i jest kompletny: od konfiguracji po dashboard Grafany.",[10,41,43],{"id":42},"najważniejsze-możliwości","Najważniejsze możliwości",[45,46,48],"h3",{"id":47},"niezawodność","Niezawodność",[50,51,52,65,68,71,74,77],"ul",{},[53,54,55,56,31,59,31,62],"li",{},"Trzy strategie load balancingu: ",[19,57,58],{},"Round Robin",[19,60,61],{},"Weighted Round Robin",[19,63,64],{},"Least Connections",[53,66,67],{},"Aktywne health checks z konfigurowalnymi progami i natychmiastowym failover",[53,69,70],{},"Graceful shutdown z drainowaniem requestów w locie",[53,72,73],{},"Konfigurowalne timeouty serwera, dial, response header i idle",[53,75,76],{},"Ścisła walidacja konfiguracji z czytelnymi błędami",[53,78,79],{},"Thread-safe stan backendów (lock-free atomics)",[45,81,83],{"id":82},"odporność","Odporność",[50,85,86,92,98],{},[53,87,88,91],{},[19,89,90],{},"Circuit breaker"," per backend (closed → open → half-open) z fast-fail",[53,93,94,97],{},[19,95,96],{},"Retry policy"," z bezpiecznymi defaultami (tylko idempotentne requesty bez body)",[53,99,100,101,104,105,104,108,111],{},"Ustrukturyzowane koperty błędów z request ID (",[24,102,103],{},"502"," \u002F ",[24,106,107],{},"503",[24,109,110],{},"504",")",[45,113,115],{"id":114},"bezpieczeństwo","Bezpieczeństwo",[50,117,118,121,131,134,137],{},[53,119,120],{},"Admin API z bearer tokenem (constant-time comparison), fail-closed",[53,122,123,124,127,128,111],{},"Bezpieczne wykrywanie IP klienta za ",[19,125,126],{},"trusted proxies"," (ochrona przed spoofingiem ",[24,129,130],{},"X-Forwarded-For",[53,132,133],{},"Stripowanie hop-by-hop headers, walidacja URL backendów",[53,135,136],{},"Sekrety tylko przez zmienne środowiskowe",[53,138,139],{},"Utwardzony obraz kontenera: non-root, read-only FS, dropped capabilities",[45,141,143],{"id":142},"obserwowalność","Obserwowalność",[50,145,146,153,156],{},[53,147,148,149,152],{},"Strukturalne logi ",[24,150,151],{},"log\u002Fslog"," (JSON lub text) z request ID",[53,154,155],{},"Metryki Prometheus: requesty, latencja, błędy backendów, circuit breakery, rate limit",[53,157,158,159,162],{},"Gotowy stack ",[19,160,161],{},"Prometheus + Grafana"," z dashboardem",[45,164,166],{"id":165},"zarządzanie-ruchem","Zarządzanie ruchem",[50,168,169,172],{},[53,170,171],{},"Rate limiting per IP (token bucket) z ograniczoną pamięcią",[53,173,174,175,178],{},"Opcjonalny ",[19,176,177],{},"Redis"," dla rozproszonego rate limitingu (atomowy Lua, fail-open)",[10,180,182],{"id":181},"architektura","Architektura",[184,185,191],"pre",{"className":186,"code":188,"language":189,"meta":190},[187],"language-text","Client\n   │\n   ▼\nReverse Proxy (:8080)\n   ├── Request ID → Access log\u002Fmetrics → Rate limiter → Proxy handler\n   │                                              │\n   │                                    ┌───────────────────┐\n   │                                    │  Load balancer     │\n   │                                    │  + circuit breaker │\n   │                                    └─────────┬─────────┘\n   ├── Admin API (\u002Fadmin\u002F*, token)                │\n   ├── Prometheus (\u002Fmetrics)               ┌──────┴──────┐\n   └── Health (\u002Fhealthz)                   ▼             ▼\n                                        Backend 1     Backend 2\n                                        (health checks + failover)\n","text","",[24,192,188],{"__ignoreMap":190},[15,194,195],{},"Każdy request przechodzi przez middleware chain (request ID, access log, rate limit), zanim handler wybierze zdrowy backend przez skonfigurowaną strategię. Nieudane próby są ponawiane zgodnie z retry policy; powtarzające się błędy otwierają circuit breaker, więc ruch failoveruje natychmiast, dopóki probe nie zakończy się sukcesem.",[10,197,199],{"id":198},"stack","Stack",[50,201,202,205,213,217,222,227,232],{},[53,203,204],{},"Go 1.26+",[53,206,207,210,211],{},[24,208,209],{},"net\u002Fhttp"," + ",[24,212,26],{},[53,214,215],{},[24,216,151],{},[53,218,219],{},[24,220,221],{},"golang.org\u002Fx\u002Ftime\u002Frate",[53,223,224],{},[24,225,226],{},"github.com\u002Fprometheus\u002Fclient_golang",[53,228,229],{},[24,230,231],{},"github.com\u002Fredis\u002Fgo-redis\u002Fv9",[53,233,234],{},[24,235,236],{},"gopkg.in\u002Fyaml.v3",[10,238,240],{"id":239},"od-czego-zacząć","Od czego zacząć?",[242,243,244,253,261,269],"card-group",{},[245,246,250],"card",{"icon":247,"title":248,"to":249},"rocket","Szybki start","\u002Freverse-proxy\u002Fgetting-started",[15,251,252],{},"Docker Compose albo lokalny build w kilka minut.",[245,254,258],{"icon":255,"title":256,"to":257},"grid","Konfiguracja","\u002Freverse-proxy\u002Fconfiguration",[15,259,260],{},"Pełna referencja config.yaml z wartościami domyślnymi.",[245,262,266],{"icon":263,"title":264,"to":265},"network","Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing",[15,267,268],{},"Trzy strategie i kiedy którą wybrać.",[245,270,274],{"icon":271,"title":272,"to":273},"shield","Wdrożenie","\u002Freverse-proxy\u002Foperations\u002Fdeployment",[15,275,276],{},"Docker, TLS, Redis i utwardzony kontener.",[10,278,280],{"id":279},"struktura-projektu","Struktura projektu",[184,282,285],{"className":283,"code":284,"language":189,"meta":190},[187],"reverse-proxy\u002F\n├── cmd\u002Fserver\u002F             # entrypoint (flagi, sygnały, wiring)\n├── internal\u002F\n│   ├── admin\u002F              # Admin API z tokenem\n│   ├── app\u002F                # wiring + testy integracyjne\n│   ├── balancer\u002F           # backendy + pickers (RR, WRR, least-conn)\n│   ├── breaker\u002F            # circuit breaker\n│   ├── clientip\u002F           # trusted-proxy client IP\n│   ├── config\u002F             # YAML + walidacja\n│   ├── health\u002F             # aktywne health checks\n│   ├── httpx\u002F              # request IDs, koperty błędów\n│   ├── limiter\u002F            # memory + Redis rate limiters\n│   ├── logging\u002F            # slog + access log\n│   ├── metrics\u002F            # Prometheus\n│   ├── proxy\u002F              # handler, retries, mapowanie błędów\n│   └── server\u002F             # HTTP(S) + graceful shutdown\n├── config\u002F                 # przykładowe konfiguracje\n├── deploy\u002F                 # demo backendy + monitoring\n├── Dockerfile\n└── docker-compose.yml\n",[24,286,284],{"__ignoreMap":190},{"title":190,"searchDepth":288,"depth":288,"links":289},3,[290,292,299,300,301,302],{"id":12,"depth":291,"text":13},2,{"id":42,"depth":291,"text":43,"children":293},[294,295,296,297,298],{"id":47,"depth":288,"text":48},{"id":82,"depth":288,"text":83},{"id":114,"depth":288,"text":115},{"id":142,"depth":288,"text":143},{"id":165,"depth":288,"text":166},{"id":181,"depth":291,"text":182},{"id":198,"depth":291,"text":199},{"id":239,"depth":291,"text":240},{"id":279,"depth":291,"text":280},"Lekki, produkcyjny reverse proxy w Go — load balancing, health checks, circuit breaker, rate limiting, metryki Prometheus i graceful shutdown.","md",{},true,"\u002Freverse-proxy",{"title":5,"description":303},"02.reverse-proxy\u002F01.index","S9Dm7DR04rOWyuArBhz9FXQRsTDEge-KcMgzr7Jb6TA",[312,317],{"title":313,"path":314,"stem":315,"description":316,"children":-1},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr","Dziewięć rekordów ADR — decyzje, których cofnięcie kosztowałoby więcej niż tydzień pracy. Kontekst, decyzja, konsekwencje.",{"title":248,"path":249,"stem":318,"description":319,"children":-1},"02.reverse-proxy\u002F02.getting-started","Uruchom reverse proxy przez Docker Compose albo lokalnie z Go. Endpointy, pierwsze requesty i opcjonalne stacki monitoringu.",[321,433,485],{"title":322,"path":323,"stem":324,"children":325},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[326,327,330,333,336,362,391,404,425,428,432],{"title":5,"path":323,"stem":324},{"title":248,"path":328,"stem":329},"\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":256,"path":331,"stem":332},"\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":182,"path":334,"stem":335},"\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":337,"path":338,"stem":339,"children":340,"page":361},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[341,345,349,353,357],{"title":342,"path":343,"stem":344},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":346,"path":347,"stem":348},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":350,"path":351,"stem":352},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":354,"path":355,"stem":356},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":358,"path":359,"stem":360},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":363,"path":364,"stem":365,"children":366,"page":361},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[367,371,375,379,383,387],{"title":368,"path":369,"stem":370},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":372,"path":373,"stem":374},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":376,"path":377,"stem":378},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":380,"path":381,"stem":382},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":384,"path":385,"stem":386},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":388,"path":389,"stem":390},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":392,"path":393,"stem":394,"children":395,"page":361},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[396,400],{"title":397,"path":398,"stem":399},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":401,"path":402,"stem":403},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":405,"path":406,"stem":407,"children":408,"page":361},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[409,413,417,421],{"title":410,"path":411,"stem":412},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":414,"path":415,"stem":416},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":418,"path":419,"stem":420},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":422,"path":423,"stem":424},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":272,"path":426,"stem":427},"\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":429,"path":430,"stem":431},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":313,"path":314,"stem":315},{"title":434,"path":307,"stem":309,"children":435},"Reverse Proxy",[436,437,438,440,459],{"title":5,"path":307,"stem":309},{"title":248,"path":249,"stem":318},{"title":256,"path":257,"stem":439},"02.reverse-proxy\u002F03.configuration",{"title":441,"path":442,"stem":443,"children":444,"page":361},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[445,447,451,455],{"title":264,"path":265,"stem":446},"02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":448,"path":449,"stem":450},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":452,"path":453,"stem":454},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":456,"path":457,"stem":458},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":460,"path":461,"stem":462,"children":463,"page":361},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[464,468,472,475,477,481],{"title":465,"path":466,"stem":467},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":469,"path":470,"stem":471},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":115,"path":473,"stem":474},"\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":272,"path":273,"stem":476},"02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":478,"path":479,"stem":480},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":482,"path":483,"stem":484},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":486,"path":487,"stem":488,"children":489},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[490,491,494,515,528,548],{"title":5,"path":487,"stem":488},{"title":248,"path":492,"stem":493},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":495,"path":496,"stem":497,"children":498,"page":361},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[499,503,507,511],{"title":500,"path":501,"stem":502},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":504,"path":505,"stem":506},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":508,"path":509,"stem":510},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":512,"path":513,"stem":514},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":516,"path":517,"stem":518,"children":519,"page":361},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[520,524],{"title":521,"path":522,"stem":523},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":525,"path":526,"stem":527},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":529,"path":530,"stem":531,"children":532,"page":361},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[533,536,540,544],{"title":182,"path":534,"stem":535},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":537,"path":538,"stem":539},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":541,"path":542,"stem":543},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":545,"path":546,"stem":547},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":549,"path":550,"stem":551},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986307164]