SSD Nodes Learn 🎉 VPS от $5.50/мес
Руководства Matt ConnorАвтор: Matt Connor

Как создать свой музыкальный стриминг на VPS

Руководство по запуску Navidrome на VPS для доступа к личной медиатеке. Вы узнаете о настройке TLS, выборе Subsonic клиентов, расчете хранилища и организации резервных копий.

Преимущества self-hosted стриминга музыки на VPS

Self-hosted стриминг музыки на VPS означает, что вы самостоятельно запускаете плеер и предоставляете контент. Сервер хранит файлы, которыми вы уже владеете, а любой телефон может получить к ним доступ через интернет с помощью стандартной авторизации. Будьте честны с собой относительно ограничений перед началом: это замена плеера стримингового сервиса, а не его каталога. В вашей библиотеке не появится ничего нового, пока вы не купите или не оцифруете запись и не скопируете файл на сервер.

Аудио гораздо менее требовательно к серверу, чем видео. Файлы имеют небольшой размер, телефоны декодируют все распространенные форматы без дополнительной помощи, а один слушатель потребляет меньше трафика, чем видеозвонок. Нагрузка на CPU здесь минимальна. Основным ограничением является дисковое пространство. Еще два фактора, определяющих работоспособность системы — качество ваших тегов и возможность мобильного приложения скачивать музыку для офлайн-прослушивания.

Navidrome — это стандартный выбор, если вас интересует только аудио. Он представляет собой один бинарный файл на языке Go в одном контейнере и хранит состояние в единственной базе данных SQLite. Он поддерживает API Subsonic, благодаря чему существует большое семейство сторонних мобильных приложений. Версия 0.63.2 была актуальной в августе 2026 года. Проект позиционируется как решение, которое отлично работает даже на таком оборудовании, как Raspberry Pi Zero, поэтому затраты на серверное ПО будут минимальными.

Jellyfin стоит использовать, если вы уже настроили Jellyfin как медиасервер на VPS для видео. Его музыкальная библиотека функциональна, а Finamp — это музыкальное приложение для Jellyfin на Android и iOS, которое позволяет загружать треки для прослушивания офлайн. Ограничением является API. В Jellyfin нет встроенной конечной точки Subsonic, а сообщество, поддерживавшее соответствующий плагин, прекратило его обновление в 2022 году, поэтому экосистема приложений Subsonic для него закрыта. Вам придётся использовать приложения, работающие с собственным API Jellyfin, выбор которых меньше.

Funkwhale — это федеративный вариант, версия 2.0 которого была выпущена в марте 2026 года. Сервер Funkwhale называется pod (под), поды объединяются в федерацию через ActivityPub (протокол, лежащий в основе Mastodon), и пользователь одного пода может подписаться на публичную библиотеку другого. Он также частично поддерживает API Subsonic, но с одним важным отличием: каждый пользователь задаёт отдельный пароль Subsonic в своих настройках, так как протокол Subsonic требует пароль, который сервер может прочитать. Установка Funkwhale более ресурсоёмка, так как помимо веб-приложения требуются PostgreSQL и очередь задач.

Выбирайте Navidrome, если вам не нужна федерация или если у вас уже не запущен Jellyfin. В оставшейся части этого руководства рассматривается настройка Navidrome с помощью Docker.

Почему API Subsonic определяет выбор мобильного приложения

Subsonic был музыкальным сервером, чей HTTP API стал общим языком для self-hosted аудио, а OpenSubsonic — это общественный проект, который продолжает его развивать. Эта история объясняет, почему у вас есть выбор приложений для телефона. Navidrome не поставляет собственного мобильного приложения и не нуждается в нём, так как любой Subsonic-клиент авторизуется с помощью адреса сервера и данных вашей учётной записи.

Это наиболее важно для офлайн-синхронизации — функции, которая определяет, будет ли система пригодна для ежедневного использования. Телефон в туннеле не может связаться с вашим сервером, поэтому клиент должен заранее скопировать файлы в локальное хранилище. Все клиенты поддерживают потоковое воспроизведение. Только некоторые умеют скачивать файлы. Список клиентов на navidrome.org/apps указывает, какие из них поддерживают эту функцию, и выбор на обеих платформах широк: Substreamer и Ultrasonic на Android, Amperfy и play:Sub на iOS. Многие из наиболее функциональных клиентов являются платными, а Symfonium на Android — это приложение, которое пользователи называют чаще всего. Установите два разных клиента перед тем, как сделать окончательный выбор, так как именно с этой частью системы вы будете взаимодействовать каждый день.

