---
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: ""
  port: 8800

site:
  base-url: http://localhost:8800
  title: IPTV Checker
  meta:
    description: Самообновляемые бесплатные IPTV-плейлисты для домашнего просмотра
    keywords: iptv,плейлисты,m3u
  repo-url: https://git.axenov.dev/IPTV
  page-size: 0
  favicon:
  header:
    menu:
      - title: Документация
        url: /docs
        icon: document-text-outline
  footer:
    links:
      - title: Исходники
        url: https://git.axenov.dev/IPTV
        icon: code-slash-outline
  tabs:
    raw:
      visible: true
    legal:
      visible: true
      text: |
        <p>Юридический текст с <a href="/terms">условиями использования</a>.</p>

check:
  start-on-serve: false
  playlists:
    user-agent:
      - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
    timeout: 10              # секунды
    all-cooldown: 1800       # секунды
    one-cooldown: 2          # секунды
    max-routines: 1
    per-routine: 1
  channels:
    user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
    timeout: 10              # секунды
    byte-range: 512
    cooldown: 0              # секунды
    max-routines: 50
    per-routine: 10

cache:
  enabled: false
  host: localhost
  port: 6379
  username:
  password:
  db: 0
  ttl: 30                   # секунды
```

Каждый параметр ниже описан отдельной секцией с указанием значения по умолчанию, переменной окружения и соответствующего CLI-флага.

---

## Секция `app` { id=app }

### `app.timezone` { id=app-timezone }

<!-- md:default GMT -->
<!-- md:env APP_TIMEZONE -->

Часовой пояс, используемый в логах и при отображении времени проверок.

---

### `app.debug` { id=app-debug }

<!-- md:default false -->
<!-- md:env APP_DEBUG -->
<!-- md:arg --debug -->

Режим отладки.
Включает расширенное логирование и дополнительные проверки в логике приложения.

---

### `app.log_level` { id=app-log-level }

<!-- md:default info -->
<!-- md:env APP_LOG_LEVEL -->
<!-- md:arg --log-level -->

Уровень логирования.
Допустимые значения: `debug`, `info`, `warn`, `error`.

---

### `app.playlists` { id=app-playlists }

<!-- md:default ./playlists.ini -->
<!-- md:env APP_PLAYLISTS -->
<!-- md:arg --ini -->

Путь к локальному [ini-файлу](formats/playlists.md) с описанием плейлистов.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `app.tags` { id=app-tags }

<!-- md:default ./channels.json -->
<!-- md:env APP_TAGS -->
<!-- md:arg --tags -->

Путь к локальному [json-файлу](formats/channels.md) с описанием тегов каналов.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

## Секция `server` { id=server }

### `server.host` { id=server-host }

<!-- md:default -->
<!-- md:env SERVER_HOST -->
<!-- md:arg --host -->

Хост для привязки веб-сервера.
Пустая строка — слушать на всех интерфейсах.

!!! info "Аргумент работает только для команды `serve`."

---

### `server.port` { id=server-port }

<!-- md:default 8800 -->
<!-- md:env SERVER_PORT -->
<!-- md:arg -p, --port -->

Порт веб-сервера.

!!! info "Аргумент работает только для команды `serve`."

---

## Секция `site` { id=site }

Настройки внешнего вида и ссылок сайта: заголовок, навигация, пагинация, иконка.

### `site.base-url` { id=site-base-url }

<!-- md:default http://localhost:8800 -->
<!-- md:env SITE_BASE_URL -->

Базовый URL сайта.
Используется при формировании абсолютных ссылок в шаблонах.

---

### `site.repo-url` { id=site-repo-url }

<!-- md:default https://git.axenov.dev/IPTV -->
<!-- md:env SITE_REPO_URL -->

Ссылка на исходный репозиторий (отображается в подвале).

---

### `site.page-size` { id=site-page-size }

<!-- md:default 0 -->
<!-- md:env SITE_PAGE_SIZE -->

Размер страницы пагинации.
При значении `0` пагинация отключена, на главной странице выводятся все плейлисты.

---

### `site.favicon` { id=site-favicon }

<!-- md:default -->
<!-- md:env SITE_FAVICON -->

Путь к файлу иконки сайта. Пустая строка — используется встроенная.

---

### `site.meta` { id=site-meta }

Мета-теги `<meta name="description">` и `<meta name="keywords">` для HTML-шаблонов.

| Поле          | Переменная окружения    | Описание                     |
| ------------- | ----------------------- | ---------------------------- |
| `description` | `SITE_META_DESCRIPTION` | Описание сайта в meta-тегах  |
| `keywords`    | `SITE_META_KEYWORDS`    | Ключевые слова через запятую |

---

### `site.title` { id=site-title }

<!-- md:default IPTV Checker -->
<!-- md:env SITE_TITLE -->

Заголовок сайта, отображается в `<title>` и в navbar.

---

### `site.header.menu` { id=site-header-menu }

Массив элементов [`Link`](#link) в шапке сайта.

---

### `site.footer.links` { id=site-footer-links }

Массив элементов [`Link`](#link) в подвале сайта.

---

### `site.tabs.raw.visible` { id=site-tabs-raw-visible }

<!-- md:default true -->

Отображать вкладку «Исходный плейлист».

---

### `site.tabs.legal.visible` { id=site-tabs-legal-visible }

<!-- md:default true -->

Отображать вкладку «Юридическая информация».

---

### `site.tabs.legal.text` { id=site-tabs-legal-text }

HTML-контент вкладки «Юридическая информация».

Предназначена для вывода информации о правообладателях и контактах для связи с администратором сайта для решения правовых вопросов.

---

### Тип `Link` { id=link }

Элемент навигации или подвала.
Если задано `children`, рендерится как выпадающее меню.

| Поле       | Тип    | Описание                                                    |
| ---------- | ------ | ----------------------------------------------------------- |
| `title`    | string | Текст ссылки                                                |
| `url`      | string | URL ссылки (можно опустить, если есть `children`)           |
| `icon`     | string | Имя иконки                                                  |
| `children` | Link[] | Дочерние ссылки (выпадающее меню, один уровень вложенности) |

--8<-- "../common/config/icons.md"

```yaml title="Пример"
site:
  header:
    menu:
      - title: Помощь
        icon: help-circle-outline
        children:
          - title: Документация
            url: https://m3u.su/docs
            icon: document-text-outline
          - title: Исходники
            url: https://git.axenov.dev/IPTV
            icon: code-slash-outline
          - title: "@iptv_aggregator"
            url: https://t.me/iptv_aggregator
            icon: bullhorn-variant-outline
      - title: Telegram
        icon: bullhorn-variant-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
      - title: "@iptv_aggregator"
        url: https://t.me/iptv_aggregator
        icon: megaphone-outline
