#!/usr/bin/env bash # Cyrene v2 本地一键开发启动:PG+pgvector → llama.cpp embedding → 前端 build → cyrene # 用法:bash scripts/dev-up.sh (在仓库根目录;需 docker + go + node) set -euo pipefail REPO="$(cd "$(dirname "$0")/.." && pwd)" MODEL_DIR="$HOME/.models" LLAMA_DIR="$HOME/apps/llama.cpp" APP_NAME="cyrene" APP_BIN="$HOME/apps/cyrene/$APP_NAME" EMB_MODEL="$MODEL_DIR/Qwen3-Embedding-0.6B-Q8_0.gguf" EMB_PORT=11434 # gateway 端口优先读 .env 的 PORT(用户可改),找不到才回退 10080 GW_PORT="$(grep -E '^PORT=' "$REPO/.env" 2>/dev/null | head -1 | cut -d= -f2)" GW_PORT="${GW_PORT:-10080}" cd "$REPO" echo "==> [1/4] PostgreSQL + pgvector (docker)" if command -v docker >/dev/null 2>&1; then # PG 已在跑则跳过 if curl -s --max-time 2 "http://127.0.0.1:5432" >/dev/null 2>&1 || docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^cyrene-pg$'; then echo " cyrene-pg 已在运行 (:5432),跳过" else # 有 compose 插件用 compose,否则回退 docker run if docker compose version >/dev/null 2>&1; then docker compose -f docker-compose.dev.yml up -d pg else echo " (docker compose 插件不可用,回退 docker run 拉起 cyrene-pg)" docker run -d --name cyrene-pg \ -e POSTGRES_USER=cyrene -e POSTGRES_PASSWORD=cyrene_pass -e POSTGRES_DB=cyrene_ai \ -p 5432:5432 -v cyrene_pgdata:/var/lib/postgresql/data \ pgvector/pgvector:pg16 >/dev/null 2>&1 \ && echo " cyrene-pg 已用 docker run 启动" \ || echo " (cyrene-pg 启动失败,请手动检查端口/镜像)" fi fi else echo " (未检测到 docker;若用 SQLite 默认可不启动 PG)" fi echo "==> [2/4] llama.cpp embedding (Qwen3-Embedding,Vulkan)" if [ -x "$LLAMA_DIR/llama-server" ] && [ -f "$EMB_MODEL" ]; then # 已在跑则跳过 if ! curl -s --max-time 2 "http://127.0.0.1:$EMB_PORT/health" >/dev/null 2>&1; then (cd "$LLAMA_DIR" && nohup ./llama-server -m "$EMB_MODEL" --embedding -ngl 99 --host 127.0.0.1 --port "$EMB_PORT" > "$HOME/cy-emb.log" 2>&1 &) echo " llama-server 已启动: http://127.0.0.1:$EMB_PORT" else echo " llama-server 已在运行 (: $EMB_PORT),跳过" fi else echo " (未找到 $LLAMA_DIR/llama-server 或模型 $EMB_MODEL;跳过。" echo " llama.cpp 放 ~/apps/llama.cpp,GGUF 放 ~/.models/)" fi echo "==> [3/4] 前端构建 (go:embed 需要 dist)" if [ -d frontend/web ]; then (cd frontend/web && npm ci >/dev/null 2>&1 && npm run build >/dev/null 2>&1) || echo " (前端 build 跳过/失败——若已存在 dist 可忽略)" fi echo "==> [4/4] 构建并启动 cyrene" if [ ! -f "$APP_BIN" ]; then mkdir -p "$HOME/apps/cyrene" echo " go build -> $APP_BIN" go build -ldflags="-s -w" -trimpath -o "$APP_BIN" ./cmd/cyrene fi if ! curl -s --max-time 2 "http://127.0.0.1:$GW_PORT/api/v1/health" >/dev/null 2>&1; then (cd "$REPO" && nohup "$APP_BIN" >> "$HOME/cy.log" 2>&1 &) echo " cyrene 已启动: http://localhost:$GW_PORT (日志 $HOME/cy.log)" else echo " cyrene 已在运行 (: $GW_PORT),跳过" fi echo echo "完成。访问 http://localhost:$GW_PORT (.env 的 PORT 覆盖此值)" echo " · LLM: .env 的 LLM_PROVIDER / ANTHROPIC_* 或 LLM_*" echo " · 向量: EMBEDDING_API_URL=http://127.0.0.1:$EMB_PORT/v1/embeddings EMBEDDING_MODEL=Qwen3-Embedding-0.6B" echo " · 停止: pkill -f llama-server ; pkill -f $APP_NAME"