489 lines
21 KiB
Markdown
489 lines
21 KiB
Markdown
---
|
||
icon: material/upload-network
|
||
tags: ["iptvc", "docker", "deploy", "nginx", "apache", "caddy", "ssl"]
|
||
---
|
||
|
||
# :material-upload-network: Развёртывание сайта
|
||
|
||
В этом разделе описан фактический порядок настройки `iptvc`, кеша и документации.
|
||
|
||
## :material-flag-checkered: Базовый вариант развёртывания сервиса { id="local" }
|
||
|
||
Для запуска приложения не нужен репозиторий с исходниками.
|
||
Достаточно [скачать актуальный релиз](../install.md) для своей платформы.
|
||
|
||
Чтобы запустить его, достаточно расположить его в любой удобной директории на диске и выполнить команду:
|
||
|
||
```shell
|
||
./iptvc serve
|
||
```
|
||
|
||
Откройте в браузере адрес <http://localhost:8800/> и убедитесь в работе сервиса.
|
||
|
||
Вы должны увидеть ошибку:
|
||
|
||
```
|
||
Не удалось загрузить список плейлистов. Проверьте наличие файла playlists.ini.
|
||
```
|
||
|
||
Всё верно.
|
||
Для полноценной работы приложения в качестве веб-сервиса следует провести минимальные настройки.
|
||
|
||
### Список плейлистов — `playlists.ini` { id="playlists" }
|
||
|
||
!!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/playlists.md)"
|
||
|
||
Без этого файла нет смысла запускать веб-сервис.
|
||
|
||
Файл можно положить рядом с `iptvc`.
|
||
|
||
Как только вы подготовите файл, перезапустите сервис командой выше.
|
||
Вы должны увидеть список плейлистов на главной странице.
|
||
|
||
Но все они будут серого цвета и будет доступна только базовая информация о них.
|
||
Зато будут работать короткие ссылки и их уже можно будет казывать в своём любимом [плеере](../../reference/players.md).
|
||
|
||
Чтобы плейлисты позеленели, нужно запустить приложение в режиме активной проверки плейлистов:
|
||
|
||
```shell
|
||
./iptvc serve --check
|
||
```
|
||
|
||
!!! tip "У этой команды есть и другие аргументы"
|
||
Полный список указан здесь: [**Команда `serve`**](../commands/serve.md).
|
||
Они позволят, при необходимости, очень гибко настроить параметры сайта и режима проверки.
|
||
|
||
### Список правил — `channels.json` { id="channels" }
|
||
|
||
!!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/channels.md)"
|
||
|
||
Без этого файла можно жить: веб-сервис будет работать, плейлисты и каналы будут проверяться, короткие ссылки в вашем распоряжении.
|
||
|
||
Но **все** каналы будут помечены как `#untagged`.
|
||
Это значит, что такие каналы можно будет искать только по названиям.
|
||
Поиск по жанрам и странам будет недоступен.
|
||
|
||
Это может быть важно для разных пользователей.
|
||
|
||
Поэтому варианта здесь три:
|
||
|
||
1. продолжать пользоваться сервисом как есть;
|
||
2. подготовить свой файл `channels.json` согласно его правил синтаксиса;
|
||
3. скачать готовый файл из репозитория: [channels.json](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/channels.json)
|
||
|
||
??? tip "Рекомендуется третий вариант"
|
||
Файл в репозитории периодически обновляется по тем плейлистам, которые широко распространяются в сети.
|
||
В нём собраны правла для многих телеканалов СНГ и Европы.
|
||
Хотя и далеко не все.
|
||
Поэтому, если вы умеете работать с регулярными выражениями, вы можете предложить свои правила в репозиторий.
|
||
|
||
Файл можно положить туда же — рядом с `iptvc`.
|
||
|
||
Когда файл будет готов, перезапустите приложение предыдущей командой.
|
||
|
||
Поздравляю, теперь у вас свой собственный рабочий агрегатор плейлистов.
|
||
Вы можете его использовать в домашней сети или на своём ПК — для мониторинга состояния плейлистов или для просмотра.
|
||
|
||
### Конфигурация приложения — `config.yml`
|
||
|
||
!!! info "Синтаксис описан в [этом разделе документации](../../reference/config.md)"
|
||
|
||
Теперь можете приступить к конфигурации приложения.
|
||
|
||
Это позволит вам освободить руки и мозг, чтобы не запоминать и не писать длинные аргументы, а также изменять параметры, недоступные через в командной строке.
|
||
|
||
Файл можно положить туда же — рядом с `iptvc`.
|
||
|
||
Но постойте.
|
||
Вы уже несколько раз перезапустили приложение, а результаты проверки плейлистов сбрасываются.
|
||
А если вы перезагрузите компьютер, то придётся заново вручную запускать приложение.
|
||
|
||
Давайте это исправим в следующих шагах.
|
||
|
||
## :simple-docker: Развёртывание через Docker { id="docker" }
|
||
|
||
Установка docker осуществляется через [brew](https://formulae.brew.sh/formula/docker) или согласно [официальной документации](https://docs.docker.com/engine/).
|
||
|
||
??? tip "Для MacOS вместо Docker Desktop рекомендую [OrbStack](https://orbstack.dev)"
|
||
Он быстрый, лёгкий, бесплатный и не жрёт столько ресурсов, как официальное приложение.
|
||
В общем-то, сама по себе гуйня для докера бесполезна и не нужна, но на маке эта тулза поможет с запуском докера на сокете в пространстве текущего пользователя.
|
||
К сожалению, иначе на маке докер работать в фоне не может из-за политик безопасности.
|
||
Либо может, но это потребует кучу гемора на ровном месте.
|
||
|
||
Для работы `iptvc` нужно будет скачать ещё один файл из репозитория: [compose.yml](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/compose.yml).
|
||
Это конфигурация связки контейнеров, и `iptvc` будет запускаться в одном из них.
|
||
|
||
Скачивайте и кладите в ту же директорию, где остальные файлы.
|
||
|
||
Для теста запустите команду:
|
||
|
||
```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
|
||
```
|
||
|
||
Проверьте состояние контейнеров и журналы:
|
||
|
||
```shell
|
||
docker compose ps
|
||
docker compose logs -f iptvc
|
||
```
|
||
|
||
Веб-интерфейс приложения доступен на `http://localhost:8800`.
|
||
|
||
Документация доступна на `http://localhost:8801`.
|
||
|
||
Для остановки окружения выполните:
|
||
|
||
```shell
|
||
docker compose down
|
||
```
|
||
|
||
## Реверс-прокси и SSL { id="reverse-proxy" }
|
||
|
||
Для публикации приложения на домене с HTTPS настроим реверс-прокси, который будет терминировать SSL и проксировать запросы на контейнеры `iptvc` (порт `8800`) и `docs` (порт `8801`).
|
||
|
||
!!! tip "site.baseUrl"
|
||
После настройки домена укажите внешний адрес в `config.yml` или `.env`:
|
||
|
||
```yaml
|
||
site:
|
||
baseUrl: https://example.com
|
||
```
|
||
|
||
Или через переменную окружения:
|
||
|
||
```shell
|
||
SITE_BASE_URL=https://example.com
|
||
```
|
||
|
||
О параметре: [`site.baseUrl`](../../reference/config.md#site-base-url)
|
||
|
||
Ниже рассмотрены три варианта: nginx, Apache2 и Caddy.
|
||
|
||
### Подготовка { id="reverse-proxy-prep" }
|
||
|
||
Убедитесь, что:
|
||
|
||
- домен `example.com` (и при необходимости `docs.example.com`) направляет A-запись на IP сервера;
|
||
- порты `80` и `443` открыты в файрволе;
|
||
- Docker-окружение запущено (`docker compose up -d`);
|
||
- порты `8800` и `8801` доступны локально (проверьте `curl -I http://localhost:8800`).
|
||
|
||
#### nginx { id="reverse-proxy-nginx" }
|
||
|
||
Установите nginx и Certbot:
|
||
|
||
```shell
|
||
sudo apt update
|
||
sudo apt install -y nginx certbot python3-certbot-nginx
|
||
```
|
||
|
||
Создайте конфигурацию для приложения:
|
||
|
||
```nginx title="/etc/nginx/sites-available/iptvc" linenums="1"
|
||
server {
|
||
listen 80;
|
||
server_name example.com;
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:8800;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
}
|
||
```
|
||
|
||
При необходимости добавьте отдельный `server`-блок для документации:
|
||
|
||
```nginx title="/etc/nginx/sites-available/iptv-docs" linenums="1"
|
||
server {
|
||
listen 80;
|
||
server_name docs.example.com;
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:8801;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
}
|
||
```
|
||
|
||
Включите конфигурации и проверьте синтаксис:
|
||
|
||
```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
|
||
sudo systemctl reload nginx
|
||
```
|
||
|
||
Получите SSL-сертификат через Certbot:
|
||
|
||
```shell
|
||
sudo certbot --nginx -d example.com -d docs.example.com
|
||
```
|
||
|
||
Certbot автоматически изменит конфигурацию nginx, добавит HTTPS и настройке редирект с HTTP на HTTPS.
|
||
|
||
Проверьте автоматическое продление:
|
||
|
||
```shell
|
||
sudo certbot renew --dry-run
|
||
```
|
||
|
||
#### Apache2 { id="reverse-proxy-apache" }
|
||
|
||
Установите Apache2 и Certbot:
|
||
|
||
```shell
|
||
sudo apt update
|
||
sudo apt install -y apache2 certbot python3-certbot-apache
|
||
```
|
||
|
||
Включите необходимые модули:
|
||
|
||
```shell
|
||
sudo a2enmod proxy proxy_http ssl rewrite headers
|
||
sudo systemctl restart apache2
|
||
```
|
||
|
||
Создайте конфигурацию виртуального хоста для приложения:
|
||
|
||
```apache title="/etc/apache2/sites-available/iptvc.conf" linenums="1"
|
||
<VirtualHost *:80>
|
||
ServerName example.com
|
||
|
||
ProxyPreserveHost On
|
||
ProxyPass / http://127.0.0.1:8800/
|
||
ProxyPassReverse / http://127.0.0.1:8800/
|
||
|
||
RequestHeader set X-Forwarded-Proto "http"
|
||
RequestHeader set X-Forwarded-Port "80"
|
||
</VirtualHost>
|
||
```
|
||
|
||
При необходимости добавьте виртуальный хост для документации:
|
||
|
||
```apache title="/etc/apache2/sites-available/iptv-docs.conf" linenums="1"
|
||
<VirtualHost *:80>
|
||
ServerName docs.example.com
|
||
|
||
ProxyPreserveHost On
|
||
ProxyPass / http://127.0.0.1:8801/
|
||
ProxyPassReverse / http://127.0.0.1:8801/
|
||
|
||
RequestHeader set X-Forwarded-Proto "http"
|
||
RequestHeader set X-Forwarded-Port "80"
|
||
</VirtualHost>
|
||
```
|
||
|
||
Включите конфигурации и проверьте синтаксис:
|
||
|
||
```shell
|
||
sudo a2ensite iptvc iptv-docs
|
||
sudo apache2ctl configtest
|
||
sudo systemctl reload apache2
|
||
```
|
||
|
||
Получите SSL-сертификат через Certbot:
|
||
|
||
```shell
|
||
sudo certbot --apache -d example.com -d docs.example.com
|
||
```
|
||
|
||
Certbot автоматически создаст HTTPS-виртуальные хосты и настроит редирект с HTTP на HTTPS.
|
||
|
||
Проверьте автоматическое продление:
|
||
|
||
```shell
|
||
sudo certbot renew --dry-run
|
||
```
|
||
|
||
#### 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" }
|
||
|
||
После настройки откройте в браузере:
|
||
|
||
- `https://example.com` — веб-интерфейс `iptvc`;
|
||
- `https://docs.example.com` — сайт документации.
|
||
|
||
Убедитесь, что сертификат валиден, а редирект с HTTP на HTTPS работает.
|
||
|
||
!!! note "Ограничение портов"
|
||
После настройки реверс-прокси можно убрать публикацию портов `8800` и `8801` наружу в `compose.yml`, оставив их доступными только локально.
|
||
Это предотвратит прямой доступ к сервисам в обход прокси.
|
||
|
||
## Сборка образа iptvc { id="image" }
|
||
|
||
Для сборки и публикации образа используйте цели Makefile в каталоге `iptvc/`:
|
||
|
||
```shell
|
||
cd iptvc
|
||
|
||
# Сборка одноархитектурного образа (linux/amd64 по умолчанию)
|
||
make image
|
||
|
||
# Сборка под arm64
|
||
make image GOARCH=arm64
|
||
|
||
# Сборка с указанием тега
|
||
make image IMAGE_TAG=v1.2.3
|
||
```
|
||
|
||
Для публикации multi-arch манифеста (linux/amd64 + linux/arm64):
|
||
|
||
```shell
|
||
make image-all
|
||
```
|
||
|
||
Цель `image-all` всегда отправляет образ в registry — это ограничение `docker buildx`: multi-arch манифест нельзя загрузить в локальный Docker daemon.
|
||
|
||
Перед публикацией войдите в registry, если это требуется вашей настройкой:
|
||
|
||
```shell
|
||
docker login git.axenov.dev
|
||
```
|
||
|
||
!!! warning "Рабочее дерево Git"
|
||
Версия и коммит вшиваются в бинарь из `git describe` и `git rev-parse` на хосте в момент запуска `make`.
|
||
Перед сборкой убедитесь, что рабочая копия чистая и находится на нужном теге или коммите.
|
||
|
||
## Обновление { id="update" }
|
||
|
||
После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы:
|
||
|
||
```shell
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Чтобы пересобрать только приложение `iptvc`:
|
||
|
||
```shell
|
||
docker compose build iptvc
|
||
docker compose up -d iptvc
|
||
```
|
||
|
||
Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис:
|
||
|
||
```shell
|
||
docker compose pull iptvc
|
||
docker compose up -d iptvc
|
||
```
|
||
|
||
Обновление документации выполняется пересборкой сервиса `docs`:
|
||
|
||
```shell
|
||
docker compose build docs
|
||
docker compose up -d docs
|
||
```
|
||
|
||
## Диагностика { id="diagnostics" }
|
||
|
||
Для просмотра журналов отдельных сервисов используйте:
|
||
|
||
```shell
|
||
docker compose logs -f iptvc
|
||
docker compose logs -f cache
|
||
docker compose logs -f docs
|
||
```
|
||
|
||
Для проверки конфигурации Compose выполните:
|
||
|
||
```shell
|
||
docker compose config
|
||
```
|
||
|
||
Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `cache`, а сервис `cache` запущен.
|