```

---

## Секция `check` { id=check }

Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы.

---

### `check.start-on-serve` { id=check-start-on-serve }

<!-- md:default false -->
<!-- md:env CHECK_START_ON_SERVE -->

Запустить фоновую проверку при `serve` без явного флага `--check`.

Независимый переключатель от CLI-флага `--check` — фоновая проверка стартует, если **хотя бы один** из них активен.

---

### `check.playlists` { id=check-playlists }

Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС).

---

#### `check.playlists.user-agent` { id=check-playlists-user-agent }

<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->

<!-- md:env CHECK_PLAYLISTS_USER_AGENT_* -->
<!-- md:arg --playlists-user-agent -->

User-Agent для HTTP-запросов плейлистов.

!!! info "Необычный параметр"
    Если значение параметра задано строкой, то в запросах к плейлистам будет использоваться только оно.

    Если значение параметра задано массивом строк, то в запросах к плейлистам будет использоваться случайный из указанных.

!!! info "Необычная переменная"
    В окружении может задаваться индексированными переменными:

    - `CHECK_PLAYLISTS_USER_AGENT_1="value1"`
    - `CHECK_PLAYLISTS_USER_AGENT_2="value2"` 
    - и т.д.; чтение останавливается на первой отсутствующей.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.playlists.timeout` { id=check-playlists-timeout }

<!-- md:default 10 -->
<!-- md:env CHECK_PLAYLISTS_TIMEOUT -->
<!-- md:arg --playlists-timeout -->

Таймаут HTTP-запроса плейлиста в секундах.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.playlists.all-cooldown` { id=check-playlists-all-cooldown }

<!-- md:default 1800 -->
<!-- md:env CHECK_PLAYLISTS_ALL_COOLDOWN -->
<!-- md:arg --playlists-all-cooldown -->

Задержка после проверки всех плейлистов в секундах.

!!! info "Необычная переменная"
    Если значение переменной указано одним числом, то для задержки будет использоваться только оно.

    Если значение переменной указано двумя числами через запятую, то будет использоваться случайная задержка в указанном диапазоне.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.playlists.one-cooldown` { id=check-playlists-one-cooldown }

<!-- md:default 2 -->
<!-- md:env CHECK_PLAYLISTS_ONE_COOLDOWN -->
<!-- md:arg --playlists-one-cooldown -->

Задержка после проверки каждого плейлиста в секундах.

!!! info "Необычная переменная"
    Если значение переменной указано одним числом, то для задержки будет использоваться только оно.

    Если значение переменной указано двумя числами через запятую, то будет использоваться случайная задержка в указанном диапазоне.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.playlists.max-routines` { id=check-playlists-max-routines }

<!-- md:default 1 -->
<!-- md:env CHECK_PLAYLISTS_MAX_ROUTINES -->
<!-- md:arg --playlists-max-routines -->

Максимальное количество параллельных потоков (рутин) проверки плейлистов.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.playlists.per-routine` { id=check-playlists-per-routine }

