Implemented a new background service, UploadsCleanupBackgroundService, to manage stale uploads in the uploads directory. Enhanced error handling in the media upload process to ensure incomplete uploads are deleted immediately upon failure, preventing unnecessary storage usage. Updated the .env.example and StorageOptions to include configuration for stale upload retention time. Improved documentation to reflect these changes and clarify the upload process.
113 lines
9.8 KiB
Bash
113 lines
9.8 KiB
Bash
# TeleWave — пример переменных окружения.
|
||
# Скопируй в .env и заполни значения. Ключи вида Section__Key биндятся в IOptions<T> ASP.NET Core.
|
||
# ВСЕ значения-секреты ниже обязательно заменить перед запуском (особенно *_PASSWORD, *SigningKey).
|
||
|
||
# ── PostgreSQL (внешний сервер, не в compose) ─────────────────────────────
|
||
# База и пользователь создаются заранее на самом сервере БД (см. README — раздел "Развёртывание").
|
||
ConnectionStrings__Default=Host=10.10.1.134;Port=5432;Database=telewave;Username=telewave;Password=change-me-strong-db-password
|
||
|
||
# ── JWT ───────────────────────────────────────────────────────────────────
|
||
Jwt__Issuer=TeleWave
|
||
Jwt__Audience=TeleWave
|
||
Jwt__SigningKey=change-me-min-32-chars-random-secret
|
||
Jwt__AccessTokenMinutes=15
|
||
Jwt__RefreshTokenDays=30
|
||
|
||
# ── Сид администратора (создаётся при первом старте, если не существует) ───
|
||
# Логин в систему — по username. Email в системе не используется.
|
||
AdminSeed__Username=admin
|
||
AdminSeed__Password=change-me-strong-admin-password
|
||
|
||
# ── Rate limiting ────────────────────────────────────────────────────────
|
||
# Лимит запросов/мин на auth-эндпоинты (login/register/refresh). По умолчанию 20.
|
||
# RateLimiting__AuthPermitLimit=20
|
||
|
||
# ── Хранилище медиа ────────────────────────────────────────────────────────
|
||
# RootPath — путь ВНУТРИ контейнера; на хосте это bind-mount тома (см. docs/server-storage-setup.md
|
||
# и volumes в docker-compose.yml). Не меняй RootPath без синхронного изменения тома.
|
||
Storage__RootPath=/media
|
||
Storage__SegmentSeconds=2
|
||
# Сколько сегментов держать в скользящем окне live-плейлиста.
|
||
Storage__LiveWindowSegments=10
|
||
Storage__KeepOriginals=false
|
||
# Порог свободного места, ниже которого загрузка отклоняется (10 ГБ).
|
||
Storage__MinFreeSpaceBytes=10737418240
|
||
# Через сколько часов простоя убирать брошенное в uploads/ (след оборванной заливки или рестарта
|
||
# посреди неё). Идущую загрузку не задевает — отсчёт от времени последней записи. 0 — не убирать.
|
||
# Storage__StaleUploadHours=24
|
||
# TTL stream-токена (cookie tw_stream), минуты. Короткий срок ограничивает окно доступа после
|
||
# блокировки/логаута; фронт перевыпускает cookie, пока идёт просмотр. По умолчанию 30.
|
||
# Storage__StreamTokenMinutes=30
|
||
|
||
# ── Планировщик эфира ──────────────────────────────────────────────────────
|
||
# HorizonDays — на сколько суток вперёд держать материализованное расписание. Неделя — часть замысла:
|
||
# «знать, что мультики будут в субботу в 9:30» работает, только если программа известна заранее.
|
||
# RetentionDays — сколько суток прошедшей ленты хранить. Окно обязано покрывать самое долгое остывание
|
||
# и самый глубокий повтор среди правил канала: история показов берётся из самой ленты, отдельного
|
||
# журнала нет — укоротишь окно, и остывание с потолком повторов начнут «забывать» показы.
|
||
# TickMinutes — период фонового тика, достраивающего горизонт.
|
||
Scheduler__HorizonDays=7
|
||
Scheduler__RetentionDays=90
|
||
Scheduler__TickMinutes=30
|
||
|
||
# ── Обработка медиа (ffmpeg) ───────────────────────────────────────────────
|
||
Media__FfmpegPath=/usr/bin/ffmpeg
|
||
Media__FfprobePath=/usr/bin/ffprobe
|
||
# Максимальный размер загружаемого файла (20 ГБ).
|
||
Media__MaxUploadBytes=21474836480
|
||
# Потоки одного ffmpeg (0 — авто/все ядра).
|
||
Media__TranscodeThreads=3
|
||
# Сколько файлов транскодировать одновременно (1 — по умолчанию, как раньше).
|
||
# Тюнинг под ядра: обычно TranscodeThreads × MaxParallelTranscodes ≈ число ядер.
|
||
# 4 vCPU: Threads=3, Parallel=1 (или Threads=2, Parallel=2)
|
||
# 8 vCPU: Threads=4, Parallel=2 ← лучший throughput на пачках серий
|
||
# (или Threads=6, Parallel=1 — если важнее скорость одного файла)
|
||
# Память: один 1080p-транскод ~0.5 ГБ; Parallel=2 требует ~1 ГБ + база API.
|
||
Media__MaxParallelTranscodes=1
|
||
# Период опроса каталога inbox/ сканером, секунды.
|
||
Media__InboxScanSeconds=15
|
||
# Нормализация громкости при обработке (EBU R128 loudnorm) — все ролики одинаковой громкости.
|
||
Media__NormalizeLoudness=true
|
||
# Целевая громкость, LUFS (−16 типично для стриминга; тише — уменьшить).
|
||
Media__LoudnessTargetLufs=-16
|
||
# Таймауты вызовов ffprobe/ffmpeg, секунды (0 — без таймаута): не дают зависшему процессу вечно
|
||
# держать слот параллелизма/тик планировщика. Поднять TranscodeTimeoutSeconds для очень длинных файлов.
|
||
# Media__ProbeTimeoutSeconds=120
|
||
# Media__TranscodeTimeoutSeconds=1800
|
||
# Предпочитаемые языки аудиодорожек ПО УМОЛЧАНИЮ (через запятую, в порядке приоритета) — если файл
|
||
# многоозвучный и есть дорожка с таким языком, при обработке берётся она. Обычно задаётся в админке
|
||
# («Настройки»); этот конфиг — дефолт, если в настройках пусто. Пусто — выбор ffmpeg по умолчанию.
|
||
# Media__PreferredAudioLanguages=rus,eng
|
||
|
||
# ── ТВ-заставки «Сейчас/Далее» (bumpers) ───────────────────────────────────
|
||
# Общие для всех каналов параметры рендера. Оформление и правила (цвета, подписи, длительность,
|
||
# интервал, только-между-разными) настраиваются на каждом канале в админке.
|
||
# Bumpers__Width=1280
|
||
# Bumpers__Height=720
|
||
# Bumpers__FontFileSans=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf
|
||
# Bumpers__FontFileSerif=/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf
|
||
# Меняй при правке ЛОГИКИ рендера, чтобы пересобрать уже отрендеренные заставки.
|
||
# Bumpers__TemplateVersion=1
|
||
|
||
# ── Метаданные шоу/серий (TMDb / OMDb) ─────────────────────────────────────
|
||
# Ключи бесплатные: TMDb — themoviedb.org (Settings → API, v3 key), OMDb — omdbapi.com.
|
||
# Без ключа источник просто не показывается в админке (ручной режим работает всегда).
|
||
Metadata__Language=ru-RU
|
||
Metadata__Tmdb__ApiKey=
|
||
Metadata__Omdb__ApiKey=
|
||
# Страны возрастной сертификации TMDb в порядке приоритета: берётся первая, у которой рейтинг есть.
|
||
# US впереди намеренно — его шкала (G/PG/PG-13/R/NC-17) совпадает с нашей и переводится точно;
|
||
# RU (0+…18+) приводится приблизительно и нужен ради покрытия там, где US-сертификации нет.
|
||
# Metadata__Tmdb__CertificationCountries__0=US
|
||
# Metadata__Tmdb__CertificationCountries__1=RU
|
||
|
||
# ── ASP.NET Core ──────────────────────────────────────────────────────────
|
||
ASPNETCORE_ENVIRONMENT=Production
|
||
ASPNETCORE_HTTP_PORTS=8080
|
||
|
||
# ── Доверенные прокси (X-Forwarded-For/Proto) ──────────────────────────────
|
||
# TLS терминируется вне compose внешним прокси/шлюзом. По умолчанию доверяется только loopback.
|
||
# Если прокси стоит не на loopback, перечисли его через запятую.
|
||
# ForwardedHeaders__KnownProxies=203.0.113.10
|
||
# ForwardedHeaders__KnownNetworks=172.18.0.0/16
|