readsb
LinuxServer.io containerized of readsb high‑performance ADS‑B decoder RTL‑SDR aircraft signal
10K+
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
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.
Docker Hub (Recommended):
docker pull blackoutsecure/readsb:latest# 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
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):
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:
| Architecture | Tag |
|---|---|
| x86-64 | amd64-latest |
| arm64 | arm64v8-latest |
---
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
---
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
---
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 00001090andrtl_eeprom -d 1 -s 00000978. See blackoutsecure/docker-dump978 for full dump978 documentation.
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
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.
| Parameter | Function |
|---|---|
-p 30001:30001 | Raw protocol output (TCP) |
-p 30002:30002 | Raw protocol input (TCP) |
-p 30003:30003 | SBS protocol compatible output (TCP) |
-p 30004:30004 | Beast protocol input (TCP) |
-p 30005:30005 | Beast protocol output (TCP) |
-p 30104:30104 | Beast protocol input (TCP) |
| Parameter | Function | Required |
|---|---|---|
-e TZ=Etc/UTC | Timezone (TZ database) | Optional |
-e READSB_NET=true | Enable TCP networking (Beast, raw, SBS listeners). Default: true. Set to false for decode-only mode. | Optional |
-e READSB_DEVICE_TYPE=rtlsdr | SDR 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=abc | Runtime user (default: abc). USB permissions are fixed automatically during init. | Optional |
-e PUID=1000 | User ID for file ownership (LinuxServer.io base image standard) | Optional |
-e PGID=1000 | Group 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=true | Enable 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=120 | Console 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=true | Auto-detect latitude/longitude via IP geolocation when FEED_LAT/FEED_LON not set. | Optional |
-e READSB_AUTOGAIN=true | Enable 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=false | Enable 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=info | Minimum log verbosity: debug, info (default), warn, error, fatal. Set to debug for verbose operational detail, or warn to suppress routine informational messages. | Optional |
| Parameter | Function | Required |
|---|---|---|
-v /config | Configuration and persistent data | Recommended |
-v /run/readsb | JSON output directory | Recommended |
| Parameter | Function | Required |
|---|---|---|
--device=/dev/bus/usb:/dev/bus/usb | RTL-SDR USB device access | Required (for RTL-SDR local RX) |
The container uses two volumes for data persistence and output:
/config — Configuration & Persistenceaircraft.csv.gz (aircraft identification database)-v /path/to/readsb/config:/config or -v readsb-config:/config/run/readsb — JSON Outputaircraft.json (current aircraft with positions and altitudes)receiver.json (receiver stats and information)-v /path/to/readsb/json:/run/readsb or -v readsb-json:/run/readsb/config to preserve aircraft database between container restarts/run/readsb to a host path to query data from other containers or host processestmpfs mounts for temp directories, but JSON output will be lost when container stopsNamed 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'
Environment variables are set using -e flags in docker run or the environment: section in docker-compose.
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):
abc user by defaultPUID and PGID only if you need file ownership to match a specific host userRoot mode (fallback):
READSB_USER=root if needed for other reasonsThe container runs readsb with network support and automatic RTL-SDR device detection by default.
/run/readsb/ and updated frequently--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.aircraft.json stops updatingSTATS_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_LEVEL to control log output: debug, info (default), warn, error, fatalrtl_test, rtl_eeprom, and rtl_biast available inside the container for diagnostics, dongle tagging, and bias-T controlMost 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.
aircraft.json - Current aircraft data with positions, callsigns, and altitudesreceiver.json - Statistics and receiver informationThe container auto-detects RTL-SDR dongles at startup and assigns the 1090 MHz device automatically using the community serial-number convention.
Auto-detection (default):
978 or uat is identified as UAT (informational); first non-UAT dongle is assigned as 1090Manual 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
Content type
Image
Digest
sha256:fb2798888…
Size
23.1 MB
Last updated
about 2 months ago
docker pull blackoutsecure/readsb:sha-3f3f30902a8daf30ba80d4f36a51877888128657