Strömma din musik med Navidrome och Podman utan root

Navidrome på Debian 13 strömmar din egen musiksamling till webbläsaren och till Subsonic-appar i mobilen, i rootless Podman under en egen användare bakom Caddy, med användningsrapporter och uppslag på nätet avstängda.

Testad på Navidrome 0.64.2 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 2 oktober 2026

Rekommenderad server för guiden

VC-S Micro · 2 vCPU · 8 GB Minne · 250 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

90 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

Navidrome gör en katalog med musikfiler till din egen strömningstjänst. Den läser taggarna i dina MP3-, FLAC-, Opus- och andra filer och spelar dem i en webbspelare, eller i vilken mobil- eller datorapp som helst som talar Subsonic-API:t. När mobilen har en långsam uppkoppling kan Navidrome koda om en stor FLAC-fil till en liten Opus- eller MP3-ström medan den spelas.

Här körs den från sin officiella avbild, i Podman under en egen användare som heter navidrome, bakom Caddy från Podman-guiden. Din musik ligger i en katalog i användarens hemkatalog, som containern kan läsa men inte ändra. För film och tv sätter Jellyfin-guiden upp en mediaserver på samma sätt.

Navidrome är ett community-projekt som startades och leds av Deluan Quintão, och som ges ut av "The Navidrome Authors". Projektet anger inget företag bakom sig och inget land. Det är öppen källkod under GNU General Public License version 3 (GPLv3). Som standard kontaktar det flera tjänster på nätet:

  • Användningsrapporter ("insights"): 30 minuter efter start, och sedan en gång om dagen, skickar Navidrome till insights.navidrome.org ett slumpat ID för installationen, sin version, operativsystemet, antal processorer, minnesanvändning, typ av filsystem, antalet spår, album, artister, spellistor, delningar och aktiva användare, och vilka inställningar som är på. Projektet säger att rapporterna sparas i 30 dagar och att namn, IP-adresser och låttitlar inte samlas in. Projektet driver den servern själv, hos ett hostingföretag i USA.
  • Artistinformation: Navidrome hämtar artistbilder, biografier och populära låtar från Deezer, en fransk strömningstjänst, utifrån artistens namn. För filer som är taggade med MusicBrainz-ID frågar den också ListenBrainz, som drivs av MetaBrainz Foundation, efter liknande artister.
  • Bilder på inloggningssidan: servern laddar ner bakgrundsbilderna till sin inloggningssida från www.navidrome.org, som svarar från Cloudflares nätverk.

Steg 3 stänger av allt detta. Navidrome letar inte efter uppdateringar, och Last.fm och Gravatar är avstängda om du inte sätter upp dem.

Varje steg nedan har körts på en ny Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:

  • Administratörskontot skapades via en SSH-tunnel innan Navidrome gick att nå från internet. Ett andra försök utifrån nekades sedan.
  • Inspelningar från Musopen-samlingen, som är fria från upphovsrätt, och Creative Commons-låtar av Kevin MacLeod laddades upp med rsync och SFTP som användaren navidrome, dök upp i biblioteket inom några sekunder och spelades i webbspelaren.
  • Subsonic-API:t svarade utifrån på ping, getMusicFolders och stream, på samma sätt som mobilappar använder det, både med originalfilen och med en Opus-ström som kodades om direkt.
  • Att koda om ett FLAC-spår på 3:49 till Opus tog 4,4 sekunder och 5,6 sekunders processortid.
  • Navidrome loggade misslyckade inloggningar med besökarens riktiga IPv4- eller IPv6-adress, nekade fler försök från just den adressen efter några misslyckade i rad, och struntade i en påhittad adress i en X-Real-IP-header.
  • Med inställningarna i steg 3 gjorde Navidrome inga DNS-uppslag alls när den startade, visade artistsidor och visade sin inloggningssida.
  • En säkerhetskopia av databasen återställdes, och allt startade igen av sig självt efter en omstart av servern.

Navidrome använde omkring 22 MB minne, och omkring 35 MB medan den kodade om ett spår, med ett litet bibliotek. Ett stort bibliotek behöver mer för sin databas, och serverns filcache håller musiken som spelas.

Innan du börjar

Du behöver:

  • en server uppsatt som i Podman-guiden, med Caddy igång, och säkrad med ufw;
  • en A-post och en AAAA-post för music.example.com som pekar på din server;
  • din musik på din egen dator, i mappar, helst en mapp per album.

