Add leave-overnight wizard to laptop_full_setup.sh
Gather all setup choices upfront so users can answer questions once and walk away. Changes: - Setup wizard asks all questions before any installation begins: 1. Component selection (AI stack / Kiwix / both) 2. Ollama model storage (Docker volume or custom bind-mount path) 3. Kiwix ZIM storage location (detect drives with enough free space) 4. Firewall LAN subnet (auto-detected from current IP) 5. Model downloads (confirm GPU-matched models, optional DeepSeek-R1) 6. ZIM downloads (all / select / skip) - Shows a summary and asks for confirmation before doing anything - Ollama supports bind-mount to custom path (e.g. /mnt/ssd/ollama) - Kiwix ZIM dir is configurable (separate large drive) - Model pull runs unattended at end using upfront answer - ZIM downloads integrated inline (no need to run kiwix_download.sh separately) — background wget with progress log https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
This commit is contained in:
+337
-31
@@ -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}" \
|
||||
|
||||
Reference in New Issue
Block a user