first commit
This commit is contained in:
104
README.md~
104
README.md~
@@ -1,104 +0,0 @@
|
|||||||
# aprs-collector
|
|
||||||
|
|
||||||
```
|
|
||||||
[Shack-LAN] [DMZ]
|
|
||||||
Direwolf AGW:8000
|
|
||||||
???
|
|
||||||
agw_forwarder.py ??????POST/Bearer????????? FastAPI :8080/ingest/rf ????????? TimescaleDB
|
|
||||||
???
|
|
||||||
rotate.aprs2.net??? (APRS-IS, outbound)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## DMZ ??? snabbstart
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
|
|
||||||
# Generera en API-nyckel
|
|
||||||
python3 -c "import secrets; print(secrets.token_hex(32))"
|
|
||||||
# Klistra in i .env som API_KEY
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
docker compose logs -f collector
|
|
||||||
```
|
|
||||||
|
|
||||||
S??tt en reverse proxy (Caddy/nginx) framf??r port 8080 om du vill ha TLS.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Shack ??? agw-forwarder
|
|
||||||
|
|
||||||
Kopiera mappen `agw-forwarder/` till Direwolf-datorn.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip3 install requests
|
|
||||||
|
|
||||||
export AGW_HOST=localhost
|
|
||||||
export AGW_PORT=8000
|
|
||||||
export COLLECTOR_URL=http://<dmz-ip>:8080
|
|
||||||
export API_KEY=<samma nyckel som i DMZ .env>
|
|
||||||
export STATION_CALL=SA6ANW-1
|
|
||||||
|
|
||||||
python3 agw_forwarder.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### K??r som systemd-tj??nst
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Redigera agw-forwarder.service ??? fyll i COLLECTOR_URL och API_KEY
|
|
||||||
sudo cp agw-forwarder.service /etc/systemd/system/
|
|
||||||
sudo systemctl daemon-reload
|
|
||||||
sudo systemctl enable --now agw-forwarder
|
|
||||||
journalctl -u agw-forwarder -f
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Resiliens
|
|
||||||
|
|
||||||
Forwardern har en intern k?? (2000 frames). Om DMZ ??r tillf??lligt on??bar buffras
|
|
||||||
frames i minnet och skickas n??r anslutningen ??terkommer. Vid omstart av forwardern
|
|
||||||
f??rsvinner buffrade frames ??? tillr??ckligt f??r de flesta avbrott.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
| Endpoint | Metod | Auth | Beskrivning |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `/ingest/rf` | POST | Bearer | RF-frame fr??n forwarder |
|
|
||||||
| `/health` | GET | ??? | Liveness check |
|
|
||||||
|
|
||||||
Swagger UI: `http://<dmz-ip>:8080/docs`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Nyttiga queries
|
|
||||||
|
|
||||||
```sql
|
|
||||||
-- Direkt-h??rda stationer senaste 7 dagarna
|
|
||||||
SELECT ts, src_call, lat, lon, path
|
|
||||||
FROM rf_frames
|
|
||||||
WHERE heard_direct = TRUE
|
|
||||||
AND ts > NOW() - INTERVAL '7 days'
|
|
||||||
ORDER BY ts DESC;
|
|
||||||
|
|
||||||
-- Digis som h??rts senaste 30 min (= "online")
|
|
||||||
SELECT src_call, MAX(ts) AS last_seen, COUNT(*) AS frames
|
|
||||||
FROM rf_frames
|
|
||||||
WHERE ts > NOW() - INTERVAL '30 minutes'
|
|
||||||
GROUP BY src_call
|
|
||||||
ORDER BY last_seen DESC;
|
|
||||||
|
|
||||||
-- T??ckningspunkter per rutn??tscell
|
|
||||||
SELECT
|
|
||||||
ROUND(lat::numeric, 2) AS grid_lat,
|
|
||||||
ROUND(lon::numeric, 2) AS grid_lon,
|
|
||||||
COUNT(*) AS hits
|
|
||||||
FROM rf_frames
|
|
||||||
WHERE heard_direct = TRUE
|
|
||||||
AND lat IS NOT NULL
|
|
||||||
GROUP BY grid_lat, grid_lon;
|
|
||||||
```
|
|
||||||
Reference in New Issue
Block a user