Navidrome är till för musik du äger: dina rippade cd-skivor, filer du har köpt i butiker som säljer filer, som Bandcamp, och musik med fri licens. Filerna tar lika mycket plats på servern som på din dator, så kontrollera serverns disk innan du laddar upp en stor samling.

Exemplen använder music.example.com för Navidrome, 203.0.113.10 för serverns IPv4-adress, som ip -brief address show eth0 visar, och 198.51.100.7 för din egen adress. Byt ut dem genomgående.

1. Skapa användaren

Som root:

apt install -y rsync
useradd -m -s /bin/bash navidrome
loginctl enable-linger navidrome

rsync behövs för att ladda upp musiken i steg 6. För att ladda upp som navidrome med samma SSH-nyckel som du använder för root kopierar du roots nyckellista till den nya användaren:

install -d -m 700 -o navidrome -g navidrome /home/navidrome/.ssh
install -m 600 -o navidrome -g navidrome /root/.ssh/authorized_keys /home/navidrome/.ssh/

Byt sedan till användaren:

machinectl shell navidrome@

Allt fram till steg 5 körs som navidrome.

2. Skapa musikkatalogen och hemligheterna

mkdir -p ~/music ~/backup ~/.config/containers/systemd
umask 077
cat > ~/navidrome.env <<EOF
ND_PASSWORDENCRYPTIONKEY=$(openssl rand -hex 32)
ND_EXTAUTH_USERHEADER=X-Auth-$(openssl rand -hex 16)
EOF
umask 022

I ~/music lägger du din musik, och i ~/backup lägger Navidrome kopior av sin databas. Filen navidrome.env, som bara navidrome kan läsa, innehåller två hemligheter:

  • Navidrome lagrar användarnas lösenord krypterade, eftersom Subsonic-appar loggar in på ett sätt som kräver det ursprungliga lösenordet. Utan ND_PASSWORDENCRYPTIONKEY använder den en nyckel som är densamma i varje kopia av Navidrome, så den som kommer åt din databas kan läsa lösenorden.
  • Steg 3 säger åt Navidrome att lita på Caddy för besökarens adress. Då loggar Navidrome också in den vars förfrågan har ett användarnamn i en header som heter Remote-User. Den kan vilken användare eller vilket program som helst på servern skicka till 127.0.0.1:8106, och Caddy skulle skicka den vidare från vem som helst på internet. På testservern räckte den headern för att öppna administratörskontot, både via Caddy och lokalt. ND_EXTAUTH_USERHEADER byter ut headerns namn mot ett slumpat som bara den här filen känner till.

3. Definiera containern

Skapa ~/.config/containers/systemd/navidrome.container, med serverns IPv4-adress i stället för 203.0.113.10:

[Unit]
Description=Navidrome music server

[Container]
ContainerName=navidrome
Image=docker.io/deluan/navidrome:latest
Volume=navidrome-data:/data
# Your music, read-only: Navidrome can play it but never change it.
Volume=%h/music:/music:ro
Volume=%h/backup:/backup
# Only Caddy, on this server, can reach Navidrome: the port is not open to the internet.
PublishPort=127.0.0.1:8106:4533
EnvironmentFile=%h/navidrome.env
# Caddy connects from the server's own IPv4 address: trust it for the visitor's address.
Environment=ND_EXTAUTH_TRUSTEDSOURCES=203.0.113.10/32
# No usage reports, artist pictures, biographies or login backgrounds from online services.
Environment=ND_ENABLEINSIGHTSCOLLECTOR=false
Environment=ND_ENABLEEXTERNALSERVICES=false
# A full library scan every night, on top of the watcher that sees new files at once.
Environment=ND_SCANNER_SCHEDULE=@daily
# A copy of the database every night at 03:00, keeping the last 7.
Environment=ND_BACKUP_PATH=/backup
Environment="ND_BACKUP_SCHEDULE=0 3 * * *"
Environment=ND_BACKUP_COUNT=7
AutoUpdate=registry

[Service]
Restart=always

[Install]
WantedBy=default.target

