83 lines
5.1 KiB
Markdown
83 lines
5.1 KiB
Markdown
# TeleWave
|
||
|
||
[](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=ci.yml)
|
||
[](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=ci.yml)
|
||
[](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) (стек, архитектурные
|
||
правила, доменные инварианты, соглашения по коду).
|
||
|
||
## Лицензия
|
||
|
||
Не определена.
|