Initial commit: local SQL expert AI (Ollama + CLI + prompts + systemd timer)

This commit is contained in:
2026-01-27 21:30:15 +01:00
commit 394edc1709
18 changed files with 574 additions and 0 deletions

49
scripts/bootstrap.sh Executable file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cp -n "${ROOT}/.env.example" "${ROOT}/.env" || true
source "${ROOT}/.env"
ts(){ date -Is; }
log_dir="${ROOT}/logs"
mkdir -p "$log_dir"
log_file="${log_dir}/bootstrap-$(date -Iseconds).log"
exec > >(tee -a "$log_file") 2>&1
echo "[$(ts)] bootstrap: starting (ROOT=$ROOT)"
echo "[$(ts)] bootstrap: docker compose up -d"
docker compose -f "${ROOT}/docker-compose.yml" up -d
echo "[$(ts)] bootstrap: waiting for Ollama API at ${OLLAMA_URL} ..."
for i in {1..90}; do
if curl -sS "${OLLAMA_URL}/api/tags" >/dev/null 2>&1; then
echo "[$(ts)] bootstrap: Ollama API is up."
break
fi
if [[ $i -eq 90 ]]; then
echo "[$(ts)] bootstrap: ERROR: API did not come up in time."
exit 1
fi
sleep 1
done
echo "[$(ts)] bootstrap: pulling base model: ${BASE_MODEL}"
docker exec -it ollama ollama pull "${BASE_MODEL}"
if [[ -n "${EXTRA_MODELS:-}" ]]; then
for m in ${EXTRA_MODELS}; do
echo "[$(ts)] bootstrap: pulling extra model: $m"
docker exec -it ollama ollama pull "$m"
done
fi
echo "[$(ts)] bootstrap: building expert model: ${EXPERT_MODEL}"
tmp="$(mktemp)"
sed "s/\${BASE_MODEL}/${BASE_MODEL}/g" "${ROOT}/Modelfile" > "$tmp"
docker exec -i ollama ollama create "${EXPERT_MODEL}" -f - < "$tmp"
rm -f "$tmp"
echo "[$(ts)] bootstrap: done"
echo "[$(ts)] bootstrap: test:"
echo " echo "SELECT 1;" | ${ROOT}/bin/sqlai analyze-tsql"

48
scripts/update.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
source "${ROOT}/.env"
ts(){ date -Is; }
log_dir="${ROOT}/logs"
mkdir -p "$log_dir"
log_file="${log_dir}/update-$(date -Iseconds).log"
exec > >(tee -a "$log_file") 2>&1
echo "[$(ts)] update: starting (ROOT=$ROOT)"
echo "[$(ts)] update: pulling docker image(s)"
docker compose -f "${ROOT}/docker-compose.yml" pull
echo "[$(ts)] update: restarting services"
docker compose -f "${ROOT}/docker-compose.yml" up -d
echo "[$(ts)] update: waiting for Ollama API at ${OLLAMA_URL} ..."
for i in {1..90}; do
if curl -sS "${OLLAMA_URL}/api/tags" >/dev/null 2>&1; then
echo "[$(ts)] update: Ollama API is up."
break
fi
if [[ $i -eq 90 ]]; then
echo "[$(ts)] update: ERROR: API did not come up in time."
exit 1
fi
sleep 1
done
echo "[$(ts)] update: pulling base model: ${BASE_MODEL}"
docker exec -it ollama ollama pull "${BASE_MODEL}"
if [[ -n "${EXTRA_MODELS:-}" ]]; then
for m in ${EXTRA_MODELS}; do
echo "[$(ts)] update: pulling extra model: $m"
docker exec -it ollama ollama pull "$m"
done
fi
echo "[$(ts)] update: rebuilding expert model: ${EXPERT_MODEL}"
tmp="$(mktemp)"
sed "s/\${BASE_MODEL}/${BASE_MODEL}/g" "${ROOT}/Modelfile" > "$tmp"
docker exec -i ollama ollama create "${EXPERT_MODEL}" -f - < "$tmp"
rm -f "$tmp"
echo "[$(ts)] update: complete"