
Одна команда оценивает весь ваш облачный аккаунт — неправильные конфигурации, отсутствие наблюдаемости и состояние безопасности.
Одна команда оценивает всю вашу облачную учетную запись — неверные конфигурации, отсутствие наблюдаемости и уровень безопасности, отсортированные по пяти вещам, которые нужно исправить в первую очередь.
Направьте её на AWS, Cloudflare, Vercel, Supabase, Render, Fly.io или Railway, и она вернёт оценку, список проблем и исправление для каждой — достаточно самодостаточно, чтобы передать агенту.
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 (укрепление цепочки поставок) и блокирует свежие релизы:
# =<число>, 0 выбран как пример
npm x --min-release-age=0 cloud-doctor -- aws profiles
Предпочитаете самую свежую версию? Альфа-сборки публикуются со своим тегом: 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
панель управления → Мой профиль → API-токены
? Cloudflare API-токен только для чтения › <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 выводит стабильный отчёт с версией схемы вместо терминального вида; --verbose выводит все находки вместо главных нарушителей; --no-color отключает цветной вывод.
Оценки никогда не подделываются: если ни одно правило не смогло выполниться, оценка — null с меткой "Проверки не запущены", а не пустая 100.
Настройте правила для каждого провайдера через doctor.config.ts (или doctor.config.json, или cloudDoctor в package.json):
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: (прим.: 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, веб-идентификация |
| 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) + программное API diagnose() |
packages/core | Реестр плагинов, оценка, загрузка конфигурации, общие типы |
packages/plugin-* | Один пакет на провайдера — обнаружение идентичности + правила |
packages/plugins | Реестр по умолчанию, связывающий всех провайдеров вместе |