Музыкальный сервис как настоящая система #
Spotifaychik — флагманский backend-проект в моём портфолио. Это не демонстрационный CRUD и не набор разрозненных лабораторных: внутри одного репозитория собрана основа музыкальной платформы, которую можно развивать до полноценного стримингового продукта.
Система управляет артистами, альбомами, треками, пользователями и плейлистами, поддерживает поиск и персональные сценарии, контролирует доступ к данным и работает в контейнерном production-контуре. От HTTP-запроса до метрик в Grafana весь путь спроектирован как единое приложение.
Что получает пользователь #
Платформа построена вокруг реальных музыкальных сценариев:
- изучать каталог артистов, альбомов и треков;
- находить музыку через глобальный и расширенный поиск;
- создавать, редактировать и публиковать собственные плейлисты;
- получать подборки популярных треков, артистов и новых релизов;
- формировать персональные плейлисты на основе истории прослушивания;
- управлять профилем, друзьями и пользовательской статистикой;
- загружать обложки и другие медиафайлы с проверкой и обработкой изображений.
За внешне простыми действиями находится полноценная доменная модель: связи между артистами, релизами и треками, принадлежность плейлистов, история прослушивания, роли, разрешения, сессии и журнал событий безопасности.
Масштаб проекта в цифрах #
| Контур | Реализация |
|---|---|
| API | 11 контроллеров для музыки, пользователей, авторизации, файлов, поиска, аудита и диагностики |
| Домен | 18 сущностей: от Track и Playlist до UserSession, Permission и SecurityAuditLog |
| Application-слой | Команды, запросы, DTO, валидаторы, маппинг и pipeline behaviors |
| Проверки | Более 50 тестовых файлов для домена, обработчиков, API, инфраструктуры и валидации |
| Production | PostgreSQL, Docker, Nginx, TLS, несколько реплик API, CI/CD и стек наблюдаемости |
Архитектура, рассчитанная на развитие #
Код разделён на четыре независимых уровня. Благодаря этому бизнес-сценарии не зависят от HTTP, база данных не проникает в доменную модель, а инфраструктуру можно менять без переписывания всего приложения.
MusicService.API
├─ Controllers, authentication, authorization
├─ files, diagnostics, Swagger
└─ единая HTTP-граница
↓
MusicService.Application
├─ CQRS-команды и запросы
├─ handlers, validators, DTO и mapping
└─ logging / validation pipeline
↓
MusicService.Domain
└─ музыка, пользователи, права, сессии и аудит
↓
MusicService.Infrastructure
├─ EF Core, PostgreSQL и миграции
├─ хеширование паролей и security services
└─ хранение файлов и фоновые процессыКоманды изменения данных и запросы на чтение разделены в CQRS-стиле. Логирование и валидация проходят через общие pipeline behaviors, поэтому контроллеры остаются компактными, а правила выполняются одинаково во всех сценариях.
Безопасность — часть архитектуры #
Регистрация и вход построены на JWT-аутентификации. Доступ не ограничивается простой проверкой роли: в проекте реализованы permissions, изменение ролей, ресурсная авторизация владельца и отдельные authorization handlers.
- пароли хешируются через BCrypt;
- токены и пользовательские сессии учитываются отдельно;
- доступ проверяется на уровне ролей, разрешений и конкретного ресурса;
- чувствительные действия попадают в асинхронный журнал аудита;
- административный API позволяет анализировать события безопасности.
Такой подход показывает не только умение написать endpoint, но и понимание того, как защищать данные пользователей в большой системе.
Данные, поиск и работа с файлами #
PostgreSQL хранит связанную модель музыкального каталога и пользователей, а EF Core отвечает за доступ к данным и развитие схемы через миграции. Для больших выборок предусмотрены пагинация, фильтрация и массовые операции.
Поиск вынесен в самостоятельный модуль и поддерживает несколько уровней — от обычного запроса до глобального и расширенного поиска. Файловый контур включает метаданные, сессии загрузки, контроль прогресса, валидацию и обработку изображений. Это превращает проект из «API с таблицами» в основу реального медиасервиса.
Production-контур #
Приложение разворачивается не как один локальный процесс, а как связанная инфраструктура:
- Nginx принимает внешний трафик, завершает TLS и балансирует запросы.
- Несколько реплик ASP.NET Core API обрабатывают нагрузку без публикации внутренних портов наружу.
- PostgreSQL работает с persistent volume и healthcheck.
- Prometheus собирает метрики API и Nginx.
- Grafana превращает телеметрию в рабочие дашборды.
- Promtail и Loki собирают и индексируют контейнерные логи.
- Отдельный сервис фиксирует события Docker — перезапуски, завершения и OOM.
Каждый backend-инстанс возвращает X-Instance-Id, поэтому round-robin можно проверить напрямую. Количество реплик меняется одной командой --scale app=N: конфигурацию Nginx, Compose и Prometheus переписывать не требуется.
Автоматическая поставка #
GitHub Actions запускает полный маршрут изменений: восстановление зависимостей, сборку, тесты, создание Docker-образа, публикацию в registry, уведомление и развёртывание через self-hosted runner. Multi-stage Dockerfile отделяет SDK-окружение от компактного runtime-образа.
Это важная часть проекта: репозиторий демонстрирует не только код приложения, но и путь этого кода до работающего сервиса.
Надёжность и проверяемость #
Тестовый набор охватывает доменные сущности, команды и запросы, контроллеры, валидацию, обработку ошибок базы данных и инфраструктурные сценарии. Для EF Core подготовлены отдельные фабрики контекста и тестовые seed-данные, а для файлового контура — временное хранилище.
Healthchecks контролируют состояние API, PostgreSQL и Nginx. Диагностические endpoints и скрипты позволяют проверить балансировку, доступность сервисов, метрики и статические файлы без ручной настройки окружения.
Запуск одной командой #
git clone https://github.com/pistaha/spotifaychik.git
cd spotifaychik
cp .env.example .env
./start.shПосле запуска доступны API и Swagger через Nginx, метрики Prometheus и дашборды Grafana. Готовые скрипты помогают проверить состояние контейнеров и увидеть, как запросы распределяются между репликами.
Почему этот проект важен #
Spotifaychik показывает проектирование системы целиком. Здесь нужно было одновременно думать о понятной доменной модели, удобстве развития кода, защите пользовательских данных, работе с медиа, производительности, тестировании и эксплуатации.
Главный результат — не количество endpoint’ов и контейнеров, а связность решения: пользовательский сценарий превращается в команду или запрос, проходит проверки безопасности и валидацию, сохраняется в PostgreSQL, наблюдается через метрики и логи и автоматически доставляется в production-контур.
Это проект, в котором backend-разработка соединяется с DevOps и системным мышлением — от первой сущности до масштабируемого запуска.