ARGUS is a geospatial intelligence platform running on a VPS with a Dockerized multi-service backend and a Next.js/Cesium frontend.
This repository is the canonical source of truth for:
- application code (
argus-app,argus-api,ingestor) - infrastructure (
docker-compose.yml,nginx,cloudflared,infra) - operational docs (
docs,VPS_CHANGELOG_AND_NEXT_STEPS.md)
ARGUS runs as containers on a VPS (single host deployment):
- nginx (
argus_nginx)
Reverse proxy / edge entrypoint. - argus-app (
argus_app)
Next.js frontend + API routes for feed proxies. - argus-api (
argus_api)
Express backend (analytics, health, server APIs). - postgis / timescaledb (
argus_postgis)
Primary database. - titiler (
argus_titiler)
Raster tile serving. - ingestor (
argus_ingestor)
Scheduled ingest/processing jobs (e.g., GFS). - cloudflared (
argus_cloudflared)
Cloudflare Tunnel to expose services securely.
All services communicate on argus_network.
- Internet traffic enters through Cloudflare Tunnel / DNS.
cloudflaredforwards traffic tonginx.nginxroutes:/->argus-app/spatial/*-> Zerve-hosted spatial FastAPI app/api/feeds/*->argus-appproxy routes/api/*->argus-api/tiles/*->titiler
ingestorwrites raster outputs todata/tiles.argus-apiadvertises available analytics layers.titilerserves those raster files as tile endpoints.argus-apprenders overlays in Cesium.
Current feed integrations include:
- OpenSky commercial flights
- ADS-B military flights
- CelesTrak satellites
- USGS earthquakes
- TFL CCTV + webcam sources
- Cloudflare Radar outages
- AlienVault OTX threat pulses
- FRED macro feed
- AISStream vessel snapshot
Most third-party feeds are proxied through server routes to avoid browser CORS/API key exposure.
argus/
argus-app/ # Next.js app + Cesium UI + feed proxy routes
argus-api/ # Express API service
ingestor/ # Data ingestion/processing jobs
nginx/ # Nginx config
cloudflared/ # Cloudflare tunnel config
infra/ # DB init / infra assets
data/ # Local data mounts (tiles, etc)
docs/ # Architecture plans and technical notes
docker-compose.yml
- Docker + Docker Compose plugin installed
.envfile present at repo root (never commit secrets)
docker compose up -d --builddocker compose ps
docker compose logs -f --tail=100docker compose downdocker compose up -d --build argus-app argus-apidocker compose restart argus-appdocker compose exec argus-app sh
docker compose exec argus-api shdocker compose exec -T argus-api node -e "fetch('http://localhost:3001/api/health').then(r=>r.text()).then(console.log)"Primary runtime env file: .env (repo root)
Important keys include (non-exhaustive):
CESIUM_ION_TOKENCLOUDFLARE_RADAR_TOKENOTX_API_KEYFRED_API_KEY,FRED_SERIES_IDAISSTREAM_API_KEY,AISSTREAM_ENDPOINTOPENSKY_CLIENT_ID,OPENSKY_CLIENT_SECRETPOSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORDCORS_ORIGIN(comma-separated allowlist forargus-api)- GlitchTip / Sentry DSNs
Do not commit secret-bearing files. .gitignore excludes local env variants.
- Frontend-specific docs:
argus-app/README.md - Infra updates and incident notes:
VPS_CHANGELOG_AND_NEXT_STEPS.md - Large architecture/design proposals:
docs/plans/*
masteris actively used for deployment work.- Keep commits focused and operationally readable.
- Avoid committing local secret files (
.env*, credentials, backup configs). - Verify
git statusbefore push.
docker compose ps-> confirm all services are up.docker compose logs <service>-> inspect errors.- Verify route flow: Cloudflare -> nginx -> target service.
- Verify tiles path consistency:
/data/tilesmounted where expected. - Validate env keys are present when feed routes return auth errors.
- Secrets in chat should be rotated and reissued.
- Never hardcode API keys in source.
- Keep credentials in
.envor secret manager only. - Remove stale
.bak/ scratch config artifacts from commits.
If you are onboarding to this repo, read AGENTS.md next.