wip1
This commit is contained in:
@@ -53,7 +53,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
|
||||
!!! info "Обрати внимание"
|
||||
1. Пропорции рабочих и нерабочих каналов в плейлистах могут меняться от проверки к проверке.
|
||||
Это нормально, таковы технические особенности проверки.
|
||||
2. Работа архива и программы передач зависит от выбранного [плеера](../../ref/players.md).
|
||||
2. Работа архива и программы передач зависит от выбранного [плеера](../../reference/players.md).
|
||||
Некоторые это просто не поддерживают.
|
||||
|
||||
## Статусы каналов { id="channels" }
|
||||
@@ -82,7 +82,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
|
||||
|
||||
Если при проверке плейлиста обнаружен хотя бы один канал для взрослых, то этот канал и весь плейлист помечается значком <span class="badge adult">18+</span>.
|
||||
|
||||
Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../../ref/formats/channels.md).
|
||||
Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../../reference/formats/channels.md).
|
||||
Они применяются к названиям каналов и их атрибутам (`tvg-id`, `tvg-name`), которые описывают канал в плейлисте.
|
||||
|
||||
Для каналов со взрослым контентом применяется тег `adult`.
|
||||
@@ -90,7 +90,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
|
||||
!!! warning "Обрати внимание"
|
||||
Далеко не все каналы могут быть помечены таким тегом.
|
||||
Хотя набор правил для тегов очень богат, но невозможно угадать все каналы с приемлемой точностью.
|
||||
Почему — читай [здесь](../../ref/formats/channels.md#warnings).
|
||||
Почему — читай [здесь](../../reference/formats/channels.md#warnings).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ tags: ["плееры", "плейлисты"]
|
||||
|
||||
# :material-television-play: Как подключить плейлист
|
||||
|
||||
1. Найти какой-нибудь [плеер](../../ref/players.md)
|
||||
1. Найти какой-нибудь [плеер](../../reference/players.md)
|
||||
2. Узнать как в него добавить плейлист по ссылке
|
||||
3. Найти желаемый плелист из [списка](./list.md)
|
||||
4. Найти на странице ["Ссылку для ТВ"](details.md#shortlink) и ввести (скопировать) её в поле ввода адреса в плеере
|
||||
|
||||
Для некоторых [плееров](../../ref/players.md) уже есть информация как добавить плейлист.
|
||||
Для некоторых [плееров](../../reference/players.md) уже есть информация как добавить плейлист.
|
||||
|
||||
|
||||
+133
-116
@@ -1,11 +1,11 @@
|
||||
---
|
||||
icon: material/upload-network
|
||||
tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
|
||||
tags: ["iptvc", "docker", "deploy", "nginx", "apache", "caddy", "ssl"]
|
||||
---
|
||||
|
||||
# :material-upload-network: Развёртывание сайта
|
||||
|
||||
В этом разделе описан фактический порядок настройки `iptvc`, хранилищем KeyDB и документацией.
|
||||
В этом разделе описан фактический порядок настройки `iptvc`, кеша и документации.
|
||||
|
||||
## :material-flag-checkered: Базовый вариант развёртывания сервиса { id="local" }
|
||||
|
||||
@@ -31,7 +31,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
|
||||
|
||||
### Список плейлистов — `playlists.ini` { id="playlists" }
|
||||
|
||||
!!! info "Синтаксис описан в [этом разделе документации](../../ref/formats/playlists.md)"
|
||||
!!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/playlists.md)"
|
||||
|
||||
Без этого файла нет смысла запускать веб-сервис.
|
||||
|
||||
@@ -41,7 +41,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
|
||||
Вы должны увидеть список плейлистов на главной странице.
|
||||
|
||||
Но все они будут серого цвета и будет доступна только базовая информация о них.
|
||||
Зато будут работать короткие ссылки и их уже можно будет казывать в своём любимом [плеере](../../ref/players.md).
|
||||
Зато будут работать короткие ссылки и их уже можно будет казывать в своём любимом [плеере](../../reference/players.md).
|
||||
|
||||
Чтобы плейлисты позеленели, нужно запустить приложение в режиме активной проверки плейлистов:
|
||||
|
||||
@@ -55,7 +55,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
|
||||
|
||||
### Список правил — `channels.json` { id="channels" }
|
||||
|
||||
!!! info "Синтаксис описан в [этом разделе документации](../../ref/formats/channels.md)"
|
||||
!!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/channels.md)"
|
||||
|
||||
Без этого файла можно жить: веб-сервис будет работать, плейлисты и каналы будут проверяться, короткие ссылки в вашем распоряжении.
|
||||
|
||||
@@ -86,7 +86,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
|
||||
|
||||
### Конфигурация приложения — `config.yml`
|
||||
|
||||
!!! info "Синтаксис описан в [этом разделе документации](../../ref/config.md)"
|
||||
!!! info "Синтаксис описан в [этом разделе документации](../../reference/config.md)"
|
||||
|
||||
Теперь можете приступить к конфигурации приложения.
|
||||
|
||||
@@ -102,7 +102,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
|
||||
|
||||
## :simple-docker: Развёртывание через Docker { id="docker" }
|
||||
|
||||
Установка docker осуществляется согласно официальной документации.
|
||||
Установка docker осуществляется через [brew](https://formulae.brew.sh/formula/docker) или согласно [официальной документации](https://docs.docker.com/engine/).
|
||||
|
||||
??? tip "Для MacOS вместо Docker Desktop рекомендую [OrbStack](https://orbstack.dev)"
|
||||
Он быстрый, лёгкий, бесплатный и не жрёт столько ресурсов, как официальное приложение.
|
||||
@@ -110,94 +110,55 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
|
||||
К сожалению, иначе на маке докер работать в фоне не может из-за политик безопасности.
|
||||
Либо может, но это потребует кучу гемора на ровном месте.
|
||||
|
||||
Для этого нужно будет скачать ещё один файл из репозитория: [compose.yml](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/compose.yml)
|
||||
Для работы `iptvc` нужно будет скачать ещё один файл из репозитория: [compose.yml](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/compose.yml).
|
||||
Это конфигурация связки контейнеров, и `iptvc` будет запускаться в одном из них.
|
||||
|
||||
Скачивайте и кладите в ту же директорию, где остальные файлы.
|
||||
|
||||
Для теста запустите команду:
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## Подготовка репозитория { id="repository" }
|
||||
|
||||
Клонируйте основной репозиторий и перейдите в его каталог:
|
||||
|
||||
```bash
|
||||
git clone https://git.axenov.dev/IPTV/.git
|
||||
cd IPTV
|
||||
```
|
||||
|
||||
В корне проекта должны находиться `compose.yml`, `.env`, `config.yml`, `playlists.ini`, `channels.json` и каталог `docker/keydb`.
|
||||
|
||||
Исходный код приложения располагается в `iptvc/`, а документации — в `docs/`.
|
||||
|
||||
## Настройка файлов { id="configuration" }
|
||||
|
||||
Создайте файлы локальной конфигурации на основе примеров:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
cp iptvc/config.yml.example config.yml
|
||||
```
|
||||
|
||||
Отредактируйте `config.yml`.
|
||||
|
||||
В контейнере `iptvc` он подключается как `/app/config.yml`.
|
||||
|
||||
Минимально проверьте следующие параметры:
|
||||
|
||||
- `app.playlists` — путь к файлу плейлистов;
|
||||
- `app.tags` — путь к файлу тегов каналов;
|
||||
- `server.host` и `server.port` — адрес и порт веб-интерфейса;
|
||||
- `cache.enabled` и параметры `cache` — использование KeyDB;
|
||||
- `site.base-url` — внешний адрес приложения.
|
||||
|
||||
Скопируйте входные данные плейлистов в корень окружения:
|
||||
|
||||
```bash
|
||||
cp /path/to/playlists.ini ./playlists.ini
|
||||
cp /path/to/channels.json ./channels.json
|
||||
```
|
||||
|
||||
Эти файлы монтируются в контейнер как `/app/playlists.ini` и `/app/channels.json`.
|
||||
|
||||
В `.env` задаются параметры приложения из `iptvc/.env.example`, включая `SITE_BASE_URL`, `SERVER_PORT`, `CACHE_ENABLED`, `CACHE_HOST`, `CACHE_PORT`, `CACHE_DB` и `CACHE_TTL`.
|
||||
|
||||
Для подключения к KeyDB из контейнера укажите имя сервиса `keydb` в `CACHE_HOST`, а не `localhost`.
|
||||
|
||||
## Состав окружения { id="services" }
|
||||
|
||||
Файл `compose.yml` запускает три сервиса:
|
||||
|
||||
| Сервис | Образ | Назначение |
|
||||
| ------- | -------------------------------------- | ------------------------------------------- |
|
||||
| `iptvc` | `git.axenov.dev/iptv/iptvc:latest` | Веб-интерфейс и фоновая проверка плейлистов |
|
||||
| `keydb` | `eqalpha/keydb:latest` | Кеш результатов проверки |
|
||||
| `docs` | `git.axenov.dev/iptv/iptv-docs:latest` | Сайт документации |
|
||||
|
||||
Сервис `iptvc` публикует порт `8800`, а `docs` — порт `8801`.
|
||||
|
||||
KeyDB публикует порт, заданный `KEYDB_PORT`, по умолчанию `6379`.
|
||||
|
||||
Сервис `iptvc` зависит от `keydb` и запускается с командой `serve --check --repeat 0`.
|
||||
|
||||
Это поднимает веб-сервер и запускает бесконечную фоновую проверку.
|
||||
|
||||
## Запуск { id="start" }
|
||||
|
||||
После подготовки файлов соберите и запустите окружение из корня проекта:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Она скачает образы, создаст контейнеры и запустит их.
|
||||
В результате вы сможете открыть в браузере <http://localhost:8800/> и увидеть то же самое, что в прошлый раз.
|
||||
|
||||
Теперь подключим кэш.
|
||||
|
||||
### Кэширование результатов { id="cache" }
|
||||
|
||||
Для этого в compose используется [Valkey](https://valkey.io).
|
||||
Это открытый форк Redis, продолжающий развитие за счёт сообщества и полностью поддерживающий его протокол.
|
||||
|
||||
Чтобы запустить связку `iptvc` + `valkey`, нужно выполнить два простых шага:
|
||||
|
||||
- создать директорию cache рядом с `iptvc`
|
||||
- внести несколько правок в файл `config.yml` приложения как показано ниже:
|
||||
|
||||
```yaml title="config.yml" linenums="1" hl_lines="3 4"
|
||||
cache:
|
||||
enabled: true #(1)!
|
||||
host: cache #(2)!
|
||||
port: 6379
|
||||
username:
|
||||
password:
|
||||
db: 0
|
||||
ttl: 30
|
||||
```
|
||||
|
||||
1. О параметре: [`cache.enabled`](../../reference/config.md#cache-enabled)
|
||||
2. О параметре: [`cache.host`](../../reference/config.md#cache-host)
|
||||
|
||||
Остановите связку контейнеров и запустите вновь, чтобы применить обновлённую конфигурацию:
|
||||
|
||||
```shell
|
||||
docker compose down; docker compose up -d --build
|
||||
```
|
||||
|
||||
Проверьте состояние контейнеров и журналы:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose ps
|
||||
docker compose logs -f iptvc
|
||||
```
|
||||
@@ -208,7 +169,7 @@ docker compose logs -f iptvc
|
||||
|
||||
Для остановки окружения выполните:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose down
|
||||
```
|
||||
|
||||
@@ -216,22 +177,24 @@ docker compose down
|
||||
|
||||
Для публикации приложения на домене с HTTPS настроим реверс-прокси, который будет терминировать SSL и проксировать запросы на контейнеры `iptvc` (порт `8800`) и `docs` (порт `8801`).
|
||||
|
||||
Ниже рассмотрены два варианта: nginx и Apache2.
|
||||
|
||||
!!! tip "site.base-url"
|
||||
!!! tip "site.baseUrl"
|
||||
После настройки домена укажите внешний адрес в `config.yml` или `.env`:
|
||||
|
||||
```yaml
|
||||
site:
|
||||
base-url: https://example.com
|
||||
baseUrl: https://example.com
|
||||
```
|
||||
|
||||
Или через переменную окружения:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
SITE_BASE_URL=https://example.com
|
||||
```
|
||||
|
||||
О параметре: [`site.baseUrl`](../../reference/config.md#site-base-url)
|
||||
|
||||
Ниже рассмотрены три варианта: nginx, Apache2 и Caddy.
|
||||
|
||||
### Подготовка { id="reverse-proxy-prep" }
|
||||
|
||||
Убедитесь, что:
|
||||
@@ -241,11 +204,11 @@ docker compose down
|
||||
- Docker-окружение запущено (`docker compose up -d`);
|
||||
- порты `8800` и `8801` доступны локально (проверьте `curl -I http://localhost:8800`).
|
||||
|
||||
### nginx { id="reverse-proxy-nginx" }
|
||||
#### nginx { id="reverse-proxy-nginx" }
|
||||
|
||||
Установите nginx и Certbot:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo apt update
|
||||
sudo apt install -y nginx certbot python3-certbot-nginx
|
||||
```
|
||||
@@ -286,7 +249,7 @@ server {
|
||||
|
||||
Включите конфигурации и проверьте синтаксис:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo ln -s /etc/nginx/sites-available/iptvc /etc/nginx/sites-enabled/
|
||||
sudo ln -s /etc/nginx/sites-available/iptv-docs /etc/nginx/sites-enabled/
|
||||
sudo nginx -t
|
||||
@@ -295,7 +258,7 @@ sudo systemctl reload nginx
|
||||
|
||||
Получите SSL-сертификат через Certbot:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo certbot --nginx -d example.com -d docs.example.com
|
||||
```
|
||||
|
||||
@@ -303,22 +266,22 @@ Certbot автоматически изменит конфигурацию nginx
|
||||
|
||||
Проверьте автоматическое продление:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
### Apache2 { id="reverse-proxy-apache" }
|
||||
#### Apache2 { id="reverse-proxy-apache" }
|
||||
|
||||
Установите Apache2 и Certbot:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo apt update
|
||||
sudo apt install -y apache2 certbot python3-certbot-apache
|
||||
```
|
||||
|
||||
Включите необходимые модули:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo a2enmod proxy proxy_http ssl rewrite headers
|
||||
sudo systemctl restart apache2
|
||||
```
|
||||
@@ -355,7 +318,7 @@ sudo systemctl restart apache2
|
||||
|
||||
Включите конфигурации и проверьте синтаксис:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo a2ensite iptvc iptv-docs
|
||||
sudo apache2ctl configtest
|
||||
sudo systemctl reload apache2
|
||||
@@ -363,7 +326,7 @@ sudo systemctl reload apache2
|
||||
|
||||
Получите SSL-сертификат через Certbot:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo certbot --apache -d example.com -d docs.example.com
|
||||
```
|
||||
|
||||
@@ -371,11 +334,65 @@ Certbot автоматически создаст HTTPS-виртуальные
|
||||
|
||||
Проверьте автоматическое продление:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
### Проверка { id="reverse-proxy-check" }
|
||||
#### Caddy { id="reverse-proxy-caddy" }
|
||||
|
||||
[Caddy](https://caddyserver.com) — современный веб-сервер с автоматическим управлением HTTPS-сертификатами через Let's Encrypt и ZeroSSL.
|
||||
В отличие от nginx и Apache2, Caddy не требует Certbot: сертификаты запрашиваются и продлеваются автоматически при старте.
|
||||
|
||||
??? tip "Почему Caddy?"
|
||||
Caddy единственный из рассмотренных серверов получает и продлевает TLS-сертификаты без внешних инструментов.
|
||||
Достаточно указать доменное имя — и Caddy сам запросит сертификат, настроит редирект с HTTP на HTTPS и будет продлевать его до истечения.
|
||||
Это сильно упрощает эксплуатацию: меньше движущихся частей, меньше шагов настройки, меньше поводов для ошибок.
|
||||
|
||||
Установите Caddy согласно [официальной документации](https://caddyserver.com/docs/install):
|
||||
|
||||
```shell
|
||||
sudo apt update
|
||||
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
sudo apt update
|
||||
sudo apt install -y caddy
|
||||
```
|
||||
|
||||
Создайте или отредактируйте конфигурационный файл `Caddyfile`:
|
||||
|
||||
```caddyfile title="/etc/caddy/Caddyfile" linenums="1"
|
||||
example.com {
|
||||
reverse_proxy 127.0.0.1:8800
|
||||
}
|
||||
|
||||
docs.example.com {
|
||||
reverse_proxy 127.0.0.1:8801
|
||||
}
|
||||
```
|
||||
|
||||
Проверьте конфигурацию и перезапустите Caddy:
|
||||
|
||||
```shell
|
||||
sudo caddy validate --config /etc/caddy/Caddyfile
|
||||
sudo systemctl reload caddy
|
||||
```
|
||||
|
||||
При первом запуске Caddy автоматически запросит SSL-сертификаты для указанных доменов, настроит редирект с HTTP на HTTPS и будет продлевать сертификаты до истечения срока действия.
|
||||
|
||||
Проверьте статус сервиса:
|
||||
|
||||
```shell
|
||||
sudo systemctl status caddy
|
||||
```
|
||||
|
||||
Если потребуется просмотреть журналы:
|
||||
|
||||
```shell
|
||||
sudo journalctl -u caddy -f
|
||||
```
|
||||
|
||||
#### Проверка { id="reverse-proxy-check" }
|
||||
|
||||
После настройки откройте в браузере:
|
||||
|
||||
@@ -392,7 +409,7 @@ sudo certbot renew --dry-run
|
||||
|
||||
Для сборки и публикации образа используйте цели Makefile в каталоге `iptvc/`:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
cd iptvc
|
||||
|
||||
# Сборка одноархитектурного образа (linux/amd64 по умолчанию)
|
||||
@@ -407,7 +424,7 @@ make image IMAGE_TAG=v1.2.3
|
||||
|
||||
Для публикации multi-arch манифеста (linux/amd64 + linux/arm64):
|
||||
|
||||
```bash
|
||||
```shell
|
||||
make image-all
|
||||
```
|
||||
|
||||
@@ -415,7 +432,7 @@ make image-all
|
||||
|
||||
Перед публикацией войдите в registry, если это требуется вашей настройкой:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker login git.axenov.dev
|
||||
```
|
||||
|
||||
@@ -427,27 +444,27 @@ docker login git.axenov.dev
|
||||
|
||||
После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Чтобы пересобрать только приложение `iptvc`:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose build iptvc
|
||||
docker compose up -d iptvc
|
||||
```
|
||||
|
||||
Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose pull iptvc
|
||||
docker compose up -d iptvc
|
||||
```
|
||||
|
||||
Обновление документации выполняется пересборкой сервиса `docs`:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose build docs
|
||||
docker compose up -d docs
|
||||
```
|
||||
@@ -456,16 +473,16 @@ docker compose up -d docs
|
||||
|
||||
Для просмотра журналов отдельных сервисов используйте:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose logs -f iptvc
|
||||
docker compose logs -f keydb
|
||||
docker compose logs -f cache
|
||||
docker compose logs -f docs
|
||||
```
|
||||
|
||||
Для проверки конфигурации Compose выполните:
|
||||
|
||||
```bash
|
||||
```shell
|
||||
docker compose config
|
||||
```
|
||||
|
||||
Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `keydb`, а сервис `keydb` запущен.
|
||||
Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `cache`, а сервис `cache` запущен.
|
||||
|
||||
@@ -7,7 +7,7 @@ tags: ["сайт", "статусы", "каналы"]
|
||||
|
||||
Страница содержит подробности об одном конкретном плейлисте.
|
||||
|
||||
В её заголовке указано [название плейлиста](../../ref/formats/playlists.md#name).
|
||||
В её заголовке указано [название плейлиста](../../reference/formats/playlists.md#name).
|
||||
|
||||
Ниже страница разделена на две части: слева две вкладки с информацией и список каналов справа.
|
||||
|
||||
@@ -19,16 +19,16 @@ tags: ["сайт", "статусы", "каналы"]
|
||||
|
||||
На этой вкладке выводится таблица со следующими строками:
|
||||
|
||||
* **Код** — короткий уникальный [код плейлиста](../../ref/formats/playlists.md#code);
|
||||
* **Описание** — [описание плейлиста](../../ref/formats/playlists.md#desc) (при наличии);
|
||||
* **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code);
|
||||
* **Описание** — [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии);
|
||||
* **Ccылка для ТВ** — короткая ссылка, которую можно использовать для [подключения плейлиста](connect.md), подробнее о ней см. ниже;
|
||||
* **Источник** — [ссылка на ресурс](../../ref/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
|
||||
* **Источник** — [ссылка на ресурс](../../reference/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
|
||||
* **Наполнение**:
|
||||
* группы — количество групп, на которые поделены каналы;
|
||||
* каналы — количества каналов общее, онлайн и оффлайн;
|
||||
(всё по нулям, если плейлист <span class="badge offline">offline</span>)
|
||||
* **Возможности** — наличие программы передач и перемотки каналов;
|
||||
* **M3U** — [прямая ссылка](../../ref/formats/playlists.md#pls) на плейлист;
|
||||
* **M3U** — [прямая ссылка](../../reference/formats/playlists.md#pls) на плейлист;
|
||||
* **Проверка плейлиста** — дата и время последней [проверки](checks.md) плейлиста с помощью [iptvc](../overview.md);
|
||||
* **Ошибка проверки** — текст ошибки, которая возникла при проверке
|
||||
(только если плейлист <span class="badge offline">offline</span>)
|
||||
@@ -82,7 +82,7 @@ tags: ["сайт", "статусы", "каналы"]
|
||||
Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**.
|
||||
Справа — **кнопка сброса** для отображения всех каналов.
|
||||
|
||||
Под строкой поиска есть [**облако тегов**](../../ref/formats/channels.md#доступные-теги).
|
||||
Под строкой поиска есть [**облако тегов**](../../reference/formats/channels.md#доступные-теги).
|
||||
|
||||
!!! question inline end "Про теги"
|
||||
Откуда они там появляются, можешь прочесть [здесь](../../common/index.md) и [здесь](../overview.md).
|
||||
@@ -128,7 +128,7 @@ m3u.su/ru
|
||||
|
||||
По идее, можешь использовать любую ссылку из подобных, т. к. технически они отработают одинаково.
|
||||
|
||||
А вот твой [плеер](../../ref/players.md) может не принять какую-то из них.
|
||||
А вот твой [плеер](../../reference/players.md) может не принять какую-то из них.
|
||||
Так что, если не подойдёт один формат, используй другой — добавь префикс или суффикс.
|
||||
|
||||
Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет — а ссылку ли мне вообще предоставил пользователь?
|
||||
|
||||
@@ -36,7 +36,7 @@ tags: ["iptvc", "serve", "сайт"]
|
||||
|
||||
## Шаг 2. Добавляем плейлисты
|
||||
|
||||
Список плейлистов описывается в файле [`playlists.ini`](../../ref/formats/playlists.md).
|
||||
Список плейлистов описывается в файле [`playlists.ini`](../../reference/formats/playlists.md).
|
||||
Создадим его рядом с `iptvc`:
|
||||
|
||||
```ini title="playlists.ini"
|
||||
@@ -66,7 +66,7 @@ pls = 'https://example.com/movies.m3u'
|
||||
Чтобы статусы появились, нужно включить фоновую проверку.
|
||||
|
||||
!!! tip "Путь к ini-файлу"
|
||||
Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../../ref/config.md) → `app.playlists`.
|
||||
Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../../reference/config.md) → `app.playlists`.
|
||||
|
||||
---
|
||||
|
||||
@@ -92,11 +92,11 @@ pls = 'https://example.com/movies.m3u'
|
||||
./iptvc serve --check --repeat 1
|
||||
```
|
||||
|
||||
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../ref/config.md):
|
||||
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../reference/config.md):
|
||||
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
start-on-serve: true
|
||||
startOnServe: true
|
||||
```
|
||||
|
||||
Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку.
|
||||
@@ -106,14 +106,14 @@ check:
|
||||
## Шаг 4. Настраиваем внешний вид сайта
|
||||
|
||||
Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале.
|
||||
Всё это — в секции [`site`](../../ref/config.md) файла `config.yml`.
|
||||
Всё это — в секции [`site`](../../reference/config.md) файла `config.yml`.
|
||||
|
||||
```yaml title="config.yml"
|
||||
site:
|
||||
base-url: http://localhost:8800
|
||||
baseUrl: http://localhost:8800
|
||||
repo-url: https://git.axenov.dev/IPTV
|
||||
page-size: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
|
||||
favicon: /favicon.ico # путь к иконке
|
||||
pageSize: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
|
||||
favicon: ./favicon.ico # путь к иконке
|
||||
header:
|
||||
title: Мой IPTV # заголовок в шапке и вкладке браузера
|
||||
menu:
|
||||
@@ -141,8 +141,8 @@ site:
|
||||
|
||||
--8<-- "icons.md"
|
||||
|
||||
!!! note "base-url"
|
||||
Параметр `base-url` используется для формирования внутренних ссылок.
|
||||
!!! note "baseUrl"
|
||||
Параметр `baseUrl` используется для формирования внутренних ссылок.
|
||||
Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`.
|
||||
|
||||
---
|
||||
@@ -150,7 +150,7 @@ site:
|
||||
## Шаг 5. Добавляем теги каналам
|
||||
|
||||
Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее.
|
||||
Правила описываются в файле [`channels.json`](../../ref/formats/channels.md).
|
||||
Правила описываются в файле [`channels.json`](../../reference/formats/channels.md).
|
||||
|
||||
```json title="channels.json"
|
||||
[
|
||||
@@ -169,30 +169,30 @@ site:
|
||||
]
|
||||
```
|
||||
|
||||
Путь к файлу указывается в [`config.yml`](../../ref/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
|
||||
Путь к файлу указывается в [`config.yml`](../../reference/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
|
||||
|
||||
```bash
|
||||
./iptvc serve --check -t /path/to/channels.json
|
||||
```
|
||||
|
||||
Полный список доступных тегов — в [справочнике по channels.json](../../ref/formats/channels.md#доступные-теги).
|
||||
Полный список доступных тегов — в [справочнике по channels.json](../../reference/formats/channels.md#доступные-теги).
|
||||
|
||||
---
|
||||
|
||||
## Шаг 6. Подключаем кеш (KeyDB/Redis)
|
||||
## Шаг 6. Подключаем кеш Valkey
|
||||
|
||||
По умолчанию результаты проверки хранятся только в оперативной памяти.
|
||||
Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки.
|
||||
|
||||
Кеш решает эту проблему: результаты сохраняются в KeyDB (или Redis) и переживают перезапуск.
|
||||
Включается одной строкой в [`config.yml`](../../ref/config.md):
|
||||
Кеш решает эту проблему: результаты сохраняются в кеше и переживают перезапуск.
|
||||
Включается в [`config.yml`](../../reference/config.md):
|
||||
|
||||
```yaml title="config.yml"
|
||||
cache:
|
||||
enabled: true
|
||||
host: localhost
|
||||
host: cache
|
||||
port: 6379
|
||||
ttl: 1800 # секунды (по умолчанию 30)
|
||||
ttl: 3600 # секунды (по умолчанию 3600)
|
||||
```
|
||||
|
||||
Или через переменные окружения:
|
||||
@@ -204,11 +204,12 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
|
||||
Или через флаги:
|
||||
|
||||
```bash
|
||||
./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 3600
|
||||
./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 1800
|
||||
```
|
||||
|
||||
!!! tip "KeyDB или Redis"
|
||||
KeyDB — это форк Redis, полностью совместимый по протоколу.
|
||||
!!! tip "Valkey, KeyDB или Redis"
|
||||
Valkey — это открытый форк Redis, а KeyDB — ещё один форк.
|
||||
Все они полностью совместимы по протоколу.
|
||||
Подойдёт любой из них.
|
||||
Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования.
|
||||
|
||||
@@ -217,18 +218,18 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
|
||||
## Шаг 7. Тонкая настройка проверки
|
||||
|
||||
Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками.
|
||||
Все параметры — в секции [`check`](../../ref/config.md) файла `config.yml`.
|
||||
Все параметры — в секции [`check`](../../reference/config.md) файла `config.yml`.
|
||||
|
||||
### Параллелизм
|
||||
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
playlists:
|
||||
max-routines: 10 # сколько плейлистов проверять одновременно
|
||||
per-routine: 5 # сколько плейлистов в одной процедуре
|
||||
maxRoutines: 10 # сколько плейлистов проверять одновременно
|
||||
perRoutine: 5 # сколько плейлистов в одной процедуре
|
||||
channels:
|
||||
max-routines: 100 # сколько каналов проверять одновременно
|
||||
per-routine: 20 # сколько каналов в одной процедуре
|
||||
maxRoutines: 100 # сколько каналов проверять одновременно
|
||||
perRoutine: 20 # сколько каналов в одной процедуре
|
||||
```
|
||||
|
||||
Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть.
|
||||
@@ -242,11 +243,11 @@ check:
|
||||
timeout: 10 # секунд на загрузку плейлиста
|
||||
channels:
|
||||
timeout: 10 # секунд на проверку одного канала
|
||||
byte-range: 512 # сколько байт скачать от сервера канала
|
||||
byteRange: 512 # сколько байт скачать от сервера канала
|
||||
```
|
||||
|
||||
Если плейлисты или каналы медленные, увеличьте `timeout`.
|
||||
Если сервер блокирует большие запросы — уменьшите `byte-range`.
|
||||
Если сервер блокирует большие запросы — уменьшите `byteRange`.
|
||||
|
||||
### Задержки (cooldown)
|
||||
|
||||
@@ -256,8 +257,8 @@ check:
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
playlists:
|
||||
all-cooldown: 5 # 5 секунд после всех плейлистов
|
||||
one-cooldown: [1, 3] # 1–3 секунды после каждого плейлиста
|
||||
allCooldown: 5 # 5 секунд после всех плейлистов
|
||||
oneCooldown: [1, 3] # 1–3 секунды после каждого плейлиста
|
||||
channels:
|
||||
cooldown: 0 # 0 секунд после каждого канала
|
||||
```
|
||||
@@ -270,14 +271,14 @@ check:
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
playlists:
|
||||
user-agent:
|
||||
userAgent:
|
||||
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
|
||||
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
channels:
|
||||
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
userAgent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
```
|
||||
|
||||
Все эти параметры можно также задавать через [переменные окружения](../../ref/config.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
|
||||
Все эти параметры можно также задавать через [переменные окружения](../../reference/config.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
|
||||
|
||||
---
|
||||
|
||||
@@ -289,7 +290,7 @@ check:
|
||||
app:
|
||||
timezone: GMT+3
|
||||
debug: false
|
||||
log_level: info
|
||||
logLevel: info
|
||||
playlists: ./playlists.ini
|
||||
tags: ./channels.json
|
||||
|
||||
@@ -298,10 +299,10 @@ server:
|
||||
port: 8800
|
||||
|
||||
site:
|
||||
base-url: https://my-iptv.ru
|
||||
baseUrl: https://my-iptv.ru
|
||||
repo-url: https://git.axenov.dev/IPTV
|
||||
page-size: 20
|
||||
favicon: /favicon.ico
|
||||
pageSize: 20
|
||||
favicon: ./favicon.ico
|
||||
header:
|
||||
title: Мой IPTV
|
||||
menu:
|
||||
@@ -330,27 +331,27 @@ site:
|
||||
icon: person-outline
|
||||
|
||||
check:
|
||||
start-on-serve: true
|
||||
startOnServe: true
|
||||
playlists:
|
||||
user-agent:
|
||||
userAgent:
|
||||
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
|
||||
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
timeout: 10
|
||||
all-cooldown: 5
|
||||
one-cooldown: [1, 3]
|
||||
max-routines: 10
|
||||
per-routine: 5
|
||||
allCooldown: 5
|
||||
oneCooldown: [1, 3]
|
||||
maxRoutines: 10
|
||||
perRoutine: 5
|
||||
channels:
|
||||
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
userAgent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
timeout: 10
|
||||
byte-range: 512
|
||||
byteRange: 512
|
||||
cooldown: 0
|
||||
max-routines: 100
|
||||
per-routine: 20
|
||||
maxRoutines: 100
|
||||
perRoutine: 20
|
||||
|
||||
cache:
|
||||
enabled: true
|
||||
host: localhost
|
||||
host: cache
|
||||
port: 6379
|
||||
ttl: 3600
|
||||
```
|
||||
@@ -361,7 +362,7 @@ cache:
|
||||
./iptvc serve
|
||||
```
|
||||
|
||||
Поскольку `start-on-serve: true`, фоновая проверка запустится автоматически.
|
||||
Поскольку `startOnServe: true`, фоновая проверка запустится автоматически.
|
||||
Кеш включён, так что результаты переживут перезапуск.
|
||||
Сайт доступен на `http://0.0.0.0:8800`.
|
||||
|
||||
@@ -385,11 +386,11 @@ services:
|
||||
environment:
|
||||
- CHECK_START_ON_SERVE=true
|
||||
- CACHE_ENABLED=true
|
||||
- CACHE_HOST=keydb
|
||||
- CACHE_HOST=cache
|
||||
- CACHE_PORT=6379
|
||||
|
||||
keydb:
|
||||
image: eqalpha/keydb:latest
|
||||
cache:
|
||||
image: valkey/valkey:latest
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
@@ -414,4 +415,4 @@ docker compose up -d
|
||||
| Пауза 2 минуты между циклами | `./iptvc serve --check --playlists-all-cooldown 120` |
|
||||
| Подробные логи | `./iptvc serve --check --verbose` |
|
||||
|
||||
Полный список параметров — в [справочнике по `config.yml`](../../ref/config.md), [переменным окружения](../../ref/config.md) и [команде `serve`](../commands/serve.md).
|
||||
Полный список параметров — в [справочнике по `config.yml`](../../reference/config.md), [переменным окружения](../../reference/config.md) и [команде `serve`](../commands/serve.md).
|
||||
|
||||
@@ -5,9 +5,9 @@ tags: ["плейлисты", "каналы", "теги", "iptvc", "плееры"
|
||||
|
||||
# :material-cogs: Как работает сервис
|
||||
|
||||
1. В специальном файле [playlists.ini](../../ref/formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете.
|
||||
1. В специальном файле [playlists.ini](../../reference/formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете.
|
||||
Каждому плейлисту присваивается свой уникальный **короткий код**.
|
||||
2. В специальном файле [channels.json](../../ref/formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы.
|
||||
2. В специальном файле [channels.json](../../reference/formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы.
|
||||
3. В фоновом режиме [работает ПО](../overview.md), которое периодически [проверяет все плейлисты](checks.md) из п. 1 и **присваивает теги** каналам из п. 2.
|
||||
4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами.
|
||||
5. Каждому плейлисту на сайте посвящена [своя страничка](details.md), где отображаются результаты его проверки, проверки его каналов (с присвоенными тегами) и пр.
|
||||
|
||||
@@ -11,22 +11,22 @@ tags: ["сайт", "плейлисты"]
|
||||
|
||||
Наверху отображаются:
|
||||
|
||||
* дата последнего изменения файла [playlists.ini](../../ref/formats/playlists.md)
|
||||
* дата последнего изменения файла [playlists.ini](../../reference/formats/playlists.md)
|
||||
* общее количество плейлистов и с разделением по статусам.
|
||||
|
||||
Ниже — спиcок плейлистов.
|
||||
|
||||
## Из чего состоит список
|
||||
|
||||
* **Код** — короткий уникальный [код плейлиста](../../ref/formats/playlists.md#code)
|
||||
* **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code)
|
||||
* **Информация о плейлисте**
|
||||
* [статус плейлиста](checks.md#playlists)
|
||||
* может быть [значок 18+](checks.md#adult)
|
||||
* [название плейлиста](../../ref/formats/playlists.md#name) — ссылка на [страницу плейлиста](details.md)
|
||||
* [название плейлиста](../../reference/formats/playlists.md#name) — ссылка на [страницу плейлиста](details.md)
|
||||
под ним:
|
||||
* [иконки возможностей плейлиста](checks.md#extra) (только при статусе <span class="badge online">online</span>)
|
||||
* [описание плейлиста](../../ref/formats/playlists.md#desc) (при наличии)
|
||||
* [список тегов](../../ref/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
|
||||
* [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии)
|
||||
* [список тегов](../../reference/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
|
||||
* ещё одна ссылка на [страницу плейлиста](details.md)
|
||||
* **Каналов** — фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах)
|
||||
* **Ссылка для ТВ** — [короткая ссылка](details.md#shortlink), которую можно использовать для [подключения плейлиста](connect.md).
|
||||
|
||||
Reference in New Issue
Block a user