Vad inställningarna gör:

  • ND_EXTAUTH_TRUSTEDSOURCES låter Navidrome ta besökarens adress från Caddy. Inne i containern kommer Caddys anslutningar från serverns egen IPv4-adress, som Podman-guiden förklarar. Utan den raden har varje besökare den adressen i Navidromes logg, och Navidromes gräns på fem inloggningsförsök per 20 sekunder och adress skulle stänga ute alla på en gång.
  • ND_ENABLEINSIGHTSCOLLECTOR=false stoppar den dagliga användningsrapporten. Sidan där du skapar administratörskontot nämner fortfarande rapporterna. Loggraden Insight Collector is DISABLED visar att de är avstängda.
  • ND_ENABLEEXTERNALSERVICES=false stoppar dessutom uppslagen hos Deezer och ListenBrainz och bakgrundsbilderna, och ersätter dem med enkla inbyggda. Artistsidorna visar då bara det som finns i dina filer. Vill du ha artistbilder och biografier tar du bort raden.
  • @daily kör en fullständig genomsökning en gång om dagen. Nya och ändrade filer hittas ändå inom några sekunder, eftersom Navidrome övervakar katalogen, och genomsökningen på natten fångar det som har missats.

Starta den:

systemctl --user daemon-reload
systemctl --user start navidrome
systemctl --user enable --now podman-auto-update.timer
podman logs navidrome 2>&1 | grep -E "DISABLED|Scheduling"

Loggen visar All external integrations are DISABLED!, Insight Collector is DISABLED, Scheduling periodic scan och Scheduling periodic backup.

4. Skapa administratörskontot via en tunnel

Navidrome har inga konton när den startar, och den första som besöker webbsidan skapar administratörskontot. Skapa därför ditt innan Caddy gör Navidrome publik. Öppna en SSH-tunnel till servern från din egen dator:

ssh -L 8106:127.0.0.1:8106 root@203.0.113.10

Låt den vara öppen och öppna http://localhost:8106 i webbläsaren. Det går direkt till Navidrome, inte via Caddy. Navidrome visar Thanks for installing Navidrome!: ange Username, Password och Confirm Password, och välj Create Admin. Navidrome loggar in dig, med ett tomt bibliotek. Stäng tunneln med exit.

5. Sätt Caddy framför

Som root byter du till machinectl shell caddy@ och lägger till det här blocket sist i ~/Caddyfile:

music.example.com {
    reverse_proxy 127.0.0.1:8106 {
        # Navidrome also reads the visitor's address from these: drop any a visitor sends.
        header_up -X-Real-IP
        header_up -True-Client-IP
    }
}

Starta om Caddy med systemctl --user restart caddy. Caddy sätter X-Forwarded-For själv, men skickar andra headers vidare som besökaren skickade dem, och Navidrome använder hellre X-Real-IP och True-Client-IP när de finns. Utan de två raderna kan en besökare välja vilken adress Navidrome loggar och begränsar.

Navidrome behöver ingen ND_BASEURL på ett eget namn: den bygger länkar, som delningslänkar och artistbilder till appar, från namnet som Caddy skickar vidare, och i testet blev de https://music.example.com/.... ND_BASEURL, till exempel ND_BASEURL=/music, behövs bara om du lägger Navidrome under en sökväg på en annan webbplats.

Kontrollera från din egen dator att administratörssidan är upptagen:

curl -s https://music.example.com/auth/createAdmin -H 'Content-Type: application/json' -d '{"username":"test","password":"test1234"}'

Svaret är {"error":"Cannot create another first admin"}.

För att kontrollera att Navidrome ser din riktiga adress loggar du in en gång med fel lösenord på https://music.example.com. Sedan, som navidrome:

podman logs navidrome 2>&1 | grep auth/login

Raden innehåller httpStatus=401 remoteAddr=198.51.100.7: din egen adress, inte serverns.

6. Ladda upp din musik

Kopiera din musikmapp till servern som navidrome från din egen dator:

rsync -av --progress ~/Music/ navidrome@203.0.113.10:music/

Snedstrecket efter ~/Music/ kopierar innehållet i mappen, inte själva mappen. Kör samma kommando igen när du har lagt till album: rsync skickar bara nya och ändrade filer. Alla SFTP-program fungerar också, som FileZilla eller WinSCP på Windows: logga in som navidrome med din nyckel och ladda upp till music.

Navidrome övervakar katalogen, och nya album dyker upp inom några sekunder. För att följa med, som navidrome:

podman logs -f navidrome 2>&1 | grep Scanner

