# TeleWave [![ci](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions/workflows/ci.yml/badge.svg)](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=ci.yml) [![coverage](https://gitea.hsrv.site/mrleo1nid/TeleWave/raw/branch/badges/coverage.svg)](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=ci.yml) [![quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=mrleo1nid_telewave&token=fa38966b51f0043827fa89a5e42a0afe20180758)](https://sonarcloud.io/summary/new_code?id=mrleo1nid_telewave) **TeleWave** — сервис онлайн-каналов: пользователи смотрят сетку каналов, видео отдаётся из хранилища на сервере, админ управляет каналами и пользователями. > Текущее состояние — **рабочий вертикальный срез**: вход/регистрация, роли, пользователи, админка; > библиотека шоу/серий, загрузка и обработка медиа (ffmpeg → HLS), метаданные (TMDb/OMDb), каталог > каналов, планировщик эфира (реклама, ТВ-заставки, weekly-override'ы) и live-раздача HLS с публичным > просмотром сетки. Приложение (фронт + бек) поставляется **единым Docker-образом**; PostgreSQL — > **внешний**, не поднимается через compose. ## Стек | Слой | Технологии | | -------- | ---------------------------------------------------------------------------------------- | | Backend | C# / .NET 10, ASP.NET Core Web API, Clean Architecture, CQRS ([LiteCqrs.Net](https://github.com/mrleo1nid/LiteCqrs.Net)), EF Core | | БД | PostgreSQL (Npgsql) | | Auth | ASP.NET Core Identity + JWT (access + refresh, ротация) | | Frontend | React 19 + Vite + TypeScript, TanStack Query/Router, shadcn/ui + Tailwind v4 (ретро-CRT тема) | | Упаковка | Единый Docker-образ (API + статика SPA); PostgreSQL — внешний сервер | ## Развёртывание Postgres не входит в compose — база и пользователь создаются заранее на внешнем сервере БД: ```sql -- на сервере БД (psql -h <хост БД> -U postgres) CREATE USER telewave WITH PASSWORD 'change-me-strong-db-password'; CREATE DATABASE telewave OWNER telewave; ``` Затем на хосте с приложением: ```bash cp .env.example .env # заполнить ConnectionStrings__Default (хост/база/юзер/пароль БД), Jwt__SigningKey, AdminSeed__* docker compose up -d --build # → http://localhost:8085 (админ — логин/пароль из .env, AdminSeed__Username/Password) ``` **Права на медиахранилище.** Контейнер работает под непривилегированным пользователем (uid/gid `1654`), а bind-mount пробрасывает права хоста как есть — каталог хранилища должен принадлежать этому uid, иначе приложение стартует, но любая запись в `/media` упадёт с `Permission denied`. Полная процедура (включая группу, через которую вы сами кладёте файлы в `inbox/` и `manual/`) — [`docs/server-storage-setup.md`](docs/server-storage-setup.md), шаг 5: ```bash sudo groupadd -g 1654 telewave sudo usermod -aG telewave "$USER" # затем перелогиниться sudo chown -R 1654:1654 /srv/telewave/media sudo chmod -R 750 /srv/telewave/media sudo chmod 2775 /srv/telewave/media/inbox /srv/telewave/media/manual ``` > Обновляетесь с версии, где контейнер работал под root? Это и есть вся миграция: остановите > контейнер (`docker compose down`), выполните команды выше, поднимайте новый образ. ## Локальная разработка ```bash # backend, из backend/ dotnet build && dotnet test tests/TeleWave.Domain.Tests tests/TeleWave.Application.Tests dotnet run --project src/TeleWave.Api # frontend, из frontend/ pnpm install pnpm dev # проксирует /api на localhost:8080 ``` ## Документация Пример переменных окружения (сид админа, БД, JWT) — [`.env.example`](.env.example). Инструкции для AI-ассистента (Claude Code) — в [`CLAUDE.md`](CLAUDE.md) (стек, архитектурные правила, доменные инварианты, соглашения по коду). ## Лицензия Не определена.