IPTV / M3U stream and EPG manager with Dispatcharr, PostgreSQL and NVIDIA GPU, using Docker Compose.
Last updated: Oct 2026
Dispatcharr manages IPTV playlists (M3U) and guide data (EPG). It merges sources, filters and renumbers channels, and serves a clean playlist and HDHomeRun-style tuner to Plex, Jellyfin or Emby. A GPU can be used for stream transcoding.
Why you'd want it: Tame large IPTV playlists into a tidy channel lineup for your media server.
| Item | Value |
|---|---|
| Stack folder | /opt/stacks/dispatcharr |
| Category | Media |
| Main image | ghcr.io/dispatcharr/dispatcharr:latest |
| Services | 1 |
| Web UI | http://<SERVER_IP>:9191 |
| Official docs | https://github.com/Dispatcharr/Dispatcharr |
.env/.secret files from Docker Folders and EnvironmentDATABASE_URL and REDIS_URL)Folder layout:
/opt/stacks/
├── _shared/
│ ├── .env # shared, non-secret settings
│ └── .secret # passwords, tokens and keys (chmod 600, never commit)
└── dispatcharr/
└── compose.yaml
/opt/appdata/dispatcharr/ # persistent application data
/opt/stacks/dispatcharr/compose.yaml:
---
services:
dispatcharr:
image: ghcr.io/dispatcharr/dispatcharr:latest
container_name: dispatcharr
hostname: dispatcharr
env_file:
- /opt/stacks/_shared/.env
- /opt/stacks/_shared/.secret
environment:
- DISPATCHARR_LOG_LEVEL=error
- DISPATCHARR_ENV=production
- DATABASE_URL=postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:5432/dispatcharr
# REDIS_URL comes from _shared/.env via env_file
# NVIDIA GPU Passthrough
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all
logging:
driver: json-file
options:
max-file: ${DOCKERLOGGING_MAXFILE:-10} # Max number of log files
max-size: ${DOCKERLOGGING_MAXSIZE:-200k} # Max file size
deploy:
resources:
limits:
cpus: '2.0'
memory: 2000M
reservations:
devices:
- driver: nvidia
count: 1 # Use 'all' if you have multiple GPUs
capabilities: [gpu, video]
ports:
- 9191:9191
volumes:
- /opt/appdata/dispatcharr/data:/data
restart: unless-stopped
Compose reads these from the shared files with --env-file. Replace every <PLACEHOLDER> with your own value.
/opt/stacks/_shared/.env:
PUID=1000
PGID=1000
TZ=<TZ>
DOCKERLOGGING_MAXFILE=10
DOCKERLOGGING_MAXSIZE=200k
REDIS_URL=redis://<REDIS_HOST>:6379/0
| Variable | File | Purpose | Example |
|---|---|---|---|
PUID |
.env |
User ID the container runs as (see Docker Folders) | 1000 |
PGID |
.env |
Group ID the container runs as | 1000 |
TZ |
.env |
Time zone in tz database format, e.g. America/New_York | <TZ> |
DOCKERLOGGING_MAXFILE |
.env |
Number of rotated container log files to keep | 10 |
DOCKERLOGGING_MAXSIZE |
.env |
Maximum size of each container log file | 200k |
REDIS_URL |
.env |
Redis connection string for Dispatcharr | redis://<REDIS_HOST>:6379/0 |
| Host port | Container port | Protocol | Service | Purpose |
|---|---|---|---|---|
| 9191 | 9191 | tcp | dispatcharr |
Web UI |
| Host path | Container path | Service | Purpose |
|---|---|---|---|
/opt/appdata/dispatcharr/data |
/data |
dispatcharr |
Application data |
Recommended limits, already set in the compose file under deploy.resources. Raise them if the app is starved, or lower them on small hosts.
| Service | CPU limit | Memory limit | Memory reservation | GPU |
|---|---|---|---|---|
dispatcharr |
2.0 | 2000M | - | nvidia x 1 (gpu, video) |
sudo mkdir -p /opt/stacks/dispatcharr /opt/appdata/dispatcharr
sudo chown -R $USER: /opt/stacks/dispatcharr
/opt/stacks/_shared/.env and /opt/stacks/_shared/.secret (chmod 600 .secret)./opt/stacks/dispatcharr/compose.yaml.cd /opt/stacks/dispatcharr
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret config --quiet
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret up -d
docker compose logs -f.dispatcharr database and user in PostgreSQL.http://<SERVER_IP>:9191 and create the admin user.Tip: create a small wrapper such as
alias dc='docker compose --env-file /opt/stacks/_shared/.env --env-file /opt/stacks/_shared/.secret'so every stack uses the same env files.
cd /opt/stacks/dispatcharr
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret pull
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret up -d
docker image prune -f
Back up /opt/appdata/dispatcharr before major upgrades. Watchtower can automate updates for stateless apps.
docker compose ps and docker compose logs --tail=100.nvidia-smi on the host and that the NVIDIA runtime is installed.DATABASE_URL or REDIS_URL cannot be reached.reservations.devices block and the NVIDIA variables.:?err): run the config command above to see which variable is not set in your env files.Educational example. Review every path, port and credential before you deploy, and never publish your .secret file.