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
This commit is contained in:
+24
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by setup scripts — not tracked
|
||||||
|
docker-compose.yml
|
||||||
|
.env
|
||||||
|
requirements.txt
|
||||||
|
mcp_requirements.txt
|
||||||
|
start.sh
|
||||||
|
stop.sh
|
||||||
|
status.sh
|
||||||
|
pull-models.sh
|
||||||
|
Caddyfile.example
|
||||||
|
.ufw-done
|
||||||
|
|
||||||
|
# Data directories
|
||||||
|
workspace/
|
||||||
|
repos/
|
||||||
|
papers/
|
||||||
|
index/
|
||||||
|
logs/
|
||||||
|
kiwix/
|
||||||
|
gitea/
|
||||||
|
portainer-data/
|
||||||
|
invokeai-data/
|
||||||
|
invokeai-outputs/
|
||||||
|
searxng/
|
||||||
@@ -34,7 +34,7 @@ LEVEL="moderate"
|
|||||||
DISABLE_CATS=""
|
DISABLE_CATS=""
|
||||||
DISABLE_ENGINES_EXTRA=""
|
DISABLE_ENGINES_EXTRA=""
|
||||||
ENABLE_ENGINES_EXTRA=""
|
ENABLE_ENGINES_EXTRA=""
|
||||||
BASE="${BASE:-$HOME/docker/ai-stack}"
|
BASE="${BASE:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
|
||||||
|
|
||||||
# ── Parse arguments ───────────────────────────────────────────────────────────
|
# ── Parse arguments ───────────────────────────────────────────────────────────
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
|||||||
warn() { echo -e "${YELLOW}[!!]${NC} $*"; }
|
warn() { echo -e "${YELLOW}[!!]${NC} $*"; }
|
||||||
die() { echo -e "${RED}[ERR]${NC} $*"; exit 1; }
|
die() { echo -e "${RED}[ERR]${NC} $*"; exit 1; }
|
||||||
|
|
||||||
BASE="$HOME/docker/ai-stack"
|
BASE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
COMPOSE="$BASE/docker-compose.yml"
|
COMPOSE="$BASE/docker-compose.yml"
|
||||||
|
|
||||||
[[ -f "$COMPOSE" ]] || die "docker-compose.yml not found at $BASE — run local-ai-setup.sh first"
|
[[ -f "$COMPOSE" ]] || die "docker-compose.yml not found at $BASE — run local-ai-setup.sh first"
|
||||||
|
|||||||
+17
-2
@@ -31,8 +31,8 @@ FORCE=false
|
|||||||
for arg in "$@"; do [[ "$arg" == "--force" ]] && FORCE=true; done
|
for arg in "$@"; do [[ "$arg" == "--force" ]] && FORCE=true; done
|
||||||
|
|
||||||
# ── config ────────────────────────────────────────────────────────────────────
|
# ── config ────────────────────────────────────────────────────────────────────
|
||||||
BASE="$HOME/docker/ai-stack"
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
BASE="$SCRIPT_DIR"
|
||||||
LOCAL_IP=$(ip route get 1.1.1.1 2>/dev/null | grep -oP 'src \K\S+' \
|
LOCAL_IP=$(ip route get 1.1.1.1 2>/dev/null | grep -oP 'src \K\S+' \
|
||||||
|| hostname -I | awk '{print $1}')
|
|| hostname -I | awk '{print $1}')
|
||||||
[[ -z "$LOCAL_IP" ]] && read -rp "Enter your LAN IP: " LOCAL_IP
|
[[ -z "$LOCAL_IP" ]] && read -rp "Enter your LAN IP: " LOCAL_IP
|
||||||
@@ -1033,8 +1033,23 @@ fi
|
|||||||
# Always written — it's the stack definition and safe to update
|
# Always written — it's the stack definition and safe to update
|
||||||
cat > "$BASE/docker-compose.yml" << COMPOSE
|
cat > "$BASE/docker-compose.yml" << COMPOSE
|
||||||
# Local AI Stack — generated $(date '+%Y-%m-%d')
|
# Local AI Stack — generated $(date '+%Y-%m-%d')
|
||||||
# Edit \$BASE/.env to add API tokens.
|
# Edit .env in this folder to add API tokens.
|
||||||
# GPU: OLLAMA_NUM_GPU=999 means "use all available VRAM" — auto-adapts to any GPU.
|
# GPU: OLLAMA_NUM_GPU=999 means "use all available VRAM" — auto-adapts to any GPU.
|
||||||
|
#
|
||||||
|
# ── Common commands (run from this folder) ─────────────────────────────────────
|
||||||
|
# Start everything: docker compose up -d
|
||||||
|
# Stop everything: docker compose down
|
||||||
|
# Restart one service: docker compose restart <service>
|
||||||
|
# Stop one service: docker compose stop <service>
|
||||||
|
# Start one service: docker compose up -d <service>
|
||||||
|
# Follow all logs: docker compose logs -f
|
||||||
|
# Follow one service logs: docker compose logs -f <service>
|
||||||
|
# Pull latest images: docker compose pull && docker compose up -d
|
||||||
|
# Show status: docker compose ps
|
||||||
|
#
|
||||||
|
# Services: ollama open-webui chromadb rag-server mcp-server
|
||||||
|
# searxng kiwix gitea invokeai portainer
|
||||||
|
# ───────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|
||||||
|
|||||||
+17
-2
@@ -13,8 +13,8 @@ section() { echo -e "\n${BOLD}━━━ $* ━━━${NC}"; }
|
|||||||
FORCE=false; NO_PULL=false
|
FORCE=false; NO_PULL=false
|
||||||
for a in "$@"; do [[ "$a" == "--force" ]] && FORCE=true; [[ "$a" == "--no-pull" ]] && NO_PULL=true; done
|
for a in "$@"; do [[ "$a" == "--force" ]] && FORCE=true; [[ "$a" == "--no-pull" ]] && NO_PULL=true; done
|
||||||
|
|
||||||
BASE="$HOME/docker/ai-stack"
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
BASE="$SCRIPT_DIR"
|
||||||
LOCAL_IP=$(ip route get 1.1.1.1 2>/dev/null | grep -oP 'src \K\S+' || hostname -I | awk '{print $1}')
|
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 LAN IP: " LOCAL_IP
|
[[ -z "$LOCAL_IP" ]] && read -rp "Enter LAN IP: " LOCAL_IP
|
||||||
|
|
||||||
@@ -720,9 +720,24 @@ fi
|
|||||||
section "Docker Compose"
|
section "Docker Compose"
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
cat > "$BASE/docker-compose.yml" << COMPOSE
|
cat > "$BASE/docker-compose.yml" << COMPOSE
|
||||||
# Local AI Stack — 2026-03-20
|
# Local AI Stack — generated $(date '+%Y-%m-%d')
|
||||||
# GPU: OLLAMA_NUM_GPU=999 uses all available VRAM automatically (V100/RTX/any)
|
# GPU: OLLAMA_NUM_GPU=999 uses all available VRAM automatically (V100/RTX/any)
|
||||||
# Context: OLLAMA_NUM_CTX= set by detected VRAM (GB)
|
# Context: OLLAMA_NUM_CTX= set by detected VRAM (GB)
|
||||||
|
#
|
||||||
|
# ── Common commands (run from this folder) ─────────────────────────────────────
|
||||||
|
# Start everything: docker compose up -d
|
||||||
|
# Stop everything: docker compose down
|
||||||
|
# Restart one service: docker compose restart <service>
|
||||||
|
# Stop one service: docker compose stop <service>
|
||||||
|
# Start one service: docker compose up -d <service>
|
||||||
|
# Follow all logs: docker compose logs -f
|
||||||
|
# Follow one service logs: docker compose logs -f <service>
|
||||||
|
# Pull latest images: docker compose pull && docker compose up -d
|
||||||
|
# Show status: docker compose ps
|
||||||
|
#
|
||||||
|
# Services: ollama open-webui chromadb rag-server mcp-server
|
||||||
|
# searxng kiwix gitea invokeai portainer
|
||||||
|
# ───────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user