Files
docs/content/iptvc/site/start.md
T
2026-07-13 12:30:05 +08:00

393 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Запуск своего сайта
icon: material/rocket-launch
tags: ["iptvc", "serve", "сайт"]
---
# :material-rocket-launch: Запуск своего сайта
В этой статье мы шаг за шагом запустим собственный сайт-агрегатор IPTV-плейлистов — от простейшего варианта до полной конфигурации с кешем и тонкой настройкой проверки.
Программа `iptvc` уже должна быть [установлена](../install.md). Все команды ниже выполняются в терминале из директории, где лежит бинарник.
---
## Шаг 1. Запускаем пустой сайт
Минимальный запуск — одна команда:
```bash
./iptvc serve
```
Сайт откроется на `http://localhost:8080`. Это пустая страница: нет ни одного плейлиста, потому что программе пока неоткуда их взять.
Чтобы изменить порт или хост, не трогая файл конфигурации:
```bash
./iptvc serve -p 3000 --host 0.0.0.0
```
Подробнее об этих флагах — в [документации команды `serve`](../commands/serve.md).
---
## Шаг 2. Добавляем плейлисты
Список плейлистов описывается в файле [`playlists.ini`](../formats/playlists.md). Создадим его рядом с `iptvc`:
```ini title="playlists.ini"
[ru]
name = Российские каналы
desc = Основные федеральные каналы
pls = 'https://example.com/ru.m3u'
src = 'https://example.com/ru-playlist'
[movies]
name = Фильмы
pls = 'https://example.com/movies.m3u'
```
Каждая секция `[code]` — это плейлист. Код используется в коротких ссылках вида `http://localhost:8080/ru`. Параметр `pls` обязателен, остальные — по желанию.
Теперь запустим:
```bash
./iptvc serve
```
Сайт покажет оба плейлиста, но их статус — `unknown` (неизвестно). Это нормально: программа знает о них, но ещё не проверяла. Чтобы статусы появились, нужно включить фоновую проверку.
!!! tip "Путь к ini-файлу"
Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../config/config.md) → `app.playlists`.
---
## Шаг 3. Включаем фоновую проверку
Без проверки сайт просто показывает список. Чтобы плейлисты и каналы проверялись автоматически, добавим флаг `--check`:
```bash
./iptvc serve --check
```
Теперь программа в фоне загружает каждый плейлист, парсит каналы и проверяет их доступность. Результаты сразу попадают в оперативную память и отображаются на сайте.
Можно настроить интервал между циклами проверки:
```bash
# проверять каждые 120 секунд, бесконечно
./iptvc serve --check --every 120
# проверить один раз и остановить
./iptvc serve --check --repeat 1
```
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../config/config.md):
```yaml title="config.yml"
check:
start-on-serve: true
```
Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку.
---
## Шаг 4. Настраиваем внешний вид сайта
Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале. Всё это — в секции [`site`](../config/config.md#секция-site) файла `config.yml`.
```yaml title="config.yml"
site:
base-url: http://localhost:8080
repo-url: https://git.axenov.dev/IPTV
page-size: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
favicon: /favicon.ico # путь к иконке
header:
title: Мой IPTV # заголовок в шапке и вкладке браузера
navigation:
- title: Документация
url: /docs
icon: document-text-outline
- title: Telegram
icon: paper-plane-outline
children:
- title: Канал
url: https://t.me/my_channel
icon: megaphone-outline
- title: Чат
url: https://t.me/my_chat
icon: chatbubbles-outline
footer-links:
- title: Исходники
url: https://git.axenov.dev/IPTV
icon: code-slash-outline
- title: Мой сайт
url: https://example.com
icon: person-outline
```
--8<-- "ionicons-name.md"
!!! note "base-url"
Параметр `base-url` используется для формирования внутренних ссылок. Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`.
---
## Шаг 5. Добавляем теги каналам
Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее. Правила описываются в файле [`channels.json`](../formats/channels.md).
```json title="channels.json"
[
{
"tvg-id": "^ru-",
"tags": ["russian"]
},
{
"title": "спорт",
"tags": ["sport"]
},
{
"title": "кино|фильм",
"tags": ["film"]
}
]
```
Путь к файлу указывается в [`config.yml`](../config/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
```bash
./iptvc serve --check -t /path/to/channels.json
```
Полный список доступных тегов — в [справочнике по channels.json](../formats/channels.md#доступные-теги).
---
## Шаг 6. Подключаем кеш (KeyDB/Redis)
По умолчанию результаты проверки хранятся только в оперативной памяти. Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки.
Кеш решает эту проблему: результаты сохраняются в KeyDB (или Redis) и переживают перезапуск. Включается одной строкой в [`config.yml`](../config/config.md#секция-cache):
```yaml title="config.yml"
cache:
enabled: true
host: localhost
port: 6379
ttl: 1800 # секунды (30 минут)
```
Или через переменные окружения:
```bash
CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
```
Или через флаги:
```bash
./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 3600
```
!!! tip "KeyDB или Redis"
KeyDB — это форк Redis, полностью совместимый по протоколу. Подойдёт любой из них. Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования.
---
## Шаг 7. Тонкая настройка проверки
Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками. Все параметры — в секции [`check`](../config/config.md#секция-check) файла `config.yml`.
### Параллелизм
```yaml title="config.yml"
check:
playlists:
max-routines: 10 # сколько плейлистов проверять одновременно
per-routine: 5 # сколько плейлистов в одной процедуре
channels:
max-routines: 100 # сколько каналов проверять одновременно
per-routine: 20 # сколько каналов в одной процедуре
```
Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть. Начните со значений по умолчанию и увеличивайте при необходимости.
### Таймауты
```yaml title="config.yml"
check:
playlists:
timeout: 10000 # мс на загрузку плейлиста
channels:
timeout: 10000 # мс на проверку одного канала
byte-range: 512 # сколько байт скачать от сервера канала
```
Если плейлисты или каналы медленные, увеличьте `timeout`. Если сервер блокирует большие запросы — уменьшите `byte-range`.
### Задержки (cooldown)
Чтобы не перегружать серверы-источники, между проверками можно делать паузы. Параметры поддерживают как фиксированное значение, так и диапазон `[min, max]` — тогда пауза будет случайной при каждом проходе:
```yaml title="config.yml"
check:
playlists:
all-cooldown: 5000 # 5 секунд после всех плейлистов
one-cooldown: [1000, 3000] # 1–3 секунды после каждого плейлиста
channels:
cooldown: [100, 500] # 100–500 мс после каждого канала
```
### User-Agent
Некоторые серверы блокируют запросы без правильного User-Agent. Можно указать один или несколько — тогда при каждом запросе будет выбран случайный:
```yaml title="config.yml"
check:
playlists:
user-agent:
- 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
```
Все эти параметры можно также задавать через [переменные окружения](../config/env.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
---
## Полный пример
Соберём всё вместе в одном `config.yml`:
```yaml title="config.yml"
app:
timezone: GMT+3
debug: false
log_level: info
playlists: ./playlists.ini
tags: ./channels.json
server:
host: 0.0.0.0
port: 8080
site:
base-url: https://my-iptv.ru
repo-url: https://git.axenov.dev/IPTV
page-size: 20
favicon: /favicon.ico
header:
title: Мой IPTV
navigation:
- title: Статус
url: https://status.my-iptv.ru
icon: pulse-outline
- title: Документация
url: /docs
icon: document-text-outline
- title: Telegram
icon: paper-plane-outline
children:
- title: Канал
url: https://t.me/my_channel
icon: megaphone-outline
- title: Чат
url: https://t.me/my_chat
icon: chatbubbles-outline
footer-links:
- title: Исходники
url: https://git.axenov.dev/IPTV
icon: code-slash-outline
- title: Контакты
url: https://example.com
icon: person-outline
check:
start-on-serve: true
playlists:
user-agent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10000
all-cooldown: 5000
one-cooldown: [1000, 3000]
max-routines: 10
per-routine: 5
channels:
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10000
byte-range: 512
cooldown: [100, 500]
max-routines: 100
per-routine: 20
cache:
enabled: true
host: localhost
port: 6379
ttl: 3600
```
Запуск:
```bash
./iptvc serve
```
Поскольку `start-on-serve: true`, фоновая проверка запустится автоматически. Кеш включён, так что результаты переживут перезапуск. Сайт доступен на `http://0.0.0.0:8080`.
---
## Docker
Удобно запускать сайт в контейнере. Образ `iptvc` уже включает бинарник:
```yaml title="compose.yml"
services:
iptvc:
image: git.axenov.dev/iptv/iptvc:latest
command: [serve]
ports:
- "8080:8080"
volumes:
- ./config.yml:/app/config.yml:ro
- ./playlists.ini:/app/playlists.ini:ro
- ./channels.json:/app/channels.json:ro
environment:
- CHECK_START_ON_SERVE=true
- CACHE_ENABLED=true
- CACHE_HOST=keydb
- CACHE_PORT=6379
keydb:
image: eqalpha/keydb:latest
restart: unless-stopped
```
```bash
docker compose up -d
```
Подробнее об установке образа — в [документации по установке](../install.md).
---
## Краткая шпаргалка
| Задача | Как |
| --- | --- |
| Запустить сайт | `./iptvc serve` |
| С проверкой плейлистов | `./iptvc serve --check` |
| На другом порту | `./iptvc serve -p 3000` |
| С ini-файлом из другого места | `./iptvc serve -i /path/to/playlists.ini` |
| С кешем | `./iptvc serve --check --cache-enabled` |
| Один цикл проверки | `./iptvc serve --check --repeat 1` |
| Проверять каждые 2 минуты | `./iptvc serve --check --every 120` |
| Подробные логи | `./iptvc serve --check --verbose` |
Полный список параметров — в [справочнике по `config.yml`](../config/config.md), [переменным окружения](../config/env.md) и [команде `serve`](../commands/serve.md).