[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"doc:\u002Fvector-engine\u002Fdeployment":3,"surround:\u002Fvector-engine\u002Fdeployment":468,"navigation":475},{"id":4,"title":5,"body":6,"description":460,"extension":461,"meta":462,"navigation":463,"path":464,"seo":465,"stem":466,"__hash__":467},"docs\u002F03.vector-engine\u002F06.deployment.md","Wdrożenie na Vercel",{"type":7,"value":8,"toc":450},"minimark",[9,14,23,27,58,128,140,169,173,207,214,218,221,229,234,249,252,256,283,287,290,307,310,314,355,361,378,382,388,413,421,424,446],[10,11,13],"h2",{"id":12},"model-wdrożenia","Model wdrożenia",[15,16,17,18,22],"p",{},"Vector Engine deployuje się jako ",[19,20,21],"strong",{},"statyczna aplikacja Vite",". Silnik C++ jest już skompilowany do WebAssembly i kopiowany do outputu przez Vite — serwer nie wykonuje żadnego kodu silnika.",[10,24,26],{"id":25},"dashboard","Dashboard",[28,29,30],"steps",{},[31,32,33,37,40,47,55],"ol",{},[34,35,36],"li",{},"Wypchnij repozytorium do GitHub \u002F GitLab \u002F Bitbucket.",[34,38,39],{},"Zaimportuj projekt w Vercel.",[34,41,42,43,46],{},"Zostaw ",[19,44,45],{},"Root Directory na korzeniu repozytorium",".",[34,48,49,50,54],{},"Vercel czyta ",[51,52,53],"code",{},"vercel.json"," — żadne override'y builda nie są potrzebne.",[34,56,57],{},"Deploy.",[59,60,61,74],"table",{},[62,63,64],"thead",{},[65,66,67,71],"tr",{},[68,69,70],"th",{},"Ustawienie",[68,72,73],{},"Wartość",[75,76,77,86,96,106,116],"tbody",{},[65,78,79,83],{},[80,81,82],"td",{},"Framework",[80,84,85],{},"Vite",[65,87,88,91],{},[80,89,90],{},"Install command",[80,92,93],{},[51,94,95],{},"npm ci",[65,97,98,101],{},[80,99,100],{},"Build command",[80,102,103],{},[51,104,105],{},"npm run build",[65,107,108,111],{},[80,109,110],{},"Output directory",[80,112,113],{},[51,114,115],{},"apps\u002Fweb\u002Fdist",[65,117,118,121],{},[80,119,120],{},"Node.js",[80,122,123,124,127],{},"22.x+ (",[51,125,126],{},".nvmrc"," pinuje 24 lokalnie)",[129,130,133],"callout",{"title":131,"type":132},"Nie ustawiaj Root Directory na apps\u002Fweb","danger",[15,134,135,136,139],{},"Korzeń workspace'u posiada lockfile, konfiguracją deploymentu, importem schemy i weryfikacją WASM. Ustawienie ",[51,137,138],{},"apps\u002Fweb"," pomija te kroki i psuje build.",[15,141,142,145,146,149,150,153,154,157,158,161,162,164,165,168],{},[51,143,144],{},".vercelignore"," utrzymuje mały upload: natywne ",[51,147,148],{},"engine\u002F",", testy, specy Playwright, docs i lokalny build nie są wysyłane; ",[51,151,152],{},"package.json",", lockfile, ",[51,155,156],{},"scripts\u002F",", ",[51,159,160],{},"schemas\u002F"," i ",[51,163,138],{}," (z ",[51,166,167],{},"public\u002Fwasm",") zostają.",[10,170,172],{"id":171},"cli","CLI",[174,175,180],"pre",{"className":176,"code":177,"language":178,"meta":179,"style":179},"language-bash shiki shiki-themes github-light github-dark","npx vercel\nnpx vercel --prod\n","bash","",[51,181,182,195],{"__ignoreMap":179},[183,184,187,191],"span",{"class":185,"line":186},"line",1,[183,188,190],{"class":189},"sScJk","npx",[183,192,194],{"class":193},"sZZnC"," vercel\n",[183,196,198,200,203],{"class":185,"line":197},2,[183,199,190],{"class":189},[183,201,202],{"class":193}," vercel",[183,204,206],{"class":205},"sj4cs"," --prod\n",[15,208,209,210,213],{},"Pierwsze uruchomienie linkuje projekt (",[51,211,212],{},".vercel\u002F"," jest git-ignore'owane) i wypisuje oba URL-e.",[10,215,217],{"id":216},"dostarczanie-wasm","Dostarczanie WASM",[15,219,220],{},"Deployment serwuje:",[174,222,227],{"className":223,"code":225,"language":226,"meta":179},[224],"language-text","\u002Fwasm\u002Fvector_engine.js\n\u002Fwasm\u002Fvector_engine.wasm\n","text",[51,228,225],{"__ignoreMap":179},[15,230,231,233],{},[51,232,53],{}," zapewnia:",[235,236,237,243,246],"ul",{},[34,238,239,242],{},[51,240,241],{},"Content-Type: application\u002Fwasm",",",[34,244,245],{},"same-origin resource policy,",[34,247,248],{},"revalidation caching dla stabilnych nazw WASM.",[15,250,251],{},"Root build weryfikuje fabrykę JavaScript i magic header WebAssembly przed uruchomieniem Vite.",[10,253,255],{"id":254},"routing-i-cache","Routing i cache",[235,257,258,264,274,280],{},[34,259,260,261,46],{},"SPA rewrite kieruje ścieżki aplikacji do ",[51,262,263],{},"index.html",[34,265,266,267,157,270,273],{},"Istniejące pliki statyczne (",[51,268,269],{},"\u002Fassets\u002F*",[51,271,272],{},"\u002Fwasm\u002F*",") są serwowane bezpośrednio.",[34,275,276,277,46],{},"Assety z fingerprintem Vite dostają ",[19,278,279],{},"immutable cache na rok",[34,281,282],{},"Dokument HTML i stabilne nazwy WASM rewalidują.",[10,284,286],{"id":285},"security-headers","Security headers",[15,288,289],{},"CSP jest restrykcyjna i kompatybilna z Emscripten, blob-backed podglądami SVG, stylami CodeMirror i lokalnymi workerami:",[235,291,292,295,298],{},[34,293,294],{},"Ajv kompiluje JSON Schema do standalone module w buildzie,",[34,296,297],{},"Emscripten wyłącza dynamiczne wykonywanie JS,",[34,299,300,301,46],{},"polityka ",[19,302,303,304],{},"nie wymaga ",[51,305,306],{},"unsafe-eval",[15,308,309],{},"Konfiguracja wyłącza też framing, MIME sniffing, kamerę, mikrofon i geolokalizację.",[10,311,313],{"id":312},"podgląd-produkcyjnego-builda-lokalnie","Podgląd produkcyjnego builda lokalnie",[174,315,317],{"className":176,"code":316,"language":178,"meta":179,"style":179},"npm run build\nnpm run verify:deployment\nnpm run preview --workspace @vector-engine\u002Fweb\n",[51,318,319,330,339],{"__ignoreMap":179},[183,320,321,324,327],{"class":185,"line":186},[183,322,323],{"class":189},"npm",[183,325,326],{"class":193}," run",[183,328,329],{"class":193}," build\n",[183,331,332,334,336],{"class":185,"line":197},[183,333,323],{"class":189},[183,335,326],{"class":193},[183,337,338],{"class":193}," verify:deployment\n",[183,340,342,344,346,349,352],{"class":185,"line":341},3,[183,343,323],{"class":189},[183,345,326],{"class":193},[183,347,348],{"class":193}," preview",[183,350,351],{"class":205}," --workspace",[183,353,354],{"class":193}," @vector-engine\u002Fweb\n",[15,356,357,360],{},[51,358,359],{},"verify:deployment"," sprawdza:",[235,362,363,366,369,372,375],{},[34,364,365],{},"katalog outputu Vercel,",[34,367,368],{},"SPA fallback,",[34,370,371],{},"MIME i magic header WASM,",[34,373,374],{},"CSP,",[34,376,377],{},"obecność wszystkich 11 breakpointów monitorowych w zminifikowanym CSS.",[10,379,381],{"id":380},"weryfikacja-po-deployu","Weryfikacja po deployu",[174,383,386],{"className":384,"code":385,"language":226,"meta":179},[224],"https:\u002F\u002Fyour-project.vercel.app\u002F\nhttps:\u002F\u002Fyour-project.vercel.app\u002Fwasm\u002Fvector_engine.js\nhttps:\u002F\u002Fyour-project.vercel.app\u002Fwasm\u002Fvector_engine.wasm\n",[51,387,385],{"__ignoreMap":179},[174,389,391],{"className":176,"code":390,"language":178,"meta":179,"style":179},"curl -I https:\u002F\u002Fyour-project.vercel.app\u002F\ncurl -I https:\u002F\u002Fyour-project.vercel.app\u002Fwasm\u002Fvector_engine.wasm\n",[51,392,393,404],{"__ignoreMap":179},[183,394,395,398,401],{"class":185,"line":186},[183,396,397],{"class":189},"curl",[183,399,400],{"class":205}," -I",[183,402,403],{"class":193}," https:\u002F\u002Fyour-project.vercel.app\u002F\n",[183,405,406,408,410],{"class":185,"line":197},[183,407,397],{"class":189},[183,409,400],{"class":205},[183,411,412],{"class":193}," https:\u002F\u002Fyour-project.vercel.app\u002Fwasm\u002Fvector_engine.wasm\n",[15,414,415,416,161,419,46],{},"Odpowiedź WASM powinna mieć ",[51,417,418],{},"200",[51,420,241],{},[15,422,423],{},"Checklist po deployu:",[28,425,426],{},[31,427,428,434,437,440],{},[34,429,430,431,46],{},"Status bar pokazuje ",[51,432,433],{},"C++23 · WebAssembly",[34,435,436],{},"Eksport PNG pobiera się i otwiera poprawnie.",[34,438,439],{},"Resize okna na 1366×768, 1920×1080 i ultrawide 21:9 — cztery kolumny pozostają czytelne, canvas trzyma minimum.",[34,441,442,445],{},[51,443,444],{},"curl -I"," na WASM zwraca właściwy MIME.",[447,448,449],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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);}",{"title":179,"searchDepth":341,"depth":341,"links":451},[452,453,454,455,456,457,458,459],{"id":12,"depth":197,"text":13},{"id":25,"depth":197,"text":26},{"id":171,"depth":197,"text":172},{"id":216,"depth":197,"text":217},{"id":254,"depth":197,"text":255},{"id":285,"depth":197,"text":286},{"id":312,"depth":197,"text":313},{"id":380,"depth":197,"text":381},"Statyczny build Vite z vercel.json, dostarczanie WASM z właściwym MIME, SPA routing, immutable cache, CSP i weryfikacja po deployu.","md",{},true,"\u002Fvector-engine\u002Fdeployment",{"title":5,"description":460},"03.vector-engine\u002F06.deployment","iVVXoGqqxk9f7ASKIBvbWQB33Iml4QPZu7fFMUjfjoA",[469,474],{"title":470,"path":471,"stem":472,"description":473,"children":-1},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints","Skala breakpointów per rozdzielczość monitora (1280×800 → 5K), tiery wysokości, ultrawide 21:9 i layouty tabowane.",null,[476,596,657],{"title":477,"path":478,"stem":479,"children":480},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[481,483,487,491,495,521,550,563,584,588,592],{"title":482,"path":478,"stem":479},"Przegląd",{"title":484,"path":485,"stem":486},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":488,"path":489,"stem":490},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":492,"path":493,"stem":494},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":496,"path":497,"stem":498,"children":499,"page":520},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[500,504,508,512,516],{"title":501,"path":502,"stem":503},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":505,"path":506,"stem":507},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":509,"path":510,"stem":511},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":513,"path":514,"stem":515},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":517,"path":518,"stem":519},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":522,"path":523,"stem":524,"children":525,"page":520},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[526,530,534,538,542,546],{"title":527,"path":528,"stem":529},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":531,"path":532,"stem":533},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":535,"path":536,"stem":537},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":539,"path":540,"stem":541},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":543,"path":544,"stem":545},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":547,"path":548,"stem":549},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":551,"path":552,"stem":553,"children":554,"page":520},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[555,559],{"title":556,"path":557,"stem":558},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":560,"path":561,"stem":562},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":564,"path":565,"stem":566,"children":567,"page":520},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[568,572,576,580],{"title":569,"path":570,"stem":571},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":573,"path":574,"stem":575},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":577,"path":578,"stem":579},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":581,"path":582,"stem":583},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":585,"path":586,"stem":587},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":589,"path":590,"stem":591},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":593,"path":594,"stem":595},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":597,"path":598,"stem":599,"children":600},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[601,602,605,608,629],{"title":482,"path":598,"stem":599},{"title":484,"path":603,"stem":604},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":488,"path":606,"stem":607},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":609,"path":610,"stem":611,"children":612,"page":520},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[613,617,621,625],{"title":614,"path":615,"stem":616},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":618,"path":619,"stem":620},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":622,"path":623,"stem":624},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":626,"path":627,"stem":628},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":630,"path":631,"stem":632,"children":633,"page":520},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[634,638,642,646,649,653],{"title":635,"path":636,"stem":637},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":639,"path":640,"stem":641},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":643,"path":644,"stem":645},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":585,"path":647,"stem":648},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":650,"path":651,"stem":652},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":654,"path":655,"stem":656},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":658,"path":659,"stem":660,"children":661},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[662,663,666,687,700,717],{"title":482,"path":659,"stem":660},{"title":484,"path":664,"stem":665},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":667,"path":668,"stem":669,"children":670,"page":520},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[671,675,679,683],{"title":672,"path":673,"stem":674},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":676,"path":677,"stem":678},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":680,"path":681,"stem":682},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":684,"path":685,"stem":686},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":688,"path":689,"stem":690,"children":691,"page":520},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[692,696],{"title":693,"path":694,"stem":695},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":697,"path":698,"stem":699},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":701,"path":702,"stem":703,"children":704,"page":520},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[705,708,712,716],{"title":492,"path":706,"stem":707},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":709,"path":710,"stem":711},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":713,"path":714,"stem":715},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":470,"path":471,"stem":472},{"title":5,"path":464,"stem":466},1793986309023]