A fleet of 9 real-time data publishers that fetch observations from public APIs and push them into a CSAPI-compliant server (e.g. OpenSensorHub).
| Service | Data Source | Default Cadence |
|---|---|---|
| ISS | CelesTrak TLE → SGP4 propagation | 30 s |
| NWS | NOAA NWS Surface Observations | 1 h |
| NDBC | NOAA NDBC Buoy Met Data | 1 h |
| NDBC BuoyCAM | NOAA NDBC Camera Imagery | 15 min |
| CO-OPS | NOAA CO-OPS Tide Stations | 6 min |
| Aviation WX | FAA AviationWeather METAR | 5 min |
| OpenSky | OpenSky Network ADS-B | 5 min |
| USGS Water | USGS NWIS Water Monitoring | 15 min |
| USGS NIMS | USGS NIMS Camera Imagery | 15 min |
| USGS EQ | USGS Earthquake Hazards | 60 s |
- Python 3.12+
- Docker & Docker Compose (for containerised deployment)
- A running CSAPI server with admin credentials
cp .env.example .env
# Edit .env with your server details:
# OSH_ADDRESS, OSH_PORT, OSH_USER, OSH_PASS, OSH_ROOTBootstraps are idempotent — safe to re-run. They create the procedures, systems, datastreams, and deployment hierarchy on your server.
# Set the env vars (or source .env)
export $(grep -v '^#' .env | xargs)
# Run one bootstrap at a time:
python -m publishers.nws.bootstrap_nws
python -m publishers.ndbc.bootstrap_ndbc
python -m publishers.coops.bootstrap_coops
python -m publishers.aviation_wx.bootstrap_aviation_wx
python -m publishers.opensky.bootstrap_opensky
python -m publishers.usgs_water.bootstrap_usgs_water
python -m publishers.usgs_nims.bootstrap_usgs_nims
python -m publishers.usgs_eq.bootstrap_usgs_eq
python -m publishers.iss.bootstrap_isscd publishers
docker compose up -d # start all
docker compose up -d nws # start one
docker compose logs -f nws # follow logs
docker compose ps # status
docker compose down # stop allexport $(grep -v '^#' .env | xargs)
python -m publishers.nws.nws_publisher --interval 3600┌─────────────┐ Bootstrap (one-time) ┌──────────────┐
│ bootstrap_ │ ──────────────────────────► │ │
│ *.py │ creates procedures, │ CSAPI │
│ │ systems, datastreams, │ Server │
└─────────────┘ deployments │ (OSH) │
│ │
┌─────────────┐ Publisher (continuous) │ │
│ *_publisher │ ──────────────────────────► │ │
│ .py │ POSTs observations every │ │
│ │ N seconds │ │
└─────────────┘ └──────────────┘
▲
│ Fetches from
▼
┌─────────────┐
│ Public API │ NWS, NDBC, USGS, etc.
└─────────────┘
| Variable | Required | Description |
|---|---|---|
OSH_ADDRESS |
Yes | Server hostname (e.g. myserver.example.com) |
OSH_PORT |
Yes | Server port (usually 443) |
OSH_USER |
Yes | Auth username |
OSH_PASS |
Yes | Auth password |
OSH_ROOT |
Yes | Server root path (usually sensorhub) |
BOOTSTRAP_URL |
No | Override the full bootstrap API URL |
OSH_FORCE_IP |
No | Force DNS resolution to a specific IP |
USGS_API_KEY |
No | USGS API key for higher rate limits |
BUOYCAM_CACHE_ROOT |
No | Local directory for BuoyCAM image cache |
BUOYCAM_CACHE_BASE_URL |
No | Public URL serving the cached images |
- BuoyCAM requires a static file server (e.g. Nginx) to serve cached
JPEG images. Set
BUOYCAM_CACHE_ROOTto the local directory andBUOYCAM_CACHE_BASE_URLto the matching public URL. - OpenSky uses the unauthenticated public API. Rate limit is 100 req/day.
- USGS Water / NIMS benefit from an optional
USGS_API_KEY. - All publishers use
--interval <seconds>and--dry-runCLI flags.