peregrine/scripts/manage-vision.sh
pyr0ball c368c7a977 chore: seed Peregrine from personal job-seeker (pre-generalization)
App: Peregrine
Company: Circuit Forge LLC
Source: github.com/pyr0ball/job-seeker (personal fork, not linked)
2026-02-24 18:25:39 -08:00

113 lines
2.9 KiB
Bash
Executable file

#!/usr/bin/env bash
# scripts/manage-vision.sh — manage the moondream2 vision service
# Usage: bash scripts/manage-vision.sh start|stop|restart|status|logs
#
# First-time setup:
# conda env create -f scripts/vision_service/environment.yml
#
# On first start, moondream2 is downloaded from HuggingFace (~1.8GB).
# Model stays resident in memory between requests.
set -euo pipefail
CONDA_ENV="job-seeker-vision"
UVICORN_BIN="/devl/miniconda3/envs/${CONDA_ENV}/bin/uvicorn"
PID_FILE="/tmp/vision-service.pid"
LOG_FILE="/tmp/vision-service.log"
PORT=8002
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(dirname "$SCRIPT_DIR")"
is_running() {
if [[ -f "$PID_FILE" ]]; then
PID=$(cat "$PID_FILE")
if kill -0 "$PID" 2>/dev/null; then
return 0
fi
fi
return 1
}
start() {
if is_running; then
echo "Already running (PID $(cat "$PID_FILE"))."
return 0
fi
if [[ ! -f "$UVICORN_BIN" ]]; then
echo "ERROR: conda env '$CONDA_ENV' not found."
echo "Install with: conda env create -f scripts/vision_service/environment.yml"
exit 1
fi
echo "Starting vision service (moondream2) on port $PORT"
cd "$REPO_ROOT"
PYTHONPATH="$REPO_ROOT" "$UVICORN_BIN" \
scripts.vision_service.main:app \
--host 0.0.0.0 \
--port "$PORT" \
> "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
sleep 2
if is_running; then
echo "Started (PID $(cat "$PID_FILE")). Logs: $LOG_FILE"
echo "Health: http://localhost:$PORT/health"
else
echo "Failed to start. Check logs: $LOG_FILE"
tail -20 "$LOG_FILE"
rm -f "$PID_FILE"
exit 1
fi
}
stop() {
if ! is_running; then
echo "Not running."
rm -f "$PID_FILE"
return 0
fi
PID=$(cat "$PID_FILE")
echo "Stopping PID $PID"
kill "$PID" 2>/dev/null || true
sleep 2
if kill -0 "$PID" 2>/dev/null; then
kill -9 "$PID" 2>/dev/null || true
fi
rm -f "$PID_FILE"
echo "Stopped."
}
restart() { stop; sleep 1; start; }
status() {
if is_running; then
echo "Running (PID $(cat "$PID_FILE")) — http://localhost:$PORT"
curl -s "http://localhost:$PORT/health" | python3 -m json.tool 2>/dev/null || true
else
echo "Not running."
fi
}
logs() {
if [[ -f "$LOG_FILE" ]]; then
tail -50 "$LOG_FILE"
else
echo "No log file at $LOG_FILE"
fi
}
CMD="${1:-help}"
case "$CMD" in
start) start ;;
stop) stop ;;
restart) restart ;;
status) status ;;
logs) logs ;;
*)
echo "Usage: bash scripts/manage-vision.sh start|stop|restart|status|logs"
echo ""
echo " Manages the moondream2 vision service on port $PORT."
echo " First-time setup: conda env create -f scripts/vision_service/environment.yml"
;;
esac