여러 웹사이트의 URL·path 헬스체크를 등록하고, 상태를 한곳에서 보는 uptime 모니터링 웹 앱입니다.
수동 검사, Cron 자동 검사, Discord 알림(장애·복구 전환 시)을 지원합니다.
| 항목 | 내용 |
|---|---|
| 시기 | 2026-05 (Phase 1 MVP → Phase 2 Auth/Cron) |
| 앱 | apps/web |
| 스택 | Next.js 16 · React 19 · Supabase · shadcn/ui · Turborepo |
- 사이트 등록 — 이름, base URL, 헬스 모드(
root/paths/both) - Path 모니터링 — 사이트별 하위 path 추가·검사
- 대시보드 — 사이트 카드, 정상/장애 요약, 수동 전체 검사
- 사이트 상세 — path별 최근 결과, 응답 시간·상태 코드
- 인증 — Google OAuth (
@supabase/ssr), 사용자별 데이터 격리(RLS) - 자동 검사 — Vercel Cron →
GET /api/cron/check - 알림 — Discord Webhook (down/up 전환 시만)
- 설정 — Discord Webhook URL 관리
| 구분 | 기술 |
|---|---|
| 프레임워크 | Next.js 16 (App Router, Turbopack) |
| UI | React 19, shadcn/ui (base-maia), Tailwind CSS v4 |
| 모노레포 | pnpm workspaces, Turborepo |
| DB / Auth | Supabase (Postgres, RLS, OAuth) |
| 배포·Cron | Vercel Cron + CRON_SECRET |
| 알림 | Discord Webhooks |
orbit/
├── apps/web/ # Next.js 앱
│ ├── app/ # dashboard, sites/[id], login, settings, api/cron
│ ├── components/orbit/ # UI (SiteCard, AddSiteSheet, StatusBadge …)
│ └── lib/
│ ├── monitor/ # URL 검사, run-checks, health-mode
│ ├── notifications/ # Discord, failure-alerts
│ └── supabase/ # auth, server client, types
├── packages/ui/ # 공유 shadcn 컴포넌트
├── supabase/migrations/ # DB 스키마·RLS
└── docs/solutions/monitoring/ # Phase 1·2 구현 기록
- Node.js >= 20
- pnpm 9
- Supabase 프로젝트 (URL, publishable key, secret key)
apps/web/.env.local (.env.example 참고):
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=
SUPABASE_SECRET_KEY=
CRON_SECRET= # Cron API 보호용pnpm install
pnpm dev # apps/web 개발 서버
pnpm build
pnpm typecheck
pnpm lintSupabase 마이그레이션은 supabase/migrations/를 프로젝트에 적용한 뒤 사용하세요.
# Authorization: Bearer <CRON_SECRET>
curl -H "Authorization: Bearer $CRON_SECRET" \
http://localhost:3000/api/cron/check| Phase | 내용 | 문서 |
|---|---|---|
| 1 | MVP — 수동 검사, sites/paths/results | docs/solutions/monitoring/phase1-mvp-manual-monitoring.md |
| 2 | Auth, Cron, Discord, RLS | docs/solutions/monitoring/phase2-auth-cron-discord.md |
에이전트·구현 규칙은 루트 AGENTS.md를 참고하세요.
(배포 URL 또는 스크린샷 추가 시 여기에 링크)
개인 프로젝트. 별도 LICENSE 없음.
김관응 (@kwaneung)