This commit is contained in:
2026-08-03 12:53:34 +08:00
parent 89b303fed3
commit c91ff4c103
26 changed files with 396 additions and 362 deletions
+133 -116
View File
@@ -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` запущен.