Skip to content
DnsLister Forum

Where domain hunters compare notes

How to add ADSB ultrafeeder to truenas

I finally got my feeder into a working state. I am posting my notes and procedures I took of my process and the working configuration. It has been converted to a reddit friendly format. I'm willing to hear any suggestions to make this more stable or fix other issues.

This guide assumes:

  • A working initial Truenas apps state
  • Working NGINX config (optional, this may be skipped)

What's not covered:

  • Setting up NGINX
  • Setting up other ADSB containers
  • Setting up initial apps configutation such as inter-container communication
  • Networking and DNS
  • Claiming feeders into ADSB website accounts

Ultrafeeder Container: https://github.com/sdr-enthusiasts/docker-adsb-ultrafeeder

I am using the following antenna which I bought for $37 in 2021: https://www.amazon.com/dp/B01GDN1T4S

SDR dongle connected to a random rear USB port.

Truenas Version: 25.10.5 – Goldeye

Server: ThinkServer TS440

Note: This guide was converted from a PDF procedure that contains images at every step. All visual screenshots have been removed and/or translated into a text-only format.

1. Find SDR Dongle USB Location

  • Step 1: Click "Log In"
  • Step 2: Click "System"
  • Step 3: Click "Shell"
  • Step 4: Click on the prompt
  • Step 5: Type sudo dmesg | grep usb and press Enter
  • Step 6: Copy admin password from password manager
  • Step 7: Press Shift + Insert to paste into shell
  • Step 8: Press Enter if it does not automatically do so
  • Step 9: Find the SDR Dongle
  • Step 10: Take note of USB bus location (e.g., usb 2-9)
  • Step 11: Take note of the USB Bus location. In this configuration, we pass in the entire USB 2 bus: /dev/bus/usb/002/:/dev/bus/usb/002/.
    • Extreme Alert! Take note of other devices that may be on the same USB bus. Passing in the entire USB 2 bus will also pass in all of these devices (e.g., mouse and keyboard). Additonally, I have noticed that the USB bus location keeps changing on restarts and updates. Currently, there is no workaround besides passing in the entire OS USB or dev bus.

2. Create Config Storage

Note: This guide assumes basic dataset layout is already complete.

  • Step 12: Click "Datasets"
  • Step 13: Click "apps"
  • Step 14: Click "Add Dataset"
  • Step 15: Edit "Name"
  • Step 16: Type ultrafeeder1
  • Step 17: Click "Save"
  • Step 18: Click ultrafeeder1
  • Step 19: Click "Edit" in ultrafeeder1 Permissions
  • Step 20: Click the "user" field
  • Step 21: Type apps
  • Step 22: Click apps
  • Step 23: Click "Apply User"
  • Step 24: Click "group" field
  • Step 25: Type apps
  • Step 26: Click apps
  • Step 27: Click "Apply Group"
  • Step 28: Verify "user" write permission is selected (Usually "on" by default)
  • Step 29: Click "group" write permission
  • Step 30: Click "Apply permissions recursively"
  • Step 31: Click the "Confirm" field
  • Step 32: Click "Continue"
  • Step 33: Click the "Apply permissions to child datasets" field
  • Step 34: Click "Save"
  • Step 35: Click ultrafeeder1
  • Step 36: Verify permissions have applied correctly

3. Blacklist Default Driver

Note: I haven't tested this thoroughly. I noticed it's no longer included in the documentation, so it may be unnecessary.

  • Step 37: Click "System"
  • Step 38: Click "Advanced Settings"
  • Step 39: Click "Add" (under Init/Shutdown Scripts)
  • Step 40: Click on "Description"
  • Step 41: Type: Blacklist RTL-SDR DVB Drivers for Ultrafeeder
  • Step 42: Click "Command" text field
  • Step 43: Type: /sbin/modprobe -r rtl2832_sdr dvb_usb_rtl28xxu rtl2832 dvb_usb_v2
    • Note: This blacklist command was generated by AI and may need manual verification.
  • Step 44: Click "When"
  • Step 45: Click "Pre Init"
  • Step 46: Click "Save"
  • Step 47: Click "edit" on the pre-init command that was just created
  • Step 48: Verify contents, then close editor

4. Add ultrafeeder Container

  • Step 49: Click "Apps"
  • Step 50: Click "Discover Apps"
  • Step 51: Click "⋮" (Custom App menu)
  • Step 52: Click "Install via YAML"
  • Step 53: Click the "Name" text field
  • Step 54: Type ultrafeeder1
  • Step 55: Click the text box area to input your YAML config
  • Step 56: Add the following configuration:

​

