feat(gateway): 重构 usage 数据层、迁移系统与系统导入

数据库迁移:
- 引入 baseline v2 bootstrap,空库首次启动自动初始化
- 服务启动不再自动执行迁移,需显式 `--migrate` 运行
- 新增 pending migration 检测,schema 落后时拒绝启动

Usage 数据层:
- usage body 存储外部化为独立 blob 表
- 新增 HTTP audit 表拆分存储请求/响应头与 body ref
- 后台清理任务支持 legacy body ref 元数据迁移
- usage runtime 写入迁移到专用 tokio runtime(独立线程池, 8MB 栈)

系统导入/导出:
- 支持用户、API Keys、钱包数据的完整导入
- 兼容 legacy 与 v1.3+ 两种导出格式

其他改进:
- executor outcome 增加 runtime miss 诊断上下文
- 主 tokio runtime 栈大小调整为 8MB
- 前端 provider 管理支持 base URL 配置
- dev.sh 支持 --migrate 参数
This commit is contained in:
fawney19
2026-04-13 14:01:22 +08:00
parent 3698e5a833
commit 5bb08e6aa4
106 changed files with 21730 additions and 1523 deletions
+62
View File
@@ -3,6 +3,35 @@
set -euo pipefail
clear >/dev/null 2>&1 || true
usage() {
cat <<'EOF'
用法:
./dev.sh 启动本地 aether-gateway
./dev.sh --migrate 执行数据库迁移后退出
./dev.sh --help 显示帮助
EOF
}
RUN_MIGRATE_ONLY=false
while [ $# -gt 0 ]; do
case "$1" in
--migrate)
RUN_MIGRATE_ONLY=true
shift
;;
--help|-h)
usage
exit 0
;;
*)
echo "=> 未知参数: $1"
usage
exit 1
;;
esac
done
# 加载 .env 文件
set -a
source .env
@@ -19,6 +48,12 @@ print_dev_infra_hint() {
echo "=> docker compose -f docker-compose.build.yml up -d postgres redis"
}
print_postgres_hint() {
echo "=> PostgreSQL 未就绪。"
echo "=> 请先启动 Postgres:"
echo "=> docker compose -f docker-compose.build.yml up -d postgres"
}
check_postgres_ready() {
local host="$1"
local port="$2"
@@ -76,6 +111,19 @@ preflight_dev_infra() {
return 0
}
preflight_postgres_only() {
local postgres_host="${DB_HOST:-localhost}"
local postgres_port="${DB_PORT:-5432}"
if ! check_postgres_ready "${postgres_host}" "${postgres_port}"; then
echo "=> PostgreSQL 不可用: ${postgres_host}:${postgres_port}"
print_postgres_hint
return 1
fi
return 0
}
# 构建 DATABASE_URL
export DATABASE_URL="postgresql://${DB_USER:-postgres}:${DB_PASSWORD}@${DB_HOST:-localhost}:${DB_PORT:-5432}/${DB_NAME:-aether}"
export REDIS_URL=redis://:${REDIS_PASSWORD}@${REDIS_HOST:-localhost}:${REDIS_PORT:-6379}/0
@@ -131,6 +179,7 @@ wait_for_startup() {
if ! kill -0 "${pid}" >/dev/null 2>&1; then
STARTUP_WAIT_EARLY_EXIT=true
echo "=> ${service_name} 启动进程已提前退出,请检查上面的日志。"
echo "=> 如果日志提示数据库 schema 落后,请先执行: ./dev.sh --migrate"
return 1
fi
@@ -144,6 +193,7 @@ wait_for_startup() {
if ! kill -0 "${pid}" >/dev/null 2>&1; then
STARTUP_WAIT_EARLY_EXIT=true
echo "=> ${service_name} 启动进程已提前退出,请检查上面的日志。"
echo "=> 如果日志提示数据库 schema 落后,请先执行: ./dev.sh --migrate"
return 1
fi
@@ -156,6 +206,7 @@ wait_for_startup() {
# - Rust aether-gateway 绑定 APP_PORT,作为唯一公开入口
# - ./dev.sh 不再启动 Python 宿主;本地默认只验证 Rust-owned 路径
export APP_PORT=${APP_PORT:-8084}
export RUST_LOG=${RUST_LOG:-aether_gateway=info}
RUST_SERVICE_STARTUP_TIMEOUT_SECONDS=${RUST_SERVICE_STARTUP_TIMEOUT_SECONDS:-120}
GATEWAY_STARTUP_TIMEOUT_SECONDS=${GATEWAY_STARTUP_TIMEOUT_SECONDS:-${RUST_SERVICE_STARTUP_TIMEOUT_SECONDS}}
@@ -166,12 +217,23 @@ fi
export AETHER_GATEWAY_VIDEO_TASK_TRUTH_SOURCE_MODE=${AETHER_GATEWAY_VIDEO_TASK_TRUTH_SOURCE_MODE:-rust-authoritative}
if [ "${RUN_MIGRATE_ONLY}" = "true" ]; then
if ! preflight_postgres_only; then
exit 1
fi
echo "=> 执行 aether-gateway 数据库迁移..."
cargo run -q -p aether-gateway -- --migrate
exit 0
fi
if ! preflight_dev_infra; then
exit 1
fi
GATEWAY_ARGS=(--app-port "${APP_PORT}")
echo "=> 启动 aether-gateway (Rust frontdoor: 0.0.0.0:${APP_PORT})..."
echo "=> 日志过滤: ${RUST_LOG} (需要更详细日志可用: RUST_LOG=aether_gateway=debug ./dev.sh)"
cargo run -q -p aether-gateway -- "${GATEWAY_ARGS[@]}" &
GATEWAY_PID=$!