Eure Erfahrungen mit Jellyfin? / "It's always DNS" für mich

gadean

Depp vom Dienst!
Hey zusammen,
ich spiele aktuell mit Jellyfin (open-source media server) rum und bin - abgesehen von einem Problem - sehr zufrieden damit.

FreeBSD: 14.3-RELEASE-p2 (nur IPv4 konfiguriert/aktiv)
Jellyfin: 10.10.7 (latest)

Für die Metadaten/Bilder/etc. werden verschiedene Endpunkte angesprochen (zB. TheMovieDB/Open Movie Database/TheTVDB) und genau dort renne ich in Probleme.
In (geschätzt) 9 von 10 Versuchen bekomme ich keine Informationen und im Log finde ich den Klassiker: Name does not resolve
Blöd nur, das wenn ich auf dem Host das ganze teste, funktioniert es - zur Sicherheit habe ich aber auch mal andere DNS-Server konfiguriert, mit dem gleichen Ergebnis.
Nach mehrfachen kompletten Neustarts und/oder Service Neustart, funktioniert es gelegentlich für eine weile.

Benutzt einer von euch Jellyfin unter FreeBSD?
Habt Ihr dort ähnliche Probleme oder funktioniert es einwandfrei?
Ich hab es zusätzliche auf einem Debian probiert und dort läuft es ohne Probleme.

Log:
Code:
[2025-08-28 21:09:29.926 +02:00] [ERR] [8] MediaBrowser.Providers.Manager.ProviderManager: Provider "TheMovieDb" failed to retrieve search results
System.Net.Http.HttpRequestException: Name does not resolve (api.themoviedb.org:443)
 ---> System.Net.Sockets.SocketException (0xFFFDFFFF): Name does not resolve
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|285_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at TMDbLib.Rest.RestRequest.SendInternal(HttpMethod method, CancellationToken cancellationToken)
   at TMDbLib.Rest.RestRequest.Get[T](CancellationToken cancellationToken)
   at TMDbLib.Rest.RestRequestExtensions.GetOfT[T](RestRequest request, CancellationToken cancellationToken)
   at TMDbLib.Client.TMDbClient.GetConfigAsync()
   at MediaBrowser.Providers.Plugins.Tmdb.TmdbClientManager.EnsureClientConfigAsync()
   at MediaBrowser.Providers.Plugins.Tmdb.TmdbClientManager.SearchSeriesAsync(String name, String language, Int32 year, CancellationToken cancellationToken)
   at MediaBrowser.Providers.Plugins.Tmdb.TV.TmdbSeriesProvider.GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
   at MediaBrowser.Providers.Manager.ProviderManager.GetRemoteSearchResults[TItemType,TLookupType](RemoteSearchQuery`1 searchInfo, BaseItem referenceItem, CancellationToken cancellationToken)
[2025-08-28 21:09:29.994 +02:00] [ERR] [8] MediaBrowser.Providers.Manager.ProviderManager: Provider "The Open Movie Database" failed to retrieve search results
System.Net.Http.HttpRequestException: Name does not resolve (www.omdbapi.com:443)
 ---> System.Net.Sockets.SocketException (0xFFFDFFFF): Name does not resolve
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|285_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
   at Jellyfin.Networking.HappyEyeballs.HttpClientExtension.AttemptConnection(AddressFamily addressFamily, SocketsHttpConnectionContext context, CancellationToken cancellationToken)
   at Jellyfin.Networking.HappyEyeballs.HttpClientExtension.OnConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at MediaBrowser.Providers.Plugins.Omdb.OmdbItemProvider.GetSearchResultsInternal(ItemLookupInfo searchInfo, Boolean isSearch, CancellationToken cancellationToken)
   at MediaBrowser.Providers.Manager.ProviderManager.GetRemoteSearchResults[TItemType,TLookupType](RemoteSearchQuery`1 searchInfo, BaseItem referenceItem, CancellationToken cancellationToken)
