06ea18f425
Highlights: - Streaming chat chunks + web search auto (Sherlock/SearXNG) - pino structured logging (43->0 console.log) - Zod validation (19 schemas API + storage) - Qwen3-TTS 0.6B + 33 persona voices - Docling + bge-reranker RAG pipeline - React lazy routes (-50% bundle), virtualized chat - SEC-01->05 all resolved - A11y WCAG (40 ARIA attrs) - Perf + error telemetry endpoints - Systemd units (TTS, LightRAG, reranker) - p-limit Ollama, WS reconnect, signal handlers - createId thread-safe via crypto.randomBytes (lot-59) - Hyperparam bounds validation with Zod schema (lot-60) - DPO extractDPOPairs warns on empty pairs (lot-61) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
90 lines
4.2 KiB
Bash
Executable File
90 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# ═══════════════════════════════════════════════════════════
|
|
# 3615-KXKM — Deploy script
|
|
# Usage: bash scripts/deploy.sh [--full|--web|--api|--tts]
|
|
# ═══════════════════════════════════════════════════════════
|
|
set -euo pipefail
|
|
|
|
HOST="kxkm@kxkm-ai"
|
|
REMOTE_DIR="/home/kxkm/KXKM_Clown"
|
|
SSH="ssh $HOST"
|
|
LOG_PREFIX="[deploy]"
|
|
|
|
log() { echo "$LOG_PREFIX $*"; }
|
|
fail() { echo "$LOG_PREFIX ERROR: $*" >&2; exit 1; }
|
|
|
|
MODE="${1:---full}"
|
|
|
|
# ─── Step 1: Build locally ─────────────────────────────────
|
|
log "Building locally..."
|
|
npx tsc --noEmit -p apps/api/tsconfig.json || fail "TypeScript API check failed"
|
|
npx tsc --noEmit -p apps/web/tsconfig.json || fail "TypeScript Web check failed"
|
|
npm run -w @kxkm/web build || fail "Web build failed"
|
|
npm run -w @kxkm/api build || fail "API build failed"
|
|
log "Local build OK"
|
|
|
|
# ─── Step 2: Sync to remote ────────────────────────────────
|
|
log "Syncing to $HOST..."
|
|
|
|
if [[ "$MODE" == "--full" || "$MODE" == "--web" ]]; then
|
|
rsync -avz --delete --exclude='node_modules' --exclude='.git' \
|
|
apps/web/src/ "$HOST:$REMOTE_DIR/apps/web/src/"
|
|
log "Web sources synced"
|
|
fi
|
|
|
|
if [[ "$MODE" == "--full" || "$MODE" == "--api" ]]; then
|
|
rsync -avz --delete --exclude='node_modules' --exclude='.git' \
|
|
apps/api/src/ "$HOST:$REMOTE_DIR/apps/api/src/"
|
|
log "API sources synced"
|
|
fi
|
|
|
|
rsync -avz scripts/ "$HOST:$REMOTE_DIR/scripts/"
|
|
rsync -avz Dockerfile docker-compose.yml "$HOST:$REMOTE_DIR/"
|
|
log "Scripts + infra synced"
|
|
|
|
# ─── Step 3: Remote build ──────────────────────────────────
|
|
log "Building on remote..."
|
|
$SSH "source ~/.nvm/nvm.sh && cd $REMOTE_DIR && \
|
|
npx tsc -b tsconfig.v2.json && \
|
|
npm run -w @kxkm/web build && \
|
|
npm run -w @kxkm/api build && \
|
|
npm run build" || fail "Remote build failed"
|
|
log "Remote build OK"
|
|
|
|
# ─── Step 4: Deploy to Docker ──────────────────────────────
|
|
log "Deploying to Docker..."
|
|
$SSH "cd $REMOTE_DIR && \
|
|
docker cp apps/web/dist/. kxkm_clown-api-1:/app/apps/web/dist/ && \
|
|
docker cp apps/api/dist/. kxkm_clown-api-1:/app/apps/api/dist/ && \
|
|
docker restart kxkm_clown-api-1" || fail "Docker deploy failed"
|
|
log "Docker restarted"
|
|
|
|
# ─── Step 5: Restart TTS server (chatterbox-remote + piper fallback) ──
|
|
if [[ "$MODE" == "--full" || "$MODE" == "--tts" ]]; then
|
|
log "Restarting TTS server..."
|
|
$SSH "tmux kill-session -t tts 2>/dev/null || true; \
|
|
sleep 1; \
|
|
tmux new-session -d -s tts \
|
|
'source /home/kxkm/venv/bin/activate && cd $REMOTE_DIR && CHATTERBOX_URL=http://127.0.0.1:9200 python3 scripts/tts-server.py --port 9100 --backend chatterbox-remote 2>&1 | tee /tmp/tts-server.log'; \
|
|
sleep 3; \
|
|
curl -sf http://127.0.0.1:9100/health && echo ' TTS OK' || echo ' TTS FAIL'"
|
|
fi
|
|
|
|
# ─── Step 5b: Restart LightRAG server ─────────────────────
|
|
if [[ "$MODE" == "--full" ]]; then
|
|
log "Restarting LightRAG server..."
|
|
$SSH "tmux kill-session -t lightrag 2>/dev/null || true; \
|
|
sleep 1; \
|
|
tmux new-session -d -s lightrag \
|
|
'source /home/kxkm/venv/bin/activate && cd $REMOTE_DIR && EMBEDDING_DIM=768 LLM_MODEL=qwen3:8b EMBEDDING_MODEL=nomic-embed-text OLLAMA_HOST=http://localhost:11434 lightrag-server --host 0.0.0.0 --port 9621 --working-dir $REMOTE_DIR/data/lightrag --llm-binding ollama --embedding-binding ollama 2>&1 | tee /tmp/lightrag-server.log'; \
|
|
sleep 5; \
|
|
curl -sf http://127.0.0.1:9621/health | head -c 30 && echo ' LightRAG OK' || echo ' LightRAG FAIL'"
|
|
fi
|
|
|
|
# ─── Step 6: Health check ──────────────────────────────────
|
|
log "Health check..."
|
|
sleep 3
|
|
$SSH "curl -sf http://localhost:3333/api/v2/health | head -c 50" && echo " API OK" || echo " API FAIL"
|
|
|
|
log "═══ Deploy complete ═══"
|