App: Peregrine Company: Circuit Forge LLC Source: github.com/pyr0ball/job-seeker (personal fork, not linked)
113 lines
2.9 KiB
Bash
Executable file
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
|