services: ultrafeeder1: container_name: ultrafeeder1 device_cgroup_rules: - c 189:* rwm environment: - TZ= - LOGLEVEL=error - READSB_DEVICE_TYPE=rtlsdr - READSB_GAIN=auto - READSB_RTLSDR_DEVICE= - READSB_RTLSDR_PPM= - READSB_LAT=00.00000 - READSB_LON=00.00000 - READSB_ALT=00m - READSB_RX_LOCATION_ACCURACY=2 - READSB_STATS_RANGE=true - >- ULTRAFEEDER_CONFIG= adsb,feed.adsb.fi,30004,beast_reduce_plus_out; adsb,in.adsb.lol,30004,beast_reduce_plus_out; adsb,feed.airplanes.live,30004,beast_reduce_plus_out; adsb,feed.planespotters.net,30004,beast_reduce_plus_out; adsb,feed.theairtraffic.com,30004,beast_reduce_plus_out; adsb,data.avdelphi.com,24999,beast_reduce_plus_out; adsb,skyfeed.hpradar.com,30004,beast_reduce_plus_out; adsb,dati.flyitalyadsb.com,4905,beast_reduce_plus_out; adsb,feed1.adsbexchange.com,30004,beast_reduce_plus_out; mlat,feed.adsb.fi,31090; mlat,in.adsb.lol,31090; mlat,feed.airplanes.live,31090; mlat,mlat.planespotters.net,31090; mlat,feed.theairtraffic.com,31090; mlat,mlatfeed.hpradar.com,31090; mlat,dati.flyitalyadsb.com,30100; mlat,feed.adsbexchange.com,31090,39008,uuid=${ADSBX_UUID} - UUID=0 - MLAT_USER= - UPDATE_TAR1090=true - TAR1090_DEFAULTCENTERLAT=00.00000 - TAR1090_DEFAULTCENTERLON=00.00000 - TAR1090_MESSAGERATEINTITLE=true - TAR1090_PAGETITLE= - TAR1090_PLANECOUNTINTITLE=true - TAR1090_ENABLE_AC_DB=true - TAR1090_FLIGHTAWARELINKS=true - TAR1090_SITESHOW=true - TAR1090_RANGE_OUTLINE_COLORED_BY_ALTITUDE=true - TAR1090_RANGE_OUTLINE_WIDTH=2.0 - TAR1090_RANGERINGSDISTANCES=50,100,150,200 - TAR1090_RANGERINGSCOLORS='#1A237E','#0D47A1','#42A5F5','#64B5F6' - TAR1090_USEROUTEAPI=true - GRAPHS1090_DARKMODE=true - PROMETHEUS_ENABLE=false expose: - '8080:80' - '9273-9274:9273-9274' hostname: ultrafeeder1 image: ghcr.io/sdr-enthusiasts/docker-adsb-ultrafeeder restart: unless-stopped tmpfs: - /run:exec,size=256M - /tmp:size=128M - /var/log:size=32M volumes: - /dev/bus/usb/002/:/dev/bus/usb/002/ - /mnt/tank/apps/ultrafeeder1/globe_history:/var/globe_history - /mnt/tank/apps/ultrafeeder1/graphs1090:/var/lib/collectd 
  • Verification Checklist:
    • TZ
    • File paths
    • Container Names
    • LAT, LONG, ALT
    • Feeder Name (This will be published to the public open web)
    • ADSB Exchange UUID
  • Step 57: Click "Save"
  • Step 58: Click ultrafeeder1
  • Step 59: Click the "logs" icon
  • Step 60: Click "Connect"
  • Step 61: Verify the container has started correctly with no serious errors. The SDR dongle must be connected to the container for it to start.
    • Note: Ultrafeeder automatically sends ADSB data to specified services in the config file. Some services may no longer exist or may be unreliable, producing connection errors. Be sure to update this list from the example YAML config found on the GitHub Repo: https://github.com/sdr-enthusiasts/docker-adsb-ultrafeeder

5. Restart Host System

  • Step 62: Click "System Settings" (or Power menu)
  • Step 63: Select "Restart" / "Reboot" for the host system
  • Step 64: Confirm system restart
  • Step 65: Wait for host system reboot to complete
  • Step 66: Log back into the management interface

6. Add NGINX Configuration

Note: This assumes basic working NGINX config already exists.

  • Step 67: Reload your base domain (e.g., server.myurl.com) after restart is complete
  • Step 68: Click "Log In"
  • Step 69: Find NGINX configuration URL and Port and navigate to it
  • Step 70: Click "Apps"
  • Step 71: Click "nginx"
  • Step 72: Find Config IP and Port: (e.g., tcp://1.1.1.1:81:81)
  • Step 73: Copy the IP and port (e.g., 1.1.1.1:81)
  • Step 74: In a new tab, navigate to the web UI (e.g., http://1.1.1.1:81/)
  • Step 75: Click "Sign in"
  • Step 76: Click "Proxy Hosts"
  • Step 77: Click "Add Proxy Host"
  • Step 78: Click "Domain Name"
  • Step 79: Type your target subdomain (e.g., ultrafeeder1.server.myurl.com)
  • Step 80: Click "Create [your-subdomain]"
  • Step 81: Click the "Forward Hostname / IP" field
  • Step 82: Type ultrafeeder1, press Tab, and type 80 (Sets hostname to ultrafeeder1 and port to 80)
  • Step 83: Enable the "Websockets Support" field
    • Note: Websockets Support is required for all logins and other active elements to work.
  • Step 84: Click "SSL"
  • Step 85: Click "SSL Certificate"
  • Step 86: Select your wildcard certificate (e.g., server.myurl.com, *.server.myurl.com)
  • Step 87: Click the "Force SSL" field
  • Step 88: Click the "HTTP/2 Support" field
  • Step 89: Click the "HSTS Enabled" field
  • Step 90: Click the "HSTS Sub-domains" field
  • Step 91: Click "Save"
  • Step 92: Verify "Online" status
  • Step 93: Click the newly created proxy link (e.g., ultrafeeder1.server.myurl.com)
  • Step 94: Switch to the newly opened tab

7. Verify Working State

Note: Check Flightradar24 for active planes overhead. Missing ADSB content doesn't mean it's not working; there just might not be any planes overhead.

  • Step 95: Click on any plane
  • Step 96: Click on another plane
  • Step 97: Check the "stats" page
    • Note 1: The container will work just fine without saving the stats into persistent storage, but the charts will be blank on every restart.
    • Note 2: Ultrafeeder feeds directly into ADSB Exchange. Check with them to add the feeder to your account.

Source: r/homelab · by /u/Informal_Banker

Leave a Reply

Your email address will not be published. Required fields are marked *