Det här sätter du upp
Jellyfin är en mediaserver: den samlar dina filmer, din musik och dina hemvideor i ett bibliotek, med omslag, beskrivningar och var du slutade titta, och spelar upp dem i webbläsaren eller i dess appar för mobil och tv. Här körs den som en container under en egen användare som heter jellyfin, bakom Caddy från Podman-guiden. Den är till för media som du har rätt att spela upp: dina egna videor, musik från cd-skivor du äger och fritt licensierade filmer och låtar.
Jellyfin utvecklas av en gemenskap av frivilliga, inte av ett företag, och tar emot donationer via Open Collective, med Open Source Collective som värdorganisation. Den är öppen källkod under GNU GPL 2.0. Den kräver inget konto hos projektet. Däremot hämtar den uppgifter på nätet som standard, och varje sådan källa går att stänga av (steg 10):
- TheMovieDb (TMDB), som drivs av Xperi Inc. i Kalifornien, USA: Jellyfin söker där på filmens titel och år och hämtar omslagsbilder därifrån. Enligt dess integritetspolicy samlar den in IP-adresser.
- MusicBrainz, som drivs av MetaBrainz Foundation, en ideell organisation i Kalifornien: Jellyfin slår upp artister och album. Den loggar IP-adressen, programmets namn och version och vad som slogs upp.
- repo.jellyfin.org, projektets katalog över insticksprogram, vid varje start och en gång om dygnet. I testet skickades anropet vidare till en spegel i Tyskland, på servrar hos DigitalOcean.
Varje steg nedan har körts på en nyinstallerad Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:
- Installationsguiden för första besökaren kördes via en SSH-tunnel. Därefter ledde alla guidens adresser till inloggningssidan från internet, och installations-API:t svarade 401.
- Filmer och musik laddades upp med
rsyncoch SFTP som användarenjellyfin, lästes av containern utan någonchownoch hittades av biblioteksgenomsökningen. En ny fil dök upp av sig själv 60 sekunder efter uppladdningen. - Big Buck Bunny, en film i 1080p H.264 på 9,7 Mbit/s, spelades upp i Chromium utan någon omkodning, och servern var nästan sysslolös.
- Att koda om den till 720p på 4 Mbit/s gick i 2,8 gånger uppspelningshastigheten på båda kärnorna. Två omkodningar samtidigt gick i 1,7 och 1,2 gånger.
- Efter proxyinställningen i steg 5 visade Jellyfins aktivitetslogg besökarnas riktiga IPv4- och IPv6-adresser.
- Med nätkällorna avstängda gjorde en fullständig uppdatering av metadata inga anslutningar utåt.
- Inställningar och databas säkerhetskopierades och återställdes, och allt startade igen av sig självt efter en omstart av servern.
Jellyfin använde omkring 130 till 200 MB minne i vila, 435 MB när den kodade om en film och 630 MB när den kodade om två. Testfilmerna var Blender Foundations öppna filmer (Big Buck Bunny, Sintel och Tears of Steel, CC BY) och soundtracket till Tears of Steel av Joram Letwory (CC BY-ND).
Innan du börjar
Du behöver:
- en server som är säkrad och uppsatt som i Podman-guiden, med Caddy igång;
- en A-post och en AAAA-post för
jelly.example.comsom pekar på din server; - tillräckligt med disk för dina media. Biblioteket tar lika mycket plats som filerna du laddar upp, och Jellyfins image ytterligare 1,7 GB, så diskstorleken i ditt paket sätter gränsen för hur stort biblioteket kan bli (steg 11).
Exemplen använder jelly.example.com för Jellyfin och 203.0.113.10 för serverns IPv4-adress, som ip -brief address show eth0 visar. Byt ut dem genomgående.
1. Skapa användaren
Som root:
apt install -y rsync
useradd -m -s /bin/bash jellyfin
loginctl enable-linger jellyfin
rsync används för att ladda upp media i steg 6. För att ladda upp som jellyfin med samma SSH-nyckel som du använder för root, kopiera roots nyckelfil till användaren:
install -d -m 700 -o jellyfin -g jellyfin /home/jellyfin/.ssh
install -m 600 -o jellyfin -g jellyfin /root/.ssh/authorized_keys /home/jellyfin/.ssh/
Byt sedan till användaren:
machinectl shell jellyfin@
Allt fram till steg 4 körs som jellyfin.
2. Definiera containern
mkdir -p ~/.config/containers/systemd ~/jellyfin/config ~/jellyfin/cache ~/media/movies ~/media/music
echo "media-$(openssl rand -hex 8)"
Det andra kommandot skriver ut ett slumpat namn, till exempel media-3c9f0a7d1e5b2846. Skapa ~/.config/containers/systemd/jellyfin.container, med ditt namn i /media-...-delen på den tredje Volume=-raden:
[Unit]
Description=Jellyfin media server
[Container]
ContainerName=jellyfin
Image=docker.io/jellyfin/jellyfin:12
# Only Caddy, on this server, can reach Jellyfin: the port is not open to the internet.
PublishPort=127.0.0.1:8113:8096
Volume=%h/jellyfin/config:/config
Volume=%h/jellyfin/cache:/cache
Volume=%h/media:/media-3c9f0a7d1e5b2846:ro
Environment=TZ=Europe/Stockholm
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
Vad raderna gör:
~/jellyfin/configinnehåller databasen, inställningarna och hämtade omslag, och~/jellyfin/cachebilderna och den omkodade video som Jellyfin skapar medan du tittar.~/mediaär ditt bibliotek. Det monteras skrivskyddat,:ro, så Jellyfin kan läsa dina filer men inte ändra eller radera dem.- Det slumpade katalognamnet behövs av ett skäl. Jellyfin spelar upp en video för den som har dess objekt-id, utan inloggning, och ett objekt-id räknas fram ur filens sökväg i containern, så det går att räkna ut från titeln på en känd film. Testat: med
/media/movies/Big Buck Bunny (2008)/Big Buck Bunny (2008).movgick id:t som räknades fram ur sökvägen att spela upp utan inloggning. Med det slumpade katalognamnet kan ingen räkna fram det. Välj namnet nu: byter du det senare får alla objekt nya id:n. - Taggen
12håller Jellyfin på den senaste 12.x-versionen.
Starta den:
systemctl --user daemon-reload
systemctl --user start jellyfin
systemctl --user enable --now podman-auto-update.timer
Den första starten laddar ner imagen, omkring 1,7 GB, och tar under en minut.
3. Kör installationsguiden via en SSH-tunnel
Tills guiden är klar låter Jellyfin den som först öppnar den skapa administratörskontot. Gör det därför innan Caddy gör den nåbar, via en SSH-tunnel. På din egen dator:
ssh -L 8096:127.0.0.1:8113 root@203.0.113.10
Låt den vara öppen och öppna http://localhost:8096 i webbläsaren. Det går direkt till Jellyfin, inte via internet. Guiden frågar efter:
- Server name, som apparna visar, och Preferred display language. Välj Next.
- Username, Password och Password (confirm) för administratörskontot. Använd ett långt lösenord: det här kontot kan ändra allt.
- Set up your media libraries: hoppa över med Next, steg 7 lägger till biblioteken.
- Preferred Metadata Language och Country/Region, för titlar och beskrivningar.
- Configure Remote Access: låt Allow remote connections to this server vara ikryssad. Via Caddy är varje besökare en fjärranslutning.
Välj Finish och logga in. Stäng sedan tunneln.
4. Sätt Caddy framför
Gå tillbaka till root med exit, byt till machinectl shell caddy@ och lägg till det här blocket sist i ~/Caddyfile:
jelly.example.com {
reverse_proxy 127.0.0.1:8113
}
Starta om Caddy med systemctl --user restart caddy och skriv exit. Öppna https://jelly.example.com: den visar Please sign in, och guidens adresser leder också dit.
5. Låt Jellyfin lita på Caddy
Logga in på https://jelly.example.com, öppna menyn, Dashboard och sedan Networking:
- Known proxies:
203.0.113.10, serverns egen IPv4-adress. Caddys anslutningar når containern från den adressen, och först när den står här läser Jellyfin besökarens riktiga adress ur headernX-Forwarded-Forsom Caddy skickar. - Published Server URI:
https://jelly.example.com. Jellyfin ger då apparna den här adressen i stället för sin adress inne i containern.
Välj Save. Proxyinställningen gäller efter en omstart. Som jellyfin (machinectl shell jellyfin@):
systemctl --user restart jellyfin
Kontrollera under Dashboard, Activity. Före ändringen kom varje inloggning från 203.0.113.10. Efter den visar inloggningar besökarens egen adress, IPv4 eller IPv6, och det gör misslyckade inloggningar också.
6. Ladda upp dina media
Lägg filmer i ~/media/movies, en katalog per film med titel och år i namnet, och musik i ~/media/music, i kataloger för artist och album:
media/
├── movies/
│ └── Big Buck Bunny (2008)/
│ └── Big Buck Bunny (2008).mov
└── music/
└── Joram Letwory/
└── Tears of Steel OST/
├── 01 40 years later.mp3
└── 02 The dome.mp3
Jellyfin hittar en films beskrivning och omslag utifrån titeln och året i katalognamnet. Dess dokumentation beskriver namngivningen för tv-serier och andra typer.
Ladda upp som jellyfin, aldrig som root. Från din egen dator med rsync, som kan fortsätta där den avbröts och bara skickar det som ändrats:
rsync -av --progress ~/Videos/Movies/ jellyfin@203.0.113.10:media/movies/
Eller med valfritt SFTP-program, till exempel FileZilla eller WinSCP: logga in som jellyfin med din SSH-nyckel och ladda upp till media. I testet flyttade rsync 395 MB från en kontorsuppkoppling på 38 sekunder.
Därför spelar användaren roll: root i containern är jellyfin utanför den, så filer som jellyfin äger tillhör root i containern, och Jellyfin kan läsa dem. Som jellyfin visar podman unshare filerna så som containern ser dem:
podman unshare ls -ln ~/media
Ägaren visas som 0, root. Kopierar du in filer som root på servern, ge dem till jellyfin efteråt med chown -R jellyfin:jellyfin /home/jellyfin/media, som root.
7. Lägg till dina bibliotek
Under Dashboard, Libraries, välj Add Media Library:
- Content type: Movies. Display name:
Movies. - Under Folders, välj knappen + och skriv katalogen så som containern ser den,
/media-3c9f0a7d1e5b2846/moviesmed ditt slumpade namn. Välj OK. - Välj OK för att skapa biblioteket.
Gör likadant med Music och /media-3c9f0a7d1e5b2846/music. Jellyfin söker igenom katalogerna direkt. Enable real time monitoring är på, så nya filer dyker upp ungefär en minut efter uppladdningen; Scan All Libraries på samma sida söker igenom allt direkt.
8. Titta, och vad 2 vCPU klarar
Jellyfin spelar upp en fil på ett av två sätt:
- Direktuppspelning (direct play): filen skickas som den är, och din enhet avkodar den. Det kostar servern nästan ingenting. Big Buck Bunny, 1080p H.264 med AAC-ljud på 9,7 Mbit/s, spelades upp så i Chromium.
- Omkodning (transcoding): när enheten inte kan spela formatet, eller du väljer lägre kvalitet, kodar Jellyfin om videon med ffmpeg medan du tittar. Utan grafikkort gör processorn allt arbete.
Uppmätt på 2 vCPU utan GPU:
| Uppspelning | ffmpeg-hastighet | Belastning på servern |
|---|---|---|
| 1080p H.264, direktuppspelning | ingen | nästan sysslolös |
| Sintel, H.264-video med AC3-ljud som webbläsaren inte kan spela | 15,8× | bara ljudet omkodat |
| 1080p H.264 omkodad till 720p på 4 Mbit/s | 2,8× | båda kärnorna fullt belastade |
| två sådana omkodningar samtidigt | 1,7× och 1,2× | båda kärnorna fullt belastade |
En hastighet över 1× hinner med uppspelningen. Den här servern kodar alltså om en film i 1080p med god marginal och två precis på gränsen; tre testades inte. Filer i 4K och HEVC testades inte.
Undvik omkodning genom att hålla kvaliteten på högsta nivån i varje spelare. I webbspelaren väljer du inställningsknappen medan en video spelas och sedan Quality: Auto spelar originalet när uppkopplingen räcker, och ett fast värde som 4 Mbps gör att servern kodar om. Apparna har en egen kvalitetsinställning, som inte testades här. Varje omkodning skriver en logg i ~/jellyfin/config/log: FFmpeg.Transcode-... när videon kodades om, FFmpeg.DirectStream-... när bara ljudet eller filformatet gjorde det. Hastigheten som den senaste nådde ser du som jellyfin med:
grep -o "speed=[ 0-9.x]*" "$(ls -t ~/jellyfin/config/log/FFmpeg.* | head -1)" | tail -1
Omkodad video skrivs till ~/jellyfin/cache/transcodes, och Jellyfin raderar den vid varje start och en gång om dygnet.
9. Använd apparna
Jellyfin har appar för Android, iPhone och iPad, Android TV och andra tv-apparater. Ange https://jelly.example.com som server i appen och logga in. Ge familjen egna konton under Dashboard, Users, så har alla sina egna framsteg och favoriter. Apparna testades inte för den här guiden.
10. Välj vad den hämtar från nätet
Varje bibliotek väljer sina egna källor på nätet. Under Dashboard, Libraries, välj ett bibliotek och kryssa ur det du inte vill ha:
- under Metadata downloaders (Movies): TheMovieDb och The Open Movie Database;
- under Image fetchers (Movies): samma två. Embedded Image Extractor och Screen Grabber arbetar med dina egna filer;
- i ett musikbibliotek MusicBrainz och TheAudioDB (bara filmbiblioteket testades).
Välj OK. Ändringen gäller nya filer; för dem som redan finns i biblioteket uppdaterar du metadata. I testet, efter att båda kryssats ur för filmbiblioteket, gjorde en fullständig uppdatering av alla filmer ingen anslutning utåt. Filmerna visar då titeln från katalognamnet, utan beskrivning och omslag.
Katalogen över insticksprogram är en lista på sidan Plugins: öppna Manage Repositories och ta bort Jellyfin Stable. I testet gjorde Jellyfin därefter inga uppslag vid start. Du kan då inte längre installera eller uppdatera insticksprogram från katalogen. De som följer med Jellyfin, som TMDb och MusicBrainz, ingår i imagen och uppdateras med den.
Under hela testet kontaktade Jellyfin inget annat än de tre tjänsterna i inledningen. The Open Movie Database och TheAudioDB var aktiverade men kontaktades inte.
11. Diskutrymme
Dina media tar den plats de tar: Jellyfin behåller filerna som de är. Jellyfins egna data var små: 11 MB i ~/jellyfin/config för tre filmer och ett album, plus omslag när biblioteket växer. Imagen tar 1,7 GB. Se vad som används och vad som är kvar, som root:
df -h /
du -sh /home/jellyfin/media /home/jellyfin/jellyfin
Dashboard visar också disken under Paths. När disken blir full kan Jellyfin inte skriva till sin databas eller spara omkodad video, så lämna några gigabyte lediga. Biblioteket kan aldrig bli större än disken i ditt paket.
12. Säkerhetskopiera
Det du inte kan få tillbaka finns i ~/jellyfin/config: användare, lösenord, var ni slutade titta, inställningar och biblioteksdatabasen. Som jellyfin, stoppa Jellyfin för att få en konsekvent kopia:
mkdir -p ~/backup
systemctl --user stop jellyfin
tar -czf ~/backup/jellyfin-config.tar.gz -C ~/jellyfin config
systemctl --user start jellyfin
Det tog under två sekunder i testet, och arkivet blev 9,7 MB. För att återställa: stoppa Jellyfin, flytta undan ~/jellyfin/config, packa upp arkivet med tar -xzf ~/backup/jellyfin-config.tar.gz -C ~/jellyfin och starta igen. Testat: administratörsinloggningen och båda biblioteken var tillbaka.
Dashboard, Backups, Create Backup gör också en säkerhetskopia av databasen, som en zip-fil i ~/jellyfin/config/data/backups, som arkivet ovan redan innehåller.
Kopiera arkivet bort från servern, till exempel med säkerhetskopior med restic. Om du också säkerhetskopierar ~/media väljer du själv: finns originalen på din egen dator kan du ladda upp dem igen.
13. Håll den uppdaterad
podman-auto-update.timer från steg 2 hämtar nya 12.x-images en gång om dygnet och startar om Jellyfin. Se om en uppdatering väntar, som jellyfin:
podman auto-update --dry-run
Taggen 12 följer bara 12.x-versioner, så en ny huvudversion kommer aldrig av sig själv. För att byta till en, läs dess versionsinformation, gör en säkerhetskopia som i steg 12 och ändra taggen i jellyfin.container. Kör sedan systemctl --user daemon-reload och systemctl --user restart jellyfin.
Felsökning
Ett bibliotek är tomt efter att du lagt till det. I testet hittade musikbiblioteket, som lades till direkt efter filmbiblioteket, ingenting vid första genomsökningen. Scan All Libraries under Dashboard, Libraries hittade albumet.
En ny fil dyker inte upp. Övervakningen i realtid väntar ungefär 60 sekunder efter en ändring. Kontrollera att filen ligger i rätt katalog och ägs av jellyfin (steg 6).
Aktivitetsloggen visar 203.0.113.10 för varje inloggning. Known proxies saknas, eller så har Jellyfin inte startats om efter ändringen (steg 5).
En film hackar eller buffrar hela tiden. Leta i ~/jellyfin/config/log efter en ny FFmpeg.Transcode-...-logg: finns den kodar servern om filmen, och kommandot i steg 8 visar om hastigheten höll sig över 1×. Ställ spelarens kvalitet på Auto, eller använd en spelare som kan spela formatet.