ducklm/scripts/server.sh

82 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VENV_PYTHON="$ROOT_DIR/.venv/bin/python"
PID_FILE="$ROOT_DIR/data/runtime/server.pid"
LOG_FILE="$ROOT_DIR/data/runtime/server.log"
HOST="${HOST:-127.0.0.1}"
PORT="${PORT:-8000}"
mkdir -p "$ROOT_DIR/data/runtime"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}$ROOT_DIR/.venv/lib/python3.13/site-packages/llama_cpp/lib"
export GGML_VULKAN=1
is_running() {
if [[ -f "$PID_FILE" ]]; then
local pid
pid="$(cat "$PID_FILE")"
if kill -0 "$pid" >/dev/null 2>&1; then
return 0
fi
fi
return 1
}
start_server() {
if is_running; then
echo "Server already running with PID $(cat "$PID_FILE")"
exit 0
fi
nohup "$VENV_PYTHON" -m uvicorn main:app --host "$HOST" --port "$PORT" >"$LOG_FILE" 2>&1 &
echo $! >"$PID_FILE"
echo "Started server on http://$HOST:$PORT with PID $(cat "$PID_FILE")"
echo "Log: $LOG_FILE"
}
stop_server() {
if ! is_running; then
echo "Server is not running"
rm -f "$PID_FILE"
exit 0
fi
local pid
pid="$(cat "$PID_FILE")"
kill "$pid"
rm -f "$PID_FILE"
echo "Stopped server PID $pid"
}
status_server() {
if is_running; then
echo "Server is running with PID $(cat "$PID_FILE") on http://$HOST:$PORT"
else
echo "Server is not running"
fi
}
case "${1:-}" in
start)
start_server
;;
stop)
stop_server
;;
restart)
stop_server || true
start_server
;;
status)
status_server
;;
logs)
touch "$LOG_FILE"
tail -n 50 -f "$LOG_FILE"
;;
*)
echo "Usage: $0 {start|stop|restart|status|logs}"
exit 1
;;
esac