- Authentik -> edge2 CT 105 (Postgres pg_dump/restore; SECRET_KEY carried verbatim; zero-downtime until ~2s cutover) - Multi-block Caddy cutover: auth.echo6.co + notes.echo6.co outpost/forward_auth -> 100.64.0.36:9000 - runbook: add reboot tailscale-before-docker gotcha; clarify dnsmasq must NOT be repointed (points at Caddy host) - source left stopped + intact on Contabo as cold rollback Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
123 lines
4.6 KiB
Bash
Executable file
123 lines
4.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# bootstrap.sh — Echo6 Vault Engine setup
|
|
#
|
|
# Idempotent setup script. Safe to re-run; each step is guarded.
|
|
# Run from any directory. Script locates itself via SCRIPT_DIR.
|
|
#
|
|
# Steps:
|
|
# 1. Verify services reachable (ollama, TEI, qdrant)
|
|
# 2. [DISABLED] Pull base model (~8 GB) — enable when ready
|
|
# 3. [DISABLED] Build vault-tagger modelfile — depends on step 2
|
|
# 4. TODO: Install Python deps for lib/
|
|
# 5. TODO: Generate initial vocab (lib/vocab_gen.py)
|
|
# 6. TODO: Install git pre-commit hook
|
|
# 7. TODO: Install cron job from config.yaml schedule
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CONFIG="${SCRIPT_DIR}/config.yaml"
|
|
MODELFILE="${SCRIPT_DIR}/Modelfile"
|
|
|
|
echo "==> Echo6 Vault Engine bootstrap"
|
|
echo " engine_dir : ${SCRIPT_DIR}"
|
|
echo " config : ${CONFIG}"
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Step 1 — Verify services reachable
|
|
# ---------------------------------------------------------------------------
|
|
echo "[1/7] Checking service endpoints..."
|
|
|
|
check_endpoint() {
|
|
local name="$1"
|
|
local url="$2"
|
|
if curl -sf --max-time 5 "$url" > /dev/null 2>&1; then
|
|
echo " OK ${name} (${url})"
|
|
else
|
|
echo " FAIL ${name} (${url}) — is the service running?"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_endpoint "ollama" "http://localhost:11434"
|
|
check_endpoint "TEI/bge-m3" "http://localhost:8090/health"
|
|
check_endpoint "qdrant" "http://localhost:6333"
|
|
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Step 2 — Pull base model (DISABLED — enable when ready to pull ~8 GB)
|
|
# ---------------------------------------------------------------------------
|
|
# Uncomment the following block together with Step 3 when ready:
|
|
#
|
|
# echo "[2/7] Pulling base model qwen2.5:7b-instruct-q8_0..."
|
|
# ollama pull qwen2.5:7b-instruct-q8_0
|
|
# echo ""
|
|
|
|
echo "[2/7] SKIPPED — base model pull disabled. Uncomment in bootstrap.sh when ready."
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Step 3 — Build vault-tagger from Modelfile (DISABLED — depends on step 2)
|
|
# ---------------------------------------------------------------------------
|
|
# Uncomment together with Step 2:
|
|
#
|
|
# echo "[3/7] Building vault-tagger model from Modelfile..."
|
|
# ollama create vault-tagger -f "${MODELFILE}"
|
|
# echo ""
|
|
|
|
echo "[3/7] SKIPPED — vault-tagger build disabled. Uncomment after pulling base model."
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Step 4 — Python dependencies for lib/
|
|
# ---------------------------------------------------------------------------
|
|
# TODO (Step 2): Install Python deps once requirements.txt is written.
|
|
# DO NOT run pip install without explicit approval from Matt.
|
|
#
|
|
# Example (do NOT uncomment without approval):
|
|
# pip install -r "${SCRIPT_DIR}/requirements.txt"
|
|
|
|
echo "[4/7] TODO — Python deps not yet defined. See lib/ stubs. Do not pip install without approval."
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Step 5 — Generate initial vocab (entity lexicon)
|
|
# ---------------------------------------------------------------------------
|
|
# TODO (Step 3): Calls lib/vocab_gen.py to query proxmox/docker/headscale
|
|
# and write engine/vocab.json.
|
|
#
|
|
# Example:
|
|
# python3 "${SCRIPT_DIR}/lib/vocab_gen.py"
|
|
|
|
echo "[5/7] TODO — vocab_gen.py not yet implemented (Step 3)."
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Step 6 — Install git pre-commit hook
|
|
# ---------------------------------------------------------------------------
|
|
# TODO (Step 4): Symlink or copy a pre-commit hook that runs lint.py
|
|
# against staged vault docs before commit.
|
|
#
|
|
# Example:
|
|
# HOOK="${SCRIPT_DIR}/../../.git/hooks/pre-commit"
|
|
# ln -sf "${SCRIPT_DIR}/hooks/pre-commit" "${HOOK}"
|
|
|
|
echo "[6/7] TODO — git pre-commit hook not yet implemented (Step 4)."
|
|
echo ""
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Step 7 — Install cron job
|
|
# ---------------------------------------------------------------------------
|
|
# TODO (Step 6): Install cron from schedule.cron in config.yaml.
|
|
# Cron entry should call sweep.sh with appropriate guards.
|
|
#
|
|
# config.yaml schedule.cron: "0 9 * * *"
|
|
# Example crontab line:
|
|
# 0 9 * * * /home/zvx/projects/.ref/engine/sweep.sh >> /home/zvx/projects/.ref/engine/sweep.log 2>&1
|
|
|
|
echo "[7/7] TODO — cron job not yet installed (Step 6)."
|
|
echo ""
|
|
|
|
echo "==> bootstrap.sh complete (partial — disabled steps noted above)."
|