wip7
This commit is contained in:
@@ -0,0 +1,206 @@
|
||||
# Инструкции для работы с репозиторием
|
||||
|
||||
## Обзор проекта
|
||||
|
||||
`iptvc` (IPTV Checker) — консольное приложение на Go для проверки IPTV-плейлистов в форматах M3U/M3U8. Программа умеет загружать плейлисты из локальных файлов, по URL и из ini-файла, проверять доступность плейлистов и отдельных каналов, выводить результаты в журнале или JSON, а также запускать встроенный веб-интерфейс.
|
||||
|
||||
Проект является частью экосистемы `m3u.su`. Исходный код размещается на Gitea: `https://git.axenov.dev/IPTV/iptvc`.
|
||||
|
||||
Основные технологии:
|
||||
|
||||
- Go 1.23.6 или новее согласно `go.mod` и README.
|
||||
- Cobra для CLI-команд и флагов.
|
||||
- YAML для конфигурации.
|
||||
- INI для списка плейлистов.
|
||||
- Redis/KeyDB через `github.com/redis/go-redis/v9` для кеширования результатов.
|
||||
- `godotenv` для автоматической загрузки `.env`.
|
||||
- Docker и Docker Compose для контейнерного запуска.
|
||||
- Встроенный HTTP-веб-сервер для просмотра плейлистов и результатов проверки.
|
||||
|
||||
## Структура репозитория
|
||||
|
||||
- `main.go` — минимальная точка входа, передающая управление в пакет `cmd`.
|
||||
- `cmd/` — CLI-слой на Cobra: корневая команда, команды `check` и `serve`, флаги, версия и тесты флагов.
|
||||
- `app/` — прикладная логика приложения.
|
||||
- `app/checker/` — подготовка и проверка плейлистов и каналов.
|
||||
- `app/cache/` — абстракции и работа с кешем.
|
||||
- `app/config/` — структуры конфигурации, значения по умолчанию, YAML и переменные окружения.
|
||||
- `app/inifile/` — чтение ini-файлов со списками плейлистов.
|
||||
- `app/playlist/` — модели и обработка IPTV-плейлистов.
|
||||
- `app/tagfile/` — чтение файла тегов каналов.
|
||||
- `app/web/` — веб-сервер, маршруты и отображение данных.
|
||||
- `app/logger/` — настройка журналирования.
|
||||
- `app/utils/` — вспомогательные функции.
|
||||
- `cmd/keydb/` — вспомогательные материалы для KeyDB, если используются соответствующие компоненты.
|
||||
- `docker/keydb/` — конфигурация и entrypoint для контейнера KeyDB.
|
||||
- `channels.json` — пример или локальный файл тегов каналов.
|
||||
- `config.yml.example` — пример конфигурации приложения.
|
||||
- `.env.example` — пример переменных окружения.
|
||||
- `compose.yml` — окружение из приложения, документации и KeyDB.
|
||||
- `Dockerfile` — многоэтапная сборка бинарного файла и минимального Alpine-образа.
|
||||
- `Makefile` — очистка, кросс-компиляция и сборка релизных архивов.
|
||||
- `README.md` — пользовательская документация, команды запуска, конфигурация и API-маршруты.
|
||||
- `LICENSE` — лицензия MIT.
|
||||
|
||||
## Архитектура и поток выполнения
|
||||
|
||||
1. `main.go` вызывает `cmd.Execute()`.
|
||||
2. `cmd/root.go` регистрирует глобальные флаги и дочерние Cobra-команды.
|
||||
3. Команда `check` инициализирует приложение, применяет CLI-переопределения, подключает кеш, получает плейлисты и запускает проверку.
|
||||
4. Команда `serve` поднимает веб-сервер и при необходимости запускает фоновую проверку через флаг `--check` или настройку `check.start-on-serve`.
|
||||
5. Конфигурация загружается со следующим приоритетом: встроенные значения по умолчанию, `config.yml`, переменные окружения и явно переданные CLI-флаги.
|
||||
6. Результаты проверки могут сохраняться в KeyDB/Redis и отображаться веб-сервером. При недоступном кеше веб-интерфейс показывает неизвестный статус.
|
||||
|
||||
Не следует помещать бизнес-логику в `main.go` или CLI-команды, если её можно разместить в соответствующем пакете `app/`. CLI-слой должен отвечать за разбор аргументов, инициализацию и координацию прикладных компонентов.
|
||||
|
||||
## Сборка и запуск
|
||||
|
||||
Для локальной разработки требуется Go версии 1.23.6 или новее. В `Dockerfile` используется `golang:1.25-alpine`, поэтому контейнерная сборка ориентируется на Go 1.25.
|
||||
|
||||
Основные команды:
|
||||
|
||||
```bash
|
||||
# Показать доступные цели Makefile
|
||||
make help
|
||||
|
||||
# Быстро запустить приложение из исходников
|
||||
go run .
|
||||
|
||||
# Запустить CLI-справку
|
||||
go run . help
|
||||
|
||||
# Проверить локальный плейлист
|
||||
go run . check -f mypls.m3u
|
||||
|
||||
# Проверить плейлист по URL
|
||||
go run . check -u https://example.com/playlist.m3u
|
||||
|
||||
# Запустить веб-интерфейс на порту 8800
|
||||
go run . serve -p 8800
|
||||
|
||||
# Запустить веб-интерфейс с фоновой проверкой
|
||||
go run . serve -i playlists.ini -p 8800 --check
|
||||
|
||||
# Собрать текущую платформу
|
||||
go build -o iptvc .
|
||||
|
||||
# Запустить тесты всех пакетов
|
||||
go test ./...
|
||||
|
||||
# Проверить форматирование
|
||||
|
||||
gofmt -w .
|
||||
```
|
||||
|
||||
В блоке выше команда форматирования приведена как ориентир: `gofmt` следует запускать по Go-файлам, например `gofmt -w main.go cmd app`, если оболочка или используемая версия инструмента не поддерживает обработку директорий так, как ожидается.
|
||||
|
||||
Цели Makefile:
|
||||
|
||||
- `make clear` — удалить результаты сборки и очистить кеш Go.
|
||||
- `make linux GOARCH=amd64` — собрать Linux-бинарный файл и ZIP-архив.
|
||||
- `make win GOARCH=amd64` — собрать Windows-бинарный файл и ZIP-архив.
|
||||
- `make darwin GOARCH=amd64` — собрать macOS-бинарный файл и ZIP-архив.
|
||||
- `make release` — собрать архивы для Linux, Windows и macOS под `amd64` и `arm64`.
|
||||
|
||||
Перед запуском приложения для конфигурации обычно следует скопировать `.env.example` в `.env`, а `config.yml.example` — в `config.yml`, после чего адаптировать значения под окружение. Не добавляйте реальные пароли, токены или локальные URL в Git.
|
||||
|
||||
## Docker
|
||||
|
||||
Для контейнерного окружения используется файл `compose.yml`, а не устаревшее имя `docker-compose.yml`.
|
||||
|
||||
Ожидаемые локальные файлы для сервиса `iptvc`:
|
||||
|
||||
- `playlists.ini` монтируется в `/app/playlists.ini`.
|
||||
- `channels.json` монтируется в `/app/channels.json`.
|
||||
- `config.yml` монтируется в `/app/config.yml`.
|
||||
- `.env` передаётся через `env_file`.
|
||||
|
||||
Основные команды:
|
||||
|
||||
```bash
|
||||
# Собрать и запустить сервисы в фоне
|
||||
docker compose up -d --build
|
||||
|
||||
# Посмотреть логи приложения
|
||||
docker compose logs -f iptvc
|
||||
|
||||
# Остановить окружение
|
||||
docker compose down
|
||||
```
|
||||
|
||||
В compose-окружение входят:
|
||||
|
||||
- `iptvc` — веб-интерфейс и фоновая проверка плейлистов.
|
||||
- `keydb` — хранилище результатов проверки.
|
||||
- `docs` — отдельный сервис документации, если его контекст доступен в окружении.
|
||||
|
||||
Обратите внимание: текущий `compose.yml` ссылается на контексты `./iptvc` и `./docs`, поэтому запуск из каталога, содержащего только этот репозиторий, может потребовать внешней структуры проекта или корректировки контекстов.
|
||||
|
||||
## Конфигурация
|
||||
|
||||
Поддерживаются `config.yml`, `.env` и CLI-флаги. CLI-флаги имеют наивысший приоритет только при явной передаче.
|
||||
|
||||
Ключевые группы настроек:
|
||||
|
||||
- `app` — часовой пояс, режим отладки, уровень журнала и пути к `playlists.ini` и `channels.json`.
|
||||
- `server`/`site` — адрес и порт веб-сервера, базовый URL, размер страницы, ссылки сайта и заголовок.
|
||||
- `check.playlists` — User-Agent, тайм-ауты, задержки и параллелизм проверки плейлистов.
|
||||
- `check.channels` — User-Agent, тайм-аут, размер диапазона байтов, задержки и параллелизм проверки каналов.
|
||||
- `cache` — включение KeyDB/Redis, адрес подключения, база и TTL.
|
||||
|
||||
Значения задержек и некоторых параметров могут задаваться как числом или диапазоном `[min, max]`. User-Agent может быть строкой или массивом строк; при массиве выбирается случайное значение.
|
||||
|
||||
Веб-команда поддерживает как минимум следующие сценарии:
|
||||
|
||||
```bash
|
||||
# Сервер без фоновой проверки
|
||||
./iptvc serve -i playlists.ini -p 8800
|
||||
|
||||
# Сервер с бесконечной фоновой проверкой каждые 60 секунд
|
||||
./iptvc serve --check --repeat 0 --playlists-all-cooldown 60
|
||||
```
|
||||
|
||||
Основные HTTP-маршруты описаны в README: `/`, `/page/{N}`, `/{code}`, `/{code}/details`, `/api/playlists/{code}`, `/api/version`, `/api/health` и `/api/stats`.
|
||||
|
||||
## Тестирование
|
||||
|
||||
Тесты находятся рядом с тестируемым кодом и используют стандартный пакет `testing`. Сейчас явно присутствуют тесты CLI-флагов в `cmd/flags_test.go`; они проверяют применение переопределений приложения, кеша и параметров проверки.
|
||||
|
||||
Перед изменением CLI или конфигурации запускайте:
|
||||
|
||||
```bash
|
||||
go test ./...
|
||||
go vet ./...
|
||||
```
|
||||
|
||||
При обновлении конфигурационных структур синхронно проверяйте `config.yml.example`, `.env.example`, `README.md` и документацию в `docs/content/common/config/config.md`, `docs/content/iptvc/commands/check.md`, `docs/content/iptvc/commands/serve.md` и связанных страницах.
|
||||
|
||||
При добавлении флага желательно добавить тесты на:
|
||||
|
||||
- значение по умолчанию без флага;
|
||||
- явное включение и выключение boolean-флага;
|
||||
- переопределение значения из конфигурации;
|
||||
- корректный разбор чисел, диапазонов и списков;
|
||||
- взаимодействие с приоритетом `config.yml`, окружения и CLI.
|
||||
|
||||
Отдельных интеграционных тестов веб-сервера, KeyDB и сетевой проверки плейлистов в просмотренных файлах не обнаружено. Такие тесты требуют изолированных фикстур и не должны зависеть от случайных внешних IPTV-ресурсов.
|
||||
|
||||
## Стиль разработки
|
||||
|
||||
- Соблюдайте стандартный стиль Go и форматируйте изменённые Go-файлы через `gofmt`.
|
||||
- Используйте имена пакетов и экспортируемых сущностей в соответствии с идиомами Go.
|
||||
- Сохраняйте существующие заголовки лицензии в файлах, где они уже присутствуют.
|
||||
- Комментарии к экспортируемым типам и функциям должны объяснять их назначение.
|
||||
- Не добавляйте секреты, реальные данные доступа к KeyDB/Redis и рабочие плейлисты в репозиторий.
|
||||
- Для ошибок и сетевых операций сохраняйте существующую практику явной обработки ошибок и логирования.
|
||||
- Не меняйте формат CLI, конфигурации или API-маршрутов без обновления README и соответствующих тестов.
|
||||
- При работе с конфигурацией учитывайте различие между отсутствующим CLI-флагом и флагом, переданным явно: в `cmd/serve.go` это используется для корректного переопределения порта и хоста.
|
||||
- Избегайте сетевых запросов и зависимости от внешних сервисов в модульных тестах.
|
||||
|
||||
## Важные ограничения и наблюдения
|
||||
|
||||
- `channels.json`, `playlists.ini`, `config.yml` и `.env` могут быть локальными входными данными; проверяйте их наличие перед запуском сценариев из документации.
|
||||
- Кеш по умолчанию отключён в конфигурации приложения, но compose-окружение запускает KeyDB и передаёт настройки через `.env`.
|
||||
- Бинарные файлы и архивы сборки создаются в `bin/` и не должны вручную добавляться в исходный код.
|
||||
- README указывает минимальную версию Go 1.23.6, а Dockerfile собирает проект на Go 1.25; при изменении зависимостей учитывайте обе среды.
|
||||
- При обновлении конфигурационных структур синхронно проверяйте `config.yml.example`, `.env.example`, README и тесты CLI-флагов.
|
||||
Reference in New Issue
Block a user