#!/bin/sh # camofox 真机核验:起临时栈 umtbr → 分阶段跑 verify.ts(阶段间重启 / 杀 camofox)→ 结果写 $OUT_DIR。 # 结束后 `docker compose -p umtbr down -v`(镜像保留)。需要本机已有 camofox-browser:1.17.0 镜像(见 docs/runbook/browser.md §1)。 set -eu cd "$(dirname "$0")/../.." export POSTGRES_PASSWORD=umtbr-verify SECRET_MASTER_KEY=umtbr-verify-master-key-0123456789 export CAMOFOX_ACCESS_KEY=${CAMOFOX_ACCESS_KEY:-umtbr-camofox-access-key} # 空闲回收阶段用短超时 export CAMOFOX_SESSION_TIMEOUT_MS=${CAMOFOX_SESSION_TIMEOUT_MS:-60000} export CAMOFOX_BROWSER_IDLE_TIMEOUT_MS=${CAMOFOX_BROWSER_IDLE_TIMEOUT_MS:-30000} export VERIFY_PG=postgres://umt:umtbr-verify@127.0.0.1:55447/umt export OUT_DIR=${OUT_DIR:-$(pwd)/.browser-verify-out} C="docker compose -p umtbr -f docker-compose.yml -f scripts/browser-verify/compose.yml" V="deno run -A scripts/browser-verify/verify.ts" wait_healthy() { for _ in $(seq 1 60); do [ "$(docker inspect -f '{{.State.Health.Status}}' umtbr-camofox-1 2>/dev/null)" = healthy ] && return 0 sleep 2 done echo "camofox 未就绪" >&2; return 1 } $C up -d --no-build postgres camofox mocknexus wait_healthy until docker exec umtbr-postgres-1 pg_isready -U umt -d umt >/dev/null 2>&1; do sleep 1; done $V setup $V a $C restart camofox && wait_healthy $V b # 上游每 60 秒扫一次过期会话:超时 + 一个扫描周期 + 余量 echo "等待会话空闲回收(${CAMOFOX_SESSION_TIMEOUT_MS}ms + 60s 扫描周期)…" sleep $(( CAMOFOX_SESSION_TIMEOUT_MS / 1000 + 75 )) $V idle $V c docker kill -s KILL umtbr-camofox-1 && $C up -d --no-build camofox && wait_healthy $V d echo "结果:$OUT_DIR/results-*.json"