--- title: config.yml icon: material/file-cog tags: ["iptvc", "конфигурация"] --- # :material-file-cog: Конфигурация config.yml Программа читает настройки из YAML-файла `config.yml` в корне проекта. Путь к файлу можно задать через глобальный флаг `--config`. ## Приоритет настроек От низшего к высшему: 1. **Значения по умолчанию** — встроены в код; 2. **`config.yml`** — YAML-файл; 3. **Переменные окружения** — переопределяют `config.yml` (если заданы); 4. **CLI-флаги** — переопределяют переменные окружения и `config.yml` (если заданы явно). Файл `.env` загружается автоматически, переменные из него применяются как переменные окружения. ## Структура файла ```yaml app: timezone: GMT debug: false log_level: info playlists: ./playlists.ini tags: ./channels.json server: host: localhost port: 8080 site: base-url: http://localhost:8080 repo-url: https://git.axenov.dev/IPTV page-size: 0 favicon: header: title: IPTV Checker navigation: - title: Документация url: /docs icon: document-text-outline - title: Telegram icon: paper-plane-outline children: - title: Канал url: https://t.me/iptv_aggregator icon: megaphone-outline footer-links: - title: Исходники url: https://git.axenov.dev/IPTV icon: code-slash-outline check: start-on-serve: false playlists: user-agent: - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer timeout: 10000 all-cooldown: 0 one-cooldown: 0 max-routines: 5 per-routine: 1 channels: user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer timeout: 10000 byte-range: 512 cooldown: 0 max-routines: 50 per-routine: 10 cache: enabled: false host: localhost port: 6379 username: password: db: 0 ttl: 1800 ``` ## Секция `app` | Параметр | Тип | По умолчанию | Описание | | ----------- | ------ | ----------------- | ---------------------- | | `timezone` | string | `GMT` | Часовой пояс | | `debug` | bool | `false` | Режим отладки | | `log_level` | string | `info` | Уровень логирования | | `playlists` | string | `./playlists.ini` | Путь к `playlists.ini` | | `tags` | string | `./channels.json` | Путь к `channels.json` | ## Секция `server` | Параметр | Тип | По умолчанию | Описание | | -------- | ------ | ------------ | ----------------- | | `host` | string | (пусто) | Хост для привязки | | `port` | uint | `8080` | Порт веб-сервера | ## Секция `site` Настройки сайта: ссылки, заголовок, навигация, пагинация. | Параметр | Тип | По умолчанию | Описание | | ----------- | ------ | ----------------------------- | ----------------------------------- | | `base-url` | string | `http://localhost:8080` | Базовый URL для формирования ссылок | | `repo-url` | string | `https://git.axenov.dev/IPTV` | Ссылка на репозиторий | | `page-size` | uint | `0` | Размер страницы (0 — без пагинации) | | `favicon` | string | (пусто) | Путь к иконке сайта | ### `site.header` Настройки шапки сайта. | Параметр | Тип | По умолчанию | Описание | | ------------ | ------ | -------------- | -------------------------------------- | | `title` | string | `IPTV Checker` | Заголовок сайта (в navbar и ``) | | `navigation` | [Link] | (см. ниже) | Ссылки в шапке сайта | ### `site.footer-links` Ссылки в подвале сайта. Массив элементов `Link`. ### Тип `Link` Элемент навигации или подвала. Если задано `children`, рендерится как выпадающее меню. | Параметр | Тип | Описание | | ---------- | ------ | ----------------------------------------------------------- | | `title` | string | Текст ссылки | | `url` | string | URL ссылки (можно опустить, если есть `children`) | | `icon` | string | Имя иконки | | `children` | [Link] | Дочерние ссылки (выпадающее меню, один уровень вложенности) | --8<-- "ionicons-name.md" Пример: ```yaml site: header: navigation: - title: Документация url: /docs icon: document-text-outline - title: Telegram icon: paper-plane-outline children: - title: Канал url: https://t.me/iptv_aggregator icon: megaphone-outline - title: Чат url: https://t.me/iptv_aggregator_chat icon: chatbubbles-outline footer-links: - title: Исходники url: https://git.axenov.dev/IPTV icon: code-slash-outline - title: axenov.dev url: https://axenov.dev icon: person-outline ``` ## Секция `check` Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы. ### `check.start-on-serve` | Параметр | Тип | По умолчанию | Описание | | ---------------- | ---- | ------------ | ---------------------------------------------------------- | | `start-on-serve` | bool | `false` | Запустить фоновую проверку при `serve` без флага `--check` | ### Типы значений !!! info "timeout, max-routines, per-routine, byte-range" Эти параметры — всегда целые числа, не массивы. !!! info "cooldown (all-cooldown, one-cooldown, channels.cooldown)" Эти параметры могут быть заданы: - **скаляром** — фиксированное значение, например `all-cooldown: 10`; - **массивом `[min, max]`** — случайное значение в диапазоне при каждой проверке, например `all-cooldown: [5, 15]`. !!! info "user-agent" Параметр `user-agent` может быть задан: - **строкой** — используется всегда одно значение; - **массивом строк** — случайный выбор при каждом запросе. !!! info "byte-range" Параметр `byte-range` — всегда целое число (не массив). ### `check.playlists` Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС). | Параметр | Тип | По умолчанию | Единица | Описание | | -------------- | ------------------ | ----------------- | ------- | ------------------------------------------------ | | `user-agent` | string \| string[] | `Mozilla/5.0 ...` | — | User-Agent для HTTP-запросов | | `timeout` | int | `10000` | мс | Таймаут запроса плейлиста | | `all-cooldown` | int \| int[] | `0` | мс | Задержка после проверки всех плейлистов | | `one-cooldown` | int \| int[] | `0` | мс | Задержка после проверки каждого плейлиста | | `max-routines` | int | `5` | шт | Максимум одновременно проверяемых плейлистов | | `per-routine` | int | `1` | шт | Количество плейлистов на одну процедуру проверки | ### `check.channels` Параметры проверки каналов внутри плейлиста. | Параметр | Тип | По умолчанию | Единица | Описание | | -------------- | ------------------ | ----------------- | ------- | --------------------------------------------- | | `user-agent` | string \| string[] | `Mozilla/5.0 ...` | — | User-Agent для HTTP-запросов | | `timeout` | int | `10000` | мс | Таймаут запроса канала | | `byte-range` | int | `512` | байт | Объём данных для загрузки от сервера | | `cooldown` | int \| int[] | `0` | мс | Задержка после проверки каждого канала | | `max-routines` | int | `50` | шт | Максимум одновременно проверяемых каналов | | `per-routine` | int | `10` | шт | Количество каналов на одну процедуру проверки | ## Секция `cache` | Параметр | Тип | По умолчанию | Описание | | ---------- | ------ | ------------ | ---------------------------------- | | `enabled` | bool | `false` | Включить кеширование (KeyDB/Redis) | | `host` | string | `localhost` | Хост KeyDB/Redis | | `port` | uint | `6379` | Порт KeyDB/Redis | | `username` | string | (пусто) | Логин | | `password` | string | (пусто) | Пароль | | `db` | uint | `0` | Номер БД | | `ttl` | uint | `1800` | TTL записей (сек) | ## Валидация При запуске конфигурация валидируется. Некорректные значения исправляются автоматически, каждое исправление логируется: | Проверка | Действие | | ---------------------------------------------------- | --------------------------------------- | | `server.port` = 0 или > 65535 | сброс в `8080` | | `site.base-url` пусто | автогенерация `http://localhost:{port}` | | `cache.host` пусто (если cache включён) | `localhost` | | `cache.port` = 0 (если cache включён) | `6379` | | `cache.ttl` = 0 (если cache включён) | `1800` | | `check.playlists.timeout` <= 0 | `10000` | | `check.channels.timeout` <= 0 | `10000` | | `check.*.cooldown` — `min > max` | swap | | `check.*.cooldown` — выход за границы `[0, 3600000]` | clamp | | `check.playlists.max-routines` < 1 | `5` | | `check.channels.max-routines` < 1 | `50` | | `check.playlists.per-routine` < 1 | `1` | | `check.channels.per-routine` < 1 | `10` | | `check.channels.byte-range` <= 0 | `512` | | `check.*.user-agent` пусто | дефолтный User-Agent | ## Переменные окружения Переменные окружения переопределяют значения из `config.yml`. ### Приложение | Переменная | Соответствует в `config.yml` | | --------------- | ---------------------------- | | `APP_DEBUG` | `app.debug` | | `APP_LOG_LEVEL` | `app.log_level` | | `APP_TIMEZONE` | `app.timezone` | | `APP_PLAYLISTS` | `app.playlists` | | `APP_TAGS` | `app.tags` | ### Веб-сервер и сайт | Переменная | Соответствует в `config.yml` | | -------------- | ---------------------------- | | `WEB_PORT` | `server.port` | | `WEB_HOST` | `server.host` | | `APP_URL` | `site.base-url` | | `PAGE_SIZE` | `site.page-size` | | `REPO_URL` | `site.repo-url` | | `SITE_FAVICON` | `site.favicon` | | `APP_TITLE` | `site.header.title` | ### Проверка | Переменная | Соответствует в `config.yml` | | ---------------------- | ---------------------------- | | `CHECK_START_ON_SERVE` | `check.start-on-serve` | #### `check.playlists` | Переменная | Соответствует в `config.yml` | | ---------------------------------- | --------------------------------------------------- | | `CHECK_PLAYLISTS_TIMEOUT` | `check.playlists.timeout` | | `CHECK_PLAYLISTS_ALL_COOLDOWN` | `check.playlists.all-cooldown` (скаляр) | | `CHECK_PLAYLISTS_ALL_COOLDOWN_MIN` | `check.playlists.all-cooldown` (минимум диапазона) | | `CHECK_PLAYLISTS_ALL_COOLDOWN_MAX` | `check.playlists.all-cooldown` (максимум диапазона) | | `CHECK_PLAYLISTS_ONE_COOLDOWN` | `check.playlists.one-cooldown` (скаляр) | | `CHECK_PLAYLISTS_ONE_COOLDOWN_MIN` | `check.playlists.one-cooldown` (минимум диапазона) | | `CHECK_PLAYLISTS_ONE_COOLDOWN_MAX` | `check.playlists.one-cooldown` (максимум диапазона) | | `CHECK_PLAYLISTS_MAX_ROUTINES` | `check.playlists.max-routines` | | `CHECK_PLAYLISTS_PER_ROUTINE` | `check.playlists.per-routine` | | `CHECK_PLAYLISTS_USER_AGENT_1` | `check.playlists.user-agent` (первый элемент) | | `CHECK_PLAYLISTS_USER_AGENT_2` | `check.playlists.user-agent` (второй элемент) | | `CHECK_PLAYLISTS_USER_AGENT_N` | `check.playlists.user-agent` (N-й элемент) | #### `check.channels` | Переменная | Соответствует в `config.yml` | | ----------------------------- | ---------------------------------------------- | | `CHECK_CHANNELS_TIMEOUT` | `check.channels.timeout` | | `CHECK_CHANNELS_BYTE_RANGE` | `check.channels.byte-range` | | `CHECK_CHANNELS_COOLDOWN` | `check.channels.cooldown` (скаляр) | | `CHECK_CHANNELS_COOLDOWN_MIN` | `check.channels.cooldown` (минимум диапазона) | | `CHECK_CHANNELS_COOLDOWN_MAX` | `check.channels.cooldown` (максимум диапазона) | | `CHECK_CHANNELS_MAX_ROUTINES` | `check.channels.max-routines` | | `CHECK_CHANNELS_PER_ROUTINE` | `check.channels.per-routine` | | `CHECK_CHANNELS_USER_AGENT_1` | `check.channels.user-agent` (первый элемент) | | `CHECK_CHANNELS_USER_AGENT_2` | `check.channels.user-agent` (второй элемент) | | `CHECK_CHANNELS_USER_AGENT_N` | `check.channels.user-agent` (N-й элемент) | !!! info "Диапазоны cooldown через env" Если заданы обе переменные `_MIN` и `_MAX` — используется диапазон. Если задана только скалярная переменная (без `_MIN`/`_MAX`) — используется фиксированное значение. Если задана только одна из `_MIN`/`_MAX` — переменная игнорируется. !!! info "Массивы user-agent через env" Переменные читаются последовательно: `_1`, `_2`, `_3`, … Первая отсутствующая переменная останавливает чтение. Пустые значения пропускаются. ### Кеш | Переменная | Соответствует в `config.yml` | | ---------------- | ---------------------------- | | `CACHE_ENABLED` | `cache.enabled` | | `CACHE_HOST` | `cache.host` | | `CACHE_PORT` | `cache.port` | | `CACHE_USERNAME` | `cache.username` | | `CACHE_PASSWORD` | `cache.password` | | `CACHE_DB` | `cache.db` | | `CACHE_TTL` | `cache.ttl` | ## CLI-флаги CLI-флаги имеют наивысший приоритет и переопределяют значения из `config.yml` и переменных окружения. Все флаги используют zero-value по умолчанию: переопределение срабатывает, только если флаг задан явно (через `cmd.Flags().Changed()`). Порядок применения в обработчиках команд: ``` app.Init() → defaults → config.yml → env → logger applyAppOverrides(cmd) → app.* через Changed() applyCacheOverrides(cmd) → cache.* через Changed() applyCheckOverrides(cmd) → check.* через Changed() app.InitCache() → подключение к KeyDB/Redis ``` ### Глобальные флаги ### Флаги путей Доступны для `check` и `serve`. | Флаг | Тип | Соответствует в `config.yml` | Описание | | -------------- | ------ | ---------------------------- | ---------------------- | | `-i`, `--ini` | string | `app.playlists` | Путь к `playlists.ini` | | `-t`, `--tags` | string | `app.tags` | Путь к `channels.json` | ### Флаги итерации Доступны для `check` и `serve`. | Флаг | Тип | По умолчанию | Описание | | ---------------- | ---- | ------------------------------ | --------------------------------------------- | | `-r`, `--random` | uint | `0` | Проверить N случайных плейлистов из ini-файла | | `--repeat` | uint | `1` (`check`) / `0` (`serve`) | Количество циклов (0 = бесконечно) | | `--every` | uint | `5` (`check`) / `60` (`serve`) | Секунд между циклами | ### Флаги проверки плейлистов Доступны для `check` и `serve`. Переопределяют секцию `check.playlists`. | Флаг | Тип | Соответствует в `config.yml` | Единица | Описание | | -------------------------- | -------- | ------------------------------ | ------- | -------------------------------- | | `--playlists-timeout` | int | `check.playlists.timeout` | мс | Таймаут запроса плейлиста | | `--playlists-all-cooldown` | int | `check.playlists.all-cooldown` | мс | Задержка после всех плейлистов | | `--playlists-one-cooldown` | int | `check.playlists.one-cooldown` | мс | Задержка после каждого плейлиста | | `--playlists-max-routines` | int | `check.playlists.max-routines` | шт | Максимум параллельных проверок | | `--playlists-per-routine` | int | `check.playlists.per-routine` | шт | Плейлистов на процедуру | | `--playlists-user-agent` | string[] | `check.playlists.user-agent` | — | User-Agent (можно несколько) | ### Флаги проверки каналов Доступны для `check` и `serve`. Переопределяют секцию `check.channels`. | Флаг | Тип | Соответствует в `config.yml` | Единица | Описание | | ------------------------- | -------- | ----------------------------- | ------- | ------------------------------ | | `--channels-timeout` | int | `check.channels.timeout` | мс | Таймаут запроса канала | | `--channels-byte-range` | int | `check.channels.byte-range` | байт | Объём данных от сервера | | `--channels-cooldown` | int | `check.channels.cooldown` | мс | Задержка после каждого канала | | `--channels-max-routines` | int | `check.channels.max-routines` | шт | Максимум параллельных проверок | | `--channels-per-routine` | int | `check.channels.per-routine` | шт | Каналов на процедуру | | `--channels-user-agent` | string[] | `check.channels.user-agent` | — | User-Agent (можно несколько) | ### Флаги кеша Доступны для `check` и `serve`. Переопределяют секцию `cache`. | Флаг | Тип | Соответствует в `config.yml` | Описание | | ------------------ | ------ | ---------------------------- | ----------------- | | `--cache-enabled` | bool | `cache.enabled` | Включить кеш | | `--cache-host` | string | `cache.host` | Хост KeyDB/Redis | | `--cache-port` | uint | `cache.port` | Порт KeyDB/Redis | | `--cache-username` | string | `cache.username` | Логин | | `--cache-password` | string | `cache.password` | Пароль | | `--cache-db` | uint | `cache.db` | Номер БД | | `--cache-ttl` | uint | `cache.ttl` | TTL записей (сек) | ### Флаги только для `serve` | Флаг | Тип | Соответствует в `config.yml` | Описание | | -------------- | ------ | ---------------------------- | ------------------------- | | `-p`, `--port` | uint | `server.port` | Порт веб-сервера | | `--host` | string | `server.host` | Хост привязки | | `--check` | bool | — | Включить фоновую проверку | ### Флаги только для `check` | Флаг | Тип | Описание | | --------------- | -------- | -------------------------- | | `-j`, `--json` | bool | Вывод результатов в JSON | | `-q`, `--quiet` | bool | Подавить логи | | `-f`, `--file` | string[] | Локальный m3u-файл | | `-u`, `--url` | string[] | URL удалённого плейлиста | | `-c`, `--code` | string[] | Код плейлиста из ini-файла |