Commit Graph
65 Commits
Author SHA1 Message Date
Claude 14da24c02b Add GPU setup research for rack server AI workloads
Research comparing P40, A2000, T4, and M40 GPUs for LLM inference
and image generation in Dell R720/R730 rack servers. Includes
benchmarks, compatibility notes, pricing, and recommendations.

https://claude.ai/code/session_01PtYTPherSJaxDEVPgF6Nxu
2026-03-22 14:12:46 +00:00
Outis 063a7b6db1 Merge pull request #20 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 14:54:51 -04:00
Claude f0eca342a7 fix kiwix 502: map host:8181 to container:80 (kiwix default port)
kiwix-serve binds to port 80 by default; the previous mapping to 8080
caused a 502. Change port mapping to 8181:80 and drop --port flag.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:53:33 +00:00
Claude 9306fe312e fix kiwix 502: bind to port 8080 to match docker port mapping
kiwix-serve defaults to port 80 but the compose mapping is 8181:8080,
causing a 502. Add --port 8080 to the serve command.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:46:40 +00:00
Outis fbb9c76c01 Merge pull request #19 from outis1one/claude/cleanup-setup-webui-bCgPE
fix kiwix crash-loop when no ZIM files present
2026-03-21 14:26:51 -04:00
Claude 2912208f87 fix kiwix crash-loop when no ZIM files present
Replace subshell ls expansion (which produces no args when /data is empty)
with a conditional: serve ZIM files if they exist, otherwise sleep infinity
so the container stays up gracefully until ZIM files are added.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:25:04 +00:00
Outis 336216092e Merge pull request #18 from outis1one/claude/cleanup-setup-webui-bCgPE
remove SearXNG entirely; fix Kiwix cold-start
2026-03-21 14:20:07 -04:00
Claude 799fc84875 remove SearXNG entirely; fix Kiwix cold-start
SearXNG:
- Dropped from both setup scripts and docker-compose (Google/Startpage
  block self-hosted instances by IP — not reliable enough to include)
- Removed all interactive safe-search and engine-selection prompts
- Removed Open WebUI RAG web-search env vars (ENABLE_RAG_WEB_SEARCH,
  SEARXNG_QUERY_URL, etc.)
- Removed port 8888 from UFW rules, start.sh URLs, done output, and
  the Caddyfile template
- Removed searxng/ from .gitignore (directory no longer created)
- configure-searxng-safesearch.sh kept in repo for optional manual use

Kiwix:
- Replace the blocking wait-loop (`until ls *.zim`) with a one-liner
  that passes whatever ZIM files exist (or none) directly to kiwix-serve,
  so the container starts immediately and shows an empty library page
  rather than hanging until ZIMs are downloaded

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:15:56 +00:00
Outis 27bf8a3d81 Merge pull request #17 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 13:41:10 -04:00
Claude 5bfedf2cee consolidate everything into the repo folder; add compose management comments
All scripts now default BASE to their own directory (SCRIPT_DIR) instead
of ~/docker/ai-stack, so after a git clone the user never needs to change
folders — docker-compose.yml, .env, settings, and data dirs all live next
to the scripts.

configure-searxng-safesearch.sh and configure-storage.sh do the same for
standalone use (still honoured when called with BASE= from a parent script).

docker-compose.yml (generated by both setup scripts) gains a comment block
at the top listing the everyday docker compose commands:
  up -d / down / restart / stop / logs -f / pull / ps
so the file itself is the reference for managing containers.

.gitignore added to exclude generated files (docker-compose.yml, .env,
requirements.txt, helper scripts) and data directories (workspace/, kiwix/,
searxng/, gitea/, etc.) from git tracking.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 15:38:20 +00:00
Claude a4f2adc50a fix mcp-server crash and Kiwix FQDN resolution
mcp_server.py / local-ai-setup.sh:
  FastMCP.get_asgi_app() was removed in mcp 1.x — replace with
  sse_app(), which returns the same Starlette ASGI app for SSE
  transport.  Fixes the crash loop the container was stuck in.

