Add top-level checklist menu to laptop_full_setup.sh
Replace the single-choice component menu with a multi-select checklist
(whiptail if available, text-based toggle fallback). Users now pick any
combination of:
[*] Full system setup — runs ubuntu-post-install.sh (Ubuntu apps,
security hardening, backups, Docker services)
[*] AI stack — Ollama, Open WebUI, RAG, MCP, Gitea, InvokeAI
[*] Kiwix — Offline Wikipedia, Stack Overflow, Arch Wiki
This makes laptop_full_setup.sh the single entry point — run it once,
toggle what you need (like Ubuntu Server's tasksel), leave overnight.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
This commit is contained in:
+80
-21
@@ -1,14 +1,18 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Local AI Stack — Ubuntu 24.04
|
# Local AI Setup — Ubuntu 24.04
|
||||||
# Services: Ollama · Open WebUI · RAG · MCP · ChromaDB · SearXNG
|
# One script to rule them all. Select what you need, answer questions, walk away.
|
||||||
# Kiwix · Gitea · InvokeAI · Portainer
|
#
|
||||||
|
# Options (checklist at launch):
|
||||||
|
# • Full system setup — Ubuntu apps, security, backups (ubuntu-post-install.sh)
|
||||||
|
# • AI stack — Ollama · Open WebUI · RAG · MCP · ChromaDB · SearXNG
|
||||||
|
# Gitea · InvokeAI · Portainer
|
||||||
|
# • Kiwix — Offline Wikipedia, Stack Overflow, Arch Wiki, etc.
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# ./laptop_full_setup.sh — interactive setup (answer questions, leave overnight)
|
# ./laptop_full_setup.sh — interactive (asks everything upfront)
|
||||||
# ./laptop_full_setup.sh --force — overwrite existing config files too
|
# ./laptop_full_setup.sh --force — overwrite existing config files too
|
||||||
#
|
#
|
||||||
# Asks all questions upfront, then runs everything unattended.
|
|
||||||
# GPU: Ollama auto-detects VRAM — works with any NVIDIA GPU
|
# GPU: Ollama auto-detects VRAM — works with any NVIDIA GPU
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@@ -78,22 +82,60 @@ info "LAN IP : $LOCAL_IP"
|
|||||||
info "GPU : ${GPU_NAME} (${VRAM_GB}GB VRAM)"
|
info "GPU : ${GPU_NAME} (${VRAM_GB}GB VRAM)"
|
||||||
$IS_UPDATE && warn "Existing install found. Config files kept unless --force is passed."
|
$IS_UPDATE && warn "Existing install found. Config files kept unless --force is passed."
|
||||||
|
|
||||||
# ── Q1: Components ────────────────────────────────────────────────────────────
|
# ── Q1: What to install — checklist ──────────────────────────────────────────
|
||||||
echo ""
|
INSTALL_POSTINSTALL=false
|
||||||
echo -e " ${BOLD}[1/5] What do you want to install?${NC}"
|
INSTALL_AI=true
|
||||||
echo ""
|
INSTALL_KIWIX=true
|
||||||
echo " 1) Full stack — AI stack + Kiwix offline library"
|
|
||||||
echo " 2) AI stack — Ollama · WebUI · RAG · MCP · ChromaDB · SearXNG · Gitea · InvokeAI · Portainer"
|
POSTINSTALL_SCRIPT="$SCRIPT_DIR/ubuntu-post-install.sh"
|
||||||
echo " 3) Kiwix only — Offline Wikipedia / docs (runs standalone)"
|
HAS_POSTINSTALL=false
|
||||||
echo ""
|
[[ -f "$POSTINSTALL_SCRIPT" ]] && HAS_POSTINSTALL=true
|
||||||
read -rp " Choice [1]: " MENU_CHOICE
|
|
||||||
MENU_CHOICE="${MENU_CHOICE:-1}"
|
# Build checklist via whiptail if available, else text toggle
|
||||||
case "$MENU_CHOICE" in
|
if command -v whiptail &>/dev/null; then
|
||||||
1) INSTALL_AI=true; INSTALL_KIWIX=true ;;
|
WHIP_ARGS=()
|
||||||
2) INSTALL_AI=true; INSTALL_KIWIX=false ;;
|
$HAS_POSTINSTALL && WHIP_ARGS+=(
|
||||||
3) INSTALL_AI=false; INSTALL_KIWIX=true ;;
|
"postinstall" "Full system setup — Ubuntu apps, security, backups" OFF
|
||||||
*) die "Invalid choice '$MENU_CHOICE' — run again and choose 1, 2, or 3" ;;
|
)
|
||||||
esac
|
WHIP_ARGS+=(
|
||||||
|
"aistack" "AI stack — Ollama · WebUI · RAG · MCP · Gitea · InvokeAI" ON
|
||||||
|
"kiwix" "Kiwix — Offline Wikipedia, Stack Overflow, Arch Wiki…" ON
|
||||||
|
)
|
||||||
|
SELECTED=$(whiptail --title "Local AI Setup" \
|
||||||
|
--checklist "SPACE = toggle TAB = move ENTER = confirm" \
|
||||||
|
15 72 "${#WHIP_ARGS[@]}" "${WHIP_ARGS[@]}" 3>&1 1>&2 2>&3) || die "Cancelled."
|
||||||
|
INSTALL_AI=false; INSTALL_KIWIX=false
|
||||||
|
[[ "$SELECTED" == *"postinstall"* ]] && INSTALL_POSTINSTALL=true
|
||||||
|
[[ "$SELECTED" == *"aistack"* ]] && INSTALL_AI=true
|
||||||
|
[[ "$SELECTED" == *"kiwix"* ]] && INSTALL_KIWIX=true
|
||||||
|
else
|
||||||
|
# Text-based toggle list
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BOLD}[1/5] Select what to install${NC}"
|
||||||
|
echo " (Type a number to toggle on/off, then press Enter with no number to confirm)"
|
||||||
|
echo ""
|
||||||
|
SEL_POST=false; SEL_AI=true; SEL_KIWIX=true
|
||||||
|
while true; do
|
||||||
|
echo ""
|
||||||
|
$HAS_POSTINSTALL && printf " [%s] 1. Full system setup — Ubuntu apps, security, backups\n" "$($SEL_POST && echo '*' || echo ' ')"
|
||||||
|
printf " [%s] 2. AI stack — Ollama · WebUI · RAG · MCP · Gitea · InvokeAI\n" "$($SEL_AI && echo '*' || echo ' ')"
|
||||||
|
printf " [%s] 3. Kiwix — Offline Wikipedia, Stack Overflow, docs\n" "$($SEL_KIWIX && echo '*' || echo ' ')"
|
||||||
|
echo ""
|
||||||
|
read -rp " Toggle [number] or Enter to confirm: " T
|
||||||
|
case "$T" in
|
||||||
|
1) $HAS_POSTINSTALL && { $SEL_POST && SEL_POST=false || SEL_POST=true; } ;;
|
||||||
|
2) $SEL_AI && SEL_AI=false || SEL_AI=true ;;
|
||||||
|
3) $SEL_KIWIX && SEL_KIWIX=false || SEL_KIWIX=true ;;
|
||||||
|
"") break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
INSTALL_POSTINSTALL=$SEL_POST
|
||||||
|
INSTALL_AI=$SEL_AI
|
||||||
|
INSTALL_KIWIX=$SEL_KIWIX
|
||||||
|
fi
|
||||||
|
|
||||||
|
$INSTALL_AI || $INSTALL_KIWIX || $INSTALL_POSTINSTALL \
|
||||||
|
|| die "Nothing selected — run again and select at least one option."
|
||||||
|
|
||||||
# ── Q2: Storage for Ollama models ─────────────────────────────────────────────
|
# ── Q2: Storage for Ollama models ─────────────────────────────────────────────
|
||||||
OLLAMA_STORAGE="volume" # "volume" = Docker named volume, else a host path
|
OLLAMA_STORAGE="volume" # "volume" = Docker named volume, else a host path
|
||||||
@@ -204,6 +246,7 @@ echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━
|
|||||||
echo -e "${BOLD} Setup plan — starting now:${NC}"
|
echo -e "${BOLD} Setup plan — starting now:${NC}"
|
||||||
echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
|
$INSTALL_POSTINSTALL && echo " ✓ Full system setup (ubuntu-post-install.sh — interactive)"
|
||||||
$INSTALL_AI && echo " ✓ AI stack (Ollama · WebUI · RAG · MCP · Gitea · InvokeAI · Portainer)"
|
$INSTALL_AI && echo " ✓ AI stack (Ollama · WebUI · RAG · MCP · Gitea · InvokeAI · Portainer)"
|
||||||
$INSTALL_KIWIX && echo " ✓ Kiwix offline library"
|
$INSTALL_KIWIX && echo " ✓ Kiwix offline library"
|
||||||
if $INSTALL_AI; then
|
if $INSTALL_AI; then
|
||||||
@@ -235,6 +278,22 @@ write_if_new() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Run full system post-install first (sets up Docker, security, base services)
|
||||||
|
# =============================================================================
|
||||||
|
if $INSTALL_POSTINSTALL; then
|
||||||
|
section "Full System Setup"
|
||||||
|
if [[ ! -f "$POSTINSTALL_SCRIPT" ]]; then
|
||||||
|
die "ubuntu-post-install.sh not found at $POSTINSTALL_SCRIPT"
|
||||||
|
fi
|
||||||
|
info "Launching ubuntu-post-install.sh in normal install mode..."
|
||||||
|
echo ""
|
||||||
|
bash "$POSTINSTALL_SCRIPT"
|
||||||
|
echo ""
|
||||||
|
ok "System setup complete — continuing with selected components..."
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
section "Prerequisites"
|
section "Prerequisites"
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user