network-user
ко всем проектам
Платформа 27 Mar 2026 в проде

.звук

DotSound

За простым плеером стоит распределённая система: свой GPU-воркер для лирики, закрытое ядро для бизнес-правил.

суть

Загружай свои треки или подтягивай музыку из VK, SoundCloud, Spotify, YouTube и Яндекс Музыки: всё в одном плеере без рекламы. Заходишь через Telegram: открыл, нашёл, послушал. Лирика появляется построчно сама, подборки подстраиваются под вкус, а тяжёлое (ASR, разделение вокала, эмбеддинги) считает отдельный GPU-воркер.

Платформа изнутри

Интерактивный разбор ключевых механик. Выбери домен, увидишь как всё работает изнутри.

Загрузка треков

Трек заходит в систему один раз и навсегда.

При загрузке файл проверяется на вирусы и получает уникальный цифровой отпечаток. Если такой трек уже есть в базе, он не дублируется, вместо этого прибавляется счётчик. Один файл в хранилище, сколько бы людей его ни заливали.

red weather.flac
Проверка антивирус · формат
Отпечаток уникальный ID файла
Хранилище

масштаб

размер и срок: что стоит за продуктом.

~3 месяца от первого коммита до рабочего продукта
395 k+ строк кода в четырёх репозиториях
974 коммитов в четырёх репозиториях
543 API-эндпоинтов в бэкенде
3.3k автотестов в четырёх репозиториях
17 типов GPU-задач в воркере
241 миграций базы данных

архитектура

data plane HTTPS WS · HLS import HMAC pull Telegram Bot Mini App PrivateCore Backend Hub ComputeWorker PostgreSQL 16 Redis 7 Elasticsearch 8 MinIO · S3

Тонкий aiogram-клиент: вход в Mini App, inline-поиск, лайки

  • Backend Hub HTTPS

Веб-плеер платформы: загрузка треков, HLS-стриминг, WebSocket

  • Backend Hub WS · HLS

Pull-воркер на GPU: Demucs + faster-whisper, аудио-эмбеддинги

  • Backend Hub HMAC pull

FastAPI: API, очередь Taskiq, дедуп по SHA-256, HLS, раздача Mini App

  • PrivateCore import
  • PostgreSQL 16
  • Redis 7
  • Elasticsearch 8
  • MinIO · S3

PrivateCore: бизнес-правила, политика выдачи, security-константы

Метаданные, пользователи, плейлисты; ~70 моделей, 241 миграция

WS pub/sub, rate-limit, кеш file_id, счётчики прослушиваний

Полнотекст по трекам, артистам и распознанной лирике

Content-addressed аудио по SHA-256, HLS-сегменты

Нажми на модуль: покажу его роль в системе.

стек

состав стека по слоям · 21
  • Язык 2
  • Фреймворк 5
  • Данные 4
  • Инфраструктура 4
  • Клиент 3
  • AI / ML 3

Язык

  • Python 3.12
  • TypeScript

Фреймворк

  • FastAPI 0.136
  • SQLAlchemy 2
  • aiogram 3.28
  • React 18
  • Vite 5

Данные

  • PostgreSQL 16
  • Elasticsearch 8
  • Redis 7
  • MinIO / S3

Инфраструктура

  • Docker
  • Taskiq
  • HMAC pull protocol
  • Prometheus + OpenTelemetry

Клиент

  • Telegram Mini App
  • WebSocket
  • hls.js

AI / ML

  • faster-whisper 1.2
  • Demucs 4.0
  • PyTorch 2.7

что умеет

ключевые возможности продукта прямо сейчас.

Загрузка прямо в плеере

Трек заливается из самого веб-плеера: устойчивая докачка кусками, проверка дублей ещё до отправки, своя обложка и видео. Ни отдельной формы, ни приложения для установки.

Загрузка идёт частями (S3 multipart) и переживает обрыв связи и перезагрузку вкладки, потому что очередь хранится в IndexedDB и сама возобновляет докачку. Сервер берёт SHA-256 от содержимого: повторная заливка того же трека не создаёт копию, а добавляет ссылку (ref_count++). Один файл на всех.

Авто-лирика (ASR)

Demucs снимает вокал, faster-whisper расшифровывает и синхронизирует текст построчно с тайм-кодами. Слова появляются сами.

Пайплайн на воркере: Demucs (--two-stems=vocals) снимает вокал, faster-whisper расшифровывает, выравнивание ставит тайм-код каждой строке, и текст всплывает синхронно с музыкой.

HLS + дедуп по содержимому

Адаптивный HLS поверх content-addressed storage: один и тот же трек хранится один раз для всех, сегменты кешируются как immutable.

