From af5dc5db4ce9bb30d938c1557c5d15d8b897a582 Mon Sep 17 00:00:00 2001 From: Porfiry Date: Tue, 15 Sep 2026 19:56:29 +0300 Subject: [PATCH] =?UTF-8?q?ADR-013:=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20=D1=84=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B0=20vs=20Docker/CI=20=E2=80=94=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=BD=D0=B8=D1=86=D0=B0=20=D0=B2=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D1=91=D0=BD=D0=BD=D0=BE=D0=BC=20=D1=81?= =?UTF-8?q?=D0=B6=D0=B0=D1=82=D0=B8=D0=B8;=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=BA=20ADR-012=20(=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=B5=D1=84=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=B8=20=D0=B2=2029)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TASKS.md | 16 +++++++++++++ docs/DECISIONS.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/TASKS.md b/TASKS.md index 3a1eda7..46df9b4 100644 --- a/TASKS.md +++ b/TASKS.md @@ -250,3 +250,19 @@ curl -s -o /dev/null -w '%{http_code} -> %{redirect_url}\n' https://smart-updown **Важное подтверждение:** билд `sol` в браузере **дошёл до игрового цикла** (`Phase -> Idle` → `Phase -> Approach`) — раньше в headless ни одна сборка так далеко не шла. Статика с nginx отдаётся корректно. + +## 2026-09-15 (5) — исследование: редакторная сборка vs наша Docker/CI (ничего не меняли) + +**Вердикт: Docker не виноват.** Разница — наш `BuildScript.cs` насильно ставит +`WebGLCompressionFormat.Disabled`; фронт собирает с **Brotli + Decompression Fallback** (отсюда +`.unityweb`). Было в браузер 26 МБ (52 МБ wasm + gzip на лету), стало бы 16.4 МБ. Код в обеих сборках +эквивалентен (маркеры в wasm совпадают), версия Unity одинаковая (6000.3.16f1). Наш конвейер +(GameCI-образ + `-batchmode -executeMethod`) — стандартная практика, не костыль. См. ADR-013. + +**⚠️ Важная поправка:** оба дефекта (`/api/api/state` → 404 и `getProvider is not defined`) есть и в +НАШЕЙ сборке 29 — это исходники, а не «его сборка». Задача переехала в кодовую правку. + +- [ ] решить: переводить ли сборку на Brotli + Decompression Fallback (или gzip_static) — **ждём владельца** +- [ ] `[pump.front]` убрать двойной `/api` в `BackendClient`/`SmartUpdownConfig` +- [ ] `[pump.front]` `getProvider`: экспортировать хелперы jslib наружу (или инлайнить) +- [ ] `[pump.ops]` `gzip off` для `.unityweb` в nginx LXC 152 (сейчас жмёт уже сжатое) diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 8dd2b74..5f202f3 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -339,3 +339,63 @@ no-store`; `/api/state`,`/api/price`,`/solana-rpc/` → 200; сквозная с ⚠️ Что **подтверждено** этим билдом: игра в браузере **стартует и доходит до игрового цикла** (`[BinaryRocket] Phase -> Idle` → `Phase -> Approach`), чего в headless-окружении не делала ни одна предыдущая сборка. То есть статика с nginx отдаётся корректно. + +## ADR-013 — Разбор: редакторная сборка фронта vs наша Docker/CI (только исследование, 2026-09-15) + +**Вопрос владельца:** почему сборка фронтендера (редактор Unity на Mac через TeamCity) «нормальная», +а наша (Docker/CI) «кривая косое». Задача была — исследовать, ничего не переделывать. + +**Вердикт: Docker ни при чём.** Расхождение объясняется одной строкой в НАШЕМ скрипте сборки, +которая насильно выключает сжатие. + +| | наша CI (сборка 29) | эталон фронта (`/sol/`) | +|---|---|---| +| файлы | `Build/WebGL.{loader.js,wasm,data,framework.js}` | `Build/Build.*.unityweb` | +| сжатие | **Disabled** (переопределено в `BuildScript.cs`) | **Brotli + Decompression Fallback** | +| wasm | 52.2 МБ raw | 8.59 МБ raw (≈49.1 МБ распакованных) | +| data | 18.3 МБ raw | 8.12 МБ raw (≈17.7 МБ распакованных) | +| едет в браузер | **26 МБ** (nginx жмёт gzip на лету) | **16.4 МБ** | +| версия Unity | 6000.3.16f1 | 6000.3.16f1 (та же!) | + +**Причина.** `Assets/Editor/BuildScript.cs` (коммит `4468014`): +`PlayerSettings.WebGL.compressionFormat = WebGLCompressionFormat.Disabled;` — комментарий «Без предсжатия: +nginx отдаёт gzip по Accept-Encoding, мобильные прокси не ломают». Скрипт **затирает** +`ProjectSettings.asset` (`webGLCompressionFormat: 0`). gzip жмёт 52-МБ wasm всего в ~3.3×; brotli тот же +wasm жмёт в ~6×. Отсюда «у него нормально, у нас криво» — это транспорт, не сборка. + +**Доки Unity:** *«If you enable Decompression Fallback, Unity appends the extension `.unityweb` to the +build file names. Otherwise, Unity appends `.gz` / `.br`.»* То есть `.unityweb` — следствие +Brotli+fallback, а не другой сборочный конвейер. + +**Код в обеих сборках эквивалентен.** В распакованных `wasm` маркеры совпадают 1:1 +(`SolanaBridge`=5, `PriceFeed`=2, `UnityWebRequest`=44, `Tonemapping`=4, `PostProcess`=1). Разница +размеров — сжатие/отладочные символы, не исходники. + +**Наш конвейер — стандартная практика.** Образ `unityci/editor:ubuntu-6000.3.16f1-webgl-3.2.2` (GameCI), +запуск `unity-editor -batchmode -nographics -quit -executeMethod BuildScript.BuildWebGL` + лицензия `.ulf` +из env — ровно то, что описано в доках game.ci. «Своих кривых практик» здесь нет. + +**⚠️ Поправка к прошлому отчёту (ADR-012):** оба дефекта, которые я назвал «дефектами сборки +фронтендера», присутствуют и в НАШЕЙ сборке 29 — проверено побайтово: +1. двойной префикс `/api/api/state` → 404: `ApiBase()` = `Origin()+"/api"`, а `BackendClient` зовёт + `HttpGetAsync("/api/state")`. Общий дефект исходников. +2. `ReferenceError: getProvider is not defined`: в `framework.js` есть вызовы `getProvider()`/`errMsg()`/ + `loadWeb3()`, но нет определений — одинаковая картина в обеих сборках. +Это делает п.1–2 задачей для кодовой правки, а не «пересборки». + +**Гипотеза (НЕ факт, требует проверки на железе):** в headless наша 29-я падала на шейдерах, а его +сборка доходила до игрового цикла (`Phase → Idle → Approach`). Возможная причина — `-nographics` +влияет на shader stripping / URP-варианты. Проверка: собрать без `-nographics`, сравнить поведение и +размеры. На живом железе разница может не проявиться вовсе. + +**Наши побочные находки:** nginx сейчас жмёт `.unityweb` gzip'ом на лету — 0 выгоды (файл уже сжат +brotli), только CPU. Для `.unityweb` gzip надо выключать. + +**Возможные шаги (НЕ выполнены — ждём решения):** (1) убрать переопределение `compressionFormat` / +поставить `Brotli` + fallback → `.unityweb` как у фронта, −40% трафика; (2) либо `gzip_static`, +а не сжатие на лету; (3) `gzip off` для `.unityweb`. + +**Методика сравнения сборок** (переиспользовать при следующем разборе): распаковать brotli +(заголовок `UnityWeb Compressed Content`, смещение 0) → размеры raw/распакованных → `index.html` +(`buildUrl`, `dataUrl`,`codeUrl`,`frameworkUrl`) → число `function`-объявлений и наличие тел хелперов → +версия Unity в `wasm` → заголовки (`Content-Encoding`,`cache-control`) → поведение в браузере.