feat: 合并 Docker Compose、标注表格优化与部署文档

将 platform + CVAT 合并为单文件 docker-compose.yml,完善 .env 与 init/dev_up 脚本;
新增 docs/DEPLOY.md 与更新 README 以支持新机器部署;含数据湖示例、车队地图、
紧凑表格 UI、ADAS det_7cls 路径与批次台账等近期改动。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-16 17:06:31 +08:00
parent 0b8ade048e
commit 483e027482
117 changed files with 5933 additions and 1499 deletions

View File

@@ -7,6 +7,10 @@ echo "[web] Installing dependencies..."
cd "$ROOT/platform/web"
npm ci --silent
echo "[web] Sync login background..."
mkdir -p public
cp "$ROOT/docs/bg.png" public/login-bg.png
echo "[web] Building..."
npm run build

View File

@@ -4,23 +4,41 @@ set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
COMPOSE_FILES=(-f docker-compose.yml -f docker-compose.cvat.yml)
if [[ ! -f .env ]]; then
cp .env.example .env
echo "已创建 .env默认挂载本仓库;大文件数据可设置 AS_WORKSPACE_ROOT"
echo "已创建 .env请按部署机器修改 AS_WORKSPACE_ROOT / AS_DATA_LAKE_HOST / AS_FRONTEND_URL"
fi
DEFAULT_WS="$(cd "$ROOT/.." && pwd)/workspace"
if [[ -d "$DEFAULT_WS/DMS" ]] && ! grep -q '^AS_WORKSPACE_ROOT=' .env 2>/dev/null; then
echo "AS_WORKSPACE_ROOT=$DEFAULT_WS" >> .env
echo "已写入 AS_WORKSPACE_ROOT=$DEFAULT_WS"
fi
if ! grep -q '^CVAT_HOST=' .env 2>/dev/null; then
echo "CVAT_HOST=http://hsap-cvat-server:8080" >> .env
DEFAULT_DATA="$(cd "$ROOT/.." && pwd)/data"
if [[ -d "$DEFAULT_DATA" ]] && ! grep -q '^AS_DATA_LAKE_HOST=' .env 2>/dev/null; then
echo "AS_DATA_LAKE_HOST=$DEFAULT_DATA" >> .env
echo "已写入 AS_DATA_LAKE_HOST=$DEFAULT_DATA"
fi
if ! grep -q '^CVAT_PUBLIC_URL=' .env 2>/dev/null; then
echo "CVAT_PUBLIC_URL=http://127.0.0.1:8080" >> .env
for key_val in \
"CVAT_HOST=http://hsap-cvat-server:8080" \
"CVAT_PUBLIC_URL=http://127.0.0.1:8080" \
"CVAT_PORT=8080"; do
key="${key_val%%=*}"
if ! grep -q "^${key}=" .env 2>/dev/null; then
echo "$key_val" >> .env
fi
done
if [[ ! -f manifests/feishu.env ]]; then
cp manifests/feishu.env.example manifests/feishu.env
echo "已创建 manifests/feishu.env"
fi
if [[ ! -f platform/ui-hsap/dist/index.html ]]; then
echo "首次启动:构建前端静态包…"
bash scripts/build_web.sh
fi
if ! command -v docker >/dev/null 2>&1; then
@@ -28,15 +46,17 @@ if ! command -v docker >/dev/null 2>&1; then
exit 1
fi
docker compose "${COMPOSE_FILES[@]}" up -d --build "$@"
# shellcheck disable=SC1091
[[ -f .env ]] && set -a && source .env && set +a
docker compose up -d --build "$@"
echo ""
echo "服务:"
echo " HSAP 平台 http://127.0.0.1:${AS_PLATFORM_PORT:-8787}"
echo " CVAT 标注画布 http://127.0.0.1:${CVAT_PORT:-8080} (由 HSAP 嵌入,无需单独登录)"
echo " PostgreSQL localhost:${AS_DB_PORT:-5432}"
echo " Redis localhost:${AS_REDIS_PORT:-6379}"
echo " HSAP 平台 ${AS_FRONTEND_URL:-http://127.0.0.1:8787}"
echo " CVAT 标注画布 ${CVAT_PUBLIC_URL:-http://127.0.0.1:8080} (由 HSAP 嵌入,无需单独登录)"
echo " PostgreSQL localhost:${AS_DB_PORT:-5433}"
echo " Redis localhost:${AS_REDIS_PORT:-6380}"
echo ""
echo "React 热更新: docker compose --profile dev up -d web-dev → :5173"
echo "日志: docker compose ${COMPOSE_FILES[*]} logs -f platform worker cvat_server"
echo "停止: docker compose ${COMPOSE_FILES[*]} down"
echo "日志: docker compose logs -f platform worker cvat_server"
echo "停止: docker compose down"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Git clone 后首次初始化
# Git clone 后首次初始化(新机器部署入口)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
@@ -7,14 +7,45 @@ cd "$ROOT"
[[ -f .env ]] || { cp .env.example .env && echo "已创建 .env"; }
[[ -f manifests/feishu.env ]] || { cp manifests/feishu.env.example manifests/feishu.env && echo "已创建 manifests/feishu.env"; }
DEFAULT_WS="$(cd "$ROOT/.." && pwd)/workspace"
DEFAULT_DATA="$(cd "$ROOT/.." && pwd)/data"
if grep -q '^# AS_WORKSPACE_ROOT=' .env && [[ -d "$DEFAULT_WS/DMS" ]]; then
sed -i "s|^# AS_WORKSPACE_ROOT=.*|AS_WORKSPACE_ROOT=$DEFAULT_WS|" .env
echo "已设置 AS_WORKSPACE_ROOT=$DEFAULT_WS"
fi
if grep -q '^# AS_DATA_LAKE_HOST=' .env && [[ -d "$DEFAULT_DATA" ]]; then
sed -i "s|^# AS_DATA_LAKE_HOST=.*|AS_DATA_LAKE_HOST=$DEFAULT_DATA|" .env
echo "已设置 AS_DATA_LAKE_HOST=$DEFAULT_DATA"
fi
if [[ -n "${AS_WORKSPACE_ROOT:-}" ]] && [[ -d "${AS_WORKSPACE_ROOT}/DMS" || -d "${AS_WORKSPACE_ROOT}/LaneDection" ]]; then
echo "检测到 AS_WORKSPACE_ROOT切换为 workspace 软链…"
bash scripts/setup_links.sh
else
echo "使用仓库内嵌 algorithms/datasets默认"
echo "若有外部 workspace: export AS_WORKSPACE_ROOT=/path/to/workspace && bash scripts/setup_links.sh"
echo "若有外部 workspace: 在 .env 设置 AS_WORKSPACE_ROOT 后执行 bash scripts/setup_links.sh"
fi
if [[ ! -d datasets/adas ]] && [[ -d "$DEFAULT_DATA/送标/adas" ]]; then
ln -sfn ../../data/送标/adas datasets/adas
echo "已创建 datasets/adas → data/送标/adas"
fi
if [[ ! -f platform/ui-hsap/dist/index.html ]]; then
if command -v npm >/dev/null 2>&1; then
echo "构建前端静态包…"
bash scripts/build_web.sh
else
echo "未安装 Node/npm跳过前端构建Docker 启动前请执行: bash scripts/build_web.sh"
fi
fi
echo ""
echo "Docker 启动: bash scripts/dev_up.sh"
echo "本机启动: bash scripts/run_local.sh"
echo "下一步:"
echo " 1. 编辑 .env — 路径与 AS_FRONTEND_URL / CVAT_PUBLIC_URL局域网部署必改"
echo " 2. 编辑 manifests/feishu.env — 飞书 App ID/Secret 或保持 AS_DEV_AUTH=true 开发登录"
echo " 3. bash scripts/dev_up.sh 或 make up"
echo ""
echo "详细部署说明: docs/DEPLOY.md"

