Wire in GPU optimizations and Gitea↔GitHub sync
Ollama config (all 3 setup scripts): - Models updated from Qwen 2.5 → Qwen 3.5 series (Feb 2026) - Auto-detect multi-GPU: TOTAL_VRAM = per-card × count - KV cache quantization (q8_0) + flash attention enabled by default - Context windows scaled by total VRAM (4K→128K) - RAG server CHAT_MODEL now uses detected model variable Gitea↔GitHub sync (new): - gitea-github-sync.sh: bidirectional mirror with --init wizard - Modes: --pull-only, --push-only, --list (dry run), --repo single - Auto-discovers repos from both platforms via API - Systemd timer: --install-timer [interval] for scheduled sync - MCP tool: gitea_github_sync() for on-demand from Claude/WebUI - Sync script mounted read-only into mcp-server container - .env gets GITEA_URL variable for sync script - curl added to mcp-server container deps https://claude.ai/code/session_01PtYTPherSJaxDEVPgF6Nxu
This commit is contained in:
+70
-44
@@ -39,30 +39,42 @@ LOCAL_IP=$(ip route get 1.1.1.1 2>/dev/null | grep -oP 'src \K\S+' \
|
||||
|
||||
# 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"
|
||||
CHAT_MODEL="qwen3.5:9b"
|
||||
CODE_MODEL="qwen3.5:9b"
|
||||
FAST_MODEL="qwen3.5:4b"
|
||||
|
||||
# ── 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_COUNT=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | wc -l || echo "0")
|
||||
GPU_NAME=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1 || echo "None")
|
||||
TOTAL_VRAM=$((VRAM_GB * GPU_COUNT))
|
||||
|
||||
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"
|
||||
# Ollama optimization flags (stacked — see docs/gpu-setup-research.md)
|
||||
OLLAMA_KV_CACHE="q8_0" # halves KV cache VRAM (q4_0 for aggressive)
|
||||
OLLAMA_FLASH="1" # flash attention: less VRAM, no quality loss
|
||||
|
||||
if [[ "$TOTAL_VRAM" -ge 40 ]]; then
|
||||
CHAT_MODEL="qwen3.5:27b"; CODE_MODEL="qwen3.5:27b"
|
||||
CTX=131072; GPU_TIER="${TOTAL_VRAM}GB VRAM — 27B dense, 128K context"
|
||||
elif [[ "$TOTAL_VRAM" -ge 28 ]]; then
|
||||
CHAT_MODEL="qwen3.5-35b-a3b"; CODE_MODEL="qwen3.5-35b-a3b"
|
||||
CTX=131072; GPU_TIER="${TOTAL_VRAM}GB VRAM — 35B MoE, 128K context"
|
||||
elif [[ "$TOTAL_VRAM" -ge 14 ]]; then
|
||||
CHAT_MODEL="qwen3.5-35b-a3b"; CODE_MODEL="qwen3.5-35b-a3b"
|
||||
CTX=65536; GPU_TIER="${TOTAL_VRAM}GB VRAM — 35B MoE + KV quant, 64K context"
|
||||
elif [[ "$TOTAL_VRAM" -ge 8 ]]; then
|
||||
CHAT_MODEL="qwen3.5:9b"; CODE_MODEL="qwen3.5:9b"
|
||||
CTX=32768; GPU_TIER="${TOTAL_VRAM}GB VRAM — 9B dense, 32K context"
|
||||
elif [[ "$TOTAL_VRAM" -ge 4 ]]; then
|
||||
CHAT_MODEL="qwen3.5:4b"; CODE_MODEL="qwen3.5:4b"
|
||||
CTX=16384; GPU_TIER="${TOTAL_VRAM}GB VRAM — 4B models, 16K context"
|
||||
elif [[ "$TOTAL_VRAM" -gt 0 ]]; then
|
||||
CHAT_MODEL="qwen3.5:4b"; CODE_MODEL="qwen3.5:4b"
|
||||
CTX=8192; GPU_TIER="${TOTAL_VRAM}GB VRAM — 4B models"
|
||||
else
|
||||
CHAT_MODEL="qwen2.5:7b"; CODE_MODEL="qwen2.5-coder:7b"
|
||||
GPU_TIER="CPU only — 7B models (slow)"
|
||||
CHAT_MODEL="qwen3.5:4b"; CODE_MODEL="qwen3.5:4b"
|
||||
CTX=4096; OLLAMA_KV_CACHE="q4_0"; GPU_TIER="CPU only — 4B models (slow)"
|
||||
fi
|
||||
|
||||
# ── new vs update ─────────────────────────────────────────────────────────────
|
||||
@@ -485,19 +497,19 @@ if $INSTALL_AI; then
|
||||
printf " %-4s %-8s %-42s %s\n" "3)" "22B" "phi4:14b + codestral:22b" "$(speed_label 13)"
|
||||
printf " %-4s %-8s %-42s %s\n" "4)" "70B" "llama3.3:70b + codestral:22b" "$(speed_label 41)"
|
||||
;;
|
||||
2) # Performance
|
||||
_TIER_NAMES=(7B 14B 32B 72B)
|
||||
printf " %-4s %-8s %-42s %s\n" "1)" "7B" "qwen2.5:7b + qwen2.5-coder:7b" "$(speed_label 4)"
|
||||
printf " %-4s %-8s %-42s %s\n" "2)" "14B" "qwen2.5:14b + qwen2.5-coder:14b" "$(speed_label 9)"
|
||||
printf " %-4s %-8s %-42s %s\n" "3)" "32B" "qwen2.5:14b + qwen2.5-coder:32b" "$(speed_label 19)"
|
||||
printf " %-4s %-8s %-42s %s\n" "4)" "72B" "qwen2.5:72b + qwen2.5-coder:32b" "$(speed_label 41)"
|
||||
2) # Performance (Qwen 3.5 — Feb 2026)
|
||||
_TIER_NAMES=(4B 9B 35B 27B)
|
||||
printf " %-4s %-8s %-42s %s\n" "1)" "4B" "qwen3.5:4b (chat+code)" "$(speed_label 2)"
|
||||
printf " %-4s %-8s %-42s %s\n" "2)" "9B" "qwen3.5:9b (chat+code)" "$(speed_label 5)"
|
||||
printf " %-4s %-8s %-42s %s\n" "3)" "35B" "qwen3.5-35b-a3b (MoE, 3B active)" "$(speed_label 12)"
|
||||
printf " %-4s %-8s %-42s %s\n" "4)" "27B" "qwen3.5:27b (dense, A- quality)" "$(speed_label 17)"
|
||||
;;
|
||||
3) # Mixed
|
||||
_TIER_NAMES=(7B 14B 32B 70B)
|
||||
printf " %-4s %-8s %-42s %s\n" "1)" "7B" "mistral:7b + qwen2.5-coder:7b" "$(speed_label 4)"
|
||||
printf " %-4s %-8s %-42s %s\n" "2)" "14B" "phi4:14b + qwen2.5-coder:14b" "$(speed_label 9)"
|
||||
printf " %-4s %-8s %-42s %s\n" "3)" "32B" "phi4:14b + qwen2.5-coder:32b" "$(speed_label 19)"
|
||||
printf " %-4s %-8s %-42s %s\n" "4)" "70B" "llama3.3:70b + qwen2.5-coder:32b" "$(speed_label 41)"
|
||||
3) # Mixed (Western chat + Qwen 3.5 code)
|
||||
_TIER_NAMES=(7B 14B 35B 70B)
|
||||
printf " %-4s %-8s %-42s %s\n" "1)" "7B" "mistral:7b + qwen3.5:4b" "$(speed_label 4)"
|
||||
printf " %-4s %-8s %-42s %s\n" "2)" "14B" "phi4:14b + qwen3.5:9b" "$(speed_label 9)"
|
||||
printf " %-4s %-8s %-42s %s\n" "3)" "35B" "phi4:14b + qwen3.5-35b-a3b" "$(speed_label 19)"
|
||||
printf " %-4s %-8s %-42s %s\n" "4)" "70B" "llama3.3:70b + qwen3.5-35b-a3b" "$(speed_label 41)"
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -535,16 +547,16 @@ if $INSTALL_AI; then
|
||||
1:14B) FAST_MODEL="mistral:7b"; CHAT_MODEL="phi4:14b"; CODE_MODEL="starcoder2:15b"; REASON_MODEL="phi4:14b" ;;
|
||||
1:22B) FAST_MODEL="mistral:7b"; CHAT_MODEL="phi4:14b"; CODE_MODEL="codestral:22b"; REASON_MODEL="phi4:14b" ;;
|
||||
1:70B) FAST_MODEL="mistral:7b"; CHAT_MODEL="llama3.3:70b"; CODE_MODEL="codestral:22b"; REASON_MODEL="llama3.3:70b" ;;
|
||||
# Performance-first
|
||||
2:7B) FAST_MODEL="qwen2.5:7b"; CHAT_MODEL="qwen2.5:7b"; CODE_MODEL="qwen2.5-coder:7b"; REASON_MODEL="" ;;
|
||||
2:14B) FAST_MODEL="qwen2.5:7b"; CHAT_MODEL="qwen2.5:14b"; CODE_MODEL="qwen2.5-coder:14b"; REASON_MODEL="deepseek-r1:14b" ;;
|
||||
2:32B) FAST_MODEL="qwen2.5:7b"; CHAT_MODEL="qwen2.5:14b"; CODE_MODEL="qwen2.5-coder:32b"; REASON_MODEL="deepseek-r1:14b" ;;
|
||||
2:72B) FAST_MODEL="qwen2.5:7b"; CHAT_MODEL="qwen2.5:72b"; CODE_MODEL="qwen2.5-coder:32b"; REASON_MODEL="deepseek-r1:14b" ;;
|
||||
# Mixed
|
||||
3:7B) FAST_MODEL="mistral:7b"; CHAT_MODEL="mistral:7b"; CODE_MODEL="qwen2.5-coder:7b"; REASON_MODEL="" ;;
|
||||
3:14B) FAST_MODEL="mistral:7b"; CHAT_MODEL="phi4:14b"; CODE_MODEL="qwen2.5-coder:14b"; REASON_MODEL="phi4:14b" ;;
|
||||
3:32B) FAST_MODEL="mistral:7b"; CHAT_MODEL="phi4:14b"; CODE_MODEL="qwen2.5-coder:32b"; REASON_MODEL="phi4:14b" ;;
|
||||
3:70B) FAST_MODEL="mistral:7b"; CHAT_MODEL="llama3.3:70b"; CODE_MODEL="qwen2.5-coder:32b"; REASON_MODEL="llama3.3:70b" ;;
|
||||
# Performance-first (Qwen 3.5)
|
||||
2:4B) FAST_MODEL="qwen3.5:4b"; CHAT_MODEL="qwen3.5:4b"; CODE_MODEL="qwen3.5:4b"; REASON_MODEL="" ;;
|
||||
2:9B) FAST_MODEL="qwen3.5:4b"; CHAT_MODEL="qwen3.5:9b"; CODE_MODEL="qwen3.5:9b"; REASON_MODEL="" ;;
|
||||
2:35B) FAST_MODEL="qwen3.5:4b"; CHAT_MODEL="qwen3.5-35b-a3b"; CODE_MODEL="qwen3.5-35b-a3b"; REASON_MODEL="" ;;
|
||||
2:27B) FAST_MODEL="qwen3.5:9b"; CHAT_MODEL="qwen3.5:27b"; CODE_MODEL="qwen3.5:27b"; REASON_MODEL="" ;;
|
||||
# Mixed (Western chat + Qwen 3.5 code)
|
||||
3:7B) FAST_MODEL="mistral:7b"; CHAT_MODEL="mistral:7b"; CODE_MODEL="qwen3.5:4b"; REASON_MODEL="" ;;
|
||||
3:14B) FAST_MODEL="mistral:7b"; CHAT_MODEL="phi4:14b"; CODE_MODEL="qwen3.5:9b"; REASON_MODEL="phi4:14b" ;;
|
||||
3:35B) FAST_MODEL="mistral:7b"; CHAT_MODEL="phi4:14b"; CODE_MODEL="qwen3.5-35b-a3b"; REASON_MODEL="phi4:14b" ;;
|
||||
3:70B) FAST_MODEL="mistral:7b"; CHAT_MODEL="llama3.3:70b"; CODE_MODEL="qwen3.5-35b-a3b"; REASON_MODEL="llama3.3:70b" ;;
|
||||
*)
|
||||
warn "Unrecognised tier '$TIER_PICK' — keeping detected defaults"
|
||||
;;
|
||||
@@ -763,8 +775,11 @@ WEBUI_URL=
|
||||
# Gitea — generate at http://$LOCAL_IP:3001/user/settings/applications
|
||||
GITEA_TOKEN=your-gitea-token-here
|
||||
|
||||
# GitHub — optional, for GitHub API access via MCP
|
||||
# GitHub — optional, for GitHub API access via MCP and Gitea↔GitHub sync
|
||||
GITHUB_TOKEN=your-github-token-here
|
||||
|
||||
# Gitea URL — used by sync script (default: http://localhost:3001)
|
||||
GITEA_URL=http://$LOCAL_IP:3001
|
||||
ENV
|
||||
ok "Created .env — add your tokens before using MCP Gitea/GitHub tools"
|
||||
else
|
||||
@@ -816,10 +831,12 @@ services:
|
||||
volumes:
|
||||
${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
|
||||
- OLLAMA_NUM_GPU=999 # use all available VRAM (auto-detects GPU size)
|
||||
- OLLAMA_NUM_CTX=$CTX # auto-set by detected VRAM
|
||||
- OLLAMA_KEEP_ALIVE=24h
|
||||
- OLLAMA_MAX_LOADED_MODELS=1
|
||||
- OLLAMA_KV_CACHE_TYPE=$OLLAMA_KV_CACHE # q8_0 halves KV cache; q4_0 = 1/3 size
|
||||
- OLLAMA_FLASH_ATTENTION=$OLLAMA_FLASH # tiled attention: less VRAM, no quality loss
|
||||
deploy:
|
||||
resources:
|
||||
reservations:
|
||||
@@ -885,7 +902,7 @@ ${OLLAMA_VOLUME_LINE}
|
||||
- OLLAMA_URL=http://ollama:11434
|
||||
- CHROMA_URL=http://chromadb:8000
|
||||
- EMBED_MODEL=nomic-embed-text
|
||||
- CHAT_MODEL=qwen2.5:14b
|
||||
- CHAT_MODEL=$CHAT_MODEL
|
||||
- PAPERS_DIR=/papers
|
||||
- REPOS_DIR=/repos
|
||||
command: >
|
||||
@@ -913,6 +930,7 @@ ${OLLAMA_VOLUME_LINE}
|
||||
- $BASE/repos:/repos
|
||||
- $BASE/mcp_server.py:/app/mcp_server.py
|
||||
- $BASE/mcp_requirements.txt:/app/mcp_requirements.txt
|
||||
- $SCRIPT_DIR/gitea-github-sync.sh:/app/gitea-github-sync.sh:ro
|
||||
working_dir: /app
|
||||
env_file: $BASE/.env
|
||||
environment:
|
||||
@@ -922,7 +940,7 @@ ${OLLAMA_VOLUME_LINE}
|
||||
- RAG_URL=http://rag-server:8001
|
||||
command: >
|
||||
bash -c "apt-get update -qq &&
|
||||
apt-get install -y --no-install-recommends git ripgrep &&
|
||||
apt-get install -y --no-install-recommends git ripgrep curl &&
|
||||
pip install --no-cache-dir -r mcp_requirements.txt &&
|
||||
python mcp_server.py"
|
||||
depends_on:
|
||||
@@ -1360,6 +1378,14 @@ if $INSTALL_AI; then
|
||||
echo -e " ${YELLOW}Add API tokens to:${NC} $BASE/.env"
|
||||
$SVC_RAG && echo -e " ${YELLOW}Drop PDFs into:${NC} $BASE/papers/"
|
||||
echo -e " ${YELLOW}Your workspace:${NC} $BASE/workspace/"
|
||||
$SVC_GITEA && {
|
||||
echo ""
|
||||
echo -e " ${YELLOW}Gitea ↔ GitHub sync:${NC}"
|
||||
echo " First time: $SCRIPT_DIR/gitea-github-sync.sh --init"
|
||||
echo " Sync now: $SCRIPT_DIR/gitea-github-sync.sh"
|
||||
echo " Auto (6h): $SCRIPT_DIR/gitea-github-sync.sh --install-timer"
|
||||
echo " Via MCP: gitea_github_sync(mode='all')"
|
||||
}
|
||||
fi
|
||||
if $SVC_KIWIX && [[ "$ZIM_CHOICE" == "3" ]]; then
|
||||
echo -e " ${YELLOW}ZIM downloads:${NC} ./kiwix_download.sh (not started)"
|
||||
|
||||
Reference in New Issue
Block a user