deploy/quickstart.sh
Rama main · réplica de lectura del repositorio original.
#!/usr/bin/env bash
# DataSteward 一键部署(单机,无 sudo / 无 systemd)。在仓库根目录运行:
# bash deploy/quickstart.sh # 全链:基建 → 初始化 → CDC → dbt → 应用层 → 冒烟
# bash deploy/quickstart.sh --infra-only # 只起数据基建
# bash deploy/quickstart.sh --skip-init # 跳过初始化链(已初始化过的机器重启用)
# 附加开关:--with-sim-u8(U8 仿真源演示,x86 only) --with-docs(RAG 文档库 + 图谱骨架)
#
# 幂等:所有初始化步骤可重复执行。Windows 用户请在 Git Bash / WSL 中运行(需 Docker Desktop)。
export MSYS_NO_PATHCONV=1 # 防 Git Bash 把 /tmp/... 参数改写成 Windows 路径
set -euo pipefail
cd "$(dirname "$0")/.."
COMPOSE="docker compose -f deploy/docker-compose.yml"
INFRA_ONLY=0; SKIP_INIT=0; WITH_SIM_U8=0; WITH_DOCS=0
for a in "$@"; do case "$a" in
--infra-only) INFRA_ONLY=1;;
--skip-init) SKIP_INIT=1;;
--with-sim-u8) WITH_SIM_U8=1;;
--with-docs) WITH_DOCS=1;;
*) echo "未知参数:$a"; exit 2;;
esac; done
step() { echo; echo "==== $* ===="; }
# ---------- ① 前置检查 ----------
step "① 前置检查"
docker compose version >/dev/null 2>&1 || { echo "需要 Docker + docker compose v2"; exit 1; }
if [ ! -f .env ]; then
cp .env.example .env
echo "已生成 .env(复制自 .env.example)。"
echo "⚠ 智能体问答需要 LLM:编辑 .env 填 DM_LLM_API_KEY(云 API),"
echo " 或 docker compose --profile ollama up -d 后按 .env 注释切换到本地模型。数据面不依赖 LLM,可先继续。"
fi
set -a; . ./.env; set +a
mkdir -p data/logs data/embed_cache data/file_sources
# ---------- ② Flink 连接器 jar ----------
step "② 拉取 Flink CDC 连接器 jar"
( cd infra/flink-lib && bash download.sh )
# ---------- ③ 数据基建 ----------
step "③ 启动数据基建(starrocks/postgres/flink/neo4j)"
$COMPOSE up -d starrocks postgres flink-jobmanager flink-taskmanager neo4j
[ "$WITH_SIM_U8" = 1 ] && $COMPOSE --profile sim-u8 up -d sim-u8
echo "等待 StarRocks healthy(首次约 2 分钟)..."
sr_health() { docker inspect --format '{{.State.Health.Status}}' "$($COMPOSE ps -q starrocks)" 2>/dev/null || echo ""; }
for i in $(seq 1 60); do
[ "$(sr_health)" = "healthy" ] && break
sleep 10
done
[ "$(sr_health)" = "healthy" ] || { echo "StarRocks 未就绪,退出"; exit 1; }
echo "StarRocks 就绪。"
if [ "$INFRA_ONLY" = 1 ]; then echo "(--infra-only 完成)"; exit 0; fi
# ---------- ④ 应用镜像 ----------
step "④ 构建应用镜像(datasteward/dm:latest)"
$COMPOSE --profile app --profile tools build dm-cli
RUN="$COMPOSE run --rm --no-deps dm-cli"
if [ "$SKIP_INIT" != 1 ]; then
# ---------- ⑤ 幂等初始化链 ----------
step "⑤.1 StarRocks 单副本(allin1 单 BE 必需)"
$COMPOSE exec -T starrocks mysql -h127.0.0.1 -P9030 -uroot \
-e 'ADMIN SET FRONTEND CONFIG ("default_replication_num"="1");' || true
step "⑤.2 建库灌数(dm-load:19 张业务表 → StarRocks)"
$RUN dm-load
step "⑤.3 PG 影子源 seed(CDC 源数据)+ dagster 库"
$RUN python -m dm.sources.seed_source
$COMPOSE exec -T postgres psql -U "${DM_SRC_PG_USER:-dm}" -d "${DM_SRC_PG_DB:-dm}" \
-tc "SELECT 1 FROM pg_database WHERE datname='dagster'" | grep -q 1 || \
$COMPOSE exec -T postgres psql -U "${DM_SRC_PG_USER:-dm}" -d "${DM_SRC_PG_DB:-dm}" -c "CREATE DATABASE dagster"
step "⑤.4 提交 Flink CDC 作业(PG → StarRocks,19 表全量+增量)"
bash infra/submit-cdc.sh cdc_all.sql || echo "⚠ CDC 提交失败(可稍后重跑 infra/submit-cdc.sh)"
if [ "$WITH_SIM_U8" = 1 ]; then
step "⑤.5 仿真 U8:建库灌数 + 首次全量批抽"
$RUN python -m dm.sources.seed_u8_sim && $RUN dm-u8 full || echo "⚠ U8 仿真链失败(可选项,跳过)"
fi
step "⑤.6 dbt build(ODS → DWD/DWS/ADS + 质量测试)"
$RUN bash -lc "cd /app/transform/dbt && dbt build --profiles-dir ."
if [ "$WITH_DOCS" = 1 ]; then
step "⑤.7 文档库 + 图谱骨架(RAG/KG,可选)"
$RUN dm-docs build || echo "⚠ dm-docs 失败(可选项)"
$RUN dm-kg skeleton || echo "⚠ dm-kg 失败(可选项)"
echo "(LLM 关系抽取不自动跑:需要时 docker compose run --rm dm-cli dm-kg extract)"
fi
fi
# ---------- ⑥ 应用层 ----------
step "⑥ 启动应用层(Streamlit + Dagster)"
$COMPOSE --profile app up -d
# ---------- ⑦ 冒烟 ----------
step "⑦ 冒烟检查"
bash deploy/smoke.sh || true
echo
echo "===== 完成 ====="
echo "治理台 : http://127.0.0.1:${DM_PORT_APP:-8501}"
echo "Dagster : http://127.0.0.1:${DM_PORT_DAGSTER:-3070}"
echo "Flink UI : http://127.0.0.1:${DM_PORT_FLINK:-8081}"
echo
echo "试一试:"
echo " $COMPOSE run --rm dm-cli dm-agent \"物料 M0001 现在总库存多少?\" # 预期答案含 12"
echo " $COMPOSE run --rm dm-cli dm-eval # 跑 eval 题集"
echo " tail -5 data/logs/audit_log.jsonl # 看审计留痕"