From 074ab05908d8c6747e289e9d0ec4f9220df4a636 Mon Sep 17 00:00:00 2001 From: Kenji Morishige Date: Mon, 23 Feb 2026 19:53:49 -0600 Subject: [PATCH] adding ollama installer --- README.md | 80 +++++++++++++++++ scripts/bootstrap_ollama_linux.sh | 40 +++++++++ scripts/bootstrap_ollama_mac.sh | 41 +++++++++ scripts/ollama_detect_and_link.sh | 53 +++++++++++ scripts/ollama_tmux.sh | 144 ++++++++++++++++++++++++++++++ 5 files changed, 358 insertions(+) create mode 100755 scripts/bootstrap_ollama_linux.sh create mode 100755 scripts/bootstrap_ollama_mac.sh create mode 100755 scripts/ollama_detect_and_link.sh create mode 100755 scripts/ollama_tmux.sh diff --git a/README.md b/README.md index b1744e3..212a6d5 100644 --- a/README.md +++ b/README.md @@ -356,3 +356,83 @@ To add manually: sudo tmutil addexclusion ~/data/raw sudo tmutil addexclusion ~/models ``` + +**Ollama Bootstrap & Usage** + +- **Bootstrap (macOS)**: Run the macOS installer/check + create model folders: + + ```bash + bash scripts/bootstrap_ollama_mac.sh + ``` + +- **Bootstrap (Linux)**: Run the Linux helper (attempts to detect package manager and prepares model folders): + + ```bash + bash scripts/bootstrap_ollama_linux.sh + ``` + +- The scripts create the model directory referenced by the setup script as `OLLAMA_MODELS` (by default `$HOME/models/ollama`). + +- Start the Ollama server inside a tmux session (helper functions): + + ```bash + # Load helper functions (one-liner to source from dotfiles workspace) + source scripts/ollama_tmux.sh + + # Start the server in a detached tmux session named 'ollama' (default command): + start_ollama_tmux + + # To attach to the session: + tmux attach -t ollama + + # To stop the server session: + stop_ollama_tmux + ``` + +- Model management (two simple options): + + - Pull a remote model (via the `ollama` CLI): + + ```bash + # example: pull a model by reference + pull_ollama_model + ``` + + - Import or stage a local model into the $OLLAMA_MODELS path (creates a symlink): + + ```bash + import_local_model /path/to/local/model-dir-or-file + # The helper will link it into the directory created by setup_enterprise_ai_bash.sh + ``` + +- Scripts referenced: + + - [scripts/bootstrap_ollama_mac.sh](scripts/bootstrap_ollama_mac.sh) + - [scripts/bootstrap_ollama_linux.sh](scripts/bootstrap_ollama_linux.sh) + - [scripts/ollama_tmux.sh](scripts/ollama_tmux.sh) + +- How to use Ollama from other AI applications: + + - Run the server with `start_ollama_tmux` (above). By default the helper uses `ollama serve --host 127.0.0.1 --port 11434`. + - Many client apps can be pointed at the local Ollama HTTP API (default: `http://127.0.0.1:11434`). Check the Ollama docs for exact endpoints and payloads. + - Example using the `ollama` CLI to run a model directly from scripts or other programs: + + ```bash + # Run a model locally (interactive / CLI). Replace with the model name. + ollama run --prompt "Write a short haiku about trees" + ``` + + - Example (generic) using HTTP from another application (replace endpoint/payload per Ollama docs): + + ```bash + curl -X POST "http://127.0.0.1:11434/api/generate" \ + -H "Content-Type: application/json" \ + -d '{"model":"","prompt":"Hello from my app"}' + ``` + + - When integrating from other AI tooling, supply the Ollama host/port (e.g. `OLLAMA_URL=http://127.0.0.1:11434`) or call the `ollama` CLI directly from the application process. + +If you want, I can also: + +- Make the new scripts executable (`chmod +x`) automatically in the repo +- Attempt to detect the Ollama default model storage path and auto-configure a symlink diff --git a/scripts/bootstrap_ollama_linux.sh b/scripts/bootstrap_ollama_linux.sh new file mode 100755 index 0000000..098ebfe --- /dev/null +++ b/scripts/bootstrap_ollama_linux.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "🔧 Ollama Linux bootstrap — starting" + +# Load environment (MODEL_ROOT, OLLAMA_MODELS) +# Temporarily disable "nounset" when sourcing user shell files to avoid +# failures from system /etc/bashrc referencing undefined vars like PS1. +if [ -f "$HOME/.bashrc" ]; then + set +u + # shellcheck disable=SC1091 + source "$HOME/.bashrc" || true + set -u +fi + +: "${OLLAMA_MODELS:=$HOME/models/ollama}" +mkdir -p "$OLLAMA_MODELS" + +if command -v ollama >/dev/null 2>&1; then + echo "✅ ollama already installed: $(ollama version 2>/dev/null || echo 'unknown')" +else + echo "â„šī¸ Attempting to install ollama on Linux" + if command -v apt-get >/dev/null 2>&1; then + echo "Using apt to install prerequisites..." + sudo apt-get update -y || true + sudo apt-get install -y ca-certificates curl gnupg lsb-release || true + echo "âš ī¸ Please follow the official ollama Linux install instructions if a package is not available: https://ollama.com/docs/install" + echo "If you have a .deb from Ollama, install it with: sudo dpkg -i " + elif command -v dnf >/dev/null 2>&1; then + echo "Using dnf; please refer to Ollama docs for distro-specific instructions: https://ollama.com/docs/install" + else + echo "âš ī¸ Could not detect package manager. Please install ollama manually. See: https://ollama.com/docs/install" + fi +fi + +echo "📁 Ensuring model directory exists: $OLLAMA_MODELS" +mkdir -p "$OLLAMA_MODELS" + +echo "✅ Linux Ollama bootstrap complete." +echo "Next steps: run scripts/ollama_tmux.sh to start the server in tmux, and place models under $OLLAMA_MODELS" diff --git a/scripts/bootstrap_ollama_mac.sh b/scripts/bootstrap_ollama_mac.sh new file mode 100755 index 0000000..6eefc37 --- /dev/null +++ b/scripts/bootstrap_ollama_mac.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "🔧 Ollama macOS bootstrap — starting" + +# Load environment (MODEL_ROOT, OLLAMA_MODELS) +# Temporarily disable "nounset" when sourcing user shell files to avoid +# failures from system /etc/bashrc referencing undefined vars like PS1. +if [ -f "$HOME/.bashrc" ]; then + set +u + # shellcheck disable=SC1091 + source "$HOME/.bashrc" || true + set -u +fi + +: "${OLLAMA_MODELS:=$HOME/models/ollama}" +mkdir -p "$OLLAMA_MODELS" + +if command -v ollama >/dev/null 2>&1; then + echo "✅ ollama already installed: $(ollama version 2>/dev/null || echo 'unknown')" +else + if command -v brew >/dev/null 2>&1; then + echo "đŸē Installing ollama via Homebrew..." + brew update || true + brew install ollama || { + echo "âš ī¸ Homebrew install failed. See https://ollama.com/docs/install" + exit 1 + } + echo "✅ ollama installed" + else + echo "âš ī¸ Homebrew not found. Install Homebrew first: https://brew.sh" + echo "Then re-run this script: $0" + exit 2 + fi +fi + +echo "📁 Ensuring model directory exists: $OLLAMA_MODELS" +mkdir -p "$OLLAMA_MODELS" + +echo "✅ macOS Ollama bootstrap complete." +echo "Next steps: run scripts/ollama_tmux.sh to start the server in tmux, and place models under $OLLAMA_MODELS" diff --git a/scripts/ollama_detect_and_link.sh b/scripts/ollama_detect_and_link.sh new file mode 100755 index 0000000..d968549 --- /dev/null +++ b/scripts/ollama_detect_and_link.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "🔍 Detecting Ollama model directories and linking into OLLAMA_MODELS" + +# Load env if available +if [ -f "$HOME/.bashrc" ]; then + set +u + # shellcheck disable=SC1091 + source "$HOME/.bashrc" || true + set -u +fi + +OLLAMA_MODELS="${OLLAMA_MODELS:-$HOME/models/ollama}" +mkdir -p "$OLLAMA_MODELS" + +candidates=( + "$HOME/.ollama/models" + "$HOME/.local/share/ollama/models" + "/var/lib/ollama/models" + "/usr/local/var/ollama/models" + "$HOME/.ollama" +) + +linked=0 +for cand in "${candidates[@]}"; do + if [ -d "$cand" ]; then + # skip empty directories + if [ -z "$(ls -A "$cand" 2>/dev/null)" ]; then + echo "â„šī¸ Found $cand but it's empty — skipping" + continue + fi + + name=$(basename "$cand") + dest="$OLLAMA_MODELS/$name" + if [ -e "$dest" ]; then + echo "â„šī¸ Destination exists: $dest — skipping" + continue + fi + ln -sfn "$cand" "$dest" + echo "✅ Linked $cand → $dest" + linked=$((linked+1)) + fi +done + +if [ $linked -eq 0 ]; then + echo "âš ī¸ No existing Ollama model directories detected in common locations." + echo "You can place models in: $OLLAMA_MODELS or run: pull_ollama_model (see scripts/ollama_tmux.sh)" +else + echo "🎉 Completed linking ($linked). Verify with: ls -la $OLLAMA_MODELS" +fi + +echo "Done." diff --git a/scripts/ollama_tmux.sh b/scripts/ollama_tmux.sh new file mode 100755 index 0000000..7681886 --- /dev/null +++ b/scripts/ollama_tmux.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Ollama tmux helper and model utilities +# Source this file or call functions directly: source scripts/ollama_tmux.sh + +# Ensure environment variables exist +if [ -f "$HOME/.bashrc" ]; then + set +u + # shellcheck disable=SC1091 + source "$HOME/.bashrc" || true + set -u +fi +: "${OLLAMA_MODELS:=$HOME/models/ollama}" + +start_ollama_tmux() { + session="ollama" + # Use provided command or sensible default. Ollama uses env vars (OLLAMA_HOST) + # Example: OLLAMA_HOST=0.0.0.0:11434 ollama serve + default_cmd="${OLLAMA_CMD:-ollama serve}" + cmd="${1:-$default_cmd}" + echo "Using command: $cmd" + if [ -n "${OLLAMA_HOST:-}" ]; then + echo "OLLAMA_HOST is set to: $OLLAMA_HOST" + fi + + if ! command -v tmux >/dev/null 2>&1; then + echo "âš ī¸ tmux not installed. Install tmux and re-run." + return 2 + fi + + # Create models dir if needed + mkdir -p "$OLLAMA_MODELS" + + if tmux has-session -t "$session" 2>/dev/null; then + echo "â„šī¸ tmux session '$session' already running. Attach with: tmux attach -t $session" + return 0 + fi + + echo "🔁 Starting ollama in tmux session '$session' with command: $cmd" + tmux new-session -d -s "$session" "$cmd" + sleep 0.5 + if tmux has-session -t "$session" 2>/dev/null; then + echo "✅ Started. Attach: tmux attach -t $session" + else + echo "❌ Failed to start tmux session. Check logs or run the command directly: $cmd" + return 1 + fi +} + +pull_ollama_model() { + if [ "$#" -lt 1 ]; then + echo "Usage: pull_ollama_model " + return 2 + fi + if ! command -v ollama >/dev/null 2>&1; then + echo "âš ī¸ ollama CLI not found. Install first." + return 3 + fi + model="$1" + echo "âŦ‡ī¸ Pulling model: $model" + ollama pull "$model" +} + +import_local_model() { + if [ "$#" -lt 1 ]; then + echo "Usage: import_local_model " + return 2 + fi + src="$1" + if [ ! -e "$src" ]; then + echo "âš ī¸ Source not found: $src" + return 3 + fi + mkdir -p "$OLLAMA_MODELS" + dest="$OLLAMA_MODELS/$(basename "$src")" + ln -sfn "$src" "$dest" + echo "🔗 Linked $src → $dest" + echo "Note: depending on your ollama installation you may need to reindex or use the ollama CLI to register the model." +} + +stop_ollama_tmux() { + session="ollama" + if tmux has-session -t "$session" 2>/dev/null; then + tmux kill-session -t "$session" + echo "🛑 Stopped tmux session '$session'" + else + echo "â„šī¸ No tmux session named '$session' running" + fi +} + +print_usage() { + cat < [args] + +Commands: + start [] Start ollama in tmux (optional command overrides default) + stop Stop the tmux session named 'ollama' + pull Pull a model using the ollama CLI + import Import/link a local model directory/file into OLLAMA_MODELS + help Show this help + +If you want to use these as shell functions, source this file instead: + source scripts/ollama_tmux.sh +EOF +} + +if [ "${BASH_SOURCE[0]}" == "${0}" ]; then + # Script executed directly; provide a simple CLI wrapper + cmd="${1:-}" + case "$cmd" in + start) + # shift and pass remaining args as the command + shift || true + start_ollama_tmux "$@" + exit $? + ;; + stop) + stop_ollama_tmux + exit $? + ;; + pull) + shift || true + pull_ollama_model "$@" + exit $? + ;; + import) + shift || true + import_local_model "$@" + exit $? + ;; + help|--help|-h|"") + print_usage + exit 0 + ;; + *) + echo "Unknown command: $cmd" + print_usage + exit 2 + ;; + esac +else + echo "Loaded ollama tmux helper. Functions: start_ollama_tmux, stop_ollama_tmux, pull_ollama_model, import_local_model" +fi