#!/usr/bin/env bash set -euo pipefail IMAGE="${1:-geointel-all-in-one:latest}" NAME="geointel-fresh-smoke-$(date +%s)-$$" ROOT="$(mktemp -d "${TMPDIR:-/tmp}/geointel-fresh-smoke.XXXXXX")" PASSWORD="fresh-smoke-$(cat /proc/sys/kernel/random/uuid)" cleanup() { docker rm -f "$NAME" >/dev/null 2>&1 || true case "$ROOT" in "${TMPDIR:-/tmp}"/geointel-fresh-smoke.*) rm -rf -- "$ROOT" ;; *) echo "Refusing to remove unexpected smoke path: ${ROOT}" >&2 ;; esac } trap cleanup EXIT docker image inspect "$IMAGE" >/dev/null mkdir -p "$ROOT/postgres-data" "$ROOT/storage" "$ROOT/models" docker run -d \ --name "$NAME" \ -p 127.0.0.1::80 \ -e GEOINTEL_POSTGRES_DB=geointel_fresh_smoke \ -e GEOINTEL_POSTGRES_USER=geointel_fresh_smoke \ -e GEOINTEL_POSTGRES_PASSWORD="$PASSWORD" \ -e GEOINTEL_MAX_UPLOAD_MB=500 \ -e OLLAMA_ENABLED=false \ -v "$ROOT/postgres-data:/var/lib/postgresql/data" \ -v "$ROOT/storage:/app/storage" \ -v "$ROOT/models:/app/models" \ "$IMAGE" >/dev/null for attempt in $(seq 1 90); do status="$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "$NAME" 2>/dev/null || true)" if [ "$status" = "healthy" ]; then break fi if [ "$status" = "unhealthy" ] || [ "$status" = "exited" ] || [ "$status" = "dead" ]; then docker logs --tail 120 "$NAME" >&2 || true exit 1 fi sleep 2 done if [ "${status:-}" != "healthy" ]; then echo "Fresh-install container did not become healthy." >&2 docker logs --tail 120 "$NAME" >&2 || true exit 1 fi host_port="$(docker port "$NAME" 80/tcp | awk -F: 'NR == 1 {print $NF}')" curl -fsS "http://127.0.0.1:${host_port}/health/ready" >/dev/null curl -fsS "http://127.0.0.1:${host_port}/api/v1/system/capabilities" >/dev/null docker exec "$NAME" python -m alembic heads echo "Fresh install passed for ${IMAGE} on isolated storage ${ROOT}."