Varje ny katalog ger en rad som Scanner: Completed processing folder audioCount=4 ... tracksImported=4.

Ladda upp som navidrome, inte som root. Inne i containern körs Navidrome som root, vilket är användaren navidrome utanför den, så den kan läsa allt som navidrome äger. En katalog som root har kopierat dit, med behörighet bara för root, hoppas över med Scanner: Skipping unreadable directory ... permission denied. Rätta det som root med:

chown -R navidrome:navidrome /home/navidrome/music

Navidrome sorterar efter taggar, inte efter filnamn, så filer med bra taggar för Artist, Album och Title visas bra. Ett taggprogram som MusicBrainz Picard rättar taggarna på din dator innan du laddar upp.

7. Lyssna

Öppna https://music.example.com och logga in. Välj ett album och Play. Spelaren längst ner fortsätter att spela medan du bläddrar.

I mobilen använder du en app som talar Subsonic-API:t. Det finns många, gratis och betalda, och Navidromes webbplats listar dem under Apps. Några som finns i dag: på Android Ultrasonic, Tempus och Symfonium, på iOS Amperfy och play:Sub, och på båda Substreamer. Ange https://music.example.com som server i appen, med ditt användarnamn och lösenord i Navidrome. Vi testade API:t med curl, inte med de här apparna.

Du kan testa API:t själv. Subsonic-appar skickar användarnamnet, ett slumpat s och t, som är MD5-summan av lösenordet följt av s. I en terminal på din egen dator, med ditt lösenord i stället för PASSWORD:

S=$(openssl rand -hex 6)
T=$(printf '%s%s' 'PASSWORD' "$S" | md5sum | cut -d' ' -f1)
Q="u=admin&t=$T&s=$S&v=1.16.1&c=test&f=json"
curl -s "https://music.example.com/rest/ping?$Q"
curl -s "https://music.example.com/rest/getMusicFolders?$Q"

Båda svarar med "status":"ok", det andra med ditt bibliotek, Music Library. Så här hittar du ett spårs ID och laddar ner det som en app skulle göra:

curl -s "https://music.example.com/rest/search3?$Q&query=Morning"
curl -s -o song.opus "https://music.example.com/rest/stream?$Q&id=SONG_ID&format=opus&maxBitRate=128"

Utan &format=opus&maxBitRate=128 får du originalfilen.

För att ge alla i familjen ett eget konto, med egna favoriter och spellistor, öppnar du menyn under personikonen uppe till höger, Users och Create.

8. Omkodning

Navidrome har ffmpeg inbyggt och kodar om spår när en app ber om ett mindre format, som Opus på 128 kbit/s i mobilen. Varje app och webbläsare som har spelat något visas under Players, i menyn under personikonen, där du kan ställa in Transcoding och Max. Bit Rate för den.

På testserverns 2 vCPU kodar ffmpeg om ett helt spår på några sekunder, långt före uppspelningen:

KällaOmkodad tillTogProcessortid
FLAC, 3:49Opus 128 kbit/s4,4 s5,6 s
FLAC, 2:34MP3 192 kbit/s4,2 s5,8 s
MP3, 3:25Opus 128 kbit/s5,3 s5,4 s

Varje spår använder alltså drygt en kärna i ungefär fem sekunder, några procent av servern utslaget över låten. Navidrome sparar omkodade spår i en cache på 100 MB, och samma spår i samma kvalitet spelat igen tog ingen processortid alls. Flera i familjen som lyssnar samtidigt är ingen belastning för den här servern.

9. Tjänster på nätet

Steg 3 stängde av allt som kontaktar andra servrar. Kontrollera det genom att, som root, titta på de DNS-uppslag servern gör medan du använder Navidrome:

apt install -y tcpdump
tcpdump -n -i any port 53

Starta om Navidrome som navidrome med systemctl --user restart navidrome, öppna inloggningssidan och öppna en artist. Med inställningarna i steg 3 visar tcpdump ingenting från Navidrome. Utan ND_ENABLEEXTERNALSERVICES=false slog testservern upp api.deezer.com, auth.deezer.com, pipe.deezer.com och www.navidrome.org. Stoppa tcpdump med Ctrl+C.