74
scripts/smoke_dms_e2e_2img.sh Executable file
View File

@@ -0,0 +1,74 @@
#!/usr/bin/env bash
# DMS 2 图端到端setup 落盘+开 Campaignrun 在标完后跑 提交→质检→导出→入库
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
export PYTHONPATH="$ROOT/platform:$ROOT"
BASE="${HSAP_API:-http://127.0.0.1:8787}"
BATCH="${DMS_E2E_BATCH:-e2e_2img_20260616}"
TASK="${DMS_E2E_TASK:-addw}"
PACK="${DMS_E2E_PACK:-dms_v1}"
PROJECT="${DMS_E2E_PROJECT:-dms}"
SRC_BATCH="${DMS_E2E_SRC_BATCH:-20260525_pilot}"
MIN_IMAGES="${DMS_E2E_MIN_IMAGES:-2}"
WAIT_LABEL_SEC="${DMS_E2E_WAIT_LABEL_SEC:-0}"
cmd="${1:-setup}"
setup_batch() {
local batch_dir="/data/hsap/datasets/dms/inbox/${TASK}/${BATCH}"
local src="/data/hsap/datasets/dms/inbox/${TASK}/${SRC_BATCH}/images/train"
echo "==> create batch ${batch_dir} (${MIN_IMAGES} images from ${SRC_BATCH})"
docker exec hsap-platform mkdir -p "${batch_dir}/images/train"
docker exec hsap-platform bash -c "
set -e
src='${src}'
dst='${batch_dir}/images/train'
n=0
for f in \"\$src\"/*.jpg; do
[ -f \"\$f\" ] || continue
cp \"\$f\" \"\$dst/\"
n=\$((n+1))
[ \"\$n\" -ge ${MIN_IMAGES} ] && break
done
echo copied=\$n
ls -la \"\$dst\"
"
docker exec hsap-platform python3 /data/hsap/as.py register-batch dms "${TASK}" "${BATCH}" --stage raw_pool
docker exec hsap-platform mkdir -p "${batch_dir}/labels/ls_annotations"
}
open_campaign() {
echo "==> open campaign via API ${BASE}"
python3 "$ROOT/platform/as_platform/tests/run_dms_e2e_pipeline.py" setup --api "$BASE" \
--batch "$BATCH" --task "$TASK" --project "$PROJECT" --pack "$PACK" --skip-files
}
case "$cmd" in
setup)
setup_batch
open_campaign
python3 "$ROOT/platform/as_platform/tests/run_dms_e2e_pipeline.py" info --api "$BASE" \
--batch "$BATCH" --task "$TASK" --project "$PROJECT"
echo ""
echo "请在平台标注 ${MIN_IMAGES} 张图后执行:"
echo " bash $0 run"
echo " 或: DMS_E2E_WAIT_LABEL_SEC=600 bash $0 run-wait"
;;
run|run-wait)
if [[ "$cmd" == "run-wait" && "$WAIT_LABEL_SEC" == "0" ]]; then
WAIT_LABEL_SEC=600
fi
python3 "$ROOT/platform/as_platform/tests/run_dms_e2e_pipeline.py" run --api "$BASE" \
--batch "$BATCH" --task "$TASK" --project "$PROJECT" --pack "$PACK" \
--min-images "$MIN_IMAGES" --wait-label-sec "$WAIT_LABEL_SEC"
;;
info)
python3 "$ROOT/platform/as_platform/tests/run_dms_e2e_pipeline.py" info --api "$BASE" \
--batch "$BATCH" --task "$TASK" --project "$PROJECT"
;;
*)
echo "usage: $0 {setup|run|run-wait|info}"
exit 1
;;
esac