This is the standard Docker feeder build: two SDRs, a stack of containers that decode ACARS and VDLM2, and an acars_router configured to send the decoded output to ACARS Drama. It also runs a local copy of ACARS Hub so you can browse your own captured traffic.
What you will need
- A Linux host with Docker and Docker Compose installed.
- Two RTL-SDR dongles — one for ACARS, one for VDLM2. One dongle works if you only want to run a single protocol.
- A VHF air-band antenna, mounted as high and clear as practical.
rtl_eeprom, from the RTL-SDR library, for flashing serial numbers.
How it fits together
Every container image comes from the SDR Enthusiasts project, which does the heavy lifting. acarsdec and dumpvdl2 decode signal from an assigned SDR, acars_router collects their output and fans it out, and acarshub gives you a searchable local record of what your antenna heard.
Step 1 — Flash a serial number to each SDR
RTL-SDR dongles almost always ship with the serial number 00000000, which makes it impossible for the containers to tell them apart. Insert one device at a time, so you know which one you are writing to, and run:
$ rtl_eeprom -s 00000001
Confirm the write when prompted, then replug the device for the change to take effect. Repeat for the second dongle with a different serial. Make a note of which serial is which — you will assign one to ACARS and one to VDLM2 in the next step.
Step 2 — Create docker-compose.yml
The configuration below is the common two-SDR setup, and is also kept in the sample-config repository. The acars_router service is already pointed at ACARS Drama, so there is nothing extra to wire up.
# Two SDR setup capturing ACARS and VDLM2, with a local ACARS Hub,
# routed to ACARS Drama by acars_router.
version: "3.8"
volumes:
acarshub_run:
services:
acarsdec:
image: ghcr.io/sdr-enthusiasts/docker-acarsdec:latest
tty: true
container_name: acarsdec
restart: always
devices:
- /dev/bus/usb:/dev/bus/usb
environment:
- FEED_ID=BLAH-KDFW-ACARS # make this unique, include your nearest airport ICAO
- TZ=Etc/UTC
- SERIAL=00000000 # serial of the SDR assigned to ACARS
- FREQUENCIES=130.025 # semicolon separated to scan multiple, e.g. 129.350;129.525
- SERVER=acars_router
- SERVER_PORT=5550
tmpfs:
- /run:exec,size=64M
- /var/log
dumpvdl2:
image: ghcr.io/sdr-enthusiasts/docker-dumpvdl2:latest
tty: true
container_name: dumpvdl2
restart: always
devices:
- /dev/bus/usb:/dev/bus/usb
environment:
- FEED_ID=BLAH-KDFW-VDL2 # make this unique, include your nearest airport ICAO
- TZ=Etc/UTC
- SERIAL=00000001 # serial of the SDR assigned to VDLM2
- FREQUENCIES=136.975 # e.g. 136.650;136.975;136.800;136.100;136.675
- ZMQ_MODE=server
- ZMQ_ENDPOINT=tcp://0.0.0.0:45555
tmpfs:
- /run:exec,size=64M
- /var/log
acarshub:
image: ghcr.io/sdr-enthusiasts/docker-acarshub:latest
tty: true
container_name: acarshub
hostname: acarshub
restart: always
ports:
- 8080:80
- 15550:15550
- 15555:15555
environment:
- TZ=Etc/UTC
- ADSB_LAT=${FEEDER_LAT}
- ADSB_LON=${FEEDER_LONG}
- ENABLE_ADSB=false
- ENABLE_ACARS=external
- ENABLE_VDLM=external
volumes:
- acarshub_run:/run/acars
tmpfs:
- /run:exec,size=64M
- /var/log
acars_router:
image: ghcr.io/sdr-enthusiasts/acars_router:latest
tty: true
container_name: acars_router
restart: always
environment:
- TZ=Etc/UTC
- AR_SEND_UDP_ACARS=acarshub:5550;feedthe.acarsdrama.com:5550
- AR_SEND_UDP_VDLM2=acarshub:5555;feedthe.acarsdrama.com:5555
- AR_RECV_ZMQ_VDLM2=dumpvdl2:45555
tmpfs:
- /run:exec,size=64M
- /var/log
Four things to change before you start it:
- FEED_ID on both decoders. Make it unique and include the ICAO code of your nearest major airport. This is how we identify your traffic.
- SERIAL on both decoders, to match the serials you flashed in step 1.
- FREQUENCIES on both decoders. The right set depends on your location — see the ACARS and VDLM2 frequency references, or ask in the Discord what works locally.
- FEEDER_LAT and FEEDER_LONG, either as environment variables or by replacing them with your coordinates.
The AR_SEND_UDP_* lines are the part that matters for feeding. Each takes a semicolon separated list of destinations, so the router delivers to your local hub and to ACARS Drama at the same time. If you already feed another aggregator, add it to the same list rather than running a second decoder.
Step 3 — Bring it up and check it
docker compose up -d
Browse to port 8080 on the container host for the ACARS Hub UI. Messages should start appearing within a few minutes if your antenna is picking up traffic.
The hub also reports message counts per feed and per frequency, which makes it the main tool for tuning your frequency lists.
Step 4 — Tell us you are feeding
Email feeders [at] acarsdrama [dot] com with your feed ID and approximate location, and we will confirm your data is arriving. Sky Drama Farmers get complimentary Jumpseat membership once the feed is confirmed.
If anything is not working, the ACARS Drama Club Discord is the best place to ask.
Got a feed running? Email feeders [at] acarsdrama [dot] com with your Feed ID and approximate location and we’ll confirm we can see you in the data — Sky Drama Farmers get complimentary Jumpseat membership.