Сколько дискового пространства требуется для музыкальной библиотеки?

ChartStorage per 1,000 albums by audio format
The data behind this chart
[
  {
    "label": "Opus 128k",
    "kbps": 128,
    "gb_per_1000_albums": 43
  },
  {
    "label": "MP3 320k",
    "kbps": 320,
    "gb_per_1000_albums": 108
  },
  {
    "label": "FLAC 16/44.1",
    "kbps": 900,
    "gb_per_1000_albums": 304
  },
  {
    "label": "FLAC 24/96",
    "kbps": "3,000",
    "gb_per_1000_albums": "1,013"
  }
]

Эти показатели порядка величин получены на основе битрейта, а не путем замеров реальной коллекции, при этом расчеты достаточно просты для проверки на ваших собственных файлах. Примите длительность альбома за 45 минут, что составляет 2,700 секунд. Умножьте битрейт в килобитах в секунду на 2,700, затем разделите на 8,000, чтобы получить мегабайты. При 320 kbps это дает 108 МБ на один альбом, поэтому тысяча альбомов займет около 108 ГБ.

Использование форматов без потерь меняет ответ. FLAC с качеством CD в среднем имеет битрейт около 900 kbps на обычном материале, поэтому для той же тысячи альбомов потребуется около 304 ГБ. Библиотека в формате 24 bit, 96 kHz потребует примерно 1,013 ГБ — целый терабайт для коллекции, список которой можно уместить на листе бумаги. Копия в формате Opus, оптимизированная для телефона, с битрейтом 128 kbps позволяет уместить ту же тысячу альбомов в 43 ГБ. Запустите du -sh /path/to/music для уже имеющейся у вас библиотеки, так как ваш собственный средний битрейт — это единственное число, которое имеет значение при выборе тарифного плана.

Пропускная способность — это меньшая часть расходов. Поток 320 kbps составляет 40 килобайт в секунду, поэтому час прослушивания передает около 144 МБ. Сто часов в месяц — это около 14 ГБ, что не заметно для лимитов трафика любого VPS. Исключением является первая офлайн-синхронизация телефона, которая может потребовать передачи десятков гигабайт за один вечер.

Уровень хранения или уровень вычислений?

Музыкальный сервер — это большой объем «холодных» данных, практически не требующий вычислительных мощностей. Чтение файла со скоростью 40 килобайт в секунду не нагружает диск, а процессор задействуется только во время сканирования библиотеки или транскодирования, что вам вряд ли понадобится. Поэтому быстрый NVMe на вычислительном тарифе здесь не дает преимуществ, а его цена за гигабайт — это именно то, что мешает вам загрузить FLAC-копии. Это тот случай, когда VPS с упором на хранилище лучше обычного VPS, так как стоимость таких тарифов рассчитывается за терабайт, а не за ядро.

Требования к памяти скромные. Navidrome обслуживает личную библиотеку, потребляя несколько сотен мегабайт, причем пиковая нагрузка приходится на сканирование, а не на воспроизведение. Выделите серверу 1 GB или 2 GB RAM, а остаток бюджета потратьте на диск.

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

sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/music

Создайте файл docker-compose.yml в отдельном каталоге, больше там ничего не должно быть:

services:
  navidrome:
    image: deluan/navidrome:0.63.2
    user: "1000:1000"
    ports:
      - "127.0.0.1:4533:4533"
    restart: unless-stopped
    environment:
      ND_LOGLEVEL: "info"
      ND_SESSIONTIMEOUT: "24h"
      ND_SCANNER_SCHEDULE: "@every 24h"
      ND_BACKUP_PATH: "/data/backup"
      ND_BACKUP_SCHEDULE: "0 4 * * *"
      ND_BACKUP_COUNT: "7"
    volumes:
      - /srv/navidrome:/data
      - /srv/music:/music:ro
docker compose up -d
docker compose ps

docker compose ps должен показать, что сервис запущен, а не находится в состоянии перезапуска. Если контейнер постоянно перезапускается, это почти всегда связано с правами доступа к /srv/navidrome, а docker compose logs navidrome указывает на файл, в который не удалось записать данные.