[2025-08-28 21:09:30.043 +02:00] [ERR] [19] Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider: No series results found for "showname"
System.Net.Http.HttpRequestException: Name does not resolve (api4.thetvdb.com:443)
 ---> System.Net.Sockets.SocketException (0xFFFDFFFF): Name does not resolve
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|285_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at Tvdb.Sdk.LoginClient.LoginAsync(Body body, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.LoginAsync()
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetSeriesByNameAsync(String name, String language, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider.FindSeriesInternal(String name, String language, CancellationToken cancellationToken)

DNS Tests
Code:
[gadean@jellyfin ~]$ host api.themoviedb.org
api.themoviedb.org has address 99.84.152.8
api.themoviedb.org has address 99.84.152.85
api.themoviedb.org has address 99.84.152.53
api.themoviedb.org has address 99.84.152.32
api.themoviedb.org has IPv6 address 2600:9000:20e8:400:c:174a:c400:93a1
api.themoviedb.org has IPv6 address 2600:9000:20e8:7600:c:174a:c400:93a1
api.themoviedb.org has IPv6 address 2600:9000:20e8:8000:c:174a:c400:93a1
api.themoviedb.org has IPv6 address 2600:9000:20e8:6a00:c:174a:c400:93a1
api.themoviedb.org has IPv6 address 2600:9000:20e8:1c00:c:174a:c400:93a1
api.themoviedb.org has IPv6 address 2600:9000:20e8:2e00:c:174a:c400:93a1
api.themoviedb.org has IPv6 address 2600:9000:20e8:4000:c:174a:c400:93a1
api.themoviedb.org has IPv6 address 2600:9000:20e8:5000:c:174a:c400:93a1

[gadean@jellyfin ~]$ host www.omdbapi.com
www.omdbapi.com has address 104.20.34.121
www.omdbapi.com has address 172.66.150.8
www.omdbapi.com has IPv6 address 2606:4700:10::6814:2279
www.omdbapi.com has IPv6 address 2606:4700:10::ac42:9608

[gadean@jellyfin ~]$ host api4.thetvdb.com
api4.thetvdb.com has address 18.244.18.75
api4.thetvdb.com has address 18.244.18.100
api4.thetvdb.com has address 18.244.18.37
api4.thetvdb.com has address 18.244.18.72

Nachtrag:
Aus "Spaß" habe ich mal mit tcpdump port 53 geschaut, dort tauchen keine Abfragen im Fehlerfall auf.
 
Zuletzt bearbeitet:
Hast du das in einer jail?
Geht netcat?

Code:
mr44er@ws01:~ $ nc -zv api.themoviedb.org 443
Connection to api.themoviedb.org 443 port [tcp/https] succeeded!
mr44er@ws01:~ $ nc -zv www.omdbapi.com 443
Connection to www.omdbapi.com 443 port [tcp/https] succeeded!
mr44er@ws01:~ $ nc -zv api4.thetvdb.com 443
Connection to api4.thetvdb.com 443 port [tcp/https] succeeded!
 
Java/JVMs haben so eine Marotte Daten zum Resolving (/etc/{resolv.conf,nsswitch.conf,hosts}...) nur
einmal beim startup zu lesen und dann steht das bis zum naechsten restart fix in der runtime.

Solltest Du da also Wechsel drin haben, koennten die ignoriert werden.

Das fehlende resolving (via port 53) ist natuerlich ... fishy :) ... Zeug wie dns-over-https am Start?
 
@mr44er Ne das läuft direkt so aufem Host, ohne Jail.
netcat habe ich nicht probiert, aber host für den DNS-Lookup und curl für nen HTTP-Request - beides funktionierte.

@double-p Das ist dotnet/C#, aber alleine daran sollte es nicht liegen.
Habe selbst mehrere Anwendung in C# geschrieben, die seit Jahren unter FreeBSD ohne Probleme 24/7 laufen.
Denke es ist eher die Kombination, da der HttpClient in dotnet etwas eigen ist und unterschiedlich instanziiert werden kann.
(Werde heute Abend mal auf der Machine eine eigene kleine Anwendung ausführen und die Endpunkt ansprechen)

Jop, wenn es funktioniert, tauchen die Abfragen/Antworten im tcpdump auf, also sehr merkwürdig :confused:
 
Ok, aktuell habe ich keine Ahnung was ich noch testen könnte

DNS-over-HTTPS
Kann ich so weit ausschließen, hab mit tcpdump mal geschaut was auf Port 80/443 passiert: nichts in dem Kontext

Meine C# Testanwendung kann die Endpunkte erreichen - parallel in Jellyfin funktioniert es nicht

Jage ich den gesamten HTTPS-Traffic durch ein Proxy (HTTPS_PROXY=http://192.168.178.61) funktioniert es - da werden die DNS Abfragen aber auch nicht auf dem FreeBSD-Host aufgelöst, sondern auf der anderen Maschine wo der Proxy läuft.

IPv6 Probleme?
Kann ich ausschließen, hatte ich für den letzten Test im gesamten Netzwerk deaktiviert und alles neugestartet.
Würde mich aber auch wundern, dann hätte ich etwas in tcpdump sehen müssen.
 
Kann es sein, dass in der Anwendung einfach sehr aggressive DNS timeouts konfiguriert sind? Hatte mal nen Kunden der irgendwo 0,1 sek hinterlegt hatte. Ging meistens, aber …
 
Ne ist auch meines Wissens nach nicht möglich, was es gibt, ist die Lifetime vom darunter liegenden "Pool", aber wenn die nicht passt hast du andere Probleme.

Zum Beispiel das auf alte - aus dem Cache - "DNS Ergebnisse" zugegriffen wird und so die Verbindung zu einem nicht mehr gültigen Host versucht wird herzustellen.

1. HttpClient stellt Anfrage zu zu google.com und legt dns.google = 8.8.8.8 im Cache "ab"
2. Google ändert den DNS-Record dns.google = 8.8.4.4
3. HttpClient will erneute eine Anfrage zu dns.google herstellen und verwendet 8.8.8.8 anstelle von 8.8.4.4

---

Edit:
Hm ...
Trage ich die IPs in /etc/hosts ein, funktioniert es.
Trage ich die IPs im DNS-Server meiner Firewall ein, funktioniert es ebenfalls und ich sehe die Abfragen/Antworten in tcpdump

Also /etc/hosts kann ich noch irgendwie verstehen und man könnte sagen "Ok, der DNS-Server brauch eventuell zu lange zum antworten" - wobei dann müsste ich doch zumindest die Abfrage in tcpdump sehen? Aber das "IP im DNS-Server" hinterlegen? Das versteh ich nu gar nicht mehr.
 
Zuletzt bearbeitet:
@double-p Tatsächlich nicht, habe es gerade damit ausprobiert - macht keinen Unterschied

@mr44er Knapp daneben :P
Ist keine Fritzbox, sondern ein selbst gebauter mit pfSense.
Die hatte ich schon neugestartet + alle anderen Netzwerkgeräte - um alles an IPv6 zu deaktivieren.
 
Wohl wahr.
Um nicht in so eine Falle zu laufen, hatte ich temporär ein externen DNS-Server auf dem Host eingetragen.
 
Also /etc/hosts kann ich noch irgendwie verstehen und man könnte sagen "Ok, der DNS-Server brauch eventuell zu lange zum antworten" - wobei dann müsste ich doch zumindest die Abfrage in tcpdump sehen? Aber das "IP im DNS-Server" hinterlegen? Das versteh ich nu gar nicht mehr.
Wie ist der Inhalt der zuständigen nsswitch.conf?
Code:
cat /etc/nsswitch.conf
?

EDIT:

Wie sind die Ausgaben von:
Code:
nc -zvn 8.8.8.8 53
nc -zvn 8.8.8.8 853
?
 
Code:
[gadean@jellyfin ~]$ cat /etc/nsswitch.conf
#
# nsswitch.conf(5) - name service switch configuration file
#
group: compat
group_compat: nis
hosts: files dns
netgroup: compat
networks: files
passwd: compat
passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files

Code:
[gadean@jellyfin ~]$ nc -zvn 8.8.8.8 53
Connection to 8.8.8.8 53 port [tcp/*] succeeded!
[gadean@jellyfin ~]$ nc -zvn 8.8.8.8 853
Connection to 8.8.8.8 853 port [tcp/*] succeeded!
[gadean@jellyfin ~]$ nc -zvn 192.168.178.1 53
Connection to 192.168.178.1 53 port [tcp/*] succeeded!
 
Zurück
Oben