跳转到内容

数据库结构

StackVitals 使用 Supabase Postgres,迁移文件按编号顺序从 supabase/migrations/*.sql 应用。

用途
projects每个被跟踪的应用一行,以自由格式的 slug 为键,与采集器配置匹配
providers提供商注册表——awsamplifysupabaseresendopenaigithubcloudflare
resources提供商资源——部署、域名、数据库、API 账户等
metric_snapshots状态、计数、使用量、延迟和部署状态的时间序列
cost_snapshots按提供商/服务的每日或每月成本;默认为账户级别
health_checks正常运行时间、HTTP 状态、响应时间和最后成功检查
collector_runs每次采集运行的审计跟踪,包括错误
dashboard_users用于 RLS 访问控制的邮箱允许列表

metric_snapshotscost_snapshotshealth_checks 是追加写入的。读取层按逻辑键取最新值,而非就地更新。这样可以保留历史记录并避免更新冲突。

成本行保持在账户级别(project_id 为 null),除非采集器能将成本映射到特定项目。仪表盘不会猜测项目级别的成本拆分。

projects.slug 是自由格式的字符串,必须与 projects.config.json 中的 slug 匹配。providers.key 映射到 TypeScript 类型 ProviderKey。新的提供商键总是与其采集器适配器一起添加,不会提前添加。

行级安全策略将所有读取限制为邮箱出现在 dashboard_users 中的已认证用户。这是持久的数据边界——前端邮箱允许列表(VITE_DASHBOARD_ALLOWED_EMAIL)是额外的关卡,不是替代品。

迁移按编号顺序从 supabase/migrations/ 应用:

  1. 核心 schema(projects、providers、resources、snapshots、health checks、collector runs)
  2. Dashboard users 表 + RLS 策略
  3. 额外的索引和优化

在开发过程中运行 npx supabase db reset 可以从头重新应用所有迁移和种子数据。