[{"data":1,"prerenderedAt":1143},["ShallowReactive",2],{"doc:\u002Freverse-proxy\u002Foperations\u002Fdeployment":3,"surround:\u002Freverse-proxy\u002Foperations\u002Fdeployment":892,"navigation":903},{"id":4,"title":5,"body":6,"description":885,"extension":886,"meta":887,"navigation":476,"path":888,"seo":889,"stem":890,"__hash__":891},"docs\u002F02.reverse-proxy\u002F05.operations\u002F04.deployment.md","Wdrożenie",{"type":7,"value":8,"toc":871},"minimark",[9,14,80,84,88,118,121,158,163,282,286,318,368,385,389,411,429,432,436,538,545,549,571,574,593,613,617,658,665,669,725,729,840,843,867],[10,11,13],"h2",{"id":12},"docker","Docker",[15,16,21],"pre",{"className":17,"code":18,"language":19,"meta":20,"style":20},"language-bash shiki shiki-themes github-light github-dark","cd reverse-proxy\ndocker build -t reverse-proxy .\ndocker run --rm -p 8080:8080 -e ADMIN_TOKEN=change-me reverse-proxy\n","bash","",[22,23,24,37,55],"code",{"__ignoreMap":20},[25,26,29,33],"span",{"class":27,"line":28},"line",1,[25,30,32],{"class":31},"sj4cs","cd",[25,34,36],{"class":35},"sZZnC"," reverse-proxy\n",[25,38,40,43,46,49,52],{"class":27,"line":39},2,[25,41,12],{"class":42},"sScJk",[25,44,45],{"class":35}," build",[25,47,48],{"class":31}," -t",[25,50,51],{"class":35}," reverse-proxy",[25,53,54],{"class":35}," .\n",[25,56,58,60,63,66,69,72,75,78],{"class":27,"line":57},3,[25,59,12],{"class":42},[25,61,62],{"class":35}," run",[25,64,65],{"class":31}," --rm",[25,67,68],{"class":31}," -p",[25,70,71],{"class":35}," 8080:8080",[25,73,74],{"class":31}," -e",[25,76,77],{"class":35}," ADMIN_TOKEN=change-me",[25,79,36],{"class":35},[81,82,83],"p",{},"Obraz jest utwardzony: multi-stage, non-root, read-only FS, dropped capabilities.",[10,85,87],{"id":86},"docker-compose","Docker Compose",[15,89,91],{"className":17,"code":90,"language":19,"meta":20,"style":20},"ADMIN_TOKEN=change-me docker compose up --build\n",[22,92,93],{"__ignoreMap":20},[25,94,95,99,103,106,109,112,115],{"class":27,"line":28},[25,96,98],{"class":97},"sVt8B","ADMIN_TOKEN",[25,100,102],{"class":101},"szBVR","=",[25,104,105],{"class":35},"change-me",[25,107,108],{"class":42}," docker",[25,110,111],{"class":35}," compose",[25,113,114],{"class":35}," up",[25,116,117],{"class":31}," --build\n",[81,119,120],{},"Opcjonalne profile:",[15,122,124],{"className":17,"code":123,"language":19,"meta":20,"style":20},"docker compose --profile monitoring up -d\ndocker compose --profile redis up -d\n",[22,125,126,143],{"__ignoreMap":20},[25,127,128,130,132,135,138,140],{"class":27,"line":28},[25,129,12],{"class":42},[25,131,111],{"class":35},[25,133,134],{"class":31}," --profile",[25,136,137],{"class":35}," monitoring",[25,139,114],{"class":35},[25,141,142],{"class":31}," -d\n",[25,144,145,147,149,151,154,156],{"class":27,"line":39},[25,146,12],{"class":42},[25,148,111],{"class":35},[25,150,134],{"class":31},[25,152,153],{"class":35}," redis",[25,155,114],{"class":35},[25,157,142],{"class":31},[159,160,162],"h3",{"id":161},"przykład-compose-z-monitoringiem-i-redis","Przykład: compose z monitoringiem i Redis",[15,164,169],{"className":165,"code":166,"filename":167,"language":168,"meta":20,"style":20},"language-yaml shiki shiki-themes github-light github-dark","services:\n  proxy:\n    environment:\n      ADMIN_TOKEN: ${ADMIN_TOKEN}\n      REDIS_PASSWORD: ${REDIS_PASSWORD}\n    volumes:\n      - .\u002Fconfig\u002Fconfig.docker.yaml:\u002Fetc\u002Fproxy\u002Fconfig.yaml:ro\n    ports:\n      - \"8080:8080\"\n    depends_on:\n      - backend1\n      - backend2\n      - redis\n","docker-compose.override.yml","yaml",[22,170,171,180,187,194,206,217,225,234,242,250,258,266,274],{"__ignoreMap":20},[25,172,173,177],{"class":27,"line":28},[25,174,176],{"class":175},"s9eBZ","services",[25,178,179],{"class":97},":\n",[25,181,182,185],{"class":27,"line":39},[25,183,184],{"class":175},"  proxy",[25,186,179],{"class":97},[25,188,189,192],{"class":27,"line":57},[25,190,191],{"class":175},"    environment",[25,193,179],{"class":97},[25,195,197,200,203],{"class":27,"line":196},4,[25,198,199],{"class":175},"      ADMIN_TOKEN",[25,201,202],{"class":97},": ",[25,204,205],{"class":35},"${ADMIN_TOKEN}\n",[25,207,209,212,214],{"class":27,"line":208},5,[25,210,211],{"class":175},"      REDIS_PASSWORD",[25,213,202],{"class":97},[25,215,216],{"class":35},"${REDIS_PASSWORD}\n",[25,218,220,223],{"class":27,"line":219},6,[25,221,222],{"class":175},"    volumes",[25,224,179],{"class":97},[25,226,228,231],{"class":27,"line":227},7,[25,229,230],{"class":97},"      - ",[25,232,233],{"class":35},".\u002Fconfig\u002Fconfig.docker.yaml:\u002Fetc\u002Fproxy\u002Fconfig.yaml:ro\n",[25,235,237,240],{"class":27,"line":236},8,[25,238,239],{"class":175},"    ports",[25,241,179],{"class":97},[25,243,245,247],{"class":27,"line":244},9,[25,246,230],{"class":97},[25,248,249],{"class":35},"\"8080:8080\"\n",[25,251,253,256],{"class":27,"line":252},10,[25,254,255],{"class":175},"    depends_on",[25,257,179],{"class":97},[25,259,261,263],{"class":27,"line":260},11,[25,262,230],{"class":97},[25,264,265],{"class":35},"backend1\n",[25,267,269,271],{"class":27,"line":268},12,[25,270,230],{"class":97},[25,272,273],{"class":35},"backend2\n",[25,275,277,279],{"class":27,"line":276},13,[25,278,230],{"class":97},[25,280,281],{"class":35},"redis\n",[10,283,285],{"id":284},"https-termination","HTTPS termination",[15,287,289],{"className":165,"code":288,"language":168,"meta":20,"style":20},"tls:\n  cert_file: \u002Fetc\u002Ftls\u002Fserver.crt\n  key_file: \u002Fetc\u002Ftls\u002Fserver.key\n",[22,290,291,298,308],{"__ignoreMap":20},[25,292,293,296],{"class":27,"line":28},[25,294,295],{"class":175},"tls",[25,297,179],{"class":97},[25,299,300,303,305],{"class":27,"line":39},[25,301,302],{"class":175},"  cert_file",[25,304,202],{"class":97},[25,306,307],{"class":35},"\u002Fetc\u002Ftls\u002Fserver.crt\n",[25,309,310,313,315],{"class":27,"line":57},[25,311,312],{"class":175},"  key_file",[25,314,202],{"class":97},[25,316,317],{"class":35},"\u002Fetc\u002Ftls\u002Fserver.key\n",[15,319,321],{"className":17,"code":320,"language":19,"meta":20,"style":20},"docker run --rm -p 443:8080 \\\n  -e ADMIN_TOKEN=$ADMIN_TOKEN \\\n  -v \u002Fetc\u002Ftls:\u002Fetc\u002Ftls:ro \\\n  reverse-proxy\n",[22,322,323,339,353,363],{"__ignoreMap":20},[25,324,325,327,329,331,333,336],{"class":27,"line":28},[25,326,12],{"class":42},[25,328,62],{"class":35},[25,330,65],{"class":31},[25,332,68],{"class":31},[25,334,335],{"class":35}," 443:8080",[25,337,338],{"class":31}," \\\n",[25,340,341,344,347,350],{"class":27,"line":39},[25,342,343],{"class":31},"  -e",[25,345,346],{"class":35}," ADMIN_TOKEN=",[25,348,349],{"class":97},"$ADMIN_TOKEN ",[25,351,352],{"class":31},"\\\n",[25,354,355,358,361],{"class":27,"line":57},[25,356,357],{"class":31},"  -v",[25,359,360],{"class":35}," \u002Fetc\u002Ftls:\u002Fetc\u002Ftls:ro",[25,362,338],{"class":31},[25,364,365],{"class":27,"line":196},[25,366,367],{"class":35},"  reverse-proxy\n",[369,370,371,375,378],"ul",{},[372,373,374],"li",{},"Oba pliki muszą istnieć, inaczej proxy nie wystartuje.",[372,376,377],{},"TLS 1.2+.",[372,379,380,381,384],{},"Jeśli TLS terminuje CDN\u002FLB przed proxy, ustaw ",[22,382,383],{},"rate_limit.trusted_proxies"," na adresy tego LB.",[10,386,388],{"id":387},"rozproszony-rate-limiting","Rozproszony rate limiting",[15,390,392],{"className":165,"code":391,"language":168,"meta":20,"style":20},"redis:\n  addr: redis:6379\n",[22,393,394,401],{"__ignoreMap":20},[25,395,396,399],{"class":27,"line":28},[25,397,398],{"class":175},"redis",[25,400,179],{"class":97},[25,402,403,406,408],{"class":27,"line":39},[25,404,405],{"class":175},"  addr",[25,407,202],{"class":97},[25,409,410],{"class":35},"redis:6379\n",[15,412,414],{"className":17,"code":413,"language":19,"meta":20,"style":20},"export REDIS_PASSWORD=secret\n",[22,415,416],{"__ignoreMap":20},[25,417,418,421,424,426],{"class":27,"line":28},[25,419,420],{"class":101},"export",[25,422,423],{"class":97}," REDIS_PASSWORD",[25,425,102],{"class":101},[25,427,428],{"class":97},"secret\n",[81,430,431],{},"Limity są atomowe (Lua token bucket), więc wiele instancji proxy współdzieli jeden budżet. Przy awarii Redis — fail-open.",[159,433,435],{"id":434},"przykład-dwie-instancje-za-lb","Przykład: dwie instancje za LB",[15,437,439],{"className":165,"code":438,"language":168,"meta":20,"style":20},"backends:\n  - url: http:\u002F\u002Fapi-1:8080\n  - url: http:\u002F\u002Fapi-2:8080\n\nredis:\n  addr: redis:6379\n\nrate_limit:\n  requests_per_minute: 300\n  burst: 100\n  trusted_proxies:\n    - 10.0.0.0\u002F8\n",[22,440,441,448,461,472,478,484,492,496,503,513,523,530],{"__ignoreMap":20},[25,442,443,446],{"class":27,"line":28},[25,444,445],{"class":175},"backends",[25,447,179],{"class":97},[25,449,450,453,456,458],{"class":27,"line":39},[25,451,452],{"class":97},"  - ",[25,454,455],{"class":175},"url",[25,457,202],{"class":97},[25,459,460],{"class":35},"http:\u002F\u002Fapi-1:8080\n",[25,462,463,465,467,469],{"class":27,"line":57},[25,464,452],{"class":97},[25,466,455],{"class":175},[25,468,202],{"class":97},[25,470,471],{"class":35},"http:\u002F\u002Fapi-2:8080\n",[25,473,474],{"class":27,"line":196},[25,475,477],{"emptyLinePlaceholder":476},true,"\n",[25,479,480,482],{"class":27,"line":208},[25,481,398],{"class":175},[25,483,179],{"class":97},[25,485,486,488,490],{"class":27,"line":219},[25,487,405],{"class":175},[25,489,202],{"class":97},[25,491,410],{"class":35},[25,493,494],{"class":27,"line":227},[25,495,477],{"emptyLinePlaceholder":476},[25,497,498,501],{"class":27,"line":236},[25,499,500],{"class":175},"rate_limit",[25,502,179],{"class":97},[25,504,505,508,510],{"class":27,"line":244},[25,506,507],{"class":175},"  requests_per_minute",[25,509,202],{"class":97},[25,511,512],{"class":31},"300\n",[25,514,515,518,520],{"class":27,"line":252},[25,516,517],{"class":175},"  burst",[25,519,202],{"class":97},[25,521,522],{"class":31},"100\n",[25,524,525,528],{"class":27,"line":260},[25,526,527],{"class":175},"  trusted_proxies",[25,529,179],{"class":97},[25,531,532,535],{"class":27,"line":268},[25,533,534],{"class":97},"    - ",[25,536,537],{"class":35},"10.0.0.0\u002F8\n",[81,539,540,541,544],{},"Każda instancja proxy ma ten sam ",[22,542,543],{},"redis.addr"," — klient dostaje jeden wspólny limit niezależnie od tego, która instancja go obsłuży.",[10,546,548],{"id":547},"graceful-shutdown","Graceful shutdown",[15,550,552],{"className":165,"code":551,"language":168,"meta":20,"style":20},"timeouts:\n  shutdown: 10s\n",[22,553,554,561],{"__ignoreMap":20},[25,555,556,559],{"class":27,"line":28},[25,557,558],{"class":175},"timeouts",[25,560,179],{"class":97},[25,562,563,566,568],{"class":27,"line":39},[25,564,565],{"class":175},"  shutdown",[25,567,202],{"class":97},[25,569,570],{"class":35},"10s\n",[81,572,573],{},"Po SIGTERM proxy:",[575,576,577,580,587,590],"ol",{},[372,578,579],{},"Przestaje przyjmować nowe połączenia.",[372,581,582,583,586],{},"Drainuje requesty w locie do ",[22,584,585],{},"shutdown"," budżetu.",[372,588,589],{},"Zamyka idle connections.",[372,591,592],{},"Kończy proces.",[15,594,596],{"className":17,"code":595,"language":19,"meta":20,"style":20},"docker stop --time 15 reverse-proxy\n",[22,597,598],{"__ignoreMap":20},[25,599,600,602,605,608,611],{"class":27,"line":28},[25,601,12],{"class":42},[25,603,604],{"class":35}," stop",[25,606,607],{"class":31}," --time",[25,609,610],{"class":31}," 15",[25,612,36],{"class":35},[10,614,616],{"id":615},"connection-pooling","Connection pooling",[15,618,620],{"className":165,"code":619,"language":168,"meta":20,"style":20},"timeouts:\n  backend_max_idle_conns: 256\n  backend_max_idle_conns_per_host: 64\n  backend_idle_conn: 90s\n",[22,621,622,628,638,648],{"__ignoreMap":20},[25,623,624,626],{"class":27,"line":28},[25,625,558],{"class":175},[25,627,179],{"class":97},[25,629,630,633,635],{"class":27,"line":39},[25,631,632],{"class":175},"  backend_max_idle_conns",[25,634,202],{"class":97},[25,636,637],{"class":31},"256\n",[25,639,640,643,645],{"class":27,"line":57},[25,641,642],{"class":175},"  backend_max_idle_conns_per_host",[25,644,202],{"class":97},[25,646,647],{"class":31},"64\n",[25,649,650,653,655],{"class":27,"line":196},[25,651,652],{"class":175},"  backend_idle_conn",[25,654,202],{"class":97},[25,656,657],{"class":35},"90s\n",[81,659,660,661,664],{},"Upstream connection pooling z keep-alive i HTTP\u002F2 dla TLS upstreamów. Dla bardzo dużej liczby backendów zwiększ ",[22,662,663],{},"backend_max_idle_conns",".",[10,666,668],{"id":667},"checklist-wdrożenia","Checklist wdrożenia",[670,671,672],"steps",{},[575,673,674,680,687,696,699,706,716,722],{},[372,675,676,677],{},"Zbuduj obraz: ",[22,678,679],{},"docker build -t reverse-proxy .",[372,681,682,683,686],{},"Przygotuj ",[22,684,685],{},"config.yaml"," z backendami i strategią.",[372,688,689,690,692,693,664],{},"Ustaw sekrety: ",[22,691,98],{},", opcjonalnie ",[22,694,695],{},"REDIS_PASSWORD",[372,697,698],{},"Zamontuj certyfikaty TLS read-only (jeśli termination na proxy).",[372,700,701,702,705],{},"Uruchom z ",[22,703,704],{},"--read-only"," i non-root.",[372,707,708,709,712,713,664],{},"Sprawdź ",[22,710,711],{},"\u002Fhealthz"," i ",[22,714,715],{},"\u002Fadmin\u002Fbackends",[372,717,718,719,664],{},"Podłącz Prometheus do ",[22,720,721],{},"\u002Fmetrics",[372,723,724],{},"Przetestuj failover: wyłącz jeden backend i obserwuj metryki.",[10,726,728],{"id":727},"reverse-proxy-za-nginx-tls-na-brzegu","Reverse proxy za nginx (TLS na brzegu)",[15,730,735],{"className":731,"code":732,"filename":733,"language":734,"meta":20,"style":20},"language-nginx shiki shiki-themes github-light github-dark","server {\n  listen 443 ssl http2;\n  server_name api.example.com;\n\n  ssl_certificate \u002Fetc\u002Ftls\u002Ffullchain.pem;\n  ssl_certificate_key \u002Fetc\u002Ftls\u002Fprivkey.pem;\n\n  location \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:8080;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto https;\n    proxy_set_header Host $host;\n  }\n}\n","nginx.conf","nginx",[22,736,737,745,756,764,768,776,784,788,799,807,815,822,829,834],{"__ignoreMap":20},[25,738,739,742],{"class":27,"line":28},[25,740,741],{"class":101},"server",[25,743,744],{"class":97}," {\n",[25,746,747,750,753],{"class":27,"line":39},[25,748,749],{"class":101},"  listen ",[25,751,752],{"class":31},"443",[25,754,755],{"class":97}," ssl http2;\n",[25,757,758,761],{"class":27,"line":57},[25,759,760],{"class":101},"  server_name ",[25,762,763],{"class":97},"api.example.com;\n",[25,765,766],{"class":27,"line":196},[25,767,477],{"emptyLinePlaceholder":476},[25,769,770,773],{"class":27,"line":208},[25,771,772],{"class":101},"  ssl_certificate ",[25,774,775],{"class":97},"\u002Fetc\u002Ftls\u002Ffullchain.pem;\n",[25,777,778,781],{"class":27,"line":219},[25,779,780],{"class":101},"  ssl_certificate_key ",[25,782,783],{"class":97},"\u002Fetc\u002Ftls\u002Fprivkey.pem;\n",[25,785,786],{"class":27,"line":227},[25,787,477],{"emptyLinePlaceholder":476},[25,789,790,793,796],{"class":27,"line":236},[25,791,792],{"class":101},"  location",[25,794,795],{"class":42}," \u002F ",[25,797,798],{"class":97},"{\n",[25,800,801,804],{"class":27,"line":244},[25,802,803],{"class":101},"    proxy_pass ",[25,805,806],{"class":97},"http:\u002F\u002F127.0.0.1:8080;\n",[25,808,809,812],{"class":27,"line":252},[25,810,811],{"class":101},"    proxy_set_header ",[25,813,814],{"class":97},"X-Forwarded-For $proxy_add_x_forwarded_for;\n",[25,816,817,819],{"class":27,"line":260},[25,818,811],{"class":101},[25,820,821],{"class":97},"X-Forwarded-Proto https;\n",[25,823,824,826],{"class":27,"line":268},[25,825,811],{"class":101},[25,827,828],{"class":97},"Host $host;\n",[25,830,831],{"class":27,"line":276},[25,832,833],{"class":97},"  }\n",[25,835,837],{"class":27,"line":836},14,[25,838,839],{"class":97},"}\n",[81,841,842],{},"Wtedy w konfiguracji proxy:",[15,844,846],{"className":165,"code":845,"language":168,"meta":20,"style":20},"rate_limit:\n  trusted_proxies:\n    - 127.0.0.1\n",[22,847,848,854,860],{"__ignoreMap":20},[25,849,850,852],{"class":27,"line":28},[25,851,500],{"class":175},[25,853,179],{"class":97},[25,855,856,858],{"class":27,"line":39},[25,857,527],{"class":175},[25,859,179],{"class":97},[25,861,862,864],{"class":27,"line":57},[25,863,534],{"class":97},[25,865,866],{"class":31},"127.0.0.1\n",[868,869,870],"style",{},"html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":20,"searchDepth":57,"depth":57,"links":872},[873,874,877,878,881,882,883,884],{"id":12,"depth":39,"text":13},{"id":86,"depth":39,"text":87,"children":875},[876],{"id":161,"depth":57,"text":162},{"id":284,"depth":39,"text":285},{"id":387,"depth":39,"text":388,"children":879},[880],{"id":434,"depth":57,"text":435},{"id":547,"depth":39,"text":548},{"id":615,"depth":39,"text":616},{"id":667,"depth":39,"text":668},{"id":727,"depth":39,"text":728},"Docker, Docker Compose, HTTPS termination, rozproszony rate limiting z Redis i graceful shutdown. Gotowe przepisy produkcyjne.","md",{},"\u002Freverse-proxy\u002Foperations\u002Fdeployment",{"title":5,"description":885},"02.reverse-proxy\u002F05.operations\u002F04.deployment","l2YAkkfzlI6VMoZ8u7EAWYPaoKuako0H5oBmpj2ADx8",[893,898],{"title":894,"path":895,"stem":896,"description":897,"children":-1},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security","Fail-closed admin API, trusted proxies, walidacja URL, hop-by-hop headers, sekrety w environment i utwardzony kontener.",{"title":899,"path":900,"stem":901,"description":902,"children":-1},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks","Wyniki benchmarków gorących ścieżek, profilowanie i testy race. Co jest allocation-free i gdzie naprawdę idzie czas.",[904,1023,1076],{"title":905,"path":906,"stem":907,"children":908},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[909,911,915,919,923,949,978,991,1012,1015,1019],{"title":910,"path":906,"stem":907},"Przegląd",{"title":912,"path":913,"stem":914},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":916,"path":917,"stem":918},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":920,"path":921,"stem":922},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":924,"path":925,"stem":926,"children":927,"page":948},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[928,932,936,940,944],{"title":929,"path":930,"stem":931},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":933,"path":934,"stem":935},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":937,"path":938,"stem":939},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":941,"path":942,"stem":943},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":945,"path":946,"stem":947},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":950,"path":951,"stem":952,"children":953,"page":948},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[954,958,962,966,970,974],{"title":955,"path":956,"stem":957},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":959,"path":960,"stem":961},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":963,"path":964,"stem":965},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":967,"path":968,"stem":969},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":971,"path":972,"stem":973},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":975,"path":976,"stem":977},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":979,"path":980,"stem":981,"children":982,"page":948},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[983,987],{"title":984,"path":985,"stem":986},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":988,"path":989,"stem":990},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":992,"path":993,"stem":994,"children":995,"page":948},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[996,1000,1004,1008],{"title":997,"path":998,"stem":999},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":1001,"path":1002,"stem":1003},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":1005,"path":1006,"stem":1007},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1009,"path":1010,"stem":1011},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":5,"path":1013,"stem":1014},"\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":1016,"path":1017,"stem":1018},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":1020,"path":1021,"stem":1022},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":1024,"path":1025,"stem":1026,"children":1027},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[1028,1029,1032,1035,1056],{"title":910,"path":1025,"stem":1026},{"title":912,"path":1030,"stem":1031},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":916,"path":1033,"stem":1034},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1036,"path":1037,"stem":1038,"children":1039,"page":948},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[1040,1044,1048,1052],{"title":1041,"path":1042,"stem":1043},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":1045,"path":1046,"stem":1047},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":1049,"path":1050,"stem":1051},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":1053,"path":1054,"stem":1055},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":1057,"path":1058,"stem":1059,"children":1060,"page":948},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1061,1065,1069,1070,1071,1072],{"title":1062,"path":1063,"stem":1064},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":1066,"path":1067,"stem":1068},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":894,"path":895,"stem":896},{"title":5,"path":888,"stem":890},{"title":899,"path":900,"stem":901},{"title":1073,"path":1074,"stem":1075},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1077,"path":1078,"stem":1079,"children":1080},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1081,1082,1085,1106,1119,1139],{"title":910,"path":1078,"stem":1079},{"title":912,"path":1083,"stem":1084},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1086,"path":1087,"stem":1088,"children":1089,"page":948},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1090,1094,1098,1102],{"title":1091,"path":1092,"stem":1093},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1095,"path":1096,"stem":1097},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1099,"path":1100,"stem":1101},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1103,"path":1104,"stem":1105},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1107,"path":1108,"stem":1109,"children":1110,"page":948},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1111,1115],{"title":1112,"path":1113,"stem":1114},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1116,"path":1117,"stem":1118},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1120,"path":1121,"stem":1122,"children":1123,"page":948},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1124,1127,1131,1135],{"title":920,"path":1125,"stem":1126},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1128,"path":1129,"stem":1130},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1132,"path":1133,"stem":1134},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1136,"path":1137,"stem":1138},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1140,"path":1141,"stem":1142},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986308567]