Развёртывание сервиса автоматически обновляемых плейлистов IPTV с помощью Docker

Как только плейлист превышает несколько десятков каналов, ручное обслуживание становится нереальным: чтобы изменить название канала, нужно редактировать файл, а при добавлении нового устройства приходится заново импортировать. Запуск лёгкого сервиса плейлистов в Docker позволяет NAS по расписанию генерировать и предоставлять фиксированный адрес, и все домашние плееры будут забирать список с одного адреса.

В этой статье рассказывается о подходе к развёртыванию и написании Compose; в качестве источников используйте те, на которые у вас есть права (multicast-адреса, выдаваемые оператором, собственные источники).

I. Общий подход

  1. Список источников (название канала + адрес) используется как входные данные и размещается в каталоге на NAS;
  2. container по расписанию выполняет «проверку + генерацию m3u»;
  3. сгенерированный m3u предоставляется наружу через Web port, и плееры просто указывают этот URL;
  4. 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. Проверка и использование

  1. Откройте в браузере http://你的NAS_IP:50086/playlist.m3uЕсли содержимое отображается, значит сервис работает нормально;
  2. В плеере выберите «Добавить источник → Импорт из URL» и укажите указанный выше адрес;
  3. После изменения списка источников перезапустите container один раз или дождитесь автоматической генерации по расписанию;
  4. Сгенерированный 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 работает по времени контейнера.

Краткое итог

Связывая «проверку + генерацию + распространение» через контейнер, обслуживание плейлиста превращается из «ручного редактирования файлов» в «изменение одной строки исходного списка, остальное — задачам по расписанию». Ценность этого процесса в том, что выдля источников, на которые у вас есть право использования,осуществляете единое управление — источников немного, но они контролируемы, обслуживаемы и откатываемы, и это и есть ключ к долгосрочной работе.

THE END