Sign inSign up

blackoutsecure/readsb

By blackoutsecure

•Updated 4 months ago

LinuxServer.io containerized of readsb high‑performance ADS‑B decoder RTL‑SDR aircraft signal

Image
Networking
Internet of things
Monitoring & observability
0

50K+

blackoutsecure/readsb repository overview

readsb logo

⁠blackoutsecure/readsb

GitHub Stars Docker Pulls GitHub Release Blackout Secure Launchpad License: GPL v3 Made by BlackoutSecure

Unofficial community image for readsb⁠, built with LinuxServer.io⁠ style container patterns (s6, hardened defaults, practical runtime options) for RTL-SDR ADS-B workloads. Sponsored and maintained by Blackout Secure⁠.

Important

This repository is not an official LinuxServer.io image release. Want to help make it an officially supported LinuxServer.io Community image? Add your support in [linuxserver/discussions/108](https://github.com/orgs/linuxserver/discussions/108).

Links: Docker Hub⁠ · Balena block⁠ · GitHub⁠ · Upstream readsb⁠

balena deploy button


⁠Table of Contents


⁠Quick Start

5-minute RTL-SDR receiver setup:

docker run -d \
  --name=readsb \
  --restart unless-stopped \
  -e TZ=Etc/UTC \
  -e READSB_DEVICE_TYPE=rtlsdr \
  -p 30001:30001 \
  -p 30002:30002 \
  -p 30003:30003 \
  -p 30004:30004 \
  -p 30005:30005 \
  -p 30104:30104 \
  -v readsb-config:/config \
  -v readsb-json:/run/readsb \
  --device=/dev/bus/usb:/dev/bus/usb \
  --security-opt no-new-privileges:true \
  blackoutsecure/readsb:latest

Access live JSON output: docker exec readsb cat /run/readsb/aircraft.json | jq .

For compose files, balena, network-only mode, and more examples, see Usage⁠ below.


⁠Image Availability

Docker Hub (Recommended):

  • All images published to Docker Hub⁠
  • Simple pull command: docker pull blackoutsecure/readsb:latest
  • Multi-arch support: amd64, arm64
  • No registry prefix needed (defaults to Docker Hub)
# Pull latest
docker pull blackoutsecure/readsb

# Pull specific version
docker pull blackoutsecure/readsb:1.2.3

# Pull architecture-specific (rarely needed)
docker pull blackoutsecure/readsb:latest@amd64

⁠About The readsb Application

readsb⁠ is an ADS-B decoder often described upstream as an "ADS-B decoder swiss knife".

It is a detached fork lineage used by many ADS-B receivers and related tooling, with network outputs, JSON/API features, and broad SDR support used for local receivers and large-scale feed/aggregation workflows.

Author and maintenance credits (upstream):

  • Primary upstream maintainer: wiedehopf⁠ (Matthias Wirth)
  • Upstream credits/history lineage: antirez (original dump1090), Malcom Robb, mutability (dump1090-mutability / dump1090-fa), Mictronics (readsb fork), and wiedehopf (current fork)
  • Upstream repository and documentation: wiedehopf/readsb⁠

⁠Supported Architectures

This image is published as a multi-arch manifest. Pulling blackoutsecure/readsb:latest retrieves the correct image for your host architecture.

The architectures supported by this image are:

ArchitectureTag
x86-64amd64-latest
arm64arm64v8-latest

⁠Usage

---
services:
  readsb:
    image: blackoutsecure/readsb:latest
    container_name: readsb
    environment:
      - TZ=Etc/UTC
      - READSB_DEVICE_TYPE=rtlsdr
      - READSB_NET_BI_PORT=30004,30104  # Beast input ports
      - READSB_NET_BO_PORT=30005        # Beast output port
      # - READSB_BIASTEE=true          # enable for powered LNAs (e.g. SAWbird+)
      - LOG_LEVEL=info                 # debug | info | warn | error | fatal
    volumes:
      - /path/to/readsb/config:/config
      - /path/to/readsb/json:/run/readsb
    ports:
      - 30001:30001  # Raw protocol (TCP)
      - 30002:30002  # Raw protocol input (TCP)
      - 30003:30003  # SBS protocol (TCP)
      - 30004:30004  # Beast input (TCP)
      - 30005:30005  # Beast output (TCP)
      - 30104:30104  # Beast input (TCP)
    devices:
      - /dev/bus/usb:/dev/bus/usb
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp
      - /run:exec
    restart: unless-stopped
⁠docker-compose with RTL-SDR over network (e.g., from a remote receiver)
---
services:
  readsb:
    image: blackoutsecure/readsb:latest
    container_name: readsb
    environment:
      - TZ=Etc/UTC
      - READSB_EXTRA_ARGS=--lon <longitude> --lat <latitude>
    volumes:
      - /path/to/readsb/config:/config
      - /path/to/readsb/json:/run/readsb
    ports:
      - 30001:30001
      - 30002:30002
      - 30003:30003
      - 30004:30004
      - 30005:30005
      - 30104:30104
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp
      - /run:exec
    restart: unless-stopped
⁠docker-compose with dump978 sidecar (dual 1090/978 MHz, US only)
---
services:
  readsb:
    image: blackoutsecure/readsb:latest
    container_name: readsb
    environment:
      - TZ=Etc/UTC
      - READSB_DEVICE_TYPE=rtlsdr
      # - READSB_BIASTEE=true          # enable for powered LNAs (e.g. SAWbird+)
      - FEED_UAT_INPUT=dump978:30978
      # - READSB_DEVICE=00001090  # pin 1090 dongle by serial
    volumes:
      - readsb-config:/config
      - readsb-json:/run/readsb
    devices:
      - /dev/bus/usb:/dev/bus/usb
    ports:
      - 30001:30001
      - 30002:30002
      - 30003:30003
      - 30004:30004
      - 30005:30005
      - 30104:30104
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp
      - /run:exec
    restart: unless-stopped
    depends_on:
      - dump978

  dump978:
    image: blackoutsecure/dump978:latest
    container_name: dump978
    environment:
      - TZ=Etc/UTC
      - DUMP978_SDR=driver=rtlsdr,serial=00000978
      - DUMP978_PROFILE=adsbexchange
    volumes:
      - dump978-config:/config
      - dump978-run:/run/dump978-fa
    ports:
      - 8978:8978
      - 30978:30978
      - 30979:30979
    devices:
      - /dev/bus/usb:/dev/bus/usb
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp
      - /run:exec
    restart: unless-stopped

volumes:
  readsb-config:
  readsb-json:
  dump978-config:
  dump978-run:

Note: UAT 978 MHz is US-only (below 18,000 ft). Tag your dongles with rtl_eeprom -d 0 -s 00001090 and rtl_eeprom -d 1 -s 00000978. See blackoutsecure/docker-dump978⁠ for full dump978 documentation.

⁠docker-cli (click here for more info⁠)
docker run -d \
  --name=readsb \
  -e TZ=Etc/UTC \
  -e READSB_DEVICE_TYPE=rtlsdr \
  -p 30001:30001 \
  -p 30002:30002 \
  -p 30003:30003 \
  -p 30004:30004 \
  -p 30005:30005 \
  -p 30104:30104 \
  -v /path/to/readsb/config:/config \
  -v /path/to/readsb/json:/run/readsb \
  --device=/dev/bus/usb:/dev/bus/usb \
  --security-opt no-new-privileges:true \
  --restart unless-stopped \
  blackoutsecure/readsb:latest
⁠Balena Deployment

This image can be deployed to Balena-powered IoT devices using the included docker-compose.yml file (which contains the required Balena labels):

balena push <your-app-slug>

For deployment via the web interface, use the deploy button in this repository. See Balena documentation⁠ for details.

⁠Parameters

⁠Ports
ParameterFunction
-p 30001:30001Raw protocol output (TCP)
-p 30002:30002Raw protocol input (TCP)
-p 30003:30003SBS protocol compatible output (TCP)
-p 30004:30004Beast protocol input (TCP)
-p 30005:30005Beast protocol output (TCP)
-p 30104:30104Beast protocol input (TCP)
⁠Environment Variables
ParameterFunctionRequired
-e TZ=Etc/UTCTimezone (TZ database⁠)Optional
-e READSB_NET=trueEnable TCP networking (Beast, raw, SBS listeners). Default: true. Set to false for decode-only mode.Optional
-e READSB_DEVICE_TYPE=rtlsdrSDR device type (rtlsdr, modesbeast, etc.). Leave empty for network-only mode. Maps to --device-type.Optional
-e READSB_EXTRA_ARGS=Additional readsb arguments appended after all env-var-driven options (e.g. --freq-correction 3).Optional
-e READSB_USER=abcRuntime user (default: abc). USB permissions are fixed automatically during init.Optional
-e PUID=1000User ID for file ownership (LinuxServer.io base image standard)Optional
-e PGID=1000Group ID for file ownership (LinuxServer.io base image standard)Optional
-e READSB_NET_BI_PORT=Beast protocol input port(s), comma-separated (e.g. 30004,30104). Maps to --net-bi-port.Optional
-e READSB_NET_BO_PORT=Beast protocol output port(s), comma-separated (e.g. 30005). Maps to --net-bo-port.Optional
-e READSB_DEVICE=RTL-SDR device index or serial for 1090 MHz (overrides auto-detection)Optional
-e FEED_PROFILES=Comma-separated feed exchanges (e.g. adsbexchange,adsb-fi). Defaults to adsbexchange if unset.Optional
-e FEED_UUID_ADSBEXCHANGE=Per-profile UUID override. Use uppercase profile name with hyphens as underscores (e.g. FEED_UUID_ADSB_FI, FEED_UUID_AIRPLANESLIVE). Stored in /config/feed-uuid-<profile>.Optional
-e FEED_STATS_ENABLED=trueEnable periodic console stats logging and ADSBx RSSI/stats upload. Console stats log aircraft count, positions, and message totals. ADSBx upload activates automatically when adsbexchange is in FEED_PROFILES, using the same UUID as the beast feed.Optional
-e STATS_LOG_INTERVAL=120Console stats logging interval in seconds (default: 120 = every 2 minutes)Optional
-e FEED_UAT_INPUT=UAT 978 MHz source as host:port (e.g. dump978:30978). Requires docker-dump978⁠ sidecar. US only.Optional
-e FEED_LAT=Receiver latitude (e.g. 47.6062). Fallback if --lat not in READSB_EXTRA_ARGS.Optional
-e FEED_LON=Receiver longitude (e.g. -122.3321). Fallback if --lon not in READSB_EXTRA_ARGS.Optional
-e READSB_AUTO_LOCATION=trueAuto-detect latitude/longitude via IP geolocation when FEED_LAT/FEED_LON not set.Optional
-e READSB_AUTOGAIN=trueEnable readsb built-in autogain (--gain auto). Default: true. Set to false to disable.Optional
-e READSB_GAIN=Set a fixed RTL-SDR gain value (e.g. 40.2). Overrides READSB_AUTOGAIN.Optional
-e READSB_BIASTEE=falseEnable bias-T DC voltage on the RTL-SDR coax to power active antennas/LNAs (default: false). Only enable if your antenna requires DC power.Optional
-e LOG_LEVEL=infoMinimum log verbosity: debug, info (default), warn, error, fatal. Set to debug for verbose operational detail, or warn to suppress routine informational messages.Optional
⁠Storage Mounts
ParameterFunctionRequired
-v /configConfiguration and persistent dataRecommended
-v /run/readsbJSON output directoryRecommended
⁠Devices
ParameterFunctionRequired
--device=/dev/bus/usb:/dev/bus/usbRTL-SDR USB device accessRequired (for RTL-SDR local RX)

⁠Volume Details

The container uses two volumes for data persistence and output:

⁠/config — Configuration & Persistence
  • Required: No (container runs without it, but state is lost on restart)
  • Purpose: Stores persistent data including aircraft database cache and application state
  • Contents:
    • aircraft.csv.gz (aircraft identification database)
    • Temporary caches and application state
    • Any custom configuration files
  • Example: -v /path/to/readsb/config:/config or -v readsb-config:/config
⁠/run/readsb — JSON Output
  • Required: No (but needed to access real-time ADS-B data)
  • Purpose: Real-time JSON protocol output consumed by other applications and visualization tools
  • Contents:
    • aircraft.json (current aircraft with positions and altitudes)
    • receiver.json (receiver stats and information)
    • Other protocol outputs
  • Update frequency: Multiple times per second
  • Example: -v /path/to/readsb/json:/run/readsb or -v readsb-json:/run/readsb
⁠Best Practices
  • For persistence: Always use named volumes or host paths for /config to preserve aircraft database between container restarts
  • For JSON access: Mount /run/readsb to a host path to query data from other containers or host processes
  • Alternative (tmpfs): Can use tmpfs mounts for temp directories, but JSON output will be lost when container stops
⁠Volume Mount Examples

Named volumes (recommended for single-host deployments):

volumes:
  - config:/config
  - json:/run/readsb

Host paths (for direct file access):

volumes:
  - /var/lib/readsb/config:/config
  - /var/lib/readsb/json:/run/readsb

Accessing JSON data from host:

docker exec readsb cat /run/readsb/aircraft.json | jq '.aircraft | length'

⁠Configuration

Environment variables are set using -e flags in docker run or the environment: section in docker-compose.


⁠User / Group Identifiers

By default, this container runs as the LSIO abc user (non-root) for better security isolation. The abc user is created by the LinuxServer.io base image⁠ with UID/GID 911 and remapped at container start via PUID/PGID.

Non-root mode (default, recommended):

  • readsb runs as the abc user by default
  • RTL-SDR USB device permissions are automatically fixed during container init — no manual configuration needed
  • Set PUID and PGID only if you need file ownership to match a specific host user

Root mode (fallback):

  • Set READSB_USER=root if needed for other reasons
  • USB permissions are handled automatically regardless of user

⁠Application Setup

The container runs readsb with network support and automatic RTL-SDR device detection by default.

⁠Key Features
  • JSON Output: ADS-B data is output as JSON to /run/readsb/ and updated frequently
  • RTL-SDR Support: USB devices are auto-detected when passed to the container; permissions are fixed automatically
  • Aircraft Database: Includes tar1090 aircraft database⁠ for accurate identification
  • Automatic Gain: readsb's built-in autogain (--gain auto) is enabled by default (READSB_AUTOGAIN=true) — adjusts gain at the IQ sample level every ~0.5s, in-process without restarts. Set READSB_AUTOGAIN=false to disable.
  • Bias-T Power: Optional DC voltage on coax for active antennas with built-in LNAs (see Bias-T Power for Active Antennas⁠)
  • Docker HEALTHCHECK: Built-in health monitoring — marks container unhealthy if aircraft.json stops updating
  • Periodic Stats: Logs aircraft count, positions, and message totals every 2 minutes (configurable via STATS_LOG_INTERVAL). When adsbexchange is in FEED_PROFILES, also uploads RSSI/stats data to ADSBx every 5 seconds using the same UUID as the beast feed. Per-upload confirmations are debug-level.
  • Log Verbosity: Set LOG_LEVEL to control log output: debug, info (default), warn, error, fatal
  • Feed Status URLs: Init logs include verification URLs for each active feed profile
  • RTL-SDR Tools: rtl_test, rtl_eeprom, and rtl_biast available inside the container for diagnostics, dongle tagging, and bias-T control
⁠Extra Arguments (READSB_EXTRA_ARGS)

Most readsb settings have dedicated READSB_* env vars (READSB_NET, READSB_DEVICE_TYPE, READSB_GAIN, READSB_AUTOGAIN, READSB_BIASTEE, READSB_NET_BI_PORT, etc.). Use READSB_EXTRA_ARGS for anything not covered by a dedicated variable — these are appended to the end of the command line after all env-var-driven options.

Examples:

# Frequency correction
-e READSB_EXTRA_ARGS="--freq-correction 10"

# Location and range
-e READSB_EXTRA_ARGS="--lat 51.5 --lon -0.1 --max-range 350"

# See autogain decisions in the log
-e READSB_EXTRA_ARGS="--gain auto-verbose"

# Multiple extra options
-e READSB_EXTRA_ARGS="--freq-correction 3 --max-range 300 --ppm 2"

For all available readsb options, see the readsb documentation⁠.

⁠JSON Output Files
  • aircraft.json - Current aircraft data with positions, callsigns, and altitudes
  • receiver.json - Statistics and receiver information
⁠Supported Modes
  • Read-only filesystem: Supported when JSON and temp directories are mounted to volumes or tmpfs
  • Non-root user: Supported by default — RTL-SDR USB permissions are fixed automatically during init
⁠SDR Device Selection

The container auto-detects RTL-SDR dongles at startup and assigns the 1090 MHz device automatically using the community serial-number convention.

Auto-detection (default):

  • Single dongle: assumed to be 1090 MHz
  • Multiple dongles: serial containing 978 or uat is identified as UAT (informational); first non-UAT dongle is assigned as 1090

Manual override:

Set READSB_DEVICE to a device index or serial number:

environment:
  - READSB_DEVICE=0          # by device index
  - READSB_DEVICE=00001090   # by serial number

UAT 978 MHz (US only):

readsb only decodes 1090 MHz. For 978 MHz UAT, run blackoutsecure/docker-dump978⁠ as a sidecar container and set FEED_UAT_INPUT=dump978:30978 to merge UAT aircraft into readsb's unified output. See the dump978 sidecar compose example⁠ above.

Tagging dongle serials:

rtl_eeprom -d 0 -s 00001090   # tag first dongle as 1090
rtl_eeprom -d 1 -s 00000978   # tag second dongle as UAT


The description above is a condensed version. View the full README on GitHub: https://github.com/blackoutsecure/docker-readsb/blob/3f3f30902a8daf30ba80d4f36a51877888128657/./README.md⁠

Tag summary

Content type

Image

Digest

sha256:fb2798888…

Size

23.1 MB

Last updated

4 months ago

docker pull blackoutsecure/readsb