
Информационная панель 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 и pull-to-refresh на сенсорных устройствах. Когда доступно обновление, баннер предлагает пользователю перезагрузиться — код не подменяется незаметно во время сеанса.
Полная техническая документация — в docs/. Она охватывает архитектуру, потоки данных, систему функций, систему панелей, рендеринг, кэширование, поиск и ограничения.
Двойное лицензирование:
| Переменная | Обязательная | Описание |
|---|
SIGINT_SERVER_SECRET | Да | Ключ подписи токенов аутентификации. openssl rand -hex 32 |
AISSTREAM_API_KEY | Нет | Ключ aisstream.io для данных о судах в реальном времени |
FIRMS_MAP_KEY | Нет | Ключ NASA FIRMS для данных о пожарах |
DOMAIN | Нет | Домен для TLS Let's Encrypt |
PORT | Нет | Порт сервера (по умолчанию: 5500) |
| Слой | Источник | Интервал |
|---|
| Самолёты | adsb.fi (серверный обход тайлов, 37 тайлов × 250 морских миль) | 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>) |