Docker container for the HDHomeRun DVR Server by SiliconDust.
HDHomeRun DVR Server version: 20250815
Base image: ubuntu:22.04
- Runs the HDHomeRun DVR recording engine inside a Docker container
supervisordkeeps the process alive — auto-restarts if the DVR daemon crashes- Container-level
restart: unless-stoppedpolicy recovers from container failures - Timezone configurable via the
TZenvironment variable - Host networking for full HDHomeRun device discovery (UDP broadcast)
- A working HDHomeRun network tuner with up-to-date firmware (see below)
- Docker and Docker Compose installed on the host
Use the published image from Docker Hub:
https://hub.docker.com/repository/docker/yoshiofthewire/hdhomerundvr/general
# 1. Clone the repository
git clone https://github.com/Yoshiofthewire/docker-hdhomerundvr.git
cd docker-hdhomerundvr
# 2. Edit docker-compose.yml and set your recordings path and timezone
# volumes:
# - /your/recordings/path:/hdhomerun
# environment:
# - TZ=America/New_York
# 3. Build and start
docker compose up -d --build| Environment Variable | Default | Description |
|---|---|---|
TZ |
UTC |
Timezone (e.g. America/New_York, Europe/London) |
| Container Path | Description |
|---|---|
/hdhomerun |
Recording output directory — map this to your storage path |
| Port | Protocol | Description |
|---|---|---|
65001 |
UDP | HDHomeRun discovery |
65002 |
TCP | DVR control/streaming |
Note:
network_mode: hostis used indocker-compose.ymlso that UDP broadcast device discovery works correctly. In host mode, theportsmapping is bypassed, so the ports above are documentation only.
Before the first install or when updating firmware:
- Install the HDHomeRun Windows or Mac application.
- When prompted to install the DVR server component, select Don't Install.
- You will be prompted to configure the tuner after setup completes.
- Re-run the tuner setup — this will update the firmware.
- You may need to re-scan channels after the firmware update.
flowchart TD
A[Docker container] --> B[supervisord\nPID 1, nodaemon=true]
B --> C[hdhomerun_wrapper.sh]
C --> D[hdhomerun_record_x64 start\nStarts DVR daemon]
C --> E[Monitors DVR process\nevery 15 seconds]
E --> F[If the DVR process disappears, the wrapper exits non-zero]
F --> G[supervisord restarts the wrapper\nup to 10 retries]
H[SIGTERM from Docker] --> I[Wrapper calls hdhomerun_record_x64 stop]
supervisordruns as PID 1 in the foreground (nodaemon=true), preventing spurious container exits.hdhomerun_wrapper.shwraps the DVR daemon (which forks to the background) and stays alive to monitor it.- If the DVR process disappears, the wrapper exits with a non-zero code so supervisord restarts it (up to 10 retries).
SIGTERMfrom Docker is caught cleanly — the wrapper callshdhomerun_record_x64 stopbefore exiting.
GPL v2.0