Платформа в стиле YouTube для летсплеев по HOI4.
- регистрация/логин, JWT
- встроенный вход админа:
admin / admin - загрузка видео только для
adminи пользователей сcan_upload=true - лайки, комментарии, подписки
watch later,continue watching, подсказки поиска- аналитика: показы, CTR, удержание
- стриминг через
Range(206 Partial Content) - переключение качества (если есть FFmpeg:
720p/480p/360p) - очередь обработки видео (
processing/ready/failed) - HLS playback endpoint (если FFmpeg доступен)
- модерация: жалобы, скрытие/бан, очередь админа
- уведомления: новые видео по подпискам и новые комментарии автору
- рекомендации v2:
home/watch_next/trending/subscriptions+ A/B bucket - studio dashboard v2: просмотры/watch time по дням, источники, топ роликов
- Python 3.11+ (проект проверялся на 3.13)
- Node.js 18+ и npm
- (опционально) FFmpeg для автогенерации качеств видео
Проверка:
python --version
node --version
npm --version
ffmpeg -versionОткрой 2 терминала.
cd "C:\Users\MoorLuck\Desktop\свой ютуб\backend"
python -m venv .venv
.\.venv\Scripts\activate
python -m pip install -r requirements.txt
uvicorn main:app --reload --host 127.0.0.1 --port 8000Проверка:
cd "C:\Users\MoorLuck\Desktop\свой ютуб\frontend"
npm install
npm run dev -- --host 127.0.0.1 --port 5173Открыть:
- логин:
admin - пароль:
admin
При первом таком входе админ создается автоматически.
- Залогиниться как админ
- Перейти в профиль
- Ввести ID пользователя
- Нажать
Выдать can_upload
-
DATABASE_URL
По умолчанию SQLite:backend/app.db
Можно PostgreSQL, например:postgresql+psycopg2://user:password@localhost:5432/moorluck -
JWT_SECRET
Обязательно сменить в проде. -
STORAGE_BACKEND
local(по умолчанию) илиs3 -
S3_ENDPOINT_URL,S3_ACCESS_KEY,S3_SECRET_KEY,S3_BUCKET,S3_REGION
Нужны приSTORAGE_BACKEND=s3(MinIO тоже поддерживается). -
USE_CELERY=1
Включает обработку видео через Celery worker. -
CELERY_BROKER_URL,CELERY_RESULT_BACKEND
Обычно Redis, напримерredis://localhost:6379/0
Пример (PowerShell):
$env:DATABASE_URL = "postgresql+psycopg2://user:pass@localhost:5432/moorluck"
$env:JWT_SECRET = "SUPER_SECRET_CHANGE_ME"
uvicorn main:app --host 127.0.0.1 --port 8000VITE_API_BASE(опционально)
Файл frontend/.env:
VITE_API_BASE=http://127.0.0.1:8000Если установлен ffmpeg, при загрузке бэкенд попробует сделать доп. версии видео:
720p480p360p
Если FFmpeg не установлен — доступен только Оригинал.
cd "C:\Users\MoorLuck\Desktop\свой ютуб\frontend"
npm ci
npm run buildАртефакты будут в frontend/dist.
cd "C:\Users\MoorLuck\Desktop\свой ютуб\backend"
.\.venv\Scripts\activate
python -m pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2Для продакшена обычно ставят reverse proxy (Nginx/Caddy):
- раздавать
frontend/dist - проксировать
/auth,/videos,/channels,/analytics,/studio,/me,/search,/mediaна backend
cd "C:\Users\MoorLuck\Desktop\свой ютуб"
docker compose up -dСервисы:
- Postgres:
localhost:5432 - Redis:
localhost:6379 - MinIO API:
localhost:9000 - MinIO Console:
http://localhost:9001
# backend
cd "...\backend"
.\.venv\Scripts\activate
python -m pip install -r requirements.txt
python -m pytest -q
# frontend
cd "...\frontend"
npm install
npm run buildПосле этого перезапусти backend/frontend процессы.
cd "...\backend"
alembic upgrade headСоздать новую миграцию после изменений моделей:
alembic revision --autogenerate -m "describe change"
alembic upgrade headcd "...\backend"
.\.venv\Scripts\activate
$env:USE_CELERY="1"
$env:CELERY_BROKER_URL="redis://localhost:6379/0"
celery -A celery_app.celery worker --loglevel=infoPOST /auth/registerPOST /auth/loginGET /auth/mePATCH /admin/users/{id}/upload-accessPOST /videos/uploadDELETE /videos/{id}GET /videos/{id}/stream?quality=source|720p|480p|360pGET /videos/{id}/qualitiesGET /videos/{id}/processing-statusGET /videos/{id}/hlsPOST/DELETE /videos/{id}/watch-laterGET /me/watch-laterGET /me/continue-watchingGET /search/suggestions?q=...POST /reports/video/{id}POST /reports/comment/{id}GET /moderation/reportsPATCH /moderation/reports/{kind}/{id}GET /me/notificationsPOST /me/notifications/{id}/readGET /studio/dashboard
- Открывается не тот адрес: обязательно
http://127.0.0.1:5173 - Frontend не видит backend: проверь
VITE_API_BASEиhttp://127.0.0.1:8000/health - Порт занят: смени порт в командах запуска
- Видео только в оригинале: проверь наличие
ffmpeg - Сломалась база после экспериментов: останови бэкенд, удали
backend/app.db, запусти заново