Prerequisites
- Docker (Recommended)
- Binary (Linux / Windows / macOS)
- Docker Engine 20.10 or newer (or Docker Desktop on Windows/macOS)
- Docker Compose v2 plugin (usually bundled with Docker Desktop or the
docker-compose-pluginpackage) - No separate .NET or FFmpeg installation required — the official image is built on top of
ghcr.io/ersatztv/ersatztv-ffmpegand includes a custom FFmpeg 7.1.1 build along with the .NET 10 ASP.NET Core runtime.
Installation
- Docker
- Binary
The official Docker image is published at
ghcr.io/ersatztv/ersatztv and is rebuilt for each release. It targets linux/amd64 and includes FFmpeg, Python 3, and the etv_client Python package for scripted schedules.1
Create a docker-compose.yml file
Create a directory for your ErsatzTV Legacy configuration and save the following
docker-compose.yml inside it:Set
TZ to your local timezone (e.g. Europe/London, Asia/Tokyo) so that schedule times and EPG data are displayed correctly. A full list of valid timezone strings can be found in the IANA Time Zone Database.2
Mount your media (optional but recommended)
Add your media paths as read-only bind mounts inside the The paths inside the container (e.g.
volumes: section of your docker-compose.yml:/media/movies) are what you will enter when configuring a Local library in the ErsatzTV Legacy UI.3
Start the container
From the directory containing your Docker will pull the
docker-compose.yml, run:ghcr.io/ersatztv/ersatztv:latest image on the first run. This may take a minute or two depending on your connection speed.4
Verify the server is running
Open your browser and navigate to:You should see the ErsatzTV Legacy web interface. The server log is also accessible from within the UI under Settings → Logs.
Configuration
Default Port
ErsatzTV Legacy binds to port 8409 for both the web UI and the IPTV/streaming endpoints. This port is used for all HTTP access: the management UI, the REST API, and the M3U, XMLTV, and HDHomeRun streaming endpoints.Config Directory
The config directory holds the SQLite database (
ersatztv.sqlite3), logs, extracted artwork cache, and the next/ folder for Next engine channel configs. Override the path with the ETV_CONFIG_FOLDER environment variable.
Transcode Directory
Temporary HLS segment files are written to a transcode directory. In Docker, this is mapped to atmpfs mount at /transcode for performance. Override with ETV_TRANSCODE_FOLDER.
Environment Variables Reference
Single-Instance Enforcement
ErsatzTV Legacy uses a named system mutex (ErsatzTV.Singleton.74360cd8985c4d1fb6bc9e81887206fe) to ensure only one instance runs per host. If you attempt to start a second instance, the process will print Another instance of ErsatztTV is already running. and exit immediately. Run multiple channels through a single server instance rather than multiple processes.
Hardware Acceleration (Docker)
GPU transcoding requires additional Docker flags beyond the basedocker-compose.yml. ErsatzTV Legacy supports NVENC (NVIDIA), VAAPI (Intel/AMD), QSV (Intel), AMF (AMD on Windows), VideoToolbox (macOS), and RKMPP (Rockchip).
Use the appropriate Compose file as a starting point:
- NVIDIA — requires the NVIDIA Container Toolkit on the host. Use the
docker-compose.nvidia.ymlvariant shown in the Docker tab above, which setsNVIDIA_VISIBLE_DEVICES,NVIDIA_DRIVER_CAPABILITIES, and thedeploy.resources.reservations.devicesblock. - VAAPI (Intel / AMD) — pass the render device into the container. Use the
docker-compose.vaapi.ymlvariant, which maps/dev/dri/renderD128from host to container. Adjust the device path if your system uses a different render node.
Hardware transcoding profiles must be explicitly assigned to channels. A channel configured with a software-only FFmpeg profile will not use GPU acceleration even if the Docker container has GPU access.
Upgrading
To upgrade to a newer release using Docker, pull the latest image and recreate the container:/config volume before upgrading major versions.