393 lines
15 KiB
Markdown
393 lines
15 KiB
Markdown
---
|
||
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).
|