Развёртывание сервиса автоматически обновляемых плейлистов IPTV с помощью Docker
Как только плейлист превышает несколько десятков каналов, ручное обслуживание становится нереальным: чтобы изменить название канала, нужно редактировать файл, а при добавлении нового устройства приходится заново импортировать. Запуск лёгкого сервиса плейлистов в Docker позволяет NAS по расписанию генерировать и предоставлять фиксированный адрес, и все домашние плееры будут забирать список с одного адреса.
В этой статье рассказывается о подходе к развёртыванию и написании Compose; в качестве источников используйте те, на которые у вас есть права (multicast-адреса, выдаваемые оператором, собственные источники).
I. Общий подход
- Список источников (название канала + адрес) используется как входные данные и размещается в каталоге на NAS;
- container по расписанию выполняет «проверку + генерацию m3u»;
- сгенерированный m3u предоставляется наружу через Web port, и плееры просто указывают этот URL;
- container также сохраняет результаты проверки и логи на диск для последующего анализа.
II. Подготовка каталогов
Сначала создайте структуру каталогов на NAS, container монтирует туда и входные данные, и выходные:
docker/
└── iptv/
├── data/ # 输出:生成的 m3u、日志
│ └── playlist.m3u
├── source.txt # 输入:你自己的频道清单
└── docker-compose.yml
Формат входного файлаМожно определить попроще — один канал на строку:
CCTV-1 综合|udp://@239.x.x.x:1234
湖南卫视|rtp://239.x.x.x:5678
III. docker-compose.yml
services:
iptv:
image: <你选用的镜像>
container_name: iptv
restart: unless-stopped
ports:
- "50086:50086"
volumes:
- ./data:/app/data
- ./source.txt:/app/source.txt:ro
environment:
- TZ=Asia/Shanghai
- CHECK_TIMEOUT=5 # 单个地址检测超时(秒)
- CHECK_CONCURRENCY=8 # 并发数,别设太大
- CRON=0 4 * * * # 每天凌晨 4 点跑一次
Запуск:
docker compose up -d
docker compose logs -f # 观察首次生成的输出
IV. Проверка и использование
- Откройте в браузере
http://你的NAS_IP:50086/playlist.m3uЕсли содержимое отображается, значит сервис работает нормально; - В плеере выберите «Добавить источник → Импорт из URL» и укажите указанный выше адрес;
- После изменения списка источников перезапустите container один раз или дождитесь автоматической генерации по расписанию;
- Сгенерированный m3u можно напрямую читать через IPTV-плагин Jellyfin / Emby / Plex, для программы передач достаточно отдельно указать адрес XMLTV.
Пять, несколько практических моментов
- Не увеличивайте concurrency: при одновременном подключении к сотням адресов домашний router легко упирается в предел, что наоборот приводит к массовым ложным срабатываниям.
- Результаты нужно версионировать: ежедневно сгенерированный файл сохраняйте с датой в имени, чтобы при проблеме можно было сравнить, в какой день начались изменения.
- Оставляйте достаточно логов: container-логи полезны только при диагностике; рекомендуется выводить их в файл и ограничивать размер одного файла, чтобы не заполнить NAS.
- Не открывайте port во внешнюю сеть: этот сервис предназначен только для домашнего использования, не пробрасывайте port в публичную сеть; если действительно нужен внешний доступ, подключайтесь через VPN, не выставляйте напрямую.
- Зафиксируйте внутренний IP: назначьте NAS статический адрес или резервирование DHCP, иначе при смене IP придётся менять настройки во всех плеерах.
VI. Частые вопросы
| Контейнер запущен, но m3u пустой | Сначала проверьте в логах, читается ли входной файл; затем убедитесь, что разделитель и кодировка исходного списка корректны. |
| Все результаты проверки — неудачные | Сначала убедитесь, что сеть, в которой находится контейнер, может получать доступ к multicast (большинство сетей bridge по умолчанию не могут), попробуйте переключиться на режим сети host. |
| Плеер сообщает о недействительном адресе | Откройте URL на компьютере в VLC для проверки — так вы определите, проблема в сервисе или в плеере. |
| Задание по расписанию не срабатывает | Проверьте настройки часового пояса контейнера — CRON работает по времени контейнера. |
Краткое итог
Связывая «проверку + генерацию + распространение» через контейнер, обслуживание плейлиста превращается из «ручного редактирования файлов» в «изменение одной строки исходного списка, остальное — задачам по расписанию». Ценность этого процесса в том, что выдля источников, на которые у вас есть право использования,осуществляете единое управление — источников немного, но они контролируемы, обслуживаемы и откатываемы, и это и есть ключ к долгосрочной работе.

