一条命令即可评估您的整个云账户——错误配置、缺失的可观测性以及安全态势,并按优先级列出前五项需要修复的问题。
将它指向 AWS、Cloudflare、Vercel、Supabase、Render、Fly.io 或 Railway,它就会返回一个评分、哪些地方出了问题以及每个问题的修复方案——内容自包含,可直接交给 Agent 处理。
npx cloud-doctor
https://github.com/user-attachments/assets/60b610ab-7aee-4c3a-8d9e-83f045c8cc56
这会选择一个提供商,解析您的身份(AWS 配置文件、API 令牌……),然后以交互方式运行扫描。要直接跳转到某个提供商:
npx cloud-doctor aws --profile prod
npx cloud-doctor cloudflare --yes
npx cloud-doctor vercel --yes
如果 ~/.npmrc 设置了 min-release-age(供应链加固)且阻止了新版本发布:
# =<number>, 0 chosen as example
npm x --min-release-age=0 cloud-doctor -- aws profiles
想要尝鲜?Alpha 版本发布在自己的标签上:npx cloud-doctor@alpha。
认证令牌可以设置为环境变量,也可以在 TUI 提示时提供:
CLOUDFLARE_API_TOKEN=cfut_aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1kUXc0dzlXZ1hjUQ== npx cloud-doctor cloudflare
(不要对令牌进行 base64 解码)
或者
$ npx cloud-doctor cloudflare
Cloudflare credentials are not set — enter them below.
Kept for this run only, never written to disk. Skip these prompts: export CLOUDFLARE_API_TOKEN
dashboard → My Profile → API Tokens
? Cloudflare read-only API token › <input>
即将推出:Google Cloud、Kubernetes 和 数据库(Postgres、MySQL、Redis)——详见 后续计划。
npx cloud-doctor # 选择提供商(默认为 AWS)→ 选择身份 → 扫描
npx cloud-doctor aws # AWS 快速路径
npx cloud-doctor aws --profile prod # 无歧义时非交互式
npx cloud-doctor aws --yes --json # CI,机器可读输出
npx cloud-doctor aws --yes --json --fail-under 75 # CI 基于评分门控
npx cloud-doctor cloudflare --yes # 需要 CLOUDFLARE_API_TOKEN
npx cloud-doctor vercel --yes # 需要 VERCEL_TOKEN(+ VERCEL_TEAM_ID)
npx cloud-doctor supabase --yes # 需要 SUPABASE_ACCESS_TOKEN
npx cloud-doctor render --yes # 需要 RENDER_API_KEY
npx cloud-doctor fly --yes # 需要 FLY_API_TOKEN(+ FLY_ORG)
npx cloud-doctor railway --yes # 需要 RAILWAY_API_TOKEN
npx cloud-doctor aws profiles # 列出 ~/.aws/config 中的配置文件
npx cloud-doctor aws whoami # 显示已解析的 AWS 身份
--yes 跳过提示(CI 安全);--json 以稳定的、带版本号的 JSON 格式输出报告,而非终端视图;--verbose 打印所有发现项,而非仅顶部问题;--no-color 禁用颜色输出。
评分从不造假:如果没有规则能运行,评分将为 null,标签显示"未运行任何检查",绝不会显示一个空洞的 100 分。
通过 doctor.config.ts(或 doctor.config.json,或 package.json 中的 cloudDoctor 字段)调整每个提供商的规则:
import { defineConfig } from "cloud-doctor/api";
export default defineConfig({
defaultProvider: "aws",
aws: {
profile: "prod",
regions: ["us-east-1", "eu-west-1"],
account: "123456789012",
},
rules: {
"aws/s3-unencrypted-bucket": "off",
"aws/iam-user-access-key": "error",
},
});
"off" 禁用规则;"error" / "warning" 覆盖其严重性。禁用的规则会从评分中移除,并显示为已静音——绝不会被静默减去。
一个轻量级 CLI,基于插件注册表——每个提供商实现相同的契约,因此 CLI 永远不会对某个提供商进行特殊处理。
每个提供商实现 CloudDoctorPlugin:
discoverIdentities() — 列出配置文件/项目/账户,供选择器使用resolveIdentity() — 将标志/环境变量/配置映射到身份,不进行网络调用validateIdentity() — 验证凭据是否正常(sts:GetCallerIdentity 或等效)scan() — 运行门控规则,返回诊断结果 + 评分新提供商在 packages/plugins/src/index.ts 中注册。
gcloud、k8s 和 db 即将推出。
pnpm install
pnpm build
pnpm typecheck
pnpm test
为了在不接触真实云账户的情况下进行规则验证,仓库附带了一个 http-mock 和 Moto/fab 夹具框架: (ps:fab 是用于生成测试环境的 CLI,目前私有,依赖项目也将开源)
pnpm mock:up <scenario> # 启动一个持久的 mock 实例
eval "$(pnpm -s mock:env <scenario>)" # 将环境变量指向它
pnpm mock:run <scenario> # 针对它运行 CLI
特别感谢 react-doctor
| 提供商 | 命令 | 认证方式 |
|---|
| AWS | cloud-doctor aws | AWS SDK 凭据链——--profile、AWS_PROFILE、环境变量、SSO、Web 身份 |
| Cloudflare | cloud-doctor cloudflare | CLOUDFLARE_API_TOKEN |
| Vercel | cloud-doctor vercel | VERCEL_TOKEN(可选 VERCEL_TEAM_ID) |
| Supabase | cloud-doctor supabase | SUPABASE_ACCESS_TOKEN |
| Render | cloud-doctor render | RENDER_API_KEY |
| Fly.io | cloud-doctor fly | FLY_API_TOKEN(可选 FLY_ORG) |
| Railway | cloud-doctor railway | RAILWAY_API_TOKEN(工作区/账户令牌) |
| 包 | 角色 |
|---|
packages/cloud-doctor | CLI(commander、prompts、ora)+ 编程式 diagnose() API |
packages/core | 插件注册表、评分、配置加载、共享类型 |
packages/plugin-* | 每个提供商一个包——身份发现 + 规则 |
packages/plugins | 默认注册表,将所有提供商连接在一起 |