#!/bin/sh # Поднимает демо-панель целиком: бэкенд в фоне, Vite на переднем плане. # Ctrl+C гасит обе половины. # # npm run demo (из корня ma7engine) # sh scripts/demo.sh (откуда угодно — пути считаются от самого скрипта) # # Учётка по умолчанию — admin / demo. Переопределяется окружением: # ADMIN_USER=root ADMIN_PASS=secret npm run demo set -eu here=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) root=$(dirname "$here") # Пароль и секрет обязательны для ядра (fail-closed), поэтому у демо есть # заведомо непригодные для прода значения по умолчанию. ADMIN_PASS=${ADMIN_PASS:-demo} ADMIN_JWT_SECRET=${ADMIN_JWT_SECRET:-dev-secret} export ADMIN_PASS ADMIN_JWT_SECRET for half in backend frontend; do if [ ! -d "$root/$half/node_modules" ]; then echo "demo: ставлю зависимости в $half…" (cd "$root/$half" && npm i) fi done (cd "$root/backend" && npm start) & backend=$! # Гасим бэкенд вместе с собой — иначе он останется висеть на :8080. Идём по # всему дереву: между нами и слушающим порт node стоят подоболочка, npm и sh, # и сигнал в верхний процесс до нижнего сам не доходит — тот просто осиротеет. kill_tree() { for child in $(pgrep -P "$1" 2>/dev/null); do kill_tree "$child"; done kill "$1" 2>/dev/null || true } cleanup() { kill_tree "$backend"; } trap cleanup EXIT INT TERM echo "demo: бэкенд на :8080, фронт поднимается на :5173 — открывать его" echo "demo: логин admin / ${ADMIN_PASS}" cd "$root/frontend" && npm run dev