Стоит пояснить четыре детали в этом файле. Порт опубликован только на 127.0.0.1, поэтому сервер доступен через обратный прокси, а не через порт 4533 из открытого интернета: Docker самостоятельно управляет правилами брандмауэра, поэтому обычный 4533:4533 останется открытым даже на сервере, где ufw сообщает, что все порты закрыты. Том с музыкой подключен в режиме только для чтения, что гарантирует: ошибка сканера не приведёт к удалению вашей единственной копии. ND_SCANNER_SCHEDULE по умолчанию отключен, а в руководствах, написанных до версии Navidrome 0.55, он называется ND_SCANSCHEDULE — этого имени больше не существует. Три настройки резервного копирования активируют встроенную функцию бэкапа базы данных, на которую опирается раздел резервного копирования ниже.

Перенос музыкальной библиотеки на сервер

Скопируйте библиотеку с помощью rsync. Эта утилита позволяет возобновить передачу при разрыве соединения, а не начинать процесс заново.

rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/

Наличие косой черты в конце пути источника имеет значение. Без неё вы получите /srv/music/Music. После завершения копирования исправьте владельца файлов:

sudo chown -R 1000:1000 /srv/music
id -u

Контейнер работает от имени пользователя с идентификатором 1000, а точка монтирования доступна только для чтения, поэтому каждый файл должен быть доступен для чтения этим идентификатором. Если ваша учетная запись SSH на VPS имеет идентификатор, отличный от 1000, файлы будут принадлежать другому пользователю, и сканирование не обнаружит ни одного трека, а веб-интерфейс останется пустым. Команда id -u выведет ваш текущий идентификатор, а в принципах работы PUID и PGID в контейнерах Docker подробно описано, как работает это сопоставление.

Обратный прокси-сервер и TLS для доступа к сервису с любого устройства

Направьте DNS A-запись на ваш VPS, а затем добавьте в конфигурацию Caddy три строки:

music.example.com {
    reverse_proxy 127.0.0.1:4533
}
sudo systemctl reload caddy

Caddy запрашивает сертификат при первом обращении. Порты 80 и 443 должны быть открыты, так как проверка ACME (automatic certificate management environment) выполняется через 80 порт. В nginx добавьте proxy_buffering off; в блок location: Navidrome отправляет события о прогрессе в веб-интерфейс через одно долгоживущее соединение, и при включенной буферизации интерфейс зависает в ожидании ответа, который удерживает nginx. Если вы размещаете сервис по пути, например /music, а не на отдельном поддомене, установите ND_BASEURL в значение этого же пути, иначе интерфейс загрузится как пустая страница. Сравнение трех популярных прокси-серверов приведено в Nginx, Caddy и Traefik на VPS.

Откройте сайт и создайте первую учетную запись. Пароля по умолчанию не существует, и первый посетитель получает предложение создать администратора, поэтому выполните это до того, как сообщите кому-либо адрес. Затем проверьте путь, который использует мобильный клиент:

SALT=$(openssl rand -hex 6)
TOKEN=$(printf '%s%s' 'YOUR_PASSWORD' "$SALT" | md5sum | cut -d' ' -f1)
curl -s "https://music.example.com/rest/ping.view?u=YOUR_USER&t=$TOKEN&s=$SALT&v=1.16.1&c=curl&f=json"

