Como hospedar seu streaming de música em um VPS
Veja como rodar o Navidrome no VPS, dimensionar armazenamento, usar clientes Subsonic, sincronizar offline, configurar TLS e fazer backups seguros.
O que o streaming de música autoalojado num VPS oferece
O streaming de música autoalojado num VPS significa que executa o leitor e fornece a música. O servidor armazena ficheiros que já possui, e qualquer telemóvel pode aceder-lhe através da Internet com um início de sessão normal. Tenha em conta esta limitação antes de começar: isto substitui o leitor de um serviço de streaming, não o respetivo catálogo. Nada de novo aparece na sua biblioteca até comprar ou extrair a música e copiar o ficheiro para o servidor.
O áudio exige muito menos de um servidor do que o vídeo. Os ficheiros são pequenos, os telemóveis descodificam todos os formatos comuns sem ajuda e um ouvinte utiliza menos largura de banda do que uma chamada de vídeo. O CPU não é um problema neste caso. O espaço em disco é a verdadeira limitação. Os outros dois fatores que determinam se isto funciona são a qualidade das etiquetas e a capacidade da aplicação do telemóvel para descarregar música para utilização offline.
Qual servidor de música escolher: Navidrome, Jellyfin ou Funkwhale?
Navidrome é a escolha padrão quando só precisa de áudio. É um único binário Go num único contentor e guarda o estado numa única base de dados SQLite. Responde à API Subsonic, razão pela qual existe uma grande família de aplicações móveis de terceiros. A versão 0.63.2 era a atual em agosto de 2026. O projeto afirma que funciona bem em hardware tão pequeno como um Raspberry Pi Zero, por isso o software do servidor não será a parte pela qual terá de pagar.
Jellyfin é uma opção adequada se já utiliza o Jellyfin como servidor multimédia num VPS para vídeo. A biblioteca de música funciona, e o Finamp é uma aplicação de música do Jellyfin para Android e iOS que descarrega faixas para audição offline. A limitação está na API. O Jellyfin não tem um endpoint Subsonic integrado, e o plugin da comunidade que adicionava um deixou de ser atualizado em 2022. Por isso, o ecossistema de aplicações Subsonic não é compatível com ele. Em vez disso, utiliza as aplicações que comunicam com a API própria do Jellyfin, e existem menos aplicações desse tipo.
Funkwhale é a opção federada, e a versão 2.0 foi lançada em março de 2026. Um servidor Funkwhale chama-se pod. Os pods federam através do ActivityPub (o protocolo usado pelo Mastodon), e um utilizador de um pod pode seguir uma biblioteca pública noutro pod. Também responde a parte da API Subsonic, com uma diferença importante: cada utilizador define uma palavra-passe Subsonic separada nas suas próprias definições, porque o protocolo Subsonic espera uma palavra-passe que o servidor consiga ler. O Funkwhale requer uma instalação mais pesada, pois precisa de PostgreSQL e de uma fila de tarefas além da aplicação Web.
Escolha o Navidrome, exceto se precisar de federação ou se o Jellyfin já estiver em execução. O restante deste guia configura o Navidrome com Docker.
Como a API do Subsonic determina qual aplicação de telemóvel utiliza
O Subsonic era um servidor de música cuja API HTTP se tornou a linguagem comum do áudio autoalojado, e o OpenSubsonic é o projeto da comunidade que continua a estendê-la. É por isso que o seu telemóvel tem várias opções. O Navidrome não inclui uma aplicação móvel própria nem precisa de uma, porque qualquer cliente Subsonic inicia sessão com o endereço do servidor e os dados da sua conta.
Isto é mais importante para a sincronização offline, que é a funcionalidade que determina se a configuração é adequada ao uso diário. Um telemóvel num túnel não consegue contactar o servidor, por isso o cliente tem de ter copiado previamente os ficheiros para o armazenamento local. Todos os clientes fazem streaming. Apenas alguns permitem descarregar ficheiros. O diretório de clientes em navidrome.org/apps indica quais permitem essa operação, e a escolha é ampla em ambas as plataformas: Substreamer e Ultrasonic no Android, Amperfy e play:Sub no iOS. Vários dos clientes mais completos são aplicações pagas, e o Symfonium no Android é o mais mencionado. Instale dois antes de decidir, porque esta é a parte do sistema com que irá interagir todos os dias.
De quanto armazenamento precisa uma biblioteca de música?
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"
}
]Estes são valores aproximados, derivados do bitrate, e não medições de uma coleção real. A aritmética é simples o suficiente para ser confirmada com os seus próprios ficheiros. Considere um álbum com 45 minutos, ou seja, 2,700 segundos. Multiplique o bitrate em quilobits por segundo por 2,700 e divida por 8,000 para obter megabytes. A 320 kbps, isso corresponde a 108 MB por álbum. Assim, mil álbuns ocupam cerca de 108 GB.
O formato sem perdas altera o resultado. Um FLAC com qualidade de CD tem, em material normal, uma média próxima de 900 kbps. Por isso, os mesmos mil álbuns precisam de cerca de 304 GB. Uma biblioteca em 24 bit e 96 kHz chega aproximadamente a 1,013 GB, ou seja, um terabyte completo para uma coleção que poderia ser listada numa folha de papel. Uma cópia Opus a 128 kbps, otimizada para telemóveis, reduz os mesmos mil álbuns a 43 GB. Execute du -sh /path/to/music na biblioteca que já tem, porque a sua bitrate média é o único valor relevante ao escolher um plano.
A largura de banda representa a parte menor do custo. Um stream a 320 kbps transfere 40 quilobytes por segundo. Assim, uma hora de audição transfere cerca de 144 MB. Cem horas por mês correspondem a aproximadamente 14 GB, um volume que nenhum limite de transferência de um VPS costuma notar. A exceção é a primeira sincronização offline de um telemóvel, que pode transferir dezenas de gigabytes numa só noite.
Armazenamento ou computação?
Um servidor de música é um grande conjunto de dados frios, com quase nenhuma computação associada. Ler um ficheiro a 40 kilobytes por segundo mantém qualquer disco praticamente inativo, e o CPU só trabalha durante uma análise da biblioteca ou durante a transcodificação, que provavelmente quase nunca fará. Por isso, o NVMe rápido de um plano de computação não traz qualquer vantagem neste caso, enquanto o preço por gigabyte é precisamente o que impede o carregamento das cópias FLAC. Este é o caso em que um VPS de armazenamento é melhor do que um VPS normal, porque estes planos têm preços definidos por terabyte, e não por core.
A memória necessária é modesta. O Navidrome serve uma biblioteca pessoal com algumas centenas de megabytes, e a análise é o pico de utilização, não a reprodução. Atribua 1 GB ou 2 GB de RAM ao servidor e use o restante orçamento para o disco.
Instalar o Navidrome com Docker Compose
Crie primeiro os diretórios, pertencentes ao ID de utilizador com o qual o contentor será executado. Se o Compose for novidade para si, Docker Compose numa VPS explica o que este ficheiro pressupõe.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicEscreva docker-compose.yml sem praticamente mais nada, no seu próprio diretório:
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:rodocker compose up -d
docker compose psdocker compose ps deve mostrar o serviço como em execução, e não em reinício contínuo. Um contentor que reinicia em ciclo quase sempre indica um problema de permissões em /srv/navidrome, e docker compose logs navidrome identifica o ficheiro que não conseguiu escrever.
Vale a pena explicar quatro detalhes desse ficheiro. A porta é publicada apenas em 127.0.0.1, por isso o servidor fica acessível através do reverse proxy e não na porta 4533 a partir da Internet pública: o Docker escreve as suas próprias regras de firewall, portanto um simples 4533:4533 continua exposto mesmo num sistema em que o ufw indique que tudo está negado. O volume da música é somente de leitura, o que significa que um erro no scanner não pode eliminar a sua única cópia. ND_SCANNER_SCHEDULE está desativado por predefinição, e os guias escritos antes do Navidrome 0.55 chamam-lhe ND_SCANSCHEDULE, um nome que já não existe. As três definições de backup ativam a cópia de segurança integrada da base de dados, da qual depende a secção de backup abaixo.
Coloque as suas músicas no servidor
Copie a biblioteca com rsync, que retoma a transferência em vez de começar novamente quando a ligação cai.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/A barra final na origem é importante. Sem ela, obtém /srv/music/Music. Quando a cópia terminar, corrija o proprietário:
sudo chown -R 1000:1000 /srv/music
id -uO contentor é executado com o ID de utilizador 1000 e a montagem é apenas de leitura, por isso todos os ficheiros têm de ser legíveis por esse ID. Se a sua conta SSH não tiver o UID 1000 na VPS, a cópia fica propriedade de outro utilizador e a pesquisa não encontra faixas, enquanto a interface Web permanece vazia. id -u mostra o seu ID real, e como PUID e PGID funcionam em contentores Docker explica todo o mapeamento.
Um reverse proxy e TLS para o telemóvel funcionar a partir de qualquer lugar
Aponte um registo DNS A para o VPS e depois forneça ao Caddy estas três linhas:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyO Caddy solicita o certificado no primeiro pedido. As portas 80 e 443 têm de estar abertas, porque o desafio ACME (ambiente de gestão automática de certificados) é respondido na porta 80. No nginx, adicione proxy_buffering off; ao bloco location: o Navidrome envia eventos de progresso para a interface web através de uma ligação longa e persistente. Com o buffering ativo, a interface fica à espera de uma resposta que o nginx ainda está a reter. Se o serviço for disponibilizado num caminho como /music, em vez de usar o seu próprio subdomínio, defina ND_BASEURL com o mesmo caminho. Caso contrário, a interface é carregada como uma página em branco. Os três proxies mais comuns são comparados em Nginx, Caddy e Traefik num VPS.
Abra o site e crie a primeira conta. Não existe uma palavra-passe predefinida. O primeiro visitante é solicitado a criar o utilizador administrador. Faça isto antes de divulgar o endereço. Depois, teste o caminho exato utilizado pelo cliente no telemóvel:
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"Uma resposta normal começa por {"subsonic-response":{"status":"ok" e identifica navidrome como o tipo de servidor. Um corpo que contenha "status":"failed" e o código de erro 40 significa que o proxy está correto e que as credenciais estão erradas. Um erro de certificado nesta etapa é o primeiro problema a corrigir, porque a maioria dos clientes móveis rejeita um certificado inválido com uma mensagem que não informa o utilizador sobre a causa.
Por que a biblioteca fica incorreta depois da primeira verificação
O Navidrome navega pelas tags, não pelas pastas, por isso são as tags que determinam o que vê. Uma faixa sem a tag de artista do álbum é organizada pelo artista da faixa. Por esse motivo, uma compilação com um artista diferente em cada faixa transforma-se em vinte álbuns com uma faixa cada. Corrija isso nos ficheiros, não no Navidrome: o MusicBrainz Picard e o beets procuram o álbum na base de dados do MusicBrainz e escrevem novamente as tags padrão.
O Navidrome também divide uma tag com vários artistas em artistas separados. Assim, o nome de uma banda que contenha um separador é dividido por engano. AC/DC é o exemplo mais comum. ND_SCANNER_ARTISTSPLITEXCEPTIONS contém os nomes que nunca devem ser divididos.
Os ficheiros novos são detetados por um monitor de ficheiros alguns segundos depois de serem adicionados. O monitor depende das notificações de alterações do kernel. Essas notificações não são recebidas para ficheiros gravados num compartilhamento de rede montado a partir de outra máquina. Nesse tipo de configuração, o ND_SCANNER_SCHEDULE periódico é o que mantém a biblioteca atualizada. Uma verificação completa lê as tags de todos os ficheiros, o que é lento numa biblioteca grande. Esse é um dos motivos para proteger a base de dados apresentada abaixo.
Utilizadores, playlists e partilha
Um administrador cria as restantes contas na interface web, e não existe registo autónomo. Cada utilizador tem contagens de reproduções, playlists, favoritos e classificações separadas. Assim, os membros de uma casa não acabam por partilhar o mesmo perfil de preferências.
As playlists podem vir de duas fontes. Uma playlist criada num cliente fica guardada na base de dados. Um ficheiro .m3u colocado na pasta da biblioteca é importado durante a análise. Esta é a forma simples de transferir playlists de um leitor de música para desktop. As playlists inteligentes são ficheiros .nsp, ficheiros JSON pequenos com regras, importados da mesma forma. São atualizados automaticamente à medida que a biblioteca muda.
A partilha fica ativada por predefinição a partir da versão 0.63.0, lançada em julho de 2026. Permite que um utilizador crie uma ligação pública para um álbum, que qualquer pessoa pode abrir sem iniciar sessão. Num servidor que contém toda a sua biblioteca, talvez não queira esse comportamento. Definir ND_ENABLESHARING como false desativa-o.
Faça uma cópia de segurança da base de dados separadamente dos ficheiros de música
A cópia de segurança do próprio Navidrome inclui apenas a base de dados. A documentação é clara: o processo faz uma cópia da base de dados, incluindo utilizadores, contagens de reproduções e os restantes dados, mas não inclui a música nem a configuração. Esta separação é a forma correta de pensar no problema, porque as duas partes falham de maneiras diferentes. Os ficheiros de música podem ser copiados novamente a partir do disco onde foram extraídos. As contagens de reproduções, classificações, favoritos e listas de reprodução não existem noutro local, e uma nova análise não os recupera.
O ficheiro compose já grava uma cópia noturna em /data/backup e mantém sete cópias. Faça uma cópia manual antes de uma atualização:
sudo docker compose run --rm navidrome backup createA restauração apaga a base de dados atual e copia a cópia de segurança para o seu lugar. Tem de ser executada enquanto o Navidrome estiver parado. Uma restauração não é segura num servidor em produção.
Esses ficheiros continuam no mesmo VPS, por isso não sobrevivem à perda do VPS. Envie /srv/navidrome para outra máquina ou para um armazenamento de objetos segundo um agendamento. Essa é a finalidade de ferramentas como restic e BorgBackup. O diretório inteiro é pequeno, normalmente muito inferior a 1 gigabyte. Uma cópia diária e encriptada fora do servidor custa quase nada e recupera tudo o que uma nova análise não consegue recuperar.
FAQ
Preciso transcodificar música num VPS?
Quase nunca. Telefones e navegadores descodificam MP3, AAC, Opus e FLAC por conta própria, por isso o servidor envia o ficheiro tal como está e usa quase nenhum CPU. Há um caso em que vale a pena ativar essa função: uma biblioteca FLAC transmitida através de dados móveis, em que converter de cerca de 900 kbps para Opus a 128 kbps reduz o consumo de dados aproximadamente sete vezes. O Navidrome permite fazer isso por utilizador e por leitor, e a função permanece desativada até a ativar.
Porque é que a aplicação do meu telefone não consegue descarregar música para ouvir offline?
Porque o armazenamento offline é uma funcionalidade do cliente, não do servidor. A API Subsonic permite que qualquer cliente obtenha um ficheiro completo, mas é a aplicação que decide se guarda uma cópia no telefone. Consulte o diretório de clientes em navidrome.org/apps e escolha um cuja descrição mencione descargas offline ou cache. Alguns clientes fazem cache apenas do que já reproduziu, o que não é o mesmo que sincronizar um álbum antes de uma viagem.
Porque é que um álbum ficou dividido em vários álbuns depois da análise?
A tag do artista do álbum está ausente ou é inconsistente entre as faixas. O Navidrome agrupa por tags e não por pasta, por isso doze faixas com doze valores de artista diferentes e sem um valor comum de artista do álbum parecem doze álbuns. Defina a tag do artista do álbum em todas as faixas do álbum, normalmente como Various Artists numa compilação, e deixe o Navidrome voltar a analisar a biblioteca. O MusicBrainz Picard ou o beets fazem isto de uma só vez para uma pasta inteira.
O streaming de música alojado por mim substitui o Spotify?
Substitui o leitor e a biblioteca, não o catálogo. Tem a sua própria coleção em todos os dispositivos, com as playlists e as contagens de reproduções que nenhuma alteração de licenciamento pode retirar-lhe. Não tem lançamentos novos nem recomendações baseadas no que outras pessoas ouvem. A maioria das pessoas que fazem isto compra a sua música e mantém uma conta de streaming económica para descobrir música.