
실시간 OSINT 인텔리전스 대시보드: 인터랙티브 지구본에서 제공되는 7개의 라이브 데이터 소스(항공기, AIS 선박, 지진, 화재, 기상, GDELT 이벤트, 뉴스). 상관관계 엔진, 점수 기반 알림, 감시 모드. Bun + React 19 + Canvas 2D Web Worker 렌더링. 오프라인 지원 PWA. https://sigint-5154d935429b.herokuapp.com/
실시간 OSINT 대시보드로, 대화형 지구본에서 실시간 항공기, 선박, 지진, 화재, 날씨, 이벤트 추적을 제공합니다. Bun, React 19, 커스텀 Canvas 2D + Web Worker 렌더링 엔진으로 구축되었으며 PWA로 설치할 수 있습니다.

git clone https://github.com/iitoneloc/sigint.git
cd sigint
bun install
프로젝트 루트에 최소한 다음 내용으로 .env 파일을 생성하세요:
SIGINT_SERVER_SECRET=<output of openssl rand -hex 32>
선박 및 화재 데이터용 키를 선택적으로 추가할 수 있습니다:
AISSTREAM_API_KEY=<your aisstream.io key>
FIRMS_MAP_KEY=<your NASA FIRMS key>
개발, 프로덕션, Heroku 옵션은 배포를 참조하세요.
bun test # run all tests
bun test --watch # watch mode
bun run docker:test # run in Docker
bun run docker:dev:up # https://localhost (self-signed cert)
bun run docker:dev:down # stop
두 환경 변수는 개발 중 실시간 데이터 조회를 우회하여 알려진 고정 상태를 기준으로 작업할 수 있게 해줍니다. 두 변수 모두 NODE_ENV !== "production" 조건에서만 활성화되며 프로덕션 빌드에서는 무시됩니다.
라벨은 /^[a-z0-9-]+$/ 패턴과 일치해야 하며(OWASP A01 — 파일 조회 전 엄격한 허용 목록 적용), tests/fixtures/<source>/<label>.json으로 해석됩니다. 잘못된 라벨은 시작 시 오류를 발생시키고, 누락된 파일은 해석된 경로와 함께 오류를 발생시킵니다. 사용 방법:
CYCLONES_FIXTURE=multi-storm bun run dev
AIRCRAFT_FIXTURE=conus-snapshot bun run dev
또는 Docker Compose 사용 시 (docker-compose.dev.yml이 두 변수를 모두 전달합니다):
CYCLONES_FIXTURE=single-cat5 bun run docker:dev:up
bun run docker:prod:up # http://localhost:5500
bun run docker:prod:down # stop
DOMAIN=sigint.example.com bun run docker:prod:tls:up
bun run docker:prod:tls:down # stop
git push heroku main
bun run docker:clean:all # remove containers, volumes, images
SIGINT는 프로그레시브 웹 앱(PWA)으로 설치할 수 있습니다. 배포된 앱에 접속한 후:
서비스 워커는 오프라인 부팅을 위해 앱 셸을 캐시합니다. 오프라인 상태에서는 라이브 데이터를 IndexedDB에서 불러옵니다. 연결이 끊기면 오프라인 표시 막대가 나타나며, RETRY 버튼과 터치 기기의 당겨서 새로고침이 제공됩니다. 업데이트가 있으면 배너가 사용자에게 다시 로드하도록 안내합니다 — 세션 중 조용한 코드 교체는 없습니다.
아키텍처, 데이터 흐름, 기능 시스템, 패널 시스템, 렌더링, 캐싱, 검색, 제약 조건을 다루는 전체 기술 문서는 docs/에 있습니다.
이중 라이선스:
| 변수 | 필수 | 설명 |
|---|
SIGINT_SERVER_SECRET | 예 | 인증 토큰 서명 키. openssl rand -hex 32 |
AISSTREAM_API_KEY | 아니요 | 실시간 선박 데이터용 aisstream.io 키 |
FIRMS_MAP_KEY | 아니요 | 화재 데이터용 NASA FIRMS 키 |
DOMAIN | 아니요 | Let's Encrypt TLS용 도메인 |
PORT | 아니요 | 서버 포트 (기본값: 5500) |
| 레이어 | 소스 | 폴링 간격 |
|---|
| 항공기 | adsb.fi (서버 측 타일 스캔, 37타일 × 250nm) | 240s |
| 선박 | aisstream.io (서버 WebSocket) | 300s |
| 지진 | USGS (클라이언트 측) | 420s |
| 화재 | NASA FIRMS (서버 측) | 600s |
| 날씨 | NOAA (클라이언트 측) | 300s |
| 이벤트 | GDELT 2.0 (서버 측) | 15m |
| 뉴스 | 6개 RSS 피드 (서버 측) | 10m |
| 환경 변수 | 재정의하는 소스 | 유효한 라벨 |
|---|
CYCLONES_FIXTURE | /api/cyclones/latest (서버가 NHC에서 조회) | single-cat3, single-cat5, multi-storm, subtropical-example, tropical-depression, empty-out-of-season |
AIRCRAFT_FIXTURE | /api/aircraft/states (서버가 adsb.fi 타일 스캔 조회) | (제공되는 항목 없음 — bun run scripts/capture-fixture.ts aircraft <label>로 캡처) |