---
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-файла |