Spaces:
Paused
Paused
| # GovOn daemon bootstrap script | |
| # Usage: ./scripts/govon-bootstrap.sh [start|stop|status|health] | |
| # | |
| # ํ๊ฒฝ๋ณ์: | |
| # GOVON_HOME โ GovOn ํ ๋๋ ํฐ๋ฆฌ (๊ธฐ๋ณธ: ~/.govon) | |
| # GOVON_PORT โ daemon ํฌํธ (๊ธฐ๋ณธ: 8000) | |
| # SKIP_MODEL_LOAD โ ๋ชจ๋ธ ๋ก๋ ๊ฑด๋๋ฐ๊ธฐ (๊ฒฝ๊ณ ํ์๋จ) | |
| set -euo pipefail | |
| PYTHON_CMD="" | |
| # --------------------------------------------------------------------------- | |
| # ์ค์ | |
| # --------------------------------------------------------------------------- | |
| GOVON_HOME="${GOVON_HOME:-$HOME/.govon}" | |
| GOVON_PORT="${GOVON_PORT:-8000}" | |
| HEALTH_URL="http://127.0.0.1:${GOVON_PORT}/health" | |
| PID_FILE="${GOVON_HOME}/daemon.pid" | |
| LOG_FILE="${GOVON_HOME}/daemon.log" | |
| # --------------------------------------------------------------------------- | |
| # ์์ ์ถ๋ ฅ ํฌํผ | |
| # --------------------------------------------------------------------------- | |
| _info() { echo "[INFO] $*"; } | |
| _warn() { echo "[WARN] $*" >&2; } | |
| _error() { echo "[ERROR] $*" >&2; } | |
| _success() { echo "[OK] $*"; } | |
| # --------------------------------------------------------------------------- | |
| # Pre-flight ๊ฒ์ฌ | |
| # --------------------------------------------------------------------------- | |
| _preflight_checks() { | |
| # SKIP_MODEL_LOAD ๊ฒฝ๊ณ | |
| if [ "${SKIP_MODEL_LOAD:-}" = "true" ] || [ "${SKIP_MODEL_LOAD:-}" = "1" ]; then | |
| _warn "SKIP_MODEL_LOAD๊ฐ ์ค์ ๋์ด ์์ต๋๋ค. ๋ชจ๋ธ์ด ๋ก๋๋์ง ์์ผ๋ฉฐ ์ผ๋ถ ๊ธฐ๋ฅ์ด ๋นํ์ฑํ๋ฉ๋๋ค." | |
| fi | |
| # GPU ๊ฐ์ง ๊ฒฝ๊ณ | |
| if command -v nvidia-smi &>/dev/null; then | |
| if ! nvidia-smi &>/dev/null 2>&1; then | |
| _warn "nvidia-smi ์คํ์ ์คํจํ์ต๋๋ค. GPU๋ฅผ ์ฌ์ฉํ ์ ์์ ์ ์์ต๋๋ค." | |
| fi | |
| else | |
| _warn "nvidia-smi๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. CPU ์ ์ฉ ๋ชจ๋๋ก ์คํ๋ฉ๋๋ค. (์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ ์ ์์ต๋๋ค)" | |
| fi | |
| } | |
| # --------------------------------------------------------------------------- | |
| # Python / govon ์ค์น ํ์ธ | |
| # --------------------------------------------------------------------------- | |
| _check_python() { | |
| if ! command -v python3 &>/dev/null && ! command -v python &>/dev/null; then | |
| _error "Python์ ์ฐพ์ ์ ์์ต๋๋ค. Python 3.10 ์ด์์ ์ค์นํ์ธ์." | |
| exit 1 | |
| fi | |
| PYTHON_CMD="$(command -v python3 || command -v python)" | |
| _info "Python: $("$PYTHON_CMD" --version 2>&1)" | |
| } | |
| _check_govon() { | |
| # govon CLI ๋๋ src.cli.shell ๋ชจ๋ ๊ฐ์ฉ ์ฌ๋ถ ํ์ธ | |
| if command -v govon &>/dev/null; then | |
| GOVON_CMD="govon" | |
| _info "govon ๋ช ๋ น์ด ๋ฐ๊ฒฌ: $(command -v govon)" | |
| elif $PYTHON_CMD -c "import src.cli.shell" 2>/dev/null; then | |
| GOVON_CMD="$PYTHON_CMD -m src.cli.shell" | |
| _info "govon ๋ชจ๋(src.cli.shell) ๋ฐ๊ฒฌ" | |
| else | |
| _error "govon์ด ์ค์น๋์ด ์์ง ์์ต๋๋ค. 'pip install govon[cli]' ๋๋ 'pip install -e .[cli]'๋ฅผ ์คํํ์ธ์." | |
| exit 1 | |
| fi | |
| } | |
| # --------------------------------------------------------------------------- | |
| # PID ์ ํธ๋ฆฌํฐ | |
| # --------------------------------------------------------------------------- | |
| _read_pid() { | |
| if [ -f "$PID_FILE" ]; then | |
| awk '{print $1}' "$PID_FILE" 2>/dev/null || echo "" | |
| fi | |
| } | |
| _pid_alive() { | |
| local pid="$1" | |
| [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null | |
| } | |
| # --------------------------------------------------------------------------- | |
| # health ํ์ธ | |
| # --------------------------------------------------------------------------- | |
| _health_check() { | |
| curl -sf --max-time 5 "$HEALTH_URL" &>/dev/null | |
| } | |
| # --------------------------------------------------------------------------- | |
| # ๋ช ๋ น: start | |
| # --------------------------------------------------------------------------- | |
| cmd_start() { | |
| _preflight_checks | |
| _check_python | |
| _check_govon | |
| # ์ด๋ฏธ ์คํ ์ค์ธ์ง ํ์ธ | |
| local existing_pid | |
| existing_pid="$(_read_pid)" | |
| if _pid_alive "$existing_pid" && _health_check; then | |
| _success "GovOn daemon์ด ์ด๋ฏธ ์คํ ์ค์ ๋๋ค. (PID=$existing_pid, ํฌํธ=$GOVON_PORT)" | |
| exit 0 | |
| fi | |
| # ~/.govon ๋๋ ํฐ๋ฆฌ ์์ฑ | |
| mkdir -p "$GOVON_HOME" | |
| _info "GovOn daemon์ ์์ํฉ๋๋ค. (ํฌํธ=$GOVON_PORT, ๋ก๊ทธ=$LOG_FILE)" | |
| # daemon ๊ธฐ๋ | |
| if [ "$GOVON_CMD" = "govon" ]; then | |
| # govon CLI๋ฅผ ํตํ ๊ธฐ๋ (govon --start ์ง์ ์ ์ฌ์ฉ; ์์ผ๋ฉด ์ง์ uvicorn ํธ์ถ) | |
| if govon --help 2>&1 | grep -q -- "--start" 2>/dev/null; then | |
| govon --start >> "$LOG_FILE" 2>&1 & | |
| else | |
| # ์ง์ uvicorn์ผ๋ก ๊ธฐ๋ | |
| $PYTHON_CMD -m uvicorn src.inference.api_server:app \ | |
| --host 127.0.0.1 \ | |
| --port "$GOVON_PORT" >> "$LOG_FILE" 2>&1 & | |
| fi | |
| else | |
| $PYTHON_CMD -m uvicorn src.inference.api_server:app \ | |
| --host 127.0.0.1 \ | |
| --port "$GOVON_PORT" >> "$LOG_FILE" 2>&1 & | |
| fi | |
| local daemon_pid=$! | |
| echo "$daemon_pid $(date +%s)" > "$PID_FILE" | |
| _info "daemon PID=$daemon_pid ๊ธฐ๋ก ์๋ฃ." | |
| # ๋น ๋ฅธ ์คํจ ๊ฐ์ง: 2์ด ํ ํ๋ก์ธ์ค๊ฐ ์ด๋ฏธ ์ข ๋ฃ๋์๋์ง ํ์ธ | |
| sleep 2 | |
| if ! kill -0 "$daemon_pid" 2>/dev/null; then | |
| _error "daemon์ด ๊ธฐ๋ ์งํ ์ข ๋ฃ๋์์ต๋๋ค. ๋ก๊ทธ๋ฅผ ํ์ธํ์ธ์: $LOG_FILE" | |
| rm -f "$PID_FILE" | |
| exit 1 | |
| fi | |
| # health check ๋๊ธฐ (์ต๋ 120์ด) | |
| local elapsed=0 | |
| local max_wait=120 | |
| _info "health check ๋๊ธฐ ์ค..." | |
| while [ $elapsed -lt $max_wait ]; do | |
| if _health_check; then | |
| _success "GovOn daemon ๊ธฐ๋ ์๋ฃ. (PID=$daemon_pid, ํฌํธ=$GOVON_PORT)" | |
| exit 0 | |
| fi | |
| sleep 1 | |
| elapsed=$((elapsed + 1)) | |
| done | |
| _error "health check timeout (${max_wait}s). ๋ก๊ทธ๋ฅผ ํ์ธํ์ธ์: $LOG_FILE" | |
| exit 1 | |
| } | |
| # --------------------------------------------------------------------------- | |
| # ๋ช ๋ น: stop | |
| # --------------------------------------------------------------------------- | |
| cmd_stop() { | |
| local pid | |
| pid="$(_read_pid)" | |
| if [ -z "$pid" ]; then | |
| _warn "PID ํ์ผ์ด ์์ต๋๋ค. daemon์ด ์คํ ์ค์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค." | |
| exit 0 | |
| fi | |
| if ! _pid_alive "$pid"; then | |
| _warn "PID=$pid ํ๋ก์ธ์ค๊ฐ ์์ต๋๋ค. PID ํ์ผ์ ์ ๊ฑฐํฉ๋๋ค." | |
| rm -f "$PID_FILE" | |
| exit 0 | |
| fi | |
| # govon CLI --stop ์ง์ ์ฌ๋ถ ํ์ธ | |
| if command -v govon &>/dev/null && govon --help 2>&1 | grep -q -- "--stop" 2>/dev/null; then | |
| govon --stop | |
| else | |
| _info "SIGTERM ์ ์ก: PID=$pid" | |
| kill -TERM "$pid" | |
| local elapsed=0 | |
| while [ $elapsed -lt 10 ]; do | |
| if ! _pid_alive "$pid"; then | |
| _success "GovOn daemon์ด ์ ์ ์ข ๋ฃ๋์์ต๋๋ค. (PID=$pid)" | |
| rm -f "$PID_FILE" | |
| exit 0 | |
| fi | |
| sleep 1 | |
| elapsed=$((elapsed + 1)) | |
| done | |
| _warn "timeout โ SIGKILL ์ ์ก: PID=$pid" | |
| kill -KILL "$pid" 2>/dev/null || true | |
| rm -f "$PID_FILE" | |
| _success "GovOn daemon์ด ๊ฐ์ ์ข ๋ฃ๋์์ต๋๋ค. (PID=$pid)" | |
| fi | |
| } | |
| # --------------------------------------------------------------------------- | |
| # ๋ช ๋ น: status | |
| # --------------------------------------------------------------------------- | |
| cmd_status() { | |
| local pid | |
| pid="$(_read_pid)" | |
| if [ -z "$pid" ]; then | |
| echo "GovOn daemon: ์ค์ง๋จ (PID ํ์ผ ์์)" | |
| exit 1 | |
| fi | |
| if ! _pid_alive "$pid"; then | |
| echo "GovOn daemon: ์ค์ง๋จ (PID=$pid โ ํ๋ก์ธ์ค ์์)" | |
| rm -f "$PID_FILE" | |
| exit 1 | |
| fi | |
| if _health_check; then | |
| echo "GovOn daemon: ์คํ ์ค (PID=$pid, ํฌํธ=$GOVON_PORT)" | |
| exit 0 | |
| else | |
| echo "GovOn daemon: ํ๋ก์ธ์ค๋ ์ด์ ์์ง๋ง health check ์คํจ (PID=$pid, URL=$HEALTH_URL)" | |
| exit 2 | |
| fi | |
| } | |
| # --------------------------------------------------------------------------- | |
| # ๋ช ๋ น: health | |
| # --------------------------------------------------------------------------- | |
| cmd_health() { | |
| _info "GET $HEALTH_URL" | |
| if curl -sf --max-time 10 "$HEALTH_URL"; then | |
| echo "" | |
| _success "health check ํต๊ณผ." | |
| exit 0 | |
| else | |
| _error "health check ์คํจ. daemon์ด ์คํ ์ค์ธ์ง ํ์ธํ์ธ์." | |
| exit 1 | |
| fi | |
| } | |
| # --------------------------------------------------------------------------- | |
| # ์ง์ ์ | |
| # --------------------------------------------------------------------------- | |
| COMMAND="${1:-help}" | |
| case "$COMMAND" in | |
| start) | |
| cmd_start | |
| ;; | |
| stop) | |
| cmd_stop | |
| ;; | |
| status) | |
| cmd_status | |
| ;; | |
| health) | |
| cmd_health | |
| ;; | |
| help|--help|-h) | |
| echo "์ฌ์ฉ๋ฒ: $0 [start|stop|status|health]" | |
| echo "" | |
| echo "๋ช ๋ น์ด:" | |
| echo " start โ GovOn daemon์ ๊ธฐ๋ํฉ๋๋ค" | |
| echo " stop โ GovOn daemon์ ์ค์งํฉ๋๋ค" | |
| echo " status โ daemon ์คํ ์ํ๋ฅผ ํ์ธํฉ๋๋ค" | |
| echo " health โ /health ์๋ํฌ์ธํธ๋ฅผ probeํฉ๋๋ค" | |
| echo "" | |
| echo "ํ๊ฒฝ๋ณ์:" | |
| echo " GOVON_HOME=$GOVON_HOME" | |
| echo " GOVON_PORT=$GOVON_PORT" | |
| echo " SKIP_MODEL_LOAD (์ค์ ์ ๊ฒฝ๊ณ ํ์)" | |
| exit 0 | |
| ;; | |
| *) | |
| _error "์ ์ ์๋ ๋ช ๋ น: $COMMAND" | |
| echo "์ฌ์ฉ๋ฒ: $0 [start|stop|status|health]" | |
| exit 1 | |
| ;; | |
| esac | |