Skip to main content
ErsatzTV Legacy is a .NET 10 web application that runs on Linux, Windows, and macOS. The recommended and easiest installation method is Docker, which bundles FFmpeg and all native dependencies in a single container image. For bare-metal or VM installs, you can download a self-contained binary release and run it directly, provided FFmpeg is available on your system.

Prerequisites

Installation

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 volumes: section of your docker-compose.yml:
The paths inside the container (e.g. /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-compose.yml, run:
Docker will pull the 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 a tmpfs 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 base docker-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.yml variant shown in the Docker tab above, which sets NVIDIA_VISIBLE_DEVICES, NVIDIA_DRIVER_CAPABILITIES, and the deploy.resources.reservations.devices block.
  • VAAPI (Intel / AMD) — pass the render device into the container. Use the docker-compose.vaapi.yml variant, which maps /dev/dri/renderD128 from host to container. Adjust the device path if your system uses a different render node.
After starting the container with GPU access, configure the hardware accelerator inside Settings → FFmpeg Profiles in the ErsatzTV Legacy UI.
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:
ErsatzTV Legacy will automatically migrate its SQLite database to the new schema on startup. Always back up your /config volume before upgrading major versions.