Files
docs/content/iptvc/site/deploy.md
T
2026-08-03 12:53:34 +08:00

489 lines
21 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.
---
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` запущен.