From a815a3555ee2b2814c9734e27e4d0dd05ce08a71 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 20 Mar 2026 21:37:58 +0000 Subject: [PATCH] Add interactive component menu and fix ChromaDB healthcheck MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Show menu at startup to select: full stack, AI stack only, or Kiwix only - Gate server files, SearXNG config, docker compose up, model pull, and summary URLs based on selection - Fix ChromaDB healthcheck: wget → curl, /api/v2/ → /api/v1/heartbeat https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx --- laptop_full_setup.sh | 77 +++++++++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/laptop_full_setup.sh b/laptop_full_setup.sh index 3cdb5e0..02b4eec 100755 --- a/laptop_full_setup.sh +++ b/laptop_full_setup.sh @@ -48,6 +48,24 @@ info "Base : $BASE" info "Host : $LOCAL_IP" $IS_UPDATE && warn "Existing install found. Config files kept unless --force is passed." +# ── component menu ───────────────────────────────────────────────────────────── +echo "" +echo -e " ${BOLD}Select components to install:${NC}" +echo "" +echo " 1) Full stack — AI stack + Kiwix" +echo " 2) AI stack — Ollama · WebUI · RAG · MCP · ChromaDB · SearXNG · Gitea · InvokeAI · Portainer" +echo " 3) Kiwix only — Offline Wikipedia / docs (runs standalone)" +echo "" +read -rp " Choice [1]: " MENU_CHOICE +MENU_CHOICE="${MENU_CHOICE:-1}" +case "$MENU_CHOICE" in + 1) INSTALL_AI=true; INSTALL_KIWIX=true ;; + 2) INSTALL_AI=true; INSTALL_KIWIX=false ;; + 3) INSTALL_AI=false; INSTALL_KIWIX=true ;; + *) die "Invalid choice '$MENU_CHOICE' — run again and choose 1, 2, or 3" ;; +esac +echo "" + # ── helper: write only if missing (or --force) ──────────────────────────────── # Usage: write_if_new /path/to/file << 'EOF' ... EOF write_if_new() { @@ -117,6 +135,7 @@ done ok "Directories ready under $BASE" # ============================================================================= +if $INSTALL_AI; then section "Server Files" # ============================================================================= @@ -146,7 +165,10 @@ httpx REQ ok "mcp_requirements.txt" +fi # INSTALL_AI + # ============================================================================= +if $INSTALL_AI; then section "SearXNG Config" # ============================================================================= write_if_new "$BASE/searxng/settings.yml" << SEARXNG @@ -162,6 +184,8 @@ search: formats: [html, json] SEARXNG +fi # INSTALL_AI + # ============================================================================= section ".env File" # ============================================================================= @@ -255,7 +279,7 @@ services: - IS_PERSISTENT=TRUE - ANONYMIZED_TELEMETRY=FALSE healthcheck: - test: ["CMD-SHELL", "wget -qO- http://localhost:8000/api/v2/heartbeat || exit 1"] + test: ["CMD-SHELL", "curl -sf http://localhost:8000/api/v1/heartbeat || exit 1"] interval: 15s timeout: 5s retries: 5 @@ -578,11 +602,18 @@ section "Starting Stack" # ============================================================================= cd "$BASE" info "Pulling images (this takes a few minutes on first run)..." -docker compose pull --quiet -docker compose up -d + +COMPOSE_SERVICES="" +$INSTALL_AI && COMPOSE_SERVICES+=" ollama open-webui chromadb rag-server mcp-server searxng gitea invokeai portainer" +$INSTALL_KIWIX && COMPOSE_SERVICES+=" kiwix" + +# shellcheck disable=SC2086 +docker compose pull --quiet $COMPOSE_SERVICES +# shellcheck disable=SC2086 +docker compose up -d $COMPOSE_SERVICES ok "Stack started" -if ! $IS_UPDATE; then +if $INSTALL_AI && ! $IS_UPDATE; then echo "" read -rp "Pull Ollama models now? (~20GB total, takes 10-40 min) [Y/n]: " DO_PULL if [[ "${DO_PULL,,}" != "n" ]]; then @@ -596,22 +627,30 @@ fi echo "" echo -e "${GREEN}${BOLD}━━━ Done! ━━━${NC}" echo "" -echo -e " ${CYAN}Open WebUI${NC} → http://$LOCAL_IP:3000" -echo -e " ${CYAN}InvokeAI${NC} → http://$LOCAL_IP:9090" -echo -e " ${CYAN}SearXNG${NC} → http://$LOCAL_IP:8888" -echo -e " ${CYAN}Kiwix${NC} → http://$LOCAL_IP:8181 (needs ZIMs — run kiwix_download.sh)" -echo -e " ${CYAN}Gitea${NC} → http://$LOCAL_IP:3001" -echo -e " ${CYAN}RAG Health${NC} → http://$LOCAL_IP:8001/health" -echo -e " ${CYAN}MCP SSE${NC} → http://$LOCAL_IP:8002/sse" -echo -e " ${CYAN}Portainer${NC} → https://$LOCAL_IP:9443" +if $INSTALL_AI; then + echo -e " ${CYAN}Open WebUI${NC} → http://$LOCAL_IP:3000" + echo -e " ${CYAN}InvokeAI${NC} → http://$LOCAL_IP:9090" + echo -e " ${CYAN}SearXNG${NC} → http://$LOCAL_IP:8888" + echo -e " ${CYAN}Gitea${NC} → http://$LOCAL_IP:3001" + echo -e " ${CYAN}RAG Health${NC} → http://$LOCAL_IP:8001/health" + echo -e " ${CYAN}MCP SSE${NC} → http://$LOCAL_IP:8002/sse" + echo -e " ${CYAN}Portainer${NC} → https://$LOCAL_IP:9443" +fi +if $INSTALL_KIWIX; then + echo -e " ${CYAN}Kiwix${NC} → http://$LOCAL_IP:8181 (needs ZIMs — run kiwix_download.sh)" +fi echo "" -echo -e " ${YELLOW}Add MCP to Claude Code:${NC}" -echo " claude mcp add local http://$LOCAL_IP:8002/sse" -echo "" -echo -e " ${YELLOW}Add API tokens to:${NC} $BASE/.env" -echo -e " ${YELLOW}Drop PDFs into:${NC} $BASE/papers/" -echo -e " ${YELLOW}Your workspace:${NC} $BASE/workspace/" -echo -e " ${YELLOW}ZIM downloads:${NC} ./kiwix_download.sh" +if $INSTALL_AI; then + echo -e " ${YELLOW}Add MCP to Claude Code:${NC}" + echo " claude mcp add local http://$LOCAL_IP:8002/sse" + echo "" + echo -e " ${YELLOW}Add API tokens to:${NC} $BASE/.env" + echo -e " ${YELLOW}Drop PDFs into:${NC} $BASE/papers/" + echo -e " ${YELLOW}Your workspace:${NC} $BASE/workspace/" +fi +if $INSTALL_KIWIX; then + echo -e " ${YELLOW}ZIM downloads:${NC} ./kiwix_download.sh" +fi echo "" $IS_UPDATE && echo -e " ${GREEN}Update complete.${NC}" \ || echo -e " ${GREEN}Fresh install complete.${NC}"