diff --git a/app.py b/app.py index 125bafc..7a81014 100644 --- a/app.py +++ b/app.py @@ -33,7 +33,10 @@ SAMPLE_IMAGE_URL = f"{BASE_URL}/static/sample.jpg" # 分辨率门槛(短边/长边,方向无关),可由环境变量覆盖(技术方案 §8.3) MIN_SHORT_SIDE = int(os.getenv("MIN_SHORT_SIDE", "600")) MIN_LONG_SIDE = int(os.getenv("MIN_LONG_SIDE", "800")) -MAX_FILE_BYTES = 1_000_000 # 1 MB +# 文件大小上限(字节),可由环境变量覆盖;设为 0 表示不限制 +MAX_FILE_BYTES = int(os.getenv("MAX_FILE_BYTES", "1000000")) # 默认 1 MB +if MAX_FILE_BYTES <= 0: + MAX_FILE_BYTES = float("inf") # 运行期状态:模型就绪标志(/health 据此返回 200/503) _STATE = {"ready": False} diff --git a/run_worker.sh b/run_worker.sh index 21e25d5..ded3e2c 100755 --- a/run_worker.sh +++ b/run_worker.sh @@ -1,31 +1,54 @@ #!/usr/bin/env bash -# worker 开发启动脚本(接口1 四庭七眼测量)。 +# 启动 GPU worker(接口1 四庭七眼 / 接口2 发际线等)。 +# 默认:后台运行,绑定 0.0.0.0:8187,日志写到 worker.log,PID 写到 worker.pid。 +# 每次开机手动执行一次即可。停止用 ./stop_worker.sh。 # -# 用法: -# ./run_worker.sh # 开发模式:127.0.0.1:8187 + --reload(改代码自动重启) -# ./run_worker.sh --prod # 部署模式:0.0.0.0:8187,无 reload -# HOST=0.0.0.0 PORT=9000 ./run_worker.sh # 用环境变量覆盖 host/port +# 可用环境变量覆盖: +# HOST=127.0.0.1 PORT=9000 ./run_worker.sh +# FOREGROUND=1 ./run_worker.sh # 前台运行(调试用,Ctrl+C 退出) # -# 鉴权密码读 worker_config.json 的 accept_passwords(本地默认 testpass), +# 鉴权密码读 worker_config.json 的 accept_passwords, # 也可用 WORKER_ACCEPT_PASSWORDS=逗号分隔 覆盖。 set -euo pipefail cd "$(dirname "$0")" -VENV_PY="./venv/bin/uvicorn" -if [ ! -x "$VENV_PY" ]; then - echo "找不到 $VENV_PY,请先创建 venv 并安装依赖(见 README/requirements.txt)" >&2 +VENV_UVICORN="./venv/bin/uvicorn" +PID_FILE="worker.pid" +LOG_FILE="worker.log" +HOST="${HOST:-0.0.0.0}" +PORT="${PORT:-8187}" + +# ---- 临时取消上传图片限制(分辨率 + 文件大小)---- +# 0 = 不限制。要恢复默认(600/800/1MB),删掉下面三行即可。 +export MIN_SHORT_SIDE="${MIN_SHORT_SIDE:-0}" +export MIN_LONG_SIDE="${MIN_LONG_SIDE:-0}" +export MAX_FILE_BYTES="${MAX_FILE_BYTES:-0}" +# ------------------------------------------------ + +if [ ! -x "$VENV_UVICORN" ]; then + echo "找不到 $VENV_UVICORN,请先创建 venv 并安装依赖(见 requirements.txt)" >&2 exit 1 fi -MODE="${1:-dev}" -if [ "$MODE" = "--prod" ]; then - HOST="${HOST:-0.0.0.0}" - PORT="${PORT:-8187}" - echo ">> 部署模式 worker: ${HOST}:${PORT}" - exec "$VENV_PY" app:app --host "$HOST" --port "$PORT" +# 已在运行则不重复启动 +if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then + echo "worker 已在运行 (PID $(cat "$PID_FILE")),端口 ${PORT}。如需重启请先 ./stop_worker.sh" >&2 + exit 0 +fi + +if [ "${FOREGROUND:-0}" = "1" ]; then + echo ">> 前台运行 worker: ${HOST}:${PORT}" + exec "$VENV_UVICORN" app:app --host "$HOST" --port "$PORT" +fi + +echo ">> 后台启动 worker: ${HOST}:${PORT}" +nohup "$VENV_UVICORN" app:app --host "$HOST" --port "$PORT" >> "$LOG_FILE" 2>&1 & +echo $! > "$PID_FILE" +sleep 1 +if kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then + echo ">> 已启动,PID $(cat "$PID_FILE"),日志:$LOG_FILE" else - HOST="${HOST:-127.0.0.1}" - PORT="${PORT:-8187}" - echo ">> 开发模式 worker: ${HOST}:${PORT} (--reload)" - exec "$VENV_PY" app:app --host "$HOST" --port "$PORT" --reload + echo ">> 启动失败,请查看 $LOG_FILE" >&2 + rm -f "$PID_FILE" + exit 1 fi diff --git a/stop_worker.sh b/stop_worker.sh new file mode 100755 index 0000000..ce456fa --- /dev/null +++ b/stop_worker.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +# 停止 GPU worker(由 run_worker.sh 后台启动的进程)。 +# 优先用 worker.pid;找不到则按端口兜底查找。 +set -euo pipefail +cd "$(dirname "$0")" + +PID_FILE="worker.pid" +PORT="${PORT:-8187}" + +stop_pid() { + local pid="$1" + if kill -0 "$pid" 2>/dev/null; then + echo ">> 停止 worker (PID $pid)" + kill "$pid" + # 等待优雅退出,最多 10 秒 + for _ in $(seq 1 10); do + kill -0 "$pid" 2>/dev/null || return 0 + sleep 1 + done + echo ">> 未在 10 秒内退出,强制 kill -9" + kill -9 "$pid" 2>/dev/null || true + fi +} + +# 1) 用 PID 文件 +if [ -f "$PID_FILE" ]; then + PID="$(cat "$PID_FILE")" + if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then + stop_pid "$PID" + rm -f "$PID_FILE" + echo ">> 已停止" + exit 0 + fi + rm -f "$PID_FILE" +fi + +# 2) 兜底:按监听端口查找 +PIDS="$(ss -tlnp 2>/dev/null | grep ":${PORT} " | grep -oE 'pid=[0-9]+' | grep -oE '[0-9]+' | sort -u || true)" +if [ -n "$PIDS" ]; then + for p in $PIDS; do stop_pid "$p"; done + echo ">> 已停止(按端口 ${PORT} 查找)" + exit 0 +fi + +echo ">> 没有发现正在运行的 worker(端口 ${PORT})"