From 5dfa06ddbe68c351c1752d5f8f3eaf903df7b4bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=B2=D0=BB=D0=B0=D0=B4?= Date: Thu, 16 Jul 2026 11:43:25 +0300 Subject: [PATCH] Fix WESP UI after git clone: serve from public/wesp and materialize static. Co-authored-by: Cursor --- .github/workflows/ci.yml | 2 +- README.md | 7 +++++- apps/web/package.json | 4 ++++ apps/web/vite.config.ts | 3 ++- docker-compose.yml | 1 + docs/deploy.md | 4 +++- scripts/materialize-wesp-static.sh | 28 +++++++++++++++++++++++ scripts/sync-wesp-ui.sh | 36 ++++-------------------------- 8 files changed, 49 insertions(+), 36 deletions(-) create mode 100755 scripts/materialize-wesp-static.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a7563f..4cf3f76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - name: Install backend deps run: pip install -r apps/api/requirements-dev.txt - name: Sync WESP UI parity - run: bash scripts/sync-wesp-ui.sh + run: bash scripts/materialize-wesp-static.sh - name: Lint run: pnpm lint - name: Types diff --git a/README.md b/README.md index ca82079..22f8a54 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,16 @@ ## Быстрый старт ```bash -python apps/api/scripts/bootstrap_install.py # один раз, до первого up +git clone https://git.groupkomton.ru/Matvey/site.git && cd site +python apps/api/scripts/bootstrap_install.py # один раз, до первого up (секреты БД) +bash scripts/materialize-wesp-static.sh # WESP UI → public/static (авто при pnpm dev) docker compose --profile docker-web up -d --build curl http://localhost:8000/api/v1/health # Windows: curl.exe ``` +> **После `git clone` обязательно:** `bootstrap_install.py` **до** `docker compose up` — иначе Postgres не примет пароль из `install.env`. +> WESP UI лежит в git (`apps/web/public/wesp/`); `public/static/` генерируется скриптом (не в git). + | URL | Что там | |-----|---------| | http://localhost:5173 | Лендинг `/` + SPA (`/login`, `/admin`, …) | diff --git a/apps/web/package.json b/apps/web/package.json index 94bfdb8..510afb1 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,6 +4,10 @@ "private": true, "type": "module", "scripts": { + "materialize:wesp": "bash ../../scripts/materialize-wesp-static.sh", + "predev": "pnpm run materialize:wesp", + "prebuild": "pnpm run materialize:wesp", + "prepreview": "pnpm run materialize:wesp", "dev": "vite", "build": "vite build", "preview": "vite preview", diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 0d668be..def8068 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -9,7 +9,8 @@ const apiProxyTarget = process.env.VITE_API_URL ?? "http://127.0.0.1:8000"; export default defineConfig({ plugins: [ - wespStaticPlugin(resolve(__dirname, "public/static")), + // public/wesp is in git; public/static is generated (see scripts/materialize-wesp-static.sh). + wespStaticPlugin(resolve(__dirname, "public/wesp")), react(), mainStaticPlugin(resolve(__dirname, "main")) ], diff --git a/docker-compose.yml b/docker-compose.yml index d14d500..ada4663 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,6 +24,7 @@ services: - postgres - redis - minio + command: ["sh", "-c", "bash scripts/materialize-wesp-static.sh && pnpm --filter web exec vite --host 0.0.0.0"] api: build: ./apps/api diff --git a/docs/deploy.md b/docs/deploy.md index 8de1520..a3b4bf5 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -173,7 +173,9 @@ Staging/prod: `EMAIL_DELIVERY_MODE=smtp`. Dev: `memory` (письма в RAM, SM | Проблема | Решение | |----------|---------| | `install.env missing` | `python apps/api/scripts/bootstrap_install.py` | -| `password authentication failed` | [восстановление секретов](#восстановление-секретов) | +| `password authentication failed` | [восстановление секретов](#восстановление-секретов) — bootstrap **до** первого `docker compose up` | +| `/login`, `/recipes` пустые / 404 после clone | `bash scripts/materialize-wesp-static.sh` (или `pnpm --filter web dev` — predev сам) | +| `WESP static not found` в CI/скрипте | обновите repo: `public/wesp/` в git; скрипт materialize не требует соседний `wesp/` | | Login failed | `curl …/health`, проверить `.env`, restart web | | 401 refresh в консоли (гость) | норма на публичных страницах | | Logout после F5 на `/admin` | rebuild web, перелогиниться | diff --git a/scripts/materialize-wesp-static.sh b/scripts/materialize-wesp-static.sh new file mode 100755 index 0000000..51cd7c5 --- /dev/null +++ b/scripts/materialize-wesp-static.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Build apps/web/public/static from git-tracked public/wesp. +# Optionally refresh public/wesp from an external WESP hub checkout first. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +WESP_EXTERNAL="${WESP_STATIC:-$ROOT/../wesp/static}" +SRC="$ROOT/apps/web/public/wesp" +DEST="$ROOT/apps/web/public/static" + +if [ ! -d "$SRC" ]; then + echo "WESP UI source not found: $SRC" >&2 + exit 1 +fi + +if [ -d "$WESP_EXTERNAL" ]; then + rsync -a --delete \ + --exclude '.DS_Store' \ + "$WESP_EXTERNAL/" "$SRC/" + echo "Refreshed $SRC from $WESP_EXTERNAL" +fi + +mkdir -p "$DEST" +rsync -a --delete \ + --exclude '.DS_Store' \ + "$SRC/" "$DEST/" + +echo "Materialized WESP static: $SRC -> $DEST" diff --git a/scripts/sync-wesp-ui.sh b/scripts/sync-wesp-ui.sh index 186cc32..d5b4e32 100755 --- a/scripts/sync-wesp-ui.sh +++ b/scripts/sync-wesp-ui.sh @@ -1,36 +1,8 @@ #!/usr/bin/env bash -# Mirror WESP zootech + admin static UI into site web public/static (1:1 paths). +# Sync WESP UI: optional external hub refresh, then materialize public/static. +# External source: WESP_STATIC or ../wesp/static (when present). +# Fallback: git-tracked apps/web/public/wesp (works after clone without WESP repo). set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" -WESP_STATIC="${WESP_STATIC:-$ROOT/../wesp/static}" -DEST="$ROOT/apps/web/public/static" -ORCH_BOOT="$ROOT/apps/web/public/wesp/js/wesp-orchestrator-boot.js" -AUTH_BRIDGE_SRC="$ROOT/apps/web/public/wesp/js/wesp-orchestrator-auth-bridge.js" - -if [ ! -d "$WESP_STATIC" ]; then - echo "WESP static not found: $WESP_STATIC" >&2 - exit 1 -fi - -mkdir -p "$DEST" - -# Full mirror: same /static/* and page HTML paths as on the WESP hub. -rsync -a --delete \ - --exclude '.DS_Store' \ - "$WESP_STATIC/" "$DEST/" - -# Orchestrator-only adapters (never overwritten by hub copy). -mkdir -p "$DEST/js" -if [ -f "$ORCH_BOOT" ]; then - cp "$ORCH_BOOT" "$DEST/js/wesp-orchestrator-boot.js" -fi -if [ -f "$AUTH_BRIDGE_SRC" ]; then - cp "$AUTH_BRIDGE_SRC" "$DEST/js/wesp-orchestrator-auth-bridge.js" -fi -LOGIN_ADAPTER_SRC="$ROOT/apps/web/public/wesp/js/wesp-orchestrator-login.js" -if [ -f "$LOGIN_ADAPTER_SRC" ]; then - cp "$LOGIN_ADAPTER_SRC" "$DEST/js/wesp-orchestrator-login.js" -fi - -echo "Synced WESP static from $WESP_STATIC -> $DEST" +exec bash "$ROOT/scripts/materialize-wesp-static.sh"