[{"data":1,"prerenderedAt":1142},["ShallowReactive",2],{"doc:\u002Freverse-proxy\u002Foperations\u002Fadmin-api":3,"surround:\u002Freverse-proxy\u002Foperations\u002Fadmin-api":891,"navigation":902},{"id":4,"title":5,"body":6,"description":884,"extension":885,"meta":886,"navigation":374,"path":887,"seo":888,"stem":889,"__hash__":890},"docs\u002F02.reverse-proxy\u002F05.operations\u002F01.admin-api.md","Admin API",{"type":7,"value":8,"toc":873},"minimark",[9,14,23,51,76,80,147,151,185,336,340,399,405,410,449,453,511,554,558,561,573,577,869],[10,11,13],"h2",{"id":12},"uwierzytelnianie","Uwierzytelnianie",[15,16,17,18,22],"p",{},"Admin API wymaga bearer tokenu z ",[19,20,21],"code",{},"ADMIN_TOKEN",":",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-bash shiki shiki-themes github-light github-dark","export ADMIN_TOKEN=super-secret-token\n","bash","",[19,31,32],{"__ignoreMap":29},[33,34,37,41,45,48],"span",{"class":35,"line":36},"line",1,[33,38,40],{"class":39},"szBVR","export",[33,42,44],{"class":43},"sVt8B"," ADMIN_TOKEN",[33,46,47],{"class":39},"=",[33,49,50],{"class":43},"super-secret-token\n",[52,53,54,63,73],"ul",{},[55,56,57,58,62],"li",{},"Porównanie tokenu jest ",[59,60,61],"strong",{},"constant-time"," (ochrona przed timing attack).",[55,64,65,66,68,69,72],{},"Bez ",[19,67,21],{}," API ",[59,70,71],{},"nie jest serwowane wcale"," — fail-closed, nie fail-open.",[55,74,75],{},"Token żyje tylko w environment, nigdy w YAML.",[10,77,79],{"id":78},"endpointy","Endpointy",[81,82,83,99],"table",{},[84,85,86],"thead",{},[87,88,89,93,96],"tr",{},[90,91,92],"th",{},"Metoda",[90,94,95],{},"Ścieżka",[90,97,98],{},"Opis",[100,101,102,118,133],"tbody",{},[87,103,104,110,115],{},[105,106,107],"td",{},[19,108,109],{},"GET",[105,111,112],{},[19,113,114],{},"\u002Fadmin\u002Fbackends",[105,116,117],{},"Lista backendów: health, admin status, in-flight",[87,119,120,125,130],{},[105,121,122],{},[19,123,124],{},"POST",[105,126,127],{},[19,128,129],{},"\u002Fadmin\u002Fbackends\u002F{index}\u002Fdown",[105,131,132],{},"Wyłącz backend z rotacji",[87,134,135,139,144],{},[105,136,137],{},[19,138,124],{},[105,140,141],{},[19,142,143],{},"\u002Fadmin\u002Fbackends\u002F{index}\u002Fup",[105,145,146],{},"Przywróć backend do rotacji",[10,148,150],{"id":149},"podgląd-backendów","Podgląd backendów",[24,152,154],{"className":26,"code":153,"language":28,"meta":29,"style":29},"curl -H \"Authorization: Bearer $ADMIN_TOKEN\" \\\n  http:\u002F\u002Flocalhost:8080\u002Fadmin\u002Fbackends\n",[19,155,156,179],{"__ignoreMap":29},[33,157,158,162,166,170,173,176],{"class":35,"line":36},[33,159,161],{"class":160},"sScJk","curl",[33,163,165],{"class":164},"sj4cs"," -H",[33,167,169],{"class":168},"sZZnC"," \"Authorization: Bearer ",[33,171,172],{"class":43},"$ADMIN_TOKEN",[33,174,175],{"class":168},"\"",[33,177,178],{"class":164}," \\\n",[33,180,182],{"class":35,"line":181},2,[33,183,184],{"class":168},"  http:\u002F\u002Flocalhost:8080\u002Fadmin\u002Fbackends\n",[24,186,190],{"className":187,"code":188,"language":189,"meta":29,"style":29},"language-json shiki shiki-themes github-light github-dark","{\n  \"backends\": [\n    {\n      \"url\": \"http:\u002F\u002Flocalhost:8081\",\n      \"healthy\": true,\n      \"admin_down\": false,\n      \"in_flight\": 3\n    },\n    {\n      \"url\": \"http:\u002F\u002Flocalhost:8082\",\n      \"healthy\": false,\n      \"admin_down\": false,\n      \"in_flight\": 0\n    }\n  ]\n}\n","json",[19,191,192,197,205,211,226,239,252,263,269,274,286,297,308,318,324,330],{"__ignoreMap":29},[33,193,194],{"class":35,"line":36},[33,195,196],{"class":43},"{\n",[33,198,199,202],{"class":35,"line":181},[33,200,201],{"class":164},"  \"backends\"",[33,203,204],{"class":43},": [\n",[33,206,208],{"class":35,"line":207},3,[33,209,210],{"class":43},"    {\n",[33,212,214,217,220,223],{"class":35,"line":213},4,[33,215,216],{"class":164},"      \"url\"",[33,218,219],{"class":43},": ",[33,221,222],{"class":168},"\"http:\u002F\u002Flocalhost:8081\"",[33,224,225],{"class":43},",\n",[33,227,229,232,234,237],{"class":35,"line":228},5,[33,230,231],{"class":164},"      \"healthy\"",[33,233,219],{"class":43},[33,235,236],{"class":164},"true",[33,238,225],{"class":43},[33,240,242,245,247,250],{"class":35,"line":241},6,[33,243,244],{"class":164},"      \"admin_down\"",[33,246,219],{"class":43},[33,248,249],{"class":164},"false",[33,251,225],{"class":43},[33,253,255,258,260],{"class":35,"line":254},7,[33,256,257],{"class":164},"      \"in_flight\"",[33,259,219],{"class":43},[33,261,262],{"class":164},"3\n",[33,264,266],{"class":35,"line":265},8,[33,267,268],{"class":43},"    },\n",[33,270,272],{"class":35,"line":271},9,[33,273,210],{"class":43},[33,275,277,279,281,284],{"class":35,"line":276},10,[33,278,216],{"class":164},[33,280,219],{"class":43},[33,282,283],{"class":168},"\"http:\u002F\u002Flocalhost:8082\"",[33,285,225],{"class":43},[33,287,289,291,293,295],{"class":35,"line":288},11,[33,290,231],{"class":164},[33,292,219],{"class":43},[33,294,249],{"class":164},[33,296,225],{"class":43},[33,298,300,302,304,306],{"class":35,"line":299},12,[33,301,244],{"class":164},[33,303,219],{"class":43},[33,305,249],{"class":164},[33,307,225],{"class":43},[33,309,311,313,315],{"class":35,"line":310},13,[33,312,257],{"class":164},[33,314,219],{"class":43},[33,316,317],{"class":164},"0\n",[33,319,321],{"class":35,"line":320},14,[33,322,323],{"class":43},"    }\n",[33,325,327],{"class":35,"line":326},15,[33,328,329],{"class":43},"  ]\n",[33,331,333],{"class":35,"line":332},16,[33,334,335],{"class":43},"}\n",[10,337,339],{"id":338},"sterowanie-rotacją","Sterowanie rotacją",[24,341,343],{"className":26,"code":342,"language":28,"meta":29,"style":29},"curl -X POST -H \"Authorization: Bearer $ADMIN_TOKEN\" \\\n  http:\u002F\u002Flocalhost:8080\u002Fadmin\u002Fbackends\u002F0\u002Fdown\n\ncurl -X POST -H \"Authorization: Bearer $ADMIN_TOKEN\" \\\n  http:\u002F\u002Flocalhost:8080\u002Fadmin\u002Fbackends\u002F0\u002Fup\n",[19,344,345,365,370,376,394],{"__ignoreMap":29},[33,346,347,349,352,355,357,359,361,363],{"class":35,"line":36},[33,348,161],{"class":160},[33,350,351],{"class":164}," -X",[33,353,354],{"class":168}," POST",[33,356,165],{"class":164},[33,358,169],{"class":168},[33,360,172],{"class":43},[33,362,175],{"class":168},[33,364,178],{"class":164},[33,366,367],{"class":35,"line":181},[33,368,369],{"class":168},"  http:\u002F\u002Flocalhost:8080\u002Fadmin\u002Fbackends\u002F0\u002Fdown\n",[33,371,372],{"class":35,"line":207},[33,373,375],{"emptyLinePlaceholder":374},true,"\n",[33,377,378,380,382,384,386,388,390,392],{"class":35,"line":213},[33,379,161],{"class":160},[33,381,351],{"class":164},[33,383,354],{"class":168},[33,385,165],{"class":164},[33,387,169],{"class":168},[33,389,172],{"class":43},[33,391,175],{"class":168},[33,393,178],{"class":164},[33,395,396],{"class":35,"line":228},[33,397,398],{"class":168},"  http:\u002F\u002Flocalhost:8080\u002Fadmin\u002Fbackends\u002F0\u002Fup\n",[15,400,401,404],{},[19,402,403],{},"admin_down"," jest niezależny od health checków — backend może być zdrowy, ale wyłączony ręcznie (np. na czas deployu).",[406,407,409],"h3",{"id":408},"przykład-kontrolowany-deploy-backendu","Przykład: kontrolowany deploy backendu",[411,412,413],"steps",{},[414,415,416,423,430,433,443],"ol",{},[55,417,418,419,422],{},"Wyłącz backend z rotacji: ",[19,420,421],{},"POST \u002Fadmin\u002Fbackends\u002F0\u002Fdown",".",[55,424,425,426,429],{},"Poczekaj, aż ",[19,427,428],{},"in_flight"," spadnie do zera.",[55,431,432],{},"Zdeployuj nową wersję backendu.",[55,434,435,436,439,440,422],{},"Sprawdź health: ",[19,437,438],{},"GET \u002Fadmin\u002Fbackends"," → ",[19,441,442],{},"healthy: true",[55,444,445,446,422],{},"Przywróć do rotacji: ",[19,447,448],{},"POST \u002Fadmin\u002Fbackends\u002F0\u002Fup",[10,450,452],{"id":451},"błędy","Błędy",[24,454,456],{"className":187,"code":455,"language":189,"meta":29,"style":29},"{\n  \"error\": {\n    \"code\": \"unauthorized\",\n    \"message\": \"invalid admin token\"\n  },\n  \"request_id\": \"a1b2c3d4e5f6\"\n}\n",[19,457,458,462,470,482,492,497,507],{"__ignoreMap":29},[33,459,460],{"class":35,"line":36},[33,461,196],{"class":43},[33,463,464,467],{"class":35,"line":181},[33,465,466],{"class":164},"  \"error\"",[33,468,469],{"class":43},": {\n",[33,471,472,475,477,480],{"class":35,"line":207},[33,473,474],{"class":164},"    \"code\"",[33,476,219],{"class":43},[33,478,479],{"class":168},"\"unauthorized\"",[33,481,225],{"class":43},[33,483,484,487,489],{"class":35,"line":213},[33,485,486],{"class":164},"    \"message\"",[33,488,219],{"class":43},[33,490,491],{"class":168},"\"invalid admin token\"\n",[33,493,494],{"class":35,"line":228},[33,495,496],{"class":43},"  },\n",[33,498,499,502,504],{"class":35,"line":241},[33,500,501],{"class":164},"  \"request_id\"",[33,503,219],{"class":43},[33,505,506],{"class":168},"\"a1b2c3d4e5f6\"\n",[33,508,509],{"class":35,"line":254},[33,510,335],{"class":43},[81,512,513,526],{},[84,514,515],{},[87,516,517,520,523],{},[90,518,519],{},"Kod",[90,521,522],{},"HTTP",[90,524,525],{},"Kiedy",[100,527,528,541],{},[87,529,530,535,538],{},[105,531,532],{},[19,533,534],{},"unauthorized",[105,536,537],{},"401",[105,539,540],{},"Zły lub brak tokenu",[87,542,543,548,551],{},[105,544,545],{},[19,546,547],{},"invalid_backend_index",[105,549,550],{},"400",[105,552,553],{},"Indeks poza zakresem",[10,555,557],{"id":556},"bezpieczeństwo-odpowiedzi","Bezpieczeństwo odpowiedzi",[15,559,560],{},"Odpowiedzi Admin API mają security headers, a sam endpoint jest chroniony przed CSRF przez wymóg tokenu w nagłówku (nie w cookie).",[562,563,566],"callout",{"title":564,"type":565},"Ogranicz dostęp sieciowy","warning",[15,567,568,569,572],{},"Admin API powinno być dostępne tylko z sieci wewnętrznej lub przez VPN. Token to ostatnia warstwa obrony, nie jedyna — wystawienie ",[19,570,571],{},"\u002Fadmin\u002F*"," do internetu to zły pomysł nawet z silnym tokenem.",[10,574,576],{"id":575},"skrypt-operacyjny","Skrypt operacyjny",[24,578,580],{"className":26,"code":579,"language":28,"meta":29,"style":29},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -euo pipefail\n\nPROXY=http:\u002F\u002Flocalhost:8080\nTOKEN=${ADMIN_TOKEN:?ustaw ADMIN_TOKEN}\n\nlist_backends() {\n  curl -sf -H \"Authorization: Bearer $TOKEN\" \"$PROXY\u002Fadmin\u002Fbackends\" | jq .\n}\n\ndrain_backend() {\n  local index=$1\n  curl -sf -X POST -H \"Authorization: Bearer $TOKEN\" \"$PROXY\u002Fadmin\u002Fbackends\u002F$index\u002Fdown\"\n  echo \"Backend $index wyłączony z rotacji\"\n}\n\ncase ${1:-list} in\n  list) list_backends ;;\n  drain) drain_backend \"${2:?podaj indeks}\" ;;\n  restore) curl -sf -X POST -H \"Authorization: Bearer $TOKEN\" \"$PROXY\u002Fadmin\u002Fbackends\u002F$2\u002Fup\" ;;\nesac\n",[19,581,582,588,599,603,613,629,633,641,676,680,684,691,705,736,749,753,757,778,794,824,863],{"__ignoreMap":29},[33,583,584],{"class":35,"line":36},[33,585,587],{"class":586},"sJ8bj","#!\u002Fusr\u002Fbin\u002Fenv bash\n",[33,589,590,593,596],{"class":35,"line":181},[33,591,592],{"class":164},"set",[33,594,595],{"class":164}," -euo",[33,597,598],{"class":168}," pipefail\n",[33,600,601],{"class":35,"line":207},[33,602,375],{"emptyLinePlaceholder":374},[33,604,605,608,610],{"class":35,"line":213},[33,606,607],{"class":43},"PROXY",[33,609,47],{"class":39},[33,611,612],{"class":168},"http:\u002F\u002Flocalhost:8080\n",[33,614,615,618,620,623,626],{"class":35,"line":228},[33,616,617],{"class":43},"TOKEN",[33,619,47],{"class":39},[33,621,622],{"class":43},"${ADMIN_TOKEN",[33,624,625],{"class":39},":?",[33,627,628],{"class":43},"ustaw ADMIN_TOKEN}\n",[33,630,631],{"class":35,"line":241},[33,632,375],{"emptyLinePlaceholder":374},[33,634,635,638],{"class":35,"line":254},[33,636,637],{"class":160},"list_backends",[33,639,640],{"class":43},"() {\n",[33,642,643,646,649,651,653,656,658,661,664,667,670,673],{"class":35,"line":265},[33,644,645],{"class":160},"  curl",[33,647,648],{"class":164}," -sf",[33,650,165],{"class":164},[33,652,169],{"class":168},[33,654,655],{"class":43},"$TOKEN",[33,657,175],{"class":168},[33,659,660],{"class":168}," \"",[33,662,663],{"class":43},"$PROXY",[33,665,666],{"class":168},"\u002Fadmin\u002Fbackends\"",[33,668,669],{"class":39}," |",[33,671,672],{"class":160}," jq",[33,674,675],{"class":168}," .\n",[33,677,678],{"class":35,"line":271},[33,679,335],{"class":43},[33,681,682],{"class":35,"line":276},[33,683,375],{"emptyLinePlaceholder":374},[33,685,686,689],{"class":35,"line":288},[33,687,688],{"class":160},"drain_backend",[33,690,640],{"class":43},[33,692,693,696,699,701],{"class":35,"line":299},[33,694,695],{"class":39},"  local",[33,697,698],{"class":43}," index",[33,700,47],{"class":39},[33,702,704],{"class":703},"s4XuR","$1\n",[33,706,707,709,711,713,715,717,719,721,723,725,727,730,733],{"class":35,"line":310},[33,708,645],{"class":160},[33,710,648],{"class":164},[33,712,351],{"class":164},[33,714,354],{"class":168},[33,716,165],{"class":164},[33,718,169],{"class":168},[33,720,655],{"class":43},[33,722,175],{"class":168},[33,724,660],{"class":168},[33,726,663],{"class":43},[33,728,729],{"class":168},"\u002Fadmin\u002Fbackends\u002F",[33,731,732],{"class":43},"$index",[33,734,735],{"class":168},"\u002Fdown\"\n",[33,737,738,741,744,746],{"class":35,"line":320},[33,739,740],{"class":164},"  echo",[33,742,743],{"class":168}," \"Backend ",[33,745,732],{"class":43},[33,747,748],{"class":168}," wyłączony z rotacji\"\n",[33,750,751],{"class":35,"line":326},[33,752,335],{"class":43},[33,754,755],{"class":35,"line":332},[33,756,375],{"emptyLinePlaceholder":374},[33,758,760,763,766,769,772,775],{"class":35,"line":759},17,[33,761,762],{"class":39},"case",[33,764,765],{"class":703}," ${1",[33,767,768],{"class":39},":-",[33,770,771],{"class":43},"list",[33,773,774],{"class":703},"}",[33,776,777],{"class":39}," in\n",[33,779,781,785,788,791],{"class":35,"line":780},18,[33,782,784],{"class":783},"sA_wV","  list",[33,786,787],{"class":39},")",[33,789,790],{"class":160}," list_backends",[33,792,793],{"class":43}," ;;\n",[33,795,797,800,802,805,807,810,812,815,818,820,822],{"class":35,"line":796},19,[33,798,799],{"class":783},"  drain",[33,801,787],{"class":39},[33,803,804],{"class":160}," drain_backend",[33,806,660],{"class":168},[33,808,809],{"class":164},"${2",[33,811,625],{"class":39},[33,813,814],{"class":43},"podaj",[33,816,817],{"class":43}," indeks",[33,819,774],{"class":164},[33,821,175],{"class":168},[33,823,793],{"class":43},[33,825,827,830,832,835,837,839,841,843,845,847,849,851,853,855,858,861],{"class":35,"line":826},20,[33,828,829],{"class":783},"  restore",[33,831,787],{"class":39},[33,833,834],{"class":160}," curl",[33,836,648],{"class":164},[33,838,351],{"class":164},[33,840,354],{"class":168},[33,842,165],{"class":164},[33,844,169],{"class":168},[33,846,655],{"class":43},[33,848,175],{"class":168},[33,850,660],{"class":168},[33,852,663],{"class":43},[33,854,729],{"class":168},[33,856,857],{"class":164},"$2",[33,859,860],{"class":168},"\u002Fup\"",[33,862,793],{"class":43},[33,864,866],{"class":35,"line":865},21,[33,867,868],{"class":39},"esac\n",[870,871,872],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}",{"title":29,"searchDepth":207,"depth":207,"links":874},[875,876,877,878,881,882,883],{"id":12,"depth":181,"text":13},{"id":78,"depth":181,"text":79},{"id":149,"depth":181,"text":150},{"id":338,"depth":181,"text":339,"children":879},[880],{"id":408,"depth":207,"text":409},{"id":451,"depth":181,"text":452},{"id":556,"depth":181,"text":557},{"id":575,"depth":181,"text":576},"Token-authenticated API do podglądu i sterowania backendami. Bearer token, fail-closed, endpointy i przykłady curl.","md",{},"\u002Freverse-proxy\u002Foperations\u002Fadmin-api",{"title":5,"description":884},"02.reverse-proxy\u002F05.operations\u002F01.admin-api","GBTiMXZr5SDstEgPJmJzrfiNFViRqgDENGreTrTjY6g",[892,897],{"title":893,"path":894,"stem":895,"description":896,"children":-1},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting","Token bucket per IP z bounded memory, rozproszony limiting przez Redis (atomowy Lua) i fail-open. Konfiguracja i trusted proxies.",{"title":898,"path":899,"stem":900,"description":901,"children":-1},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability","Strukturalne logi slog, pełna lista metryk Prometheus i gotowy stack Prometheus + Grafana z dashboardem.",[903,1023,1075],{"title":904,"path":905,"stem":906,"children":907},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[908,910,914,918,922,948,977,990,1011,1015,1019],{"title":909,"path":905,"stem":906},"Przegląd",{"title":911,"path":912,"stem":913},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":915,"path":916,"stem":917},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":919,"path":920,"stem":921},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":923,"path":924,"stem":925,"children":926,"page":947},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[927,931,935,939,943],{"title":928,"path":929,"stem":930},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":932,"path":933,"stem":934},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":936,"path":937,"stem":938},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":940,"path":941,"stem":942},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":944,"path":945,"stem":946},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":949,"path":950,"stem":951,"children":952,"page":947},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[953,957,961,965,969,973],{"title":954,"path":955,"stem":956},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":958,"path":959,"stem":960},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":962,"path":963,"stem":964},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":966,"path":967,"stem":968},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":970,"path":971,"stem":972},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":974,"path":975,"stem":976},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":978,"path":979,"stem":980,"children":981,"page":947},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[982,986],{"title":983,"path":984,"stem":985},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":987,"path":988,"stem":989},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":991,"path":992,"stem":993,"children":994,"page":947},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[995,999,1003,1007],{"title":996,"path":997,"stem":998},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":1000,"path":1001,"stem":1002},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":1004,"path":1005,"stem":1006},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1008,"path":1009,"stem":1010},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":1012,"path":1013,"stem":1014},"Wdrożenie","\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,1053],{"title":909,"path":1025,"stem":1026},{"title":911,"path":1030,"stem":1031},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":915,"path":1033,"stem":1034},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1036,"path":1037,"stem":1038,"children":1039,"page":947},"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":893,"path":894,"stem":895},{"title":1054,"path":1055,"stem":1056,"children":1057,"page":947},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1058,1059,1060,1064,1067,1071],{"title":5,"path":887,"stem":889},{"title":898,"path":899,"stem":900},{"title":1061,"path":1062,"stem":1063},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":1012,"path":1065,"stem":1066},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":1068,"path":1069,"stem":1070},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":1072,"path":1073,"stem":1074},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1076,"path":1077,"stem":1078,"children":1079},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1080,1081,1084,1105,1118,1138],{"title":909,"path":1077,"stem":1078},{"title":911,"path":1082,"stem":1083},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1085,"path":1086,"stem":1087,"children":1088,"page":947},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1089,1093,1097,1101],{"title":1090,"path":1091,"stem":1092},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1094,"path":1095,"stem":1096},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1098,"path":1099,"stem":1100},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1102,"path":1103,"stem":1104},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1106,"path":1107,"stem":1108,"children":1109,"page":947},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1110,1114],{"title":1111,"path":1112,"stem":1113},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1115,"path":1116,"stem":1117},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1119,"path":1120,"stem":1121,"children":1122,"page":947},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1123,1126,1130,1134],{"title":919,"path":1124,"stem":1125},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1127,"path":1128,"stem":1129},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1131,"path":1132,"stem":1133},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1135,"path":1136,"stem":1137},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1139,"path":1140,"stem":1141},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986308493]