diff --git a/laptop_full_setup.sh b/laptop_full_setup.sh index 703c8cb..7f47ce8 100755 --- a/laptop_full_setup.sh +++ b/laptop_full_setup.sh @@ -5,11 +5,11 @@ # Kiwix · Gitea · InvokeAI · Portainer # # Usage: -# ./laptop_full_setup.sh — new install or update +# ./laptop_full_setup.sh — interactive setup (answer questions, leave overnight) # ./laptop_full_setup.sh --force — overwrite existing config files too # -# ZIM downloads: run ./kiwix_download.sh separately (large files) -# GPU: Ollama auto-detects VRAM — works with any NVIDIA GPU +# Asks all questions upfront, then runs everything unattended. +# GPU: Ollama auto-detects VRAM — works with any NVIDIA GPU # ============================================================================= set -euo pipefail @@ -33,26 +33,56 @@ LOCAL_IP=$(ip route get 1.1.1.1 2>/dev/null | grep -oP 'src \K\S+' \ || hostname -I | awk '{print $1}') [[ -z "$LOCAL_IP" ]] && read -rp "Enter your LAN IP: " LOCAL_IP -# Models pulled on first install (adjust to your VRAM) -EMBED_MODEL="nomic-embed-text" # always needed for RAG +# Models (defaults, may be adjusted below based on VRAM) +EMBED_MODEL="nomic-embed-text" CHAT_MODEL="qwen2.5:14b" CODE_MODEL="qwen2.5-coder:7b" FAST_MODEL="qwen2.5:7b" +# ── detect GPU ──────────────────────────────────────────────────────────────── +VRAM_GB=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>/dev/null \ + | head -1 | awk '{printf "%d", $1/1024}' 2>/dev/null || echo "0") +GPU_NAME=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1 || echo "None") + +if [[ "$VRAM_GB" -ge 14 ]]; then + CHAT_MODEL="qwen2.5:14b"; CODE_MODEL="qwen2.5-coder:14b" + GPU_TIER="16GB VRAM — 14B models" +elif [[ "$VRAM_GB" -ge 8 ]]; then + CHAT_MODEL="qwen2.5:14b"; CODE_MODEL="qwen2.5-coder:7b" + GPU_TIER="8GB VRAM — 14B chat, 7B code" +elif [[ "$VRAM_GB" -ge 4 ]]; then + CHAT_MODEL="qwen2.5:7b"; CODE_MODEL="qwen2.5-coder:7b" + GPU_TIER="6GB VRAM — 7B models" +elif [[ "$VRAM_GB" -gt 0 ]]; then + CHAT_MODEL="qwen2.5:7b"; CODE_MODEL="qwen2.5-coder:7b" + GPU_TIER="${VRAM_GB}GB VRAM — 7B models" +else + CHAT_MODEL="qwen2.5:7b"; CODE_MODEL="qwen2.5-coder:7b" + GPU_TIER="CPU only — 7B models (slow)" +fi + # ── new vs update ───────────────────────────────────────────────────────────── IS_UPDATE=false [[ -f "$BASE/docker-compose.yml" ]] && IS_UPDATE=true -section "Local AI Stack — $($IS_UPDATE && echo UPDATE || echo NEW INSTALL)" -info "Base : $BASE" -info "Host : $LOCAL_IP" +# ============================================================================= +# QUESTIONS UPFRONT — answer everything, then walk away +# ============================================================================= +section "Local AI Stack — Setup Wizard" +echo "" +echo -e " ${BOLD}Answer the questions below, then leave it overnight.${NC}" +echo -e " Everything will install and download while you sleep." +echo "" +info "Machine : $(hostname)" +info "LAN IP : $LOCAL_IP" +info "GPU : ${GPU_NAME} (${VRAM_GB}GB VRAM)" $IS_UPDATE && warn "Existing install found. Config files kept unless --force is passed." -# ── component menu ───────────────────────────────────────────────────────────── +# ── Q1: Components ──────────────────────────────────────────────────────────── echo "" -echo -e " ${BOLD}Select components to install:${NC}" +echo -e " ${BOLD}[1/5] What do you want to install?${NC}" echo "" -echo " 1) Full stack — AI stack + Kiwix" +echo " 1) Full stack — AI stack + Kiwix offline library" echo " 2) AI stack — Ollama · WebUI · RAG · MCP · ChromaDB · SearXNG · Gitea · InvokeAI · Portainer" echo " 3) Kiwix only — Offline Wikipedia / docs (runs standalone)" echo "" @@ -64,6 +94,132 @@ case "$MENU_CHOICE" in 3) INSTALL_AI=false; INSTALL_KIWIX=true ;; *) die "Invalid choice '$MENU_CHOICE' — run again and choose 1, 2, or 3" ;; esac + +# ── Q2: Storage for Ollama models ───────────────────────────────────────────── +OLLAMA_STORAGE="volume" # "volume" = Docker named volume, else a host path +OLLAMA_HOST_PATH="" + +if $INSTALL_AI; then + echo "" + echo -e " ${BOLD}[2/5] Where should Ollama models be stored?${NC}" + echo " (Models are large — 5-50GB each. A fast SSD or large HDD is ideal.)" + echo "" + echo " Available mount points with >20GB free:" + df -h --output=target,avail,fstype 2>/dev/null \ + | awk 'NR>1 && $2~/[0-9]/ { + val=$2; unit=substr(val,length(val)); + num=substr(val,1,length(val)-1)+0; + if ((unit=="G" && num>=20) || unit=="T") print " " $0 + }' | head -10 + echo "" + echo " 1) Docker volume (default — stored in /var/lib/docker/volumes/)" + echo " 2) Custom path (e.g. /mnt/ssd/ollama or /data/ollama)" + echo "" + read -rp " Choice [1]: " STORAGE_CHOICE + STORAGE_CHOICE="${STORAGE_CHOICE:-1}" + if [[ "$STORAGE_CHOICE" == "2" ]]; then + read -rp " Enter full path for Ollama models: " OLLAMA_HOST_PATH + OLLAMA_HOST_PATH="${OLLAMA_HOST_PATH%/}" # strip trailing slash + [[ -z "$OLLAMA_HOST_PATH" ]] && die "No path entered." + OLLAMA_STORAGE="bind" + fi +fi + +# ── Q3: Storage for Kiwix ZIMs ──────────────────────────────────────────────── +KIWIX_DIR="$BASE/kiwix" # default + +if $INSTALL_KIWIX; then + echo "" + echo -e " ${BOLD}[3/5] Where should Kiwix ZIM files be stored?${NC}" + echo " (ZIMs are large — Wikipedia alone is ~46GB. Total collection ~130GB.)" + echo "" + echo " Available mount points with >50GB free:" + df -h --output=target,avail,fstype 2>/dev/null \ + | awk 'NR>1 && $2~/[0-9]/ { + val=$2; unit=substr(val,length(val)); + num=substr(val,1,length(val)-1)+0; + if ((unit=="G" && num>=50) || unit=="T") print " " $0 + }' | head -10 + echo "" + echo " Default: $KIWIX_DIR" + read -rp " Press Enter to use default, or type a different path: " KIWIX_INPUT + if [[ -n "$KIWIX_INPUT" ]]; then + KIWIX_DIR="${KIWIX_INPUT%/}" + fi + + # ── Q4: Download ZIMs now? ───────────────────────────────────────────────── + echo "" + echo -e " ${BOLD}[4/5] Download ZIM files? (offline Wikipedia, Stack Overflow, etc.)${NC}" + echo " Downloads run in the background — safe to start now and leave overnight." + echo " Total: ~130GB (Wikipedia 46GB, Project Gutenberg 60GB, others smaller)" + echo "" + echo " 1) Yes — download all ZIMs overnight (~130GB)" + echo " 2) Select — choose which ZIMs to download" + echo " 3) No — skip for now (run ./kiwix_download.sh later)" + echo "" + read -rp " Choice [3]: " ZIM_CHOICE + ZIM_CHOICE="${ZIM_CHOICE:-3}" +else + ZIM_CHOICE="3" +fi + +# ── Q4b: Firewall (LAN subnet) ──────────────────────────────────────────────── +LAN_SUBNET="192.168.1.0/24" +if command -v ufw &>/dev/null && { [[ ! -f "$BASE/.ufw-done" ]] || $FORCE; }; then + echo "" + # Auto-detect likely subnet from current IP + AUTO_SUBNET=$(echo "$LOCAL_IP" | awk -F. '{print $1"."$2"."$3".0/24"}') + echo -e " ${BOLD}[4b] Firewall — allow LAN access to services${NC}" + read -rp " LAN subnet [${AUTO_SUBNET}]: " LAN_INPUT + LAN_SUBNET="${LAN_INPUT:-$AUTO_SUBNET}" + [[ "$LAN_SUBNET" =~ /[0-9]+$ ]] || LAN_SUBNET="${LAN_SUBNET}/24" +fi + +# ── Q5: Pull Ollama models now? ─────────────────────────────────────────────── +PULL_MODELS=false +PULL_DEEPSEEK=false + +if $INSTALL_AI; then + echo "" + echo -e " ${BOLD}[5/5] Download AI models now?${NC}" + echo " GPU detected: ${GPU_NAME} (${VRAM_GB}GB VRAM) → recommended tier: ${GPU_TIER}" + echo "" + echo " Models that will be downloaded:" + echo " nomic-embed-text (~300MB) — RAG embeddings (required)" + echo " ${FAST_MODEL} (~5GB) — fast chat" + echo " ${CHAT_MODEL} (~9GB) — smart chat" + echo " ${CODE_MODEL} (~5GB) — code assistant" + echo "" + read -rp " Download models now? (~20GB total) [Y/n]: " DO_PULL + if [[ "${DO_PULL,,}" != "n" ]]; then + PULL_MODELS=true + read -rp " Also download DeepSeek-R1:14b for reasoning? (~9GB extra) [y/N]: " DO_DS + [[ "${DO_DS,,}" == "y" ]] && PULL_DEEPSEEK=true + fi +fi + +# ── Summary ─────────────────────────────────────────────────────────────────── +echo "" +echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" +echo -e "${BOLD} Setup plan — starting now:${NC}" +echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" +echo "" +$INSTALL_AI && echo " ✓ AI stack (Ollama · WebUI · RAG · MCP · Gitea · InvokeAI · Portainer)" +$INSTALL_KIWIX && echo " ✓ Kiwix offline library" +if $INSTALL_AI; then + if [[ "$OLLAMA_STORAGE" == "bind" ]]; then + echo " ✓ Ollama models → $OLLAMA_HOST_PATH" + else + echo " ✓ Ollama models → Docker volume (default)" + fi +fi +$INSTALL_KIWIX && echo " ✓ Kiwix ZIMs → $KIWIX_DIR" +$PULL_MODELS && echo " ✓ Pull models : embed + ${FAST_MODEL} + ${CHAT_MODEL} + ${CODE_MODEL}${PULL_DEEPSEEK:+ + deepseek-r1:14b}" +[[ "$ZIM_CHOICE" == "1" ]] && echo " ✓ Download all ZIMs in background (~130GB)" +[[ "$ZIM_CHOICE" == "2" ]] && echo " ✓ Select ZIMs to download (prompted after stack starts)" +echo "" +read -rp " Proceed? [Y/n]: " CONFIRM +[[ "${CONFIRM,,}" == "n" ]] && echo "Aborted." && exit 0 echo "" # ── helper: write only if missing (or --force) ──────────────────────────────── @@ -129,10 +285,14 @@ fi section "Directories" # ============================================================================= for d in papers repos workspace index searxng invokeai-data invokeai-outputs \ - kiwix gitea portainer-data logs; do + gitea portainer-data logs; do mkdir -p "$BASE/$d" done -ok "Directories ready under $BASE" +# Kiwix ZIM dir — may be on a different drive +mkdir -p "$KIWIX_DIR" +# Ollama bind-mount dir (if using custom path) +[[ "$OLLAMA_STORAGE" == "bind" ]] && mkdir -p "$OLLAMA_HOST_PATH" +ok "Directories ready" # ============================================================================= if $INSTALL_AI; then @@ -209,6 +369,15 @@ fi # ============================================================================= section "Docker Compose" # ============================================================================= +# Build ollama volume line based on storage choice +if [[ "$OLLAMA_STORAGE" == "bind" ]]; then + OLLAMA_VOLUME_LINE=" - ${OLLAMA_HOST_PATH}:/root/.ollama" + OLLAMA_VOLUMES_DECL="" +else + OLLAMA_VOLUME_LINE=" - ollama-models:/root/.ollama" + OLLAMA_VOLUMES_DECL=" ollama-models:" +fi + # Always written — it's the stack definition and safe to update cat > "$BASE/docker-compose.yml" << COMPOSE # Local AI Stack — generated $(date '+%Y-%m-%d') @@ -225,7 +394,7 @@ services: ports: - "0.0.0.0:11434:11434" volumes: - - ollama-models:/root/.ollama +${OLLAMA_VOLUME_LINE} environment: - OLLAMA_NUM_GPU=999 # use all available VRAM (auto-detects GPU size) - OLLAMA_NUM_CTX=8192 # lower to 4096 if you hit OOM @@ -353,7 +522,6 @@ services: cap_add: [CHOWN, SETGID, SETUID] # ── Kiwix — Offline Wikipedia/docs ───────────────────────────────────────── - # Download ZIMs first: ./kiwix_download.sh kiwix: image: ghcr.io/kiwix/kiwix-serve:latest container_name: kiwix @@ -361,7 +529,7 @@ services: ports: - "0.0.0.0:8181:8080" volumes: - - $BASE/kiwix:/data + - $KIWIX_DIR:/data command: "*.zim" # ── Gitea — Self-hosted Git ───────────────────────────────────────────────── @@ -419,7 +587,7 @@ services: - $BASE/portainer-data:/data volumes: - ollama-models: +${OLLAMA_VOLUMES_DECL} open-webui-data: invokeai-models: COMPOSE @@ -430,10 +598,6 @@ section "Firewall (UFW)" # ============================================================================= if command -v ufw &>/dev/null; then if [[ ! -f "$BASE/.ufw-done" ]] || $FORCE; then - read -rp " LAN subnet for firewall [192.168.1.0/24]: " LAN_SUBNET - LAN_SUBNET="${LAN_SUBNET:-192.168.1.0/24}" - [[ "$LAN_SUBNET" =~ /[0-9]+$ ]] || LAN_SUBNET="${LAN_SUBNET}/24" - for port_comment in \ "3000:Open WebUI" "11434:Ollama" "8001:RAG Server" \ "8002:MCP Server" "8000:ChromaDB" "8888:SearXNG" \ @@ -608,14 +772,153 @@ docker compose pull --quiet $COMPOSE_SERVICES docker compose up -d $COMPOSE_SERVICES ok "Stack started" -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 - bash "$BASE/pull-models.sh" - else - info "Run later: bash $BASE/pull-models.sh" +# ── Pull Ollama models (answer was captured upfront) ───────────────────────── +if $INSTALL_AI && $PULL_MODELS; then + section "Pulling Ollama Models" + info "Waiting for Ollama to be ready..." + until docker exec ollama ollama list &>/dev/null; do sleep 3; done + ok "Ollama ready." + + info "Pulling embed model (required for RAG)..." + docker exec ollama ollama pull "$EMBED_MODEL" + + info "Pulling fast chat model..." + docker exec ollama ollama pull "$FAST_MODEL" + + info "Pulling smart chat model..." + docker exec ollama ollama pull "$CHAT_MODEL" + + info "Pulling code model..." + docker exec ollama ollama pull "$CODE_MODEL" + + if $PULL_DEEPSEEK; then + info "Pulling DeepSeek-R1:14b (reasoning)..." + docker exec ollama ollama pull deepseek-r1:14b fi + + ok "All models pulled." + echo "" + docker exec ollama ollama list +elif $INSTALL_AI; then + info "Skipping model pull — run later: bash $BASE/pull-models.sh" +fi + +# ── Start ZIM downloads (answer was captured upfront) ──────────────────────── +if $INSTALL_KIWIX && [[ "$ZIM_CHOICE" != "3" ]]; then + section "Starting ZIM Downloads" + LOG="$BASE/logs/kiwix-download.log" + mkdir -p "$(dirname "$LOG")" + + info "Checking mirrors for latest ZIM filenames..." + + MIRROR="https://ftp.fau.de/kiwix/zim" + MIRROR2="https://download.kiwix.org/zim" + + latest_zim() { + local base_url="$1" pattern="$2" + curl -s "$base_url/" | grep -oP "${pattern}_[0-9-]+\.zim" | sort -u | tail -1 + } + + dl_zim() { + local cat="$1" file="$2" desc="$3" mirror="${4:-$MIRROR}" + local dest="$KIWIX_DIR/$file" + if [[ -z "$file" ]]; then warn "Could not find $desc — skipping"; return; fi + if [[ -f "$dest" ]]; then ok "$desc already downloaded"; return; fi + info "Starting: $desc" + nohup wget -c "$mirror/$cat/$file" -O "$dest" >> "$LOG" 2>&1 & + echo $! >> "$KIWIX_DIR/.download_pids" + ok "Download started (PID $!) — $desc" + } + + WIKI=$(latest_zim "$MIRROR/wikipedia" "wikipedia_en_all_nopic") + SO=$(latest_zim "$MIRROR/stack_exchange" "stackoverflow.com_en_all") + ARCH=$(latest_zim "$MIRROR/other" "archlinux_en_all_maxi") + WIKT=$(latest_zim "$MIRROR/wiktionary" "wiktionary_en_all_nopic") + WIKB=$(latest_zim "$MIRROR/wikibooks" "wikibooks_en_all_nopic") + WIKS=$(latest_zim "$MIRROR/wikisource" "wikisource_en_all_nopic") + WIKV=$(latest_zim "$MIRROR/wikivoyage" "wikivoyage_en_all_nopic") + WIKUNI=$(latest_zim "$MIRROR/wikiversity" "wikiversity_en_all_nopic") + WIKNEWS=$(latest_zim "$MIRROR/wikinews" "wikinews_en_all_nopic") + WIKQ=$(latest_zim "$MIRROR/wikiquote" "wikiquote_en_all_nopic") + VIKIDIA=$(latest_zim "$MIRROR/vikidia" "vikidia_en_all_nopic") + TED=$(latest_zim "$MIRROR/ted" "ted_mul_youth") + PHET=$(latest_zim "$MIRROR/phet" "phet_en_all") + DEVDOCS=$(latest_zim "$MIRROR/devdocs" "devdocs_en_zig") + FCC=$(latest_zim "$MIRROR/freecodecamp" "freecodecamp_en_all") + IFIX=$(latest_zim "$MIRROR/ifixit" "ifixit_en_all") + LIBRE=$(latest_zim "$MIRROR/libretexts" "libretexts.org_en_workforce") + GUT=$(latest_zim "$MIRROR2/gutenberg" "gutenberg_en_all") + + if [[ "$ZIM_CHOICE" == "2" ]]; then + # Let user select which ZIMs + echo "" + echo " Select ZIMs to download (enter numbers separated by spaces):" + echo " 1) Wikipedia ~46GB ${WIKI:-NOT FOUND}" + echo " 2) Stack Overflow ~3GB ${SO:-NOT FOUND}" + echo " 3) Arch Linux Wiki ~30MB ${ARCH:-NOT FOUND}" + echo " 4) Wiktionary ~2GB ${WIKT:-NOT FOUND}" + echo " 5) Wikibooks ~500MB ${WIKB:-NOT FOUND}" + echo " 6) Wikisource ~4GB ${WIKS:-NOT FOUND}" + echo " 7) Wikivoyage ~200MB ${WIKV:-NOT FOUND}" + echo " 8) Wikiversity ~500MB ${WIKUNI:-NOT FOUND}" + echo " 9) WikiNews ~300MB ${WIKNEWS:-NOT FOUND}" + echo " 10) Wikiquote ~300MB ${WIKQ:-NOT FOUND}" + echo " 11) Vikidia (kids K-8) ~66MB ${VIKIDIA:-NOT FOUND}" + echo " 12) TED Talks ~5GB ${TED:-NOT FOUND}" + echo " 13) PhET Simulations ~500MB ${PHET:-NOT FOUND}" + echo " 14) DevDocs ~1GB ${DEVDOCS:-NOT FOUND}" + echo " 15) FreeCodeCamp ~small ${FCC:-NOT FOUND}" + echo " 16) iFixit ~2GB ${IFIX:-NOT FOUND}" + echo " 17) LibreTexts ~varies ${LIBRE:-NOT FOUND}" + echo " 18) Project Gutenberg ~60GB ${GUT:-NOT FOUND}" + echo "" + read -rp " Your choices (e.g. 1 2 3): " ZIM_PICKS + rm -f "$KIWIX_DIR/.download_pids" + for n in $ZIM_PICKS; do + case "$n" in + 1) dl_zim "wikipedia" "$WIKI" "Wikipedia" ;; + 2) dl_zim "stack_exchange" "$SO" "Stack Overflow" ;; + 3) dl_zim "other" "$ARCH" "Arch Linux Wiki" ;; + 4) dl_zim "wiktionary" "$WIKT" "Wiktionary" ;; + 5) dl_zim "wikibooks" "$WIKB" "Wikibooks" ;; + 6) dl_zim "wikisource" "$WIKS" "Wikisource" ;; + 7) dl_zim "wikivoyage" "$WIKV" "Wikivoyage" ;; + 8) dl_zim "wikiversity" "$WIKUNI" "Wikiversity" ;; + 9) dl_zim "wikinews" "$WIKNEWS" "WikiNews" ;; + 10) dl_zim "wikiquote" "$WIKQ" "Wikiquote" ;; + 11) dl_zim "vikidia" "$VIKIDIA" "Vikidia (kids K-8)" ;; + 12) dl_zim "ted" "$TED" "TED Talks" ;; + 13) dl_zim "phet" "$PHET" "PhET Simulations" ;; + 14) dl_zim "devdocs" "$DEVDOCS" "DevDocs" ;; + 15) dl_zim "freecodecamp" "$FCC" "FreeCodeCamp" ;; + 16) dl_zim "ifixit" "$IFIX" "iFixit" ;; + 17) dl_zim "libretexts" "$LIBRE" "LibreTexts" ;; + 18) dl_zim "gutenberg" "$GUT" "Project Gutenberg" "$MIRROR2" ;; + esac + done + else + # Download all + rm -f "$KIWIX_DIR/.download_pids" + dl_zim "wikipedia" "$WIKI" "Wikipedia" + dl_zim "stack_exchange" "$SO" "Stack Overflow" + dl_zim "other" "$ARCH" "Arch Linux Wiki" + dl_zim "wiktionary" "$WIKT" "Wiktionary" + dl_zim "wikibooks" "$WIKB" "Wikibooks" + dl_zim "wikisource" "$WIKS" "Wikisource" + dl_zim "wikivoyage" "$WIKV" "Wikivoyage" + dl_zim "wikiversity" "$WIKUNI" "Wikiversity" + dl_zim "wikinews" "$WIKNEWS" "WikiNews" + dl_zim "wikiquote" "$WIKQ" "Wikiquote" + dl_zim "vikidia" "$VIKIDIA" "Vikidia (kids K-8)" + dl_zim "ted" "$TED" "TED Talks" + dl_zim "phet" "$PHET" "PhET Simulations" + dl_zim "devdocs" "$DEVDOCS" "DevDocs" + dl_zim "freecodecamp" "$FCC" "FreeCodeCamp" + dl_zim "ifixit" "$IFIX" "iFixit" + dl_zim "libretexts" "$LIBRE" "LibreTexts" + dl_zim "gutenberg" "$GUT" "Project Gutenberg" "$MIRROR2" + fi + ok "ZIM downloads running in background — monitor: tail -f $LOG" fi # ============================================================================= @@ -632,7 +935,7 @@ if $INSTALL_AI; then 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)" + echo -e " ${CYAN}Kiwix${NC} → http://$LOCAL_IP:8181" fi echo "" if $INSTALL_AI; then @@ -643,8 +946,11 @@ if $INSTALL_AI; then 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" +if $INSTALL_KIWIX && [[ "$ZIM_CHOICE" == "3" ]]; then + echo -e " ${YELLOW}ZIM downloads:${NC} ./kiwix_download.sh (not started)" +elif $INSTALL_KIWIX; then + echo -e " ${YELLOW}ZIM progress:${NC} tail -f $BASE/logs/kiwix-download.log" + echo -e " ${YELLOW}ZIM location:${NC} $KIWIX_DIR/" fi echo "" $IS_UPDATE && echo -e " ${GREEN}Update complete.${NC}" \