Fix WESP UI after git clone: serve from public/wesp and materialize static.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
влад
2026-07-16 11:43:25 +03:00
co-authored by Cursor
parent 2c294424ef
commit 5dfa06ddbe
8 changed files with 49 additions and 36 deletions
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
- name: Install backend deps - name: Install backend deps
run: pip install -r apps/api/requirements-dev.txt run: pip install -r apps/api/requirements-dev.txt
- name: Sync WESP UI parity - name: Sync WESP UI parity
run: bash scripts/sync-wesp-ui.sh run: bash scripts/materialize-wesp-static.sh
- name: Lint - name: Lint
run: pnpm lint run: pnpm lint
- name: Types - name: Types
+6 -1
View File
@@ -7,11 +7,16 @@
## Быстрый старт ## Быстрый старт
```bash ```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 docker compose --profile docker-web up -d --build
curl http://localhost:8000/api/v1/health # Windows: curl.exe 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 | Что там | | URL | Что там |
|-----|---------| |-----|---------|
| http://localhost:5173 | Лендинг `/` + SPA (`/login`, `/admin`, …) | | http://localhost:5173 | Лендинг `/` + SPA (`/login`, `/admin`, …) |
+4
View File
@@ -4,6 +4,10 @@
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "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", "dev": "vite",
"build": "vite build", "build": "vite build",
"preview": "vite preview", "preview": "vite preview",
+2 -1
View File
@@ -9,7 +9,8 @@ const apiProxyTarget = process.env.VITE_API_URL ?? "http://127.0.0.1:8000";
export default defineConfig({ export default defineConfig({
plugins: [ 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(), react(),
mainStaticPlugin(resolve(__dirname, "main")) mainStaticPlugin(resolve(__dirname, "main"))
], ],
+1
View File
@@ -24,6 +24,7 @@ services:
- postgres - postgres
- redis - redis
- minio - minio
command: ["sh", "-c", "bash scripts/materialize-wesp-static.sh && pnpm --filter web exec vite --host 0.0.0.0"]
api: api:
build: ./apps/api build: ./apps/api
+3 -1
View File
@@ -173,7 +173,9 @@ Staging/prod: `EMAIL_DELIVERY_MODE=smtp`. Dev: `memory` (письма в RAM, SM
| Проблема | Решение | | Проблема | Решение |
|----------|---------| |----------|---------|
| `install.env missing` | `python apps/api/scripts/bootstrap_install.py` | | `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 | | Login failed | `curl …/health`, проверить `.env`, restart web |
| 401 refresh в консоли (гость) | норма на публичных страницах | | 401 refresh в консоли (гость) | норма на публичных страницах |
| Logout после F5 на `/admin` | rebuild web, перелогиниться | | Logout после F5 на `/admin` | rebuild web, перелогиниться |
+28
View File
@@ -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"
+4 -32
View File
@@ -1,36 +1,8 @@
#!/usr/bin/env bash #!/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 set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)" ROOT="$(cd "$(dirname "$0")/.." && pwd)"
WESP_STATIC="${WESP_STATIC:-$ROOT/../wesp/static}" exec bash "$ROOT/scripts/materialize-wesp-static.sh"
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"