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:
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
74
scripts/smoke_dms_e2e_2img.sh
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
# DMS 2 图端到端:setup 落盘+开 Campaign;run 在标完后跑 提交→质检→导出→入库
|
||||
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
|
||||
Reference in New Issue
Block a user