Om du vill ha något av det här:

  • Artistbilder och biografier: ta bort raden ND_ENABLEEXTERNALSERVICES=false, och behåll ND_ENABLEINSIGHTSCOLLECTOR=false så att användningsrapporterna förblir avstängda. Då kommer Deezer, ListenBrainz och bakgrundsbilderna tillbaka.
  • Scrobbling, att spara det du spelar i en profil hos Last.fm eller ListenBrainz, kräver också tjänsterna på nätet. ListenBrainz fungerar per användare, med en token från deras ListenBrainz-profil. Last.fm kräver en egen API-nyckel från Last.fm, som ND_LASTFM_APIKEY och ND_LASTFM_SECRET i navidrome.env. Vi testade inte scrobbling.

Kör systemctl --user daemon-reload och systemctl --user restart navidrome som navidrome efter varje ändring.

Navidromes Shares är publika länkar till en låt, ett album eller en spellista, som vem som helst med länken kan spela utan konto. De slutar gälla efter ett år om du inte anger ett annat datum, och sidan Shares listar och tar bort dem.

10. Säkerhetskopiera

Musiken är en kopia av det som finns på din dator, så om du säkerhetskopierar den från servern är ditt val. Navidromes egen data är det inte: användare, lösenord, spellistor, favoriter, betyg och antal spelningar finns i databasen.

Steg 3 gör att Navidrome kopierar sin databas till ~/backup varje natt klockan 03.00 och behåller de sju senaste. För att göra en nu, som navidrome:

podman exec navidrome navidrome backup create
ls ~/backup

Säkerhetskopiera ~/backup, ~/navidrome.env och ~/.config/containers/systemd/navidrome.container. Utan nyckeln i navidrome.env kan ingen logga in i en återställd databas, och tillsammans ger de två tillgång till alla konton, så förvara dem lika säkert som servern. För att få ut dem från servern varje natt använder du restic på de tre, och på ~/music också om du vill ha en kopia av musiken där.

För att återställa en säkerhetskopia, som navidrome, med filnamnet från ls ~/backup:

systemctl --user stop navidrome
podman run --rm -v navidrome-data:/data -v ~/backup:/backup --env-file ~/navidrome.env \
  -e ND_BACKUP_PATH=/backup docker.io/deluan/navidrome:latest \
  backup restore -b navidrome_backup_2026.10.02_17.16.04.db -f
systemctl --user start navidrome

Det slutar med Restore complete. På testservern var en spellista som skapats efter säkerhetskopian borta, och användarna kunde fortfarande logga in, både på webben och via Subsonic-API:t.

11. Uppdateringar

podman-auto-update.timer från steg 3 letar en gång om dagen efter en nyare avbild av Navidrome, startar om containern med den och går tillbaka till den gamla avbilden om den nya inte startar. För att se vad den skulle uppdatera just nu, som navidrome:

podman auto-update --dry-run

UPDATED false betyder att du har den senaste avbilden. Navidrome uppdaterar sin databas själv när en ny version startar. Läs versionsinformationen på Navidromes GitHub-sida då och då, eftersom inställningar ibland byter namn eller tas bort.

Felsökning

Ett album du har laddat upp syns inte. Filerna går inte att läsa för navidrome, och loggen har Skipping unreadable directory. Kör chown-kommandot från steg 6. Om loggen inte visar någonting alls startar du en genomsökning från webbsidan: välj aktivitetsikonen uppe till höger, sicksacklinjen, och sedan de runda pilarna för en snabb genomsökning eller förstoringsglaset för en fullständig.

Alla besökare har serverns egen adress i loggen, och några misslyckade inloggningar stänger ute alla. ND_EXTAUTH_TRUSTEDSOURCES saknas eller innehåller inte serverns IPv4-adress. Kontrollera den med ip -brief address show eth0.

Ingen kan logga in, och loggen visar Password Encryption Key changed! Users won't be able to login!. ND_PASSWORDENCRYPTIONKEY i navidrome.env är inte nyckeln som lösenorden krypterades med, till exempel efter att databasen återställts utan sin navidrome.env. Lägg tillbaka den ursprungliga filen från din säkerhetskopia och starta om Navidrome. På testservern kunde alla logga in igen. Förvara navidrome.env tillsammans med dina säkerhetskopior.

Kör det på din egen server

VC-S Micro

90 kr/mån

vCPU
2
Minne
8 GB
Lagring
250 GB
Trafik
10 TB
Standard
HDD · RAID 10
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider