mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-09-23 01:10:42 +02:00
feat: pass FINNHUB_API_KEY to Docker, update layer defaults, cluster APRS
- Add FINNHUB_API_KEY to docker-compose.yml so financial ticker works in Docker deployments - Update default layer config: planes/ships ON, satellites only for space, no fire hotspots, military bases + internet outages for infra, all SIGINT except HF digital spots - Add MapLibre native clustering to APRS markers (matches Meshtastic) with cluster radius 42, breaks apart at zoom 8
This commit is contained in:
@@ -10,6 +10,7 @@ services:
|
|||||||
- OPENSKY_CLIENT_SECRET=${OPENSKY_CLIENT_SECRET}
|
- OPENSKY_CLIENT_SECRET=${OPENSKY_CLIENT_SECRET}
|
||||||
- LTA_ACCOUNT_KEY=${LTA_ACCOUNT_KEY}
|
- LTA_ACCOUNT_KEY=${LTA_ACCOUNT_KEY}
|
||||||
- ADMIN_KEY=${ADMIN_KEY:-}
|
- ADMIN_KEY=${ADMIN_KEY:-}
|
||||||
|
- FINNHUB_API_KEY=${FINNHUB_API_KEY:-}
|
||||||
# Override allowed CORS origins (comma-separated). Auto-detects LAN IPs if empty.
|
# Override allowed CORS origins (comma-separated). Auto-detects LAN IPs if empty.
|
||||||
- CORS_ORIGINS=${CORS_ORIGINS:-}
|
- CORS_ORIGINS=${CORS_ORIGINS:-}
|
||||||
# Default Infonet relay peer so fresh installs can sync immediately.
|
# Default Infonet relay peer so fresh installs can sync immediately.
|
||||||
|
|||||||
+30
-22
@@ -365,47 +365,55 @@ export default function Dashboard() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const [activeLayers, setActiveLayers] = useState<ActiveLayers>({
|
const [activeLayers, setActiveLayers] = useState<ActiveLayers>({
|
||||||
|
// Aircraft — all ON
|
||||||
flights: true,
|
flights: true,
|
||||||
private: true,
|
private: true,
|
||||||
jets: true,
|
jets: true,
|
||||||
military: true,
|
military: true,
|
||||||
tracked: true,
|
tracked: true,
|
||||||
satellites: true,
|
gps_jamming: true,
|
||||||
|
// Maritime — all ON
|
||||||
ships_military: true,
|
ships_military: true,
|
||||||
ships_cargo: true,
|
ships_cargo: true,
|
||||||
ships_civilian: true,
|
ships_civilian: true,
|
||||||
ships_passenger: true,
|
ships_passenger: true,
|
||||||
ships_tracked_yachts: true,
|
ships_tracked_yachts: true,
|
||||||
earthquakes: true,
|
fishing_activity: true,
|
||||||
cctv: true,
|
// Space — only satellites
|
||||||
ukraine_frontline: true,
|
satellites: true,
|
||||||
global_incidents: true,
|
|
||||||
day_night: true,
|
|
||||||
gps_jamming: true,
|
|
||||||
gibs_imagery: false,
|
gibs_imagery: false,
|
||||||
highres_satellite: false,
|
highres_satellite: false,
|
||||||
|
sentinel_hub: false,
|
||||||
|
viirs_nightlights: false,
|
||||||
|
// Hazards — no fire, rest ON
|
||||||
|
earthquakes: true,
|
||||||
|
firms: false,
|
||||||
|
ukraine_alerts: true,
|
||||||
|
weather_alerts: true,
|
||||||
|
volcanoes: true,
|
||||||
|
air_quality: true,
|
||||||
|
// Infrastructure — military bases + internet outages only
|
||||||
|
cctv: false,
|
||||||
|
datacenters: false,
|
||||||
|
internet_outages: true,
|
||||||
|
power_plants: false,
|
||||||
|
military_bases: true,
|
||||||
|
trains: false,
|
||||||
|
// SIGINT — all ON except HF digital spots
|
||||||
kiwisdr: true,
|
kiwisdr: true,
|
||||||
psk_reporter: true,
|
psk_reporter: false,
|
||||||
satnogs: true,
|
satnogs: true,
|
||||||
tinygs: true,
|
tinygs: true,
|
||||||
scanners: true,
|
scanners: true,
|
||||||
firms: true,
|
|
||||||
internet_outages: true,
|
|
||||||
datacenters: true,
|
|
||||||
military_bases: true,
|
|
||||||
power_plants: false,
|
|
||||||
sigint_meshtastic: true,
|
sigint_meshtastic: true,
|
||||||
sigint_aprs: true,
|
sigint_aprs: true,
|
||||||
ukraine_alerts: true,
|
// Overlays
|
||||||
weather_alerts: true,
|
ukraine_frontline: true,
|
||||||
air_quality: true,
|
global_incidents: true,
|
||||||
volcanoes: true,
|
day_night: true,
|
||||||
fishing_activity: true,
|
|
||||||
sentinel_hub: false,
|
|
||||||
trains: true,
|
|
||||||
shodan_overlay: false,
|
|
||||||
viirs_nightlights: false,
|
|
||||||
correlations: true,
|
correlations: true,
|
||||||
|
// Shodan
|
||||||
|
shodan_overlay: false,
|
||||||
});
|
});
|
||||||
const [shodanResults, setShodanResults] = useState<ShodanSearchMatch[]>([]);
|
const [shodanResults, setShodanResults] = useState<ShodanSearchMatch[]>([]);
|
||||||
const [, setShodanQueryLabel] = useState('');
|
const [, setShodanQueryLabel] = useState('');
|
||||||
|
|||||||
@@ -1595,6 +1595,8 @@ const MaplibreViewer = ({
|
|||||||
meshtasticGeoJSON && 'meshtastic-clusters',
|
meshtasticGeoJSON && 'meshtastic-clusters',
|
||||||
meshtasticGeoJSON && 'meshtastic-cluster-count',
|
meshtasticGeoJSON && 'meshtastic-cluster-count',
|
||||||
meshtasticGeoJSON && 'meshtastic-circles',
|
meshtasticGeoJSON && 'meshtastic-circles',
|
||||||
|
aprsGeoJSON && 'aprs-clusters',
|
||||||
|
aprsGeoJSON && 'aprs-cluster-count',
|
||||||
aprsGeoJSON && 'aprs-triangles',
|
aprsGeoJSON && 'aprs-triangles',
|
||||||
ukraineAlertsGeoJSON && 'ukraine-alerts-fill',
|
ukraineAlertsGeoJSON && 'ukraine-alerts-fill',
|
||||||
weatherAlertsGeoJSON && 'weather-alerts-fill',
|
weatherAlertsGeoJSON && 'weather-alerts-fill',
|
||||||
@@ -3180,44 +3182,82 @@ const MaplibreViewer = ({
|
|||||||
/>
|
/>
|
||||||
</Source>
|
</Source>
|
||||||
|
|
||||||
{/* APRS / JS8Call — pink triangles */}
|
{/* APRS / JS8Call — pink triangles with clustering */}
|
||||||
<Source id="aprs-source" type="geojson" data={EMPTY_FC}>
|
<Source
|
||||||
|
id="aprs-source"
|
||||||
|
type="geojson"
|
||||||
|
data={EMPTY_FC}
|
||||||
|
cluster={true}
|
||||||
|
clusterRadius={42}
|
||||||
|
clusterMaxZoom={8}
|
||||||
|
>
|
||||||
<Layer
|
<Layer
|
||||||
id="aprs-halo"
|
id="aprs-clusters"
|
||||||
type="circle"
|
|
||||||
paint={{
|
|
||||||
'circle-radius': ['interpolate', ['linear'], ['zoom'], 2, 4, 6, 6, 10, 8],
|
|
||||||
'circle-color': '#f472b6',
|
|
||||||
'circle-opacity': 0.14,
|
|
||||||
'circle-stroke-width': 1,
|
|
||||||
'circle-stroke-color': '#f9a8d4',
|
|
||||||
'circle-stroke-opacity': 0.45,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<Layer
|
|
||||||
id="aprs-triangles"
|
|
||||||
type="symbol"
|
type="symbol"
|
||||||
|
filter={['has', 'point_count']}
|
||||||
layout={{
|
layout={{
|
||||||
'icon-image': 'icon-aprs-triangle',
|
'icon-image': 'icon-aprs-triangle',
|
||||||
'icon-size': ['interpolate', ['linear'], ['zoom'], 2, 0.8, 6, 1.0, 10, 1.15],
|
'icon-size': [
|
||||||
|
'step',
|
||||||
|
['get', 'point_count'],
|
||||||
|
1.1,
|
||||||
|
10,
|
||||||
|
1.35,
|
||||||
|
50,
|
||||||
|
1.65,
|
||||||
|
100,
|
||||||
|
1.95,
|
||||||
|
500,
|
||||||
|
2.3,
|
||||||
|
],
|
||||||
'icon-allow-overlap': true,
|
'icon-allow-overlap': true,
|
||||||
'icon-ignore-placement': true,
|
|
||||||
}}
|
}}
|
||||||
paint={{
|
paint={{
|
||||||
'icon-opacity': 0.95,
|
'icon-opacity': 0.95,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
<Layer
|
||||||
|
id="aprs-cluster-count"
|
||||||
|
type="symbol"
|
||||||
|
filter={['has', 'point_count']}
|
||||||
|
layout={{
|
||||||
|
'text-field': ['get', 'point_count_abbreviated'],
|
||||||
|
'text-size': 11,
|
||||||
|
'text-font': ['Noto Sans Bold'],
|
||||||
|
'text-offset': [0, 0.05],
|
||||||
|
'text-anchor': 'center',
|
||||||
|
'text-allow-overlap': true,
|
||||||
|
}}
|
||||||
|
paint={{
|
||||||
|
'text-color': '#4a0525',
|
||||||
|
'text-halo-color': '#f9a8d4',
|
||||||
|
'text-halo-width': 0.8,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Layer
|
||||||
|
id="aprs-triangles"
|
||||||
|
type="symbol"
|
||||||
|
filter={['!', ['has', 'point_count']]}
|
||||||
|
layout={{
|
||||||
|
'icon-image': 'icon-aprs-triangle',
|
||||||
|
'icon-size': 0.7,
|
||||||
|
'icon-allow-overlap': true,
|
||||||
|
}}
|
||||||
|
paint={{
|
||||||
|
'icon-opacity': 0.85,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
<Layer
|
<Layer
|
||||||
id="aprs-labels"
|
id="aprs-labels"
|
||||||
type="symbol"
|
type="symbol"
|
||||||
minzoom={5}
|
minzoom={8}
|
||||||
layout={{
|
layout={{
|
||||||
'text-field': ['get', 'callsign'],
|
'text-field': ['get', 'callsign'],
|
||||||
'text-size': 9,
|
'text-size': 9,
|
||||||
'text-offset': [0, 1.2],
|
'text-offset': [0, 1.2],
|
||||||
'text-anchor': 'top',
|
'text-anchor': 'top',
|
||||||
'text-font': ['Noto Sans Regular'],
|
'text-font': ['Noto Sans Regular'],
|
||||||
'text-allow-overlap': true,
|
'text-allow-overlap': false,
|
||||||
}}
|
}}
|
||||||
paint={{
|
paint={{
|
||||||
'text-color': '#f9a8d4',
|
'text-color': '#f9a8d4',
|
||||||
|
|||||||
Reference in New Issue
Block a user