From afec0980d479b2333008217929ccfda21bb99944 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 7 Apr 2026 02:01:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video_worker/.env.example | 2 + video_worker/README.md | 7 ++ .../scripts/start_edge_device_local.sh | 84 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 video_worker/scripts/start_edge_device_local.sh diff --git a/video_worker/.env.example b/video_worker/.env.example index 4619ab6..aeaa03c 100644 --- a/video_worker/.env.example +++ b/video_worker/.env.example @@ -4,6 +4,8 @@ WS_GATEWAY_HOST=0.0.0.0 WS_GATEWAY_PORT=8010 WORKER_BASE_URL=http://127.0.0.1:8000 WS_POLL_INTERVAL_SEC=1.0 +DISPATCH_WS_URL=ws://127.0.0.1:8060/ws/edge/edge-a4000-01 +EDGE_POLL_INTERVAL_SEC=1.0 EDGE_DISPATCH_HOST=0.0.0.0 EDGE_DISPATCH_PORT=8020 EDGE_MAX_DISPATCH_RECORDS=2000 diff --git a/video_worker/README.md b/video_worker/README.md index 7fbf237..953ef0c 100644 --- a/video_worker/README.md +++ b/video_worker/README.md @@ -69,6 +69,13 @@ cd video_worker bash scripts/run_server.sh ``` +边缘设备一键接入(仅上游下发,边缘主动连中心): + +```bash +cd video_worker +bash scripts/start_edge_device_local.sh +``` + 独立 WS 网关服务(远程推荐): ```bash diff --git a/video_worker/scripts/start_edge_device_local.sh b/video_worker/scripts/start_edge_device_local.sh new file mode 100644 index 0000000..a34c93c --- /dev/null +++ b/video_worker/scripts/start_edge_device_local.sh @@ -0,0 +1,84 @@ +#!/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}"