Корректный ответ начинается с {"subsonic-response":{"status":"ok" и указывает navidrome в качестве типа сервера. Тело ответа, содержащее "status":"failed" и код ошибки 40, означает, что прокси настроен верно, а учетные данные неверны. Ошибки сертификата на этом этапе нужно устранить в первую очередь, так как большинство мобильных клиентов отклоняют некорректные сертификаты, не предоставляя пользователю никакой полезной информации.

Почему ваша медиатека выглядит некорректно после первого сканирования

Navidrome выполняет навигацию по тегам, а не по папкам, поэтому именно теги определяют структуру отображения. Трек без тега album artist будет отнесен к исполнителю трека (track artist). Именно поэтому сборник, где у каждого трека указан свой исполнитель, превращается в двадцать альбомов по одному треку в каждом. Исправляйте это в самих файлах, а не в Navidrome: MusicBrainz Picard и beets позволяют найти альбом в базе данных MusicBrainz и записать стандартные теги обратно в файлы.

Navidrome также разделяет теги с несколькими исполнителями на отдельных артистов. В результате название группы, содержащее разделитель, ошибочно разбивается на части; AC/DC — это пример, с которым сталкиваются все. В ND_SCANNER_ARTISTSPLITEXCEPTIONS указываются имена, которые не должны разделяться ни при каких обстоятельствах.

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

Пользователи, плейлисты и общий доступ

Администратор создает остальные учетные записи через веб-интерфейс, самостоятельная регистрация отсутствует. У каждого пользователя свои счетчики прослушиваний, плейлисты, избранное и оценки, поэтому профили предпочтений членов семьи не смешиваются.

Плейлисты могут поступать из двух источников. Плейлист, созданный в клиенте, хранится в базе данных. Файл .m3u, помещенный в папку библиотеки, импортируется во время сканирования; это простой способ переноса плейлистов из десктопного плеера. Смарт-плейлисты — это файлы .nsp, небольшие JSON-файлы с правилами, которые импортируются аналогичным образом и обновляются автоматически при изменении библиотеки.

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

Резервное копирование базы данных отдельно от музыкальных файлов

Собственный механизм резервного копирования Navidrome охватывает только базу данных. В документации прямо указано: процесс резервного копирования сохраняет базу данных, то есть пользователей, статистику прослушиваний и прочие данные, но не затрагивает музыку или конфигурацию. Такое разделение является правильным подходом, так как эти две части выходят из строя по разным причинам. Музыкальные файлы можно скопировать заново с диска, с которого они были импортированы. Статистика прослушиваний, оценки, избранное и плейлисты больше нигде не хранятся, и повторное сканирование их не восстановит.

Файл compose уже настроен на создание ежедневной копии в /data/backup с хранением семи последних версий. Перед обновлением создайте копию вручную:

sudo docker compose run --rm navidrome backup create

Восстановление удаляет текущую базу данных и копирует на её место резервную копию; эта операция должна выполняться только при остановленном Navidrome. Восстановление на работающем сервере небезопасно.

Эти файлы по-прежнему находятся на том же VPS, поэтому они не сохранятся при выходе сервера из строя. Регулярно отправляйте /srv/navidrome на другую машину или в объектное хранилище, для чего и предназначены restic и BorgBackup. Весь каталог занимает мало места, обычно значительно меньше гигабайта, поэтому ежедневная зашифрованная копия вне сервера почти ничего не стоит и позволяет восстановить всё то, что невозможно вернуть при обычном сканировании.

FAQ

Нужно ли перекодировать музыку на VPS?

Почти никогда. Телефоны и браузеры самостоятельно декодируют MP3, AAC, Opus и FLAC, поэтому сервер отправляет файл «как есть», практически не нагружая процессор. Есть один случай, когда это стоит включить: прослушивание библиотеки FLAC через мобильный интернет. Конвертация из потока примерно 900 кбит/с в Opus с битрейтом 128 кбит/с сокращает объем передаваемых данных примерно в семь раз. Navidrome позволяет настроить это для каждого пользователя и плеера отдельно, и эта функция отключена по умолчанию.

Почему мое мобильное приложение не может скачать музыку для прослушивания офлайн?

Потому что офлайн-хранилище — это функция клиента, а не сервера. API Subsonic позволяет любому клиенту запросить файл целиком, но решение о сохранении копии на телефоне принимает само приложение. Проверьте список клиентов на navidrome.org/apps и выберите тот, в описании которого упоминаются офлайн-загрузки или кэширование. Некоторые клиенты кэшируют только то, что вы уже прослушали, что не равносильно синхронизации альбома перед поездкой.

Почему после сканирования один альбом разделился на несколько?

Отсутствует или не совпадает тег album artist у треков. Navidrome группирует музыку по тегам, а не по папкам. Двенадцать треков с двенадцатью разными значениями artist и без общего значения album artist выглядят как двенадцать разных альбомов. Установите тег album artist для каждого трека в альбоме (для сборников обычно используется значение Various Artists) и запустите повторное сканирование. Инструменты MusicBrainz Picard или beets позволяют сделать это для всей папки целиком.

Заменяет ли self-hosted стриминг музыки Spotify?

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

#navidrome#music#streaming#self-hosting#media-server