#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" PID_DIR="runtime/pids" LOG_DIR="runtime/logs" WORKER_PID_FILE="${PID_DIR}/worker.pid" EDGE_CLIENT_PID_FILE="${PID_DIR}/edge_client.pid" WORKER_LOG="${LOG_DIR}/worker.log" EDGE_CLIENT_LOG="${LOG_DIR}/edge_client.log" mkdir -p "$PID_DIR" "$LOG_DIR" if [ ! -f .env ]; then cp .env.example .env echo "[INFO] .env missing, created from .env.example" fi if [ ! -d .venv ]; then echo "[INFO] .venv missing, running install script" bash scripts/install_wsl_env.sh fi source .venv/bin/activate set -a source .env set +a # Edge device should not expose a public ingress service. APP_HOST="${APP_HOST:-127.0.0.1}" APP_PORT="${APP_PORT:-8000}" DISPATCH_WS_URL="${DISPATCH_WS_URL:-}" WORKER_BASE_URL="${WORKER_BASE_URL:-http://127.0.0.1:${APP_PORT}}" EDGE_POLL_INTERVAL_SEC="${EDGE_POLL_INTERVAL_SEC:-1.0}" if [ -z "${DISPATCH_WS_URL}" ]; then echo "[ERROR] DISPATCH_WS_URL is empty" echo "[INFO] set DISPATCH_WS_URL in .env, e.g. ws://:8060/ws/edge/" exit 1 fi is_running() { local pid_file="$1" if [ ! -f "$pid_file" ]; then return 1 fi local pid pid="$(cat "$pid_file" 2>/dev/null || true)" if [ -z "$pid" ]; then return 1 fi if kill -0 "$pid" >/dev/null 2>&1; then return 0 fi return 1 } if is_running "$WORKER_PID_FILE"; then echo "[INFO] worker already running (pid $(cat "$WORKER_PID_FILE"))" else nohup python -m uvicorn app.main:app --host "$APP_HOST" --port "$APP_PORT" >"$WORKER_LOG" 2>&1 & echo $! >"$WORKER_PID_FILE" echo "[OK] worker started (pid $(cat "$WORKER_PID_FILE"))" fi if is_running "$EDGE_CLIENT_PID_FILE"; then echo "[INFO] edge client already running (pid $(cat "$EDGE_CLIENT_PID_FILE"))" else nohup env \ DISPATCH_WS_URL="$DISPATCH_WS_URL" \ WORKER_BASE_URL="$WORKER_BASE_URL" \ EDGE_POLL_INTERVAL_SEC="$EDGE_POLL_INTERVAL_SEC" \ python scripts/edge_device_client.py >"$EDGE_CLIENT_LOG" 2>&1 & echo $! >"$EDGE_CLIENT_PID_FILE" echo "[OK] edge client started (pid $(cat "$EDGE_CLIENT_PID_FILE"))" fi echo "[INFO] worker health: curl http://127.0.0.1:${APP_PORT}/health" echo "[INFO] dispatch ws: ${DISPATCH_WS_URL}" echo "[INFO] worker base url for client: ${WORKER_BASE_URL}" echo "[INFO] worker log: ${WORKER_LOG}" echo "[INFO] edge client log: ${EDGE_CLIENT_LOG}"