From a5be552a6713715a4a0529d916cc54d8b2a3a59f Mon Sep 17 00:00:00 2001 From: lsy Date: Sun, 22 Feb 2026 00:08:26 +0800 Subject: [PATCH] =?UTF-8?q?ci(deploy):=20=E6=94=AF=E6=8C=81=20init=20?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E5=B9=B6=E7=BB=9F=E4=B8=80=20D1=20=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 134 +++++++++++++++++- README.md | 5 +- apps/worker/migrations/0001_init.sql | 7 + .../migrations/0002_add_token_plain.sql | 1 - .../migrations/0003_add_channel_meta.sql | 6 - .../migrations/0004_add_usage_log_metrics.sql | 3 - apps/worker/wrangler.toml | 3 +- helloagents/CHANGELOG.md | 36 ++++- helloagents/INDEX.md | 9 +- helloagents/modules/_index.md | 2 + helloagents/modules/deploy-workflow.md | 24 ++++ 11 files changed, 206 insertions(+), 24 deletions(-) delete mode 100644 apps/worker/migrations/0002_add_token_plain.sql delete mode 100644 apps/worker/migrations/0003_add_channel_meta.sql delete mode 100644 apps/worker/migrations/0004_add_usage_log_metrics.sql create mode 100644 helloagents/modules/deploy-workflow.md diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index fb365f8..cb0785a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,7 +11,11 @@ on: from_panel: description: "是否由部署控制面板触发 / triggered from deployment control panel" required: false - default: "false" + default: "auto" + deploy_action: + description: "部署动作:update/init(默认 update)" + required: false + default: "update" deploy_target: description: "部署目标:frontend/backend/both/auto(默认 auto)" required: false @@ -28,6 +32,7 @@ jobs: runs-on: ubuntu-latest outputs: should_deploy: ${{ steps.check.outputs.should_deploy }} + deploy_action: ${{ steps.plan.outputs.deploy_action }} deploy_target: ${{ steps.plan.outputs.deploy_target }} apply_migrations: ${{ steps.plan.outputs.apply_migrations }} deploy_ui: ${{ steps.plan.outputs.deploy_ui }} @@ -98,6 +103,7 @@ jobs: id: plan run: | event="${{ github.event_name }}" + deploy_action="${{ github.event.inputs.deploy_action }}" deploy_target="${{ github.event.inputs.deploy_target }}" apply_migrations="${{ github.event.inputs.apply_migrations }}" @@ -108,14 +114,24 @@ jobs: if [[ -n "${{ github.event.client_payload.apply_migrations }}" ]]; then apply_migrations="${{ github.event.client_payload.apply_migrations }}" fi + if [[ -n "${{ github.event.client_payload.deploy_action }}" ]]; then + deploy_action="${{ github.event.client_payload.deploy_action }}" + fi fi + if [[ -z "$deploy_action" ]]; then + deploy_action="update" + fi if [[ -z "$deploy_target" ]]; then deploy_target="auto" fi if [[ -z "$apply_migrations" ]]; then apply_migrations="auto" fi + if [[ "$deploy_action" == "init" ]]; then + deploy_target="both" + apply_migrations="true" + fi ui_changed="${{ steps.changes.outputs.ui_changed }}" worker_changed="${{ steps.changes.outputs.worker_changed }}" @@ -161,15 +177,122 @@ jobs: fi fi + echo "deploy_action=$deploy_action" >> $GITHUB_OUTPUT echo "deploy_target=$deploy_target" >> $GITHUB_OUTPUT echo "apply_migrations=$apply_migrations" >> $GITHUB_OUTPUT echo "deploy_ui=$deploy_ui" >> $GITHUB_OUTPUT echo "deploy_worker=$deploy_worker" >> $GITHUB_OUTPUT echo "should_migrate=$should_migrate" >> $GITHUB_OUTPUT + init-spa: + needs: check-config + if: needs.check-config.outputs.should_deploy == 'true' && needs.check-config.outputs.deploy_action == 'init' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: "1.3.9" + + - name: Show init plan + run: | + echo "deploy_action=${{ needs.check-config.outputs.deploy_action }}" + echo "deploy_target=${{ needs.check-config.outputs.deploy_target }}" + echo "apply_migrations=${{ needs.check-config.outputs.apply_migrations }}" + echo "deploy_ui=${{ needs.check-config.outputs.deploy_ui }}" + echo "deploy_worker=${{ needs.check-config.outputs.deploy_worker }}" + echo "should_migrate=${{ needs.check-config.outputs.should_migrate }}" + + - name: Check if D1 database exists + id: check-db + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "检查 D1 数据库是否已存在..." + DATABASE_LIST=$(bunx wrangler d1 list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") + EXISTING_DB=$(echo "$DATABASE_LIST" | jq -r '.[] | select(.name=="api-worker") | .uuid') + + if [ -n "$EXISTING_DB" ]; then + echo "db_exists=true" >> $GITHUB_OUTPUT + echo "✅ D1 已存在,跳过初始化" + else + echo "db_exists=false" >> $GITHUB_OUTPUT + fi + + - name: Install dependencies + if: steps.check-db.outputs.db_exists != 'true' + run: bun install + + - name: Build UI + if: steps.check-db.outputs.db_exists != 'true' && (needs.check-config.outputs.deploy_ui == 'true' || needs.check-config.outputs.deploy_worker == 'true') + run: bun run --filter api-worker-ui build + + - name: Verify UI build + if: steps.check-db.outputs.db_exists != 'true' && (needs.check-config.outputs.deploy_ui == 'true' || needs.check-config.outputs.deploy_worker == 'true') + run: | + if [ ! -d "apps/ui/dist" ]; then + echo "❌ UI 构建失败:dist 目录不存在" + exit 1 + fi + if [ ! -f "apps/ui/dist/index.html" ]; then + echo "❌ UI 构建失败:index.html 不存在" + exit 1 + fi + echo "✅ UI 构建产物已就绪" + + - name: Disable wrangler telemetry + if: steps.check-db.outputs.db_exists != 'true' + run: bunx wrangler telemetry disable + + - name: Create D1 database (init only) + if: steps.check-db.outputs.db_exists != 'true' + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "创建 D1 数据库..." + CREATE_OUTPUT=$(bunx wrangler d1 create api-worker --config apps/worker/wrangler.toml 2>&1) + + if echo "$CREATE_OUTPUT" | grep -q "database_id"; then + DATABASE_ID=$(echo "$CREATE_OUTPUT" | grep -oP "database_id = \"\K[^\"]+") + if [ -z "$DATABASE_ID" ]; then + DATABASE_ID=$(echo "$CREATE_OUTPUT" | grep -oP "([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})") + fi + else + LIST_OUTPUT=$(bunx wrangler d1 list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") + DATABASE_ID=$(echo "$LIST_OUTPUT" | jq -r '.[] | select(.name=="api-worker") | .uuid') + fi + + if [ -z "$DATABASE_ID" ]; then + echo "❌ 无法创建或找到 D1 数据库" + exit 1 + fi + + sed -i -E "s/(database_id = \")([^\"]+)(\")/\\1$DATABASE_ID\\3/" apps/worker/wrangler.toml + echo "database_id=$DATABASE_ID" >> $GITHUB_ENV + + - name: Apply D1 migrations (remote) + if: steps.check-db.outputs.db_exists != 'true' + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: bunx wrangler d1 migrations apply DB --remote --config apps/worker/wrangler.toml + + - name: Deploy to Cloudflare Workers (SPA Mode) + if: steps.check-db.outputs.db_exists != 'true' && (needs.check-config.outputs.deploy_worker == 'true' || needs.check-config.outputs.deploy_ui == 'true') + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: bunx wrangler deploy --config apps/worker/wrangler.toml + deploy-spa: needs: check-config - if: needs.check-config.outputs.should_deploy == 'true' + if: needs.check-config.outputs.should_deploy == 'true' && needs.check-config.outputs.deploy_action != 'init' runs-on: ubuntu-latest steps: @@ -183,6 +306,7 @@ jobs: - name: Show deploy plan run: | + echo "deploy_action=${{ needs.check-config.outputs.deploy_action }}" echo "deploy_target=${{ needs.check-config.outputs.deploy_target }}" echo "apply_migrations=${{ needs.check-config.outputs.apply_migrations }}" echo "ui_changed=${{ needs.check-config.outputs.ui_changed }}" @@ -232,13 +356,13 @@ jobs: run: | echo "检查并创建 D1 数据库..." DATABASE_LIST=$(bunx wrangler d1 list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") - EXISTING_DB=$(echo "$DATABASE_LIST" | jq -r '.[] | select(.name=="new_api_lite") | .uuid') + EXISTING_DB=$(echo "$DATABASE_LIST" | jq -r '.[] | select(.name=="api-worker") | .uuid') if [ -n "$EXISTING_DB" ]; then echo "✅ 找到现有 D1 数据库: $EXISTING_DB" DATABASE_ID=$EXISTING_DB else - CREATE_OUTPUT=$(bunx wrangler d1 create new_api_lite --config apps/worker/wrangler.toml 2>&1) + CREATE_OUTPUT=$(bunx wrangler d1 create api-worker --config apps/worker/wrangler.toml 2>&1) if echo "$CREATE_OUTPUT" | grep -q "database_id"; then DATABASE_ID=$(echo "$CREATE_OUTPUT" | grep -oP "database_id = \"\K[^\"]+") @@ -247,7 +371,7 @@ jobs: fi else LIST_OUTPUT=$(bunx wrangler d1 list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") - DATABASE_ID=$(echo "$LIST_OUTPUT" | jq -r '.[] | select(.name=="new_api_lite") | .uuid') + DATABASE_ID=$(echo "$LIST_OUTPUT" | jq -r '.[] | select(.name=="api-worker") | .uuid') if [ -z "$DATABASE_ID" ]; then echo "❌ 无法创建或找到 D1 数据库" diff --git a/README.md b/README.md index dd3931f..0c5fc7d 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ - Checkout → 安装 Bun 1.3.9 → `bun install` - 构建管理台(`apps/ui/dist`),并校验产物 - 关闭 wrangler telemetry -- 创建/校验 D1(`new_api_lite`),在 CI 内写入 `apps/worker/wrangler.toml` 的 `database_id` +- 创建/校验 D1(`api-worker`),在 CI 内写入 `apps/worker/wrangler.toml` 的 `database_id` - 按需执行远程迁移 - `wrangler deploy` 部署 Worker @@ -86,7 +86,7 @@ bun run dev:worker - 日志保留天数(默认 30) - 会话时长(小时,默认 12) -- 管理员密码(首次登录自动初始化,可在系统设置中修改) +- 管理员密码(首次登录在登录页输入密码将自动设置,可在系统设置中修改) ### 3) 启动管理台 UI @@ -181,3 +181,4 @@ bun run --filter api-worker db:migrate - `ALL /v1/*` 转发到渠道 `base_url + 请求路径` - 当请求路径为 `/v1/responses` 且上游 400/404 时自动回退到 `/responses` - 流式请求会自动补齐 `stream_options.include_usage = true` 以收集用量 + diff --git a/apps/worker/migrations/0001_init.sql b/apps/worker/migrations/0001_init.sql index 66ef1d3..85c1575 100644 --- a/apps/worker/migrations/0001_init.sql +++ b/apps/worker/migrations/0001_init.sql @@ -3,10 +3,16 @@ CREATE TABLE IF NOT EXISTS channels ( name TEXT NOT NULL, base_url TEXT NOT NULL, api_key TEXT NOT NULL, + type INTEGER NOT NULL DEFAULT 1, + group_name TEXT, + priority INTEGER NOT NULL DEFAULT 0, weight INTEGER NOT NULL DEFAULT 1, status TEXT NOT NULL DEFAULT 'active', rate_limit INTEGER DEFAULT 0, models_json TEXT, + metadata_json TEXT, + test_time INTEGER, + response_time_ms INTEGER, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); @@ -16,6 +22,7 @@ CREATE TABLE IF NOT EXISTS tokens ( name TEXT NOT NULL, key_hash TEXT NOT NULL, key_prefix TEXT NOT NULL, + token_plain TEXT, quota_total INTEGER, quota_used INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'active', diff --git a/apps/worker/migrations/0002_add_token_plain.sql b/apps/worker/migrations/0002_add_token_plain.sql deleted file mode 100644 index af782f2..0000000 --- a/apps/worker/migrations/0002_add_token_plain.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE tokens ADD COLUMN token_plain TEXT; diff --git a/apps/worker/migrations/0003_add_channel_meta.sql b/apps/worker/migrations/0003_add_channel_meta.sql deleted file mode 100644 index 23a9c70..0000000 --- a/apps/worker/migrations/0003_add_channel_meta.sql +++ /dev/null @@ -1,6 +0,0 @@ -ALTER TABLE channels ADD COLUMN type INTEGER NOT NULL DEFAULT 1; -ALTER TABLE channels ADD COLUMN group_name TEXT; -ALTER TABLE channels ADD COLUMN priority INTEGER NOT NULL DEFAULT 0; -ALTER TABLE channels ADD COLUMN metadata_json TEXT; -ALTER TABLE channels ADD COLUMN test_time INTEGER; -ALTER TABLE channels ADD COLUMN response_time_ms INTEGER; diff --git a/apps/worker/migrations/0004_add_usage_log_metrics.sql b/apps/worker/migrations/0004_add_usage_log_metrics.sql deleted file mode 100644 index 9bdb3e0..0000000 --- a/apps/worker/migrations/0004_add_usage_log_metrics.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE usage_logs ADD COLUMN first_token_latency_ms INTEGER; -ALTER TABLE usage_logs ADD COLUMN stream INTEGER; -ALTER TABLE usage_logs ADD COLUMN reasoning_effort TEXT; diff --git a/apps/worker/wrangler.toml b/apps/worker/wrangler.toml index c4accdf..a4fcb47 100644 --- a/apps/worker/wrangler.toml +++ b/apps/worker/wrangler.toml @@ -9,7 +9,7 @@ PROXY_RETRY_DELAY_MS = "200" [[d1_databases]] binding = "DB" -database_name = "new_api_lite" +database_name = "api-worker" database_id = "00000000-0000-0000-0000-000000000000" [assets] @@ -19,3 +19,4 @@ not_found_handling = "single-page-application" run_worker_first = true + diff --git a/helloagents/CHANGELOG.md b/helloagents/CHANGELOG.md index ee2b9b3..c350756 100644 --- a/helloagents/CHANGELOG.md +++ b/helloagents/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased] ### 微调 + - **[admin-ui]**: 处理剪贴板异常时忽略未使用的错误变量 - 类型: 微调(无方案包) - 文件: apps/ui/src/App.tsx:500 @@ -85,15 +86,31 @@ - 类型: 微调(无方案包) - 文件: apps/worker/src/routes/proxy.ts +## [0.4.10] - 2026-02-21 + +### 变更 + +- **[ci]**: D1 数据库名称调整为 `api-worker` + - 方案: [202602212345_db-name-api-worker](archive/2026-02/202602212345_db-name-api-worker/) + +## [0.4.9] - 2026-02-21 + +### 变更 + +- **[ci]**: 部署流程新增 init 动作并仅首次初始化 + - 方案: [202602212329_deploy-init-action](archive/2026-02/202602212329_deploy-init-action/) + ## [0.4.8] - 2026-02-21 ### 变更 + - **[ci]**: 部署流程支持按变更范围选择前端/后端并默认按迁移变更执行 - 方案: [202602211446_deploy-workflow-auto](archive/2026-02/202602211446_deploy-workflow-auto/) ## [0.4.7] - 2026-02-21 ### 变更 + - **[tooling]**: UI 目录从 apps/admin 迁移为 apps/ui 并同步配置 - 方案: [202602211405_rename-admin-ui](archive/2026-02/202602211405_rename-admin-ui/) - **[ci]**: 部署流程改用 apps/ui 与 api-worker-ui @@ -104,6 +121,7 @@ ## [0.4.6] - 2026-02-21 ### 变更 + - **[tooling]**: 统一工作区包名与脚本为 api-worker / api-worker-ui - 方案: [202602161825_rename-api-worker-ui](archive/2026-02/202602161825_rename-api-worker-ui/) - **[worker]**: Worker 部署名称更新为 api-worker @@ -114,12 +132,14 @@ ## [0.4.5] - 2026-02-16 ### 变更 + - **[admin-ui]**: 令牌管理改为列表视图并支持分页弹窗创建 - 方案: [202602161600_token-list-ui](archive/2026-02/202602161600_token-list-ui/) ## [0.4.4] - 2026-02-16 ### 修复 + - **[admin-ui]**: 使用日志默认每页 50 条并修正本地时间显示 - 方案: [202602161433_usage-log-fixes](archive/2026-02/202602161433_usage-log-fixes/) - **[usage/proxy]**: 使用日志补充首 token 延迟、流式与推理强度记录 @@ -128,18 +148,21 @@ ## [0.4.3] - 2026-02-16 ### 变更 + - **[admin-ui]**: 使用日志支持分页与指标拆分展示 - 方案: [202602161355_usage-view-metrics](archive/2026-02/202602161355_usage-view-metrics/) ## [0.4.2] - 2026-02-16 ### 变更 + - **[deployment]**: 管理台通过 Worker Static Assets 部署并补齐手动/自动部署流程 - 方案: [202602161013_worker-assets-deploy](archive/2026-02/202602161013_worker-assets-deploy/) ## [0.4.1] - 2026-02-15 ### 变更 + - **[admin-ui]**: 管理台入口拆分为模块、扁平化 features,并将 AppShell 调整为 AppLayout - 方案: [202602152325_admin-ui-modularize](archive/2026-02/202602152325_admin-ui-modularize/) - 决策: admin-ui-modularize#D001(功能域拆分) @@ -147,18 +170,21 @@ ## [0.4.0] - 2026-02-15 ### 新增 + - **[channels]**: New API 标签批量权重/启用/停用接口 - 方案: [202602152211_newapi-tag-sync](archive/2026-02/202602152211_newapi-tag-sync/) ## [0.3.1] - 2026-02-15 ### 修复 + - **[proxy]**: 增强 usage 解析以修复使用日志与数据面板 token 统计为 0 - 方案: [202602151843_fix-usage-tokens](archive/2026-02/202602151843_fix-usage-tokens/) ## [0.3.0] - 2026-02-15 ### 变更 + - **[admin-ui]**: 管理台改为 Hono + TSX DOM 渲染并接入 Tailwind v4 - 方案: [202602151628_admin-ui-hono-tsx-tailwind](archive/2026-02/202602151628_admin-ui-hono-tsx-tailwind/) - 决策: admin-ui-hono-tsx-tailwind#D001(采用 Hono JSX DOM + Tailwind) @@ -166,12 +192,14 @@ ## [0.2.1] - 2026-02-15 ### 变更 + - **[tooling]**: 切换为 Bun 作为包管理器,补充部署说明与 fix 命令 - 方案: [202602150153_bun-tooling](archive/2026-02/202602150153_bun-tooling/) ## [0.2.0] - 2026-02-15 ### 新增 + - **[channels/auth/models]**: 新增 New API 兼容渠道管理接口、用户模型接口与管理员令牌鉴权 - 方案: [202602150127_newapi-channel-compat](archive/2026-02/202602150127_newapi-channel-compat/) - 决策: newapi-channel-compat#D001(新增兼容层并保留扩展字段) @@ -179,22 +207,24 @@ ## [0.1.0] - 2026-02-14 ### 新增 + - **[核心服务]**: 初始化 Worker + D1 后端与 Vite 管理台,提供渠道/模型/令牌/日志/面板与 OpenAI 兼容代理 - 方案: [202602142217_new-api-lite](archive/2026-02/202602142217_new-api-lite/) - 决策: new-api-lite#D001(单 Worker + Hono), new-api-lite#D002(Vite + Pages), new-api-lite#D003(Token 默认全渠道), new-api-lite#D004(日志保留可配置) ### 修复 + - **[{模块名}]**: {修复描述} - - 方案: [{YYYYMMDDHHMM}_{fix}](archive/{YYYY-MM}/{YYYYMMDDHHMM}_{fix}/) + - 方案: [{YYYYMMDDHHMM}\_{fix}](archive/{YYYY-MM}/{YYYYMMDDHHMM}_{fix}/) ### 微调 + - **[{模块名}]**: {微调描述} - 类型: 微调(无方案包) - 文件: {文件路径}:{行号范围} ### 回滚 + - **[{模块名}]**: 回滚至 {版本/提交} - 原因: {回滚原因} - 方案: [{原方案包}](archive/{YYYY-MM}/{原方案包}/) - - diff --git a/helloagents/INDEX.md b/helloagents/INDEX.md index 6483292..e809046 100644 --- a/helloagents/INDEX.md +++ b/helloagents/INDEX.md @@ -16,9 +16,9 @@ ## 知识库状态 ```yaml -最后更新: 2026-02-21 14:18 -模块数量: 9 -待执行方案: 0 +最后更新: 2026-02-21 23:47 +模块数量: 10 +待执行方案: 9 ``` ## 读取指引 @@ -36,3 +36,6 @@ ``` + + + diff --git a/helloagents/modules/_index.md b/helloagents/modules/_index.md index fe5884c..fd9049c 100644 --- a/helloagents/modules/_index.md +++ b/helloagents/modules/_index.md @@ -15,6 +15,7 @@ | dashboard | 数据面板统计 | 🚧 | [dashboard.md](./dashboard.md) | | settings | 系统配置 | 🚧 | [settings.md](./settings.md) | | admin-ui | 管理台前端 | 🚧 | [admin-ui.md](./admin-ui.md) | +| deploy-workflow | GitHub Actions 部署流程 | 🚧 | [deploy-workflow.md](./deploy-workflow.md) | ## 模块依赖关系 @@ -24,6 +25,7 @@ proxy → channels, tokens, usage dashboard → usage, tokens models → channels usage → settings +deploy-workflow → admin-ui, worker ``` ## 状态说明 diff --git a/helloagents/modules/deploy-workflow.md b/helloagents/modules/deploy-workflow.md new file mode 100644 index 0000000..08e1f8c --- /dev/null +++ b/helloagents/modules/deploy-workflow.md @@ -0,0 +1,24 @@ +# deploy-workflow + +## 职责 + +GitHub Actions 部署流程,负责区分 update/init 动作,控制 UI/Worker 构建、D1 初始化与部署。 + +## 行为规范 + +### 初始化部署 +**条件**: workflow_dispatch/repository_dispatch 且 `deploy_action=init`,`should_deploy=true`,D1 数据库不存在 +**行为**: 创建 D1 数据库 → 远程迁移 → 部署 Worker(含 UI 构建) +**结果**: 完成首次初始化部署 + +### 常规更新 +**条件**: `deploy_action=update` 或 push 自动触发 +**行为**: 按变更范围选择前端/后端部署,必要时执行迁移 +**结果**: 日常更新发布 + +## 依赖关系 + +```yaml +依赖: admin-ui, worker +被依赖: - +```