<!-- md:default 1 -->
<!-- md:env CHECK_PLAYLISTS_PER_ROUTINE -->
<!-- md:arg --playlists-per-routine -->

Максимальное количество плейлистов в каждом потоке (рутине) проверки.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `check.channels` { id=check-channels }

Параметры проверки каналов внутри плейлиста.

---

#### `check.channels.user-agent` { id=check-channels-user-agent }

<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->

<!-- md:env CHECK_CHANNELS_USER_AGENT_* -->
<!-- md:arg --channels-user-agent --> 

User-Agent для HTTP-запроса каждого канала каждого плейлиста.

!!! info "Необычный параметр"
    Если значение параметра задано строкой, то в запросах к каналам будет использоваться только оно.

    Если значение параметра задано массивом строк, то в запросах к каналам будет использоваться случайный из указанных.

!!! info "Необычная переменная"
    В окружении может задаваться индексированными переменными:

    - `CHECK_CHANNELS_USER_AGENT_1="value1"`
    - `CHECK_CHANNELS_USER_AGENT_2="value2"` 
    - и т.д.; чтение останавливается на первой отсутствующей.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.channels.timeout` { id=check-channels-timeout }

<!-- md:default 10 -->
<!-- md:env CHECK_CHANNELS_TIMEOUT -->
<!-- md:arg --channels-timeout -->

Таймаут HTTP-запроса каждого канала каждого плейлиста в секундах.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.channels.byte-range` { id=check-channels-byte-range }

<!-- md:default 512 -->
<!-- md:env CHECK_CHANNELS_BYTE_RANGE -->
<!-- md:arg --channels-byte-range -->

Объём данных в байтах, запрашиваемых у сервера при проверке каждого канала каждого плейлиста.

Меньшее значение повышает риск ошибок в определении типа контента (mime-type).

Большее значение может приводить к повышенной нагрузке и увеличению времени проверки.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.channels.cooldown` { id=check-channels-cooldown }

<!-- md:default 0 -->
<!-- md:env CHECK_CHANNELS_COOLDOWN -->
<!-- md:arg --channels-cooldown -->

Задержка после проверки каждого канала каждого плейлиста в секундах.

!!! info "Необычная переменная"
    Если значение переменной указано одним числом, то для задержки будет использоваться только оно.

    Если значение переменной указано двумя числами через запятую, то будет использоваться случайная задержка в указанном диапазоне.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.channels.max-routines` { id=check-channels-max-routines }

<!-- md:default 50 -->
<!-- md:env CHECK_CHANNELS_MAX_ROUTINES -->
<!-- md:arg --channels-max-routines -->

Максимальное количество параллельных потоков (рутин) проверки каналов каждого плейлиста.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

#### `check.channels.per-routine` { id=check-channels-per-routine }

<!-- md:default 10 -->
<!-- md:env CHECK_CHANNELS_PER_ROUTINE -->
<!-- md:arg --channels-per-routine -->

Максимальное количество каналов в каждом потоке (рутине) проверки каждого плейлиста.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

## Секция `cache` { id=cache }

Параметры подключения к KeyDB/Redis для хранения результатов проверок.

---

### `cache.enabled` { id=cache-enabled }

<!-- md:default false -->
<!-- md:env CACHE_ENABLED -->
<!-- md:arg --cache-enabled -->

Включить использование внешнего кеша.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `cache.host` { id=cache-host }

<!-- md:default localhost -->
<!-- md:env CACHE_HOST -->
<!-- md:arg --cache-host -->

Хост KeyDB/Redis.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `cache.port` { id=cache-port }

<!-- md:default 6379 -->
<!-- md:env CACHE_PORT -->
<!-- md:arg --cache-port -->

Порт KeyDB/Redis.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `cache.username` { id=cache-username }

<!-- md:default -->
<!-- md:env CACHE_USERNAME -->
<!-- md:arg --cache-username -->

Логин для подключения. Пустая строка — без аутентификации.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `cache.password` { id=cache-password }

<!-- md:default -->
<!-- md:env CACHE_PASSWORD -->
<!-- md:arg --cache-password -->

Пароль для подключения.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `cache.db` { id=cache-db }

<!-- md:default 0 -->
<!-- md:env CACHE_DB -->
<!-- md:arg --cache-db -->

Номер логической базы данных в KeyDB/Redis.

!!! info "Аргумент работает только для команд `check` и `serve --check`."

---

### `cache.ttl` { id=cache-ttl }

<!-- md:default 30 -->
<!-- md:env CACHE_TTL -->
<!-- md:arg --cache-ttl -->

TTL записей кеша, секунды.

!!! info "Аргумент работает только для команд `check` и `serve --check`."
