Server to centralize measurements from many Rayhunter devices to archive and process looking for anomalies.
  • Python 77.3%
  • HTML 11.5%
  • Shell 9.7%
  • Dockerfile 1.5%
Find a file
2026-07-27 19:04:51 +02:00
config Fixing 2FA templates 2026-07-11 17:53:55 +02:00
ingestion ability to download received files from the admin 2026-07-12 22:09:02 +02:00
nginx Telemetry feature receiving data in /api/telemetry 2026-06-30 12:35:57 +02:00
sensors adding sensor ip to the info sheet qr code 2026-07-12 21:34:27 +02:00
telemetry fixing some issues in the deploy script 2026-07-11 17:05:42 +02:00
templates/two_factor Fixing 2FA templates 2026-07-11 17:53:55 +02:00
.env.example Adding QR generation for companion app at the sensor level 2026-06-30 18:41:37 +02:00
.gitignore Initial commit 2026-06-23 14:23:09 +02:00
deploy.sh further polishing 2FA and style 2026-07-11 17:26:12 +02:00
docker-compose.yml adding log rotation 2026-07-27 19:04:51 +02:00
Dockerfile Initial commit 2026-06-23 14:23:09 +02:00
init-letsencrypt.sh Initial commit 2026-06-23 14:23:09 +02:00
manage.py Initial commit 2026-06-23 14:23:09 +02:00
README.md Initial commit 2026-06-23 14:23:09 +02:00
requirements.txt Add phonenumbers dependency for django-two-factor-auth 1.15+ 2026-07-11 17:34:50 +02:00

fade-server

Work in progress. This project is under active development and is expected to be heavily contributed to over the coming months.

What is this?

This is the server-side stack for the FADE project, built to ingest and process data from Rayhunter sensors deployed in the field.

The server lets you register any number of sensors, each getting its own WebDAV endpoint with a dedicated username and password. Sensors upload their QMDL recordings and GPS sidecar files to these endpoints. Once uploaded, files are queued for server-side processing — the goal being to run analysis on the Rayhunter readings, detect anomalies, and surface them alongside the alerts generated on-device.

Processing components (PCAP conversion, variable extraction, anomaly detection) will be added as separate Django apps as the project advances.

Stack

  • Django — core framework, one app per major aspect of execution
  • MySQL — database backend
  • Celery + Redis — async task queue and file scan scheduler
  • wsgidav — WebDAV server, mounted at /webdav/{sensor-slug}/
  • nginx — reverse proxy, handles TLS termination
  • Docker Compose — runs everything, no host dependencies beyond Docker

Running on a new server

Requirements

  • Docker with the Compose plugin
  • Ports 80 and 443 open on the server firewall
  • A domain name pointing to the server (for HTTPS)

Steps

1. Clone and configure

git clone <repo-url> fade_server
cd fade_server
cp .env.example .env

Edit .env and set at minimum:

  • SECRET_KEY — a long random string
  • DB_PASSWORD — database password
  • ALLOWED_HOSTS — your domain (e.g. dashboard.example.com)
  • CSRF_TRUSTED_ORIGINS — full HTTPS URL (e.g. https://dashboard.example.com)
  • DOMAIN — your domain, for the TLS certificate
  • CERTBOT_EMAIL — your email, for Let's Encrypt notifications

2. Obtain a TLS certificate (first deploy only)

chmod +x init-letsencrypt.sh
./init-letsencrypt.sh

This generates the nginx config, starts nginx, requests a Let's Encrypt certificate, and reloads nginx. The certbot container will handle renewals automatically after this.

3. Start the stack

docker compose up -d
docker compose exec web python manage.py migrate
docker compose exec web python manage.py createsuperuser

4. Add sensors

Go to https://your-domain/admin/ and create a Sensor record. Each sensor gets:

  • A slug-based WebDAV endpoint: https://your-domain/webdav/{slug}/
  • A dedicated username and password for uploads

Sensors can upload files using any WebDAV client:

curl -u user:password -T recording.qmdl \
  https://your-domain/webdav/sensor-slug/recording.qmdl

Uploaded files appear under Ingestion → Ingested files in the admin within 30 seconds.

Local testing (no domain, no HTTPS)

docker compose up -d
docker compose exec web python manage.py migrate
docker compose exec web python manage.py createsuperuser

Access the admin at http://<server-ip>/admin/. WebDAV endpoints work the same over HTTP.