Адресом сегмента служит сам хеш содержимого: blobs/a1/a1f9...ts. Одинаковый трек не транскодируется дважды, а сегменты кешируются как immutable на год.

Поиск по тексту и метаданным

Полнотекстовый Elasticsearch-индекс по метаданным и распознанной лирике с ранжированием по популярности.

Индексируются и метаданные, и распознанная лирика, поэтому трек находится по строчке из песни. Ранжирование идёт по популярности.

Личные подборки и радио

Daily Mix, Weekly Mix, жанровые подборки и бесконечное радио от любого трека: лента подстраивается под то, что слушаешь.

Похожие треки и артисты считаются по аудио-эмбеддингам на воркере, а правила ранжирования и политика выдачи живут в закрытом ядре. Радио стартует от трека-затравки и тянет ближайших соседей по вектору.

Совместные плейлисты

Плейлисты с совместным редактированием и обложкой-коллажем, которая собирается сама из обложек добавленных треков.

Несколько соавторов ведут один плейлист; обложка пересобирается из обложек треков. CRUD и совместный доступ реализованы на бэкенде, без отдельного приложения.

Telegram как точка входа

Тонкий бот: вход в плеер одним тапом, inline-поиск треков в любом чате, лайки и подборки прямо в Telegram. Туда же приходят уведомления о входах и готовности задач.

Бот ничего не решает сам: читает сообщение и дёргает единый Backend-клиент, вся логика в ядре. Inline-режим отдаёт треки с кнопками play и like прямо в переписку.

Импорт из источников

Загружай свои треки прямо из плеера или импортируй из SoundCloud, YouTube, VK, Яндекс Музыки и Spotify: каталог наполняется без лишних шагов.

Личные треки заливаются из веб-плеера кусками (S3 multipart). Внешние источники импортируются так: SoundCloud, YouTube и VK через yt-dlp; Spotify и Яндекс Музыка подключаются привязкой аккаунта по OAuth. Каталог растёт без ручной заливки.

GPU-офлоад по HMAC

Воркер сам забирает задачи по HMAC и считает лирику и рекомендации на GPU. Никаких открытых портов наружу.

Цикл воркера: heartbeat → claim с арендой и дедлайном → забор аудио по одноразовой ссылке OTT (5 минут, под один IP) → результат. Наружу не открыто ни одного порта.

Модерация и закон

Жалобы на треки, авто-скрытие по порогу и админ-модерация. Часть соц-функций (чаты, комментарии) сознательно отключена под требования к ОРИ по 149-ФЗ.

Жалобы копятся на трек и при достижении порога скрывают его автоматически до решения модератора. Отключённые функции остаются в коде с пометкой и не подключены к маршрутам, их можно включить, когда позволит регуляторика.

хронология

как продукт рос от первой версии.

  1. 27 Mar 2026

    Старт проекта: первый коммит

    27 марта 2026, 12:13: первый коммит. За день поднята первая версия в двух репозиториях (Backend + Bot): FastAPI, PostgreSQL 16, React 18 Mini App, Telegram-вход; SHA-256-дедупликация не даёт треку храниться дважды.

  2. 31 Mar 2026

    Адаптивный HLS-стриминг

    Двухбитрейтный HLS (128k/64k) поверх content-addressed хранилища: сегменты кешируются как immutable.

  3. 12 Apr 2026

    PrivateCore: закрытое ядро

    Бизнес-правила, политика выдачи и security-константы вынесены в отдельный закрытый репозиторий PrivateCore, четвёртый в экосистеме. Открытый клиент ходит в него по internal-token со scoped JWT; тогда же добавились passwordless-вход (Magic Link) и TOTP-2FA.

  4. 22 Apr 2026

    ComputeWorker: GPU-воркер

    Третий открытый репозиторий: GPU-воркер на Demucs + faster-whisper. Вокал снимается, лирика расшифровывается и синхронизируется построчно.

репозитории

  • Backend hub

    Сердце системы: API, база, очередь задач, раздача React Mini App, дедуп по SHA-256, HLS-стриминг и полнотекстовый поиск.

    github.com/network-user/DotSoundBackend
  • Bot telegram-ui

    Тонкий клиент Telegram: вход в Mini App, inline-поиск, лайки и подборки, уведомления о входах. Вся логика живёт в ядре.

    github.com/network-user/DotSoundBot
  • ComputeWorker asr-worker

    Pull-based воркер на faster-whisper + Demucs с HMAC-протоколом: лирика и рекомендации считаются на GPU без открытых портов.

    github.com/network-user/DotSoundComputeWorker

ссылки