
Go 기반 CLI 도구로, 프로덕션 배포 전에 코드베이스의 출시 준비 상태를 스캔하여 누락된 구성, 보안 위생 문제, 비밀 유출 및 통합 격차를 감지합니다.
Preflight.sh는 코드베이스의 출시 준비 상태를 스캔하는 명령줄 도구입니다. 배포 전에 누락된 설정, 통합 문제, 보안 우려사항, SEO 메타데이터 공백 및 기타 일반적인 실수를 식별합니다.
운영 환경에서 부끄러운 일을 당하지 마세요. 그냥 명령을 실행하세요.
brew install preflightsh/preflight/preflight
npm install -g @preflightsh/preflight
go install github.com/preflightsh/preflight@latest
docker pull ghcr.io/preflightsh/preflight
curl -sSL https://preflight.sh/install.sh | sh
최신 릴리스를 GitHub Releases에서 다운로드하세요.
# 프로젝트 디렉터리에서 초기화
cd your-project
preflight init
# 모든 검사 실행
preflight scan
# 특정 디렉터리 스캔
preflight scan /path/to/project
# 자세한 출력으로 실행 (각 검사에 일치하는 파일 표시)
preflight scan --verbose
preflight scan -v # 축약형
# CI 모드에서 JSON 출력으로 실행
preflight scan --ci --format json
# 특정 검사만 실행하거나 일부 건너뛰기 (빠른 반복 작업용)
# (일회성; `preflight ignore`와 달리 preflight.yml을 변경하지 않음)
preflight scan --only seoMeta,ogTwitter
preflight scan --skip vulnerability,secrets
# 검사 무음 처리
preflight ignore sitemap
# 검사 무음 해제
preflight unignore sitemap
# 모든 검사 ID 나열
preflight checks
이 저장소에는 skills/preflight/SKILL.md에 skills.sh 호환 에이전트 스킬이 포함되어 있습니다. 코딩 에이전트에게 반복 가능한 Preflight 워크플로를 제공합니다: preflight.yml 검사, CI 안전 스캔 실행, 결과 분류, 안전하지 않은 무시 방지, 재검증, 남은 출시 위험 보고.
이 저장소에서 스킬 목록 보기:
# Bun 사용
bunx --yes skills add preflightsh/preflight --list
# 또는 npm 사용
npx --yes skills add preflightsh/preflight --list
Preflight 스킬만 설치:
# Bun 사용
bunx --yes skills add preflightsh/preflight --skill preflight
# 또는 npm 사용
npx --yes skills add preflightsh/preflight --skill preflight
Preflight는 계정 없이 명령줄에서 완전히 사용할 수 있습니다. 선택적 대시보드(app.preflight.sh)는 스캔 기록과 각 결과에 대한 AI 생성 수정 제안을 호스팅합니다. 코드는 절대 머신을 떠나지 않습니다: 스캔은 로컬에서 실행되며, 게시 시 결과의 요약(검사 ID, 상태, 메시지, 비밀 값이나 파일 내용은 절대 포함되지 않음)만 전송됩니다.
무료 계정을 만든 후 CLI를 연결하세요:
preflight auth login # 브라우저를 열어 이 CLI 승인
preflight auth status # 현재 로그인된 사용자 표시
preflight auth logout # 저장된 자격 증명 제거
--publish를 사용하여 스캔을 대시보드에 게시하세요. 실행을 볼 수 있는 링크가 출력됩니다. 게시는 최선의 방식으로 이루어집니다: 오프라인이거나 로그인하지 않은 경우에도 스캔은 정상적으로 실행되고 종료됩니다.
preflight scan --publish
대시보드에서는 각 실행의 pass/warn/fail 분석, 전체 결과 목록, 프로젝트별 기록을 확인할 수 있어 배포 간 변경 사항을 볼 수 있습니다.
터미널에서도 preflight history로 해당 기록을 읽을 수 있습니다:
preflight history # 프로젝트 전체의 최근 실행
preflight history --here # 현재 프로젝트의 실행만
preflight history <run-id> # 특정 실행의 전체 검사 결과
preflight history --here --format json # 기계가 읽을 수 있는 형식 (에이전트용)
preflight auth login이 필요합니다. --here는 git 원격을 기준으로 현재 저장소의 실행과 일치시킵니다. 게시 시 사용된 키와 동일합니다.
게시된 실행에서 실패 또는 경고 검사를 열면 감지된 스택에 맞춰 단계별 수정 방법을 생성하며, 복사 준비가 된 명령과 코드를 제공합니다.
Preflight는 다음 서비스에 대한 구성을 자동 감지하고 검증합니다:
결제
오류 추적 및 모니터링
이메일 및 뉴스레터
분석
인증
채팅
알림
인프라
스토리지 및 CDN
검색
SEO
AI / LLMs
Preflight는 프로젝트 루트의 preflight.yml 파일을 사용합니다:
projectName: my-app
stack: rails # rails, next, react, vite, laravel, etc.
urls:
staging: "https://staging.example.com"
production: "https://example.com"
services:
stripe:
declared: true
sentry:
declared: true
checks:
envParity:
enabled: true
envFile: ".env"
exampleFile: ".env.example"
healthEndpoint:
enabled: true
path: "/health" # optional - auto-detects common paths if not set
stripeWebhook:
enabled: true
url: "https://api.example.com/webhooks/stripe"
seoMeta:
enabled: true
mainLayout: "app/views/layouts/application.html.erb"
security:
enabled: true
secrets:
enabled: true
# Per-file allowlist for the secrets scan. Use this to suppress an
# individual finding (e.g. a referrer-restricted public key) without
# disabling the whole check.
allowlist:
- path: web/js/golden-hour.js
fingerprint: "sha256:<hex>" # recommended — pins to the exact secret
reason: "HTTP-referrer-restricted Google Timezone key"
- path: "web/tools/**/*.php" # doublestar globs are supported
indexNow:
enabled: true
key: "your32characterhexkeyhere00000"
emailAuth:
enabled: true # opt-in, checks SPF/DMARC on production domain
humansTxt:
enabled: false # opt-in, credits the team
license:
enabled: false # opt-in, for open source projects
# Silence specific checks or services by ID
ignore:
- sitemap
- llmsTxt
- google_analytics
preflight ignore <id>를 사용하여 특정 검사 또는 서비스를 무음 처리합니다:
preflight ignore sitemap # 사이트맵 검사 무시
preflight ignore sentry # Sentry 서비스 검증 무시
preflight unignore sitemap # 사이트맵 검사 다시 활성화
preflight checks # 모든 무시 가능 ID 나열
전체 secrets 검사를 무음 처리하는 대신 개별 결과를 허용 목록에 추가하는 것이 좋습니다. 명령줄에서 일회성 예외를 추가하세요:
preflight ignore secrets web/js/golden-hour.js
그러면 preflight.yml의 checks.secrets.allowlist 아래에 경로 항목이 추가됩니다. path 필드는 doublestar glob입니다 (**는 디렉터리 간 일치). 프로젝트 기준 파일 경로로 해석됩니다.
지문을 고정하세요. 경로만 있는 허용 목록은 해당 파일에 향후 어떤 시크릿이 추가되어도 자동으로 수락합니다. 항목을 편집하고 fingerprint: "sha256:<hex>"를 추가하세요. 이는 감지된 시크릿 값의 SHA-256 해시입니다. 이제 키가 교체되거나 동일한 파일에 다른 시크릿이 나타나면 preflight가 다시 경고합니다.
결과는 경로 + 지문으로 일치하며, 파일 전체가 아닙니다. 파일 내 허용 목록에 등록된 지문이 같은 파일의 다른 줄에 있는 다른 시크릿을 억제하지는 않습니다.
SEO 및 소셜: seoMeta, canonical, structured_data, indexNow (옵트인), ogTwitter, viewport, lang
보안 및 인프라: securityHeaders, ssl, www_redirect, email_auth (옵트인), secrets
환경 및 상태: envParity, healthEndpoint
코드 품질 및 성능: vulnerability, debug_statements, error_pages, image_optimization
법률 및 규정 준수: legal_pages
웹 표준 파일: favicon, robotsTxt, sitemap, llmsTxt, adsTxt (옵트인), humansTxt (옵트인), license (옵트인)
모든 서비스에는 올바른 통합(환경 변수, SDK 패턴, 구성 파일)을 검증하는 검사가 있습니다:
결제: stripe, paypal, braintree, paddle, lemonsqueezy
오류 추적: sentry, bugsnag, rollbar, honeybadger, datadog, newrelic, logrocket
트랜잭션 이메일: postmark, sendgrid, mailgun, aws_ses, resend
이메일 마케팅: mailchimp, convertkit, beehiiv, aweber, activecampaign, campaignmonitor, drip, klaviyo, buttondown
분석: plausible, fathom, google_analytics, fullres, datafast, posthog, mixpanel, amplitude, segment, hotjar
인증: auth0, clerk, workos, firebase, supabase
커뮤니케이션: twilio, slack, discord, intercom, crisp
인프라: redis, sidekiq, rabbitmq, elasticsearch, convex
스토리지 및 CDN: aws_s3, cloudinary, cloudflare
검색: algolia
AI: openai, anthropic, google_ai, mistral, cohere, replicate, huggingface, grok, perplexity, together_ai
SEO: indexNow
쿠키 동의: cookieconsent, cookiebot, onetrust, termly, cookieyes, iubenda
| 코드 | 의미 |
|---|---|
| 0 | 모든 검사 통과 |
| 1 | 경고만 있음 |
| 2 | 오류 발견됨 |
| 64 | Preflight 실행 불가 (잘못된 경로, 읽을 수 없는 설정, 알 수 없는 검사 ID) |
코드 1과 2는 스캔이 실행되어 무언가를 보고했음을 의미합니다. 코드 64는 스캔이 그 단계까지 도달하지 못했음을 의미하므로, CI에서 "이 프로젝트에 문제가 있다"와 "이 호출이 잘못되었다"를 구분할 수 있습니다.
명령, 플래그 및 검사 ID(--only 및 --skip 값 포함)에 대한 탭 완성:
# bash (~/.bashrc에 추가)
source <(preflight completion bash)
# zsh (~/.zshrc에 추가)
source <(preflight completion zsh)
# fish
preflight completion fish | source
출력은 NO_COLOR 환경 변수도 존중합니다.
백엔드 프레임워크
프론트엔드 프레임워크
전통적인 CMS
정적 사이트 생성기
헤드리스 CMS
기타
# GitHub Actions 예제 (curl)
- name: Run Preflight
run: |
curl -sSL https://preflight.sh/install.sh | sh
preflight scan --ci --format json
# GitHub Actions 예제 (Docker)
- name: Run Preflight
run: docker run -v ${{ github.workspace }}:/app ghcr.io/preflightsh/preflight scan --ci --format json
MIT
| 검사 | 설명 |
|---|
| ENV Parity | .env와 .env.example을 비교하여 누락된 변수 확인 |
| Health Endpoint | 사이트 접근 가능 여부 확인; /health, /healthz, /api/health 자동 감지 또는 루트로 대체 |
| Vulnerability Scan | 종속성 취약점 확인 (bundle audit, npm audit 등) |
| SEO Metadata | title, description, Open Graph 태그 확인 |
| OG & Twitter Cards | og:image, twitter:card 및 소셜 공유 메타데이터 검증 |
| Canonical URL | canonical 링크 태그 존재 확인 |
| Viewport | 모바일을 위한 올바른 viewport meta 태그 확인 |
| Lang Attribute | 접근성을 위한 html lang 속성 검증 |
| Structured Data | JSON-LD Schema.org 마크업 확인 |
| Security Headers | 프로덕션 및 스테이징 모두에서 HSTS, CSP, X-Content-Type-Options 검증 |
| SSL Certificate | SSL 유효성 확인 및 만료 전 경고 |
| WWW Redirect | www/비-www 리디렉션이 표준 URL로 연결되는지 확인 |
| Email Auth | 이메일 전달성을 위한 SPF/DMARC DNS 레코드 확인 (옵트인) |
| Secret Scanning | 코드에 유출된 API 키 및 자격 증명 찾기 |
| Debug Statements | 코드에 남아 있는 console.log, var_dump, debugger 감지 |
| Error Pages | 사용자 정의 404/500 오류 페이지 확인 |
| Image Optimization | 로드 시간을 저하시키는 큰 이미지(>500KB) 발견 |
| Legal Pages | 개인정보 처리방침 및 서비스 약관 페이지 확인 |
| Cookie Consent | 쿠키 동의 솔루션 감지 (GDPR/CCPA 준수) |
| Favicon & Icons | favicon, apple-touch-icon (.png, .webp, .svg) 및 웹 매니페스트 확인 |
| robots.txt | robots.txt 존재 및 콘텐츠 확인 |
| sitemap.xml | 사이트맵 존재 또는 생성기 확인 |
| llms.txt | LLM 크롤러 안내 파일 확인 |
| ads.txt | 광고 지원 사이트를 위한 ads.txt 검증 (옵트인) |
| humans.txt | 팀을 표시하는 humans.txt 확인 (옵트인) |
| IndexNow | 빠른 검색 색인을 위한 IndexNow 키 파일 확인 (옵트인) |
| LICENSE | 라이선스 파일 확인 (옵트인, 오픈 소스 프로젝트용) |
| 130 |
| 스캔 취소됨 (Ctrl-C / SIGTERM) |