laptop_full_setup.sh Caddyfile:
  $(hostname).local requires mDNS (Avahi/Bonjour) to resolve from a
  proxy machine, which is often not available on all LAN clients.
  Replace every occurrence with $LOCAL_IP (the machine's LAN IP)
  so the generated Caddyfile.example works reliably regardless of
  mDNS support.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 15:03:27 +00:00
Outis aca95b1741 Merge pull request #16 from outis1one/claude/fix-invokeai-upload-To8AX
Add LoRA import script and InvokeAI usage guide
2026-03-21 10:49:19 -04:00
Claude ed315999b1 Add LoRA import script and InvokeAI usage guide
Adds invokeai-import-lora.sh to copy LoRA .safetensors files directly
into InvokeAI's Docker model volume, bypassing the greyed-out UI upload
buttons. Also adds README documentation for LoRA usage and troubleshooting.

https://claude.ai/code/session_01RU7NQuTbA8S8NRoWojvhR5
2026-03-21 14:12:45 +00:00
Outis 7de4d385c4 Merge pull request #15 from outis1one/claude/cleanup-setup-webui-bCgPE
lock safesearch preference when level is moderate or strict
2026-03-21 02:04:12 -04:00
Claude 0eac82e06e lock safesearch preference when level is moderate or strict
SearXNG's preferences.lock list prevents users from changing a setting
via the UI — it greys out the option. Without this, safe_search in
settings.yml was only a server default that users could still override
in their preferences page.

For moderate/strict, add:
  preferences:
    lock:
      - safesearch

For none, the lock is omitted so users can freely adjust it.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 06:02:25 +00:00
Outis fc9bbeebac Merge pull request #14 from outis1one/claude/cleanup-setup-webui-bCgPE
fix ENABLE_MAP unbound variable in reporting block
2026-03-21 01:58:26 -04:00
Claude 07f8c83acb fix ENABLE_MAP unbound variable in reporting block
set +u was added around the ENGINE_BLOCK for-loops but the reporting
lines after ok "Updated settings.yml" still ran under set -u.
bash < 4.4 throws "unbound variable" for ${#ENABLE_MAP[@]} when the
associative array is empty (no --enable-engines argument was given).

Add set +u before the Disabled/Re-enabled info lines; it already covers
the ${#DISABLE_MAP[@]} reference at the end of the script.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:56:42 +00:00
Outis 30ff4014f2 Merge pull request #13 from outis1one/claude/cleanup-setup-webui-bCgPE
fix whiptail capture bug (2>/dev/null killed selections); add artic; …
2026-03-21 01:47:38 -04:00
Claude b090b902c0 fix whiptail capture bug (2>/dev/null killed selections); add artic; fix ENABLE_MAP
Root cause of all 85 engines being disabled:
  `3>&1 1>&2 2>&3 2>/dev/null` — the trailing `2>/dev/null` overwrites FD2
  with /dev/null AFTER the FD swap, destroying the pipe that whiptail writes
  selections to. User selections were silently discarded every time. Remove it.

Also: if whiptail exits 0 but returns empty string (all items unchecked),
fall back to pre-checked defaults rather than disabling everything.

ENABLE_MAP: unbound variable (configure-searxng-safesearch.sh):
  bash < 4.4 treats `${!empty_assoc[@]}` as unbound under `set -u`.
  Wrap for loops and mark_disabled key-check with set +u / set -u.

Add artic (Art Institute of Chicago) to image engine menus.
Add yandex images (defaults OFF for moderate/strict, same as yandex).
Update _SX_AUTOFF to include "yandex images" so re-enabling it works.
Update configure script engine category lists to match expanded menus.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:45:30 +00:00
Outis a1d9c2970e Merge pull request #12 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 01:30:21 -04:00
Claude fc10cbf668 expand engine menus to ~80 engines across 6 categories; fix permissions
configure-searxng-safesearch.sh:
- Fix "Permission denied" when Docker created settings.yml as root:
  detect unwritable file, run sudo chown before writing

Engine menus (both setup scripts):
- Web:       +presearch, yep, wiby  (15 total)
- Images:    +startpage images, mojeek images, presearch images,
              pexels, pixabay images, pinterest, flickr (moved to ON — it
              supports safe-search), wikcommons.images, artstation, adobe stock
              (19 total); removed flickr/dailymotion from no-safe-search list
- Videos:    +brave videos, qwant videos, rumble, odysee, bitchute,
              media.ccc.de, wikcommons.videos  (17 total)
- News:      +startpage news, presearch news, mojeek news, reuters,
              yahoo news, wikinews, yep news  (12 total)
- Reference: NEW — wikipedia, wikidata, wolframalpha, ask, ddg definitions,
              encyclopsearch, wikibooks, wikiquote, wikisource, wikispecies,
              wikiversity, wikivoyage  (12 total)
- Science:   unchanged (5)

_sxst() updated: removed flickr/dailymotion from OFF list; added
  vimeo, bitchute, rumble, odysee, artstation, mojeek images/news

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:28:23 +00:00
Claude 9a329a754b replace ZIM text prompts with whiptail radiolist + checklist
- Radiolist first: Choose / All / Skip (ESC = skip)
- Checklist shows all 18 ZIMs with sizes; pre-checks any already
  downloaded ZIMs so re-runs don't re-select what you have
- ZIM_PICKS now stores space-separated names (wikipedia, stackoverflow,
  archlinux...) instead of numbers; dispatch updated to match
- Text fallback (no whiptail): same numbered list as before, converts
  input numbers to names before dispatch
- Summary shows count and names of selected ZIMs

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:18:54 +00:00
Outis 0c783de44e Merge pull request #11 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 01:07:47 -04:00
Claude e6eaec4bd4 replace category/engine text prompts with whiptail checklists
For both setup scripts and configure-searxng-safesearch.sh:
- Five whiptail checklist menus: Web · Images · Videos · News · Science
- Pre-populated ON/OFF based on the chosen safe-search level:
    none     → all engines ON
    moderate/strict → no-safe-search engines (mojeek, yandex, baidu, naver,
                      invidious, piped, peertube, sepiasearch, flickr,
                      imgur, deviantart, dailymotion, vimeo) default OFF
- User can toggle any engine independently before confirming
- ESC on any menu restores defaults for that category (keeps them unchanged)
- If user re-enables an auto-disabled engine, --enable-engines is passed
  to configure script to override the auto-disable
- Text fallback for non-interactive/headless installs
- Summary shows count of disabled engines instead of raw list

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:01:50 +00:00
Claude 9bcef89719 add interactive SearXNG safe-search prompts and category/engine controls
Setup (both scripts):
- Q6 asks safe-search level: none / moderate / strict
- Then asks which categories to disable: videos images news science social
- Then asks which engines to disable by name (duckduckgo, bing, etc.)
- Choices flow into SEARXNG_QUERY_URL &safesearch=N in docker-compose.yml
- SearXNG summary line added to laptop_full_setup.sh install plan

configure-searxng-safesearch.sh:
- Full rewrite: --disable-categories, --disable-engines, --enable-engines
- Category maps: videos / images / news / science / social engine lists
- --enable-engines overrides auto-disables (e.g. keep yandex on strict)
- Preserves existing secret key on update
- Creates settings.yml from scratch if missing (safe for setup use)
- Help flag (-h/--help)

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 04:49:50 +00:00
Claude bab3f113a2 add SearXNG safe-search script and improve OWUI search env vars
- New configure-searxng-safesearch.sh: set strict/moderate/none level,
  disable engines that can't enforce the chosen level (torrent sites,
  mojeek, baidu, yandex, nvidious/piped/peertube video frontends),
  updates &safesearch= in SEARXNG_QUERY_URL, and restarts searxng
- Add RAG_WEB_SEARCH_RESULT_COUNT=5 and RAG_WEB_SEARCH_CONCURRENT_REQUESTS=10
  to Open WebUI env in both setup scripts
- Add &safesearch=0 to SEARXNG_QUERY_URL so the script can find/replace it
- Sync ENABLE_TOOL_SERVERS=true into laptop_full_setup.sh (was missing)

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 04:38:03 +00:00
Claude cccf3afc4f Enable tool servers and auth in Open WebUI config
- WEBUI_AUTH=true: require login (auth was disabled by default)
- ENABLE_TOOL_SERVERS=true: unlocks the MCP/OpenAPI tool server UI

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 03:41:11 +00:00
Claude e5e357a37d Enable Open WebUI authentication (WEBUI_AUTH=true)
Disabling auth is unsafe when Open WebUI is exposed via a public FQDN.
Enabling it allows proper login/signup with credentials.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 03:18:27 +00:00
Outis 7832248209 Merge pull request #10 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-20 23:09:20 -04:00
Claude 90111df03f Fix Open WebUI FQDN auth and Kiwix 502 on cold start
- Add WEBUI_URL to .env template and open-webui compose env so sessions
  work correctly when served behind Caddy (or any reverse proxy)
- Fix Caddyfile.example to pass X-Forwarded-Proto/Host headers for Open WebUI
- Wrap kiwix-serve command in a wait loop so the container stays healthy
  while ZIM files are still downloading (avoids 502 from Caddy)

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 03:07:20 +00:00
Claude f5ddb345dd Add Open WebUI MCP tool registration hint to Done output
After install, remind users to add the MCP SSE URL in Open WebUI's
Admin → Settings → Tools panel (only shown when both MCP and WebUI
are selected).

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 02:54:20 +00:00
Outis 9cb05fcdde Merge pull request #9 from outis1one/claude/cleanup-setup-webui-bCgPE
Fix permission denied when --force overwrites root-owned config files
2026-03-20 22:52:29 -04:00
Claude 55cfa71464 Fix permission denied when --force overwrites root-owned config files
When Docker containers write config files (e.g. searxng/settings.yml),
those files end up owned by root. write_if_new now falls back to
sudo tee when the destination file exists but is not writable.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 02:49:51 +00:00
Outis 0cd56b7aec Merge pull request #8 from outis1one/claude/cleanup-setup-webui-bCgPE
Move ZIM selection into the wizard so all prompts complete before dow…
2026-03-20 22:26:52 -04:00
Claude cd150a7911 Move ZIM selection into the wizard so all prompts complete before downloads start
- The "select which ZIMs" menu now fires during Q4 (upfront wizard),
  alongside the yes/select/no choice, not after docker/models start
- Each ZIM entry shows [downloaded] if a matching .zim already exists
  in KIWIX_DIR — skips re-downloading automatically via dl_zim check
- Download phase now uses the pre-captured ZIM_PICKS directly,
  no interactive prompt mid-install

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 02:21:54 +00:00
Outis 44f2ed3a66 Merge pull request #7 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-20 22:13:29 -04:00
Claude 01ab7b8cc9 Number drive mount points for Ollama and Kiwix storage selection
Both [2/6] and [3/6] prompts now show detected mount points as a
numbered list. Type 0 for default/Docker volume, or 1/2/3 to pick a
drive directly. Typing a path manually still works as fallback.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 02:11:39 +00:00
Claude 19346ba867 Use numbered input for size tier selection
The tier table now shows 1–4 numbers so you type 1/2/3/4 instead of
typing "14B" or "32B". Tier names are still accepted as fallback.
Recommended tier is shown as a number (e.g. [2] instead of [14B]).

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 02:08:21 +00:00
Claude 342c746b51 Revert "Replace whiptail menus with numbered text toggle selection"
This reverts commit c83439f576.
2026-03-21 02:06:55 +00:00
Claude c83439f576 Replace whiptail menus with numbered text toggle selection
All interactive prompts now use numbered toggles (type a number to
toggle on/off, Enter to confirm) instead of requiring whiptail.
Removed whiptail from apt dependencies in ubuntu-post-install.sh.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 02:05:08 +00:00
Outis 523d72e5a6 Merge pull request #6 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-20 21:53:40 -04:00
Claude 47e91baf69 Fix start.sh and Done output to only show URLs for selected services
Build URL/path lines as variables before the heredoc so only
installed services appear in start.sh and the final Done summary.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 01:48:22 +00:00
Claude 7e52271cb6 Replace component menu with per-service whiptail checklist
- Top-level menu now just: Full system setup / AI stack
- AI stack opens a second whiptail checklist (same style as
  ubuntu-post-install.sh) where each service is individually toggled:
    Ollama (always on, core)
    Open WebUI · RAG+ChromaDB · MCP Server · SearXNG
    Gitea · InvokeAI · Portainer · Kiwix
- Kiwix moved from top-level into the AI stack service list
- Existing containers auto-detected and pre-ticked ON
- MCP dependency on RAG enforced automatically with a warning
- COMPOSE_SERVICES, Done URLs, and summary all driven by per-service
  SVC_* flags so only selected services are started/shown
- Text toggle fallback for systems without whiptail

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 00:33:14 +00:00
Claude 7953ba9d99 Add model selection wizard with speed estimates and origin preference
Replace fixed model defaults with an interactive wizard:

Origin preference:
  1) Western-only      — Codestral (Mistral 🇫🇷) · Phi4 · Mistral 7B
  2) Performance-first — Qwen2.5 + Qwen2.5-Coder (top benchmarks)
  3) Mixed             — Western chat/reasoning, Qwen for coding only
  4) Custom            — free-form model names

Size tier table — speed estimated for the user's actual VRAM with no
hard limits (Ollama already uses all available VRAM via NUM_GPU=999):
  ✓ fast  — fully in VRAM
  ~ good  — fits with small overhang (~reading speed)
  ✗ slow  — partial CPU offload
  ✗ very slow — heavy CPU offload

Recommended tier shown as suggestion based on VRAM, user can override.
pull-models.sh now bakes in the chosen model names at install time.
REASON_MODEL replaces hardcoded deepseek-r1:14b; skipped if empty or
same as chat model.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 00:23:11 +00:00
Claude 796a073c0a Add Docker/Compose always-check and SSH key import to AI stack setup
- Docker + Docker Compose check now runs on every invocation (not skipped
  on updates), installing if missing — ensures the stack can always run
- Added Docker Compose plugin install as fallback if compose is missing
- NVIDIA Container Toolkit check also always runs (not update-gated)
- Added SSH key import wizard question: import public keys from GitHub
  (gh:username) and/or Launchpad (lp:username) using ssh-import-id,
  so the machine is accessible over SSH immediately after setup

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-20 22:22:02 +00:00
Claude 45dfa58d93 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
2026-03-20 22:03:49 +00:00
Claude 92f5d886c7 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
2026-03-20 22:01:27 +00:00
Outis 3e508401f8 Merge pull request #5 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-20 17:42:22 -04:00
Claude 5da719b1d0 Remove ChromaDB healthcheck, use service_started for depends_on
Healthcheck tools (wget/curl) are not reliably available in the
chromadb image. Removing the healthcheck and switching rag-server
depends_on to service_started avoids the unhealthy container error.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-20 21:40:22 +00:00
Claude a815a3555e Add interactive component menu and fix ChromaDB healthcheck
- 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
2026-03-20 21:37:58 +00:00