From 4b0faf4da1a6bbbf7c4e0ad1bba3af327046a180 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:52:05 -0500 Subject: [PATCH] unify hardware acceleration in docker (#2045) --- CHANGELOG.md | 4 ++++ .../Checks/IUnifiedDockerHealthCheck.cs | 5 ++++ .../Health/Checks/UnifiedDockerHealthCheck.cs | 23 +++++++++++++++++++ .../Health/HealthCheckService.cs | 4 +++- ErsatzTV/Startup.cs | 1 + docker/Dockerfile | 1 + docker/nvidia/Dockerfile | 2 +- docker/vaapi/Dockerfile | 2 +- 8 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs create mode 100644 ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 596aa806..3c4b8548 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Upgrade VAAPI docker image Ubuntu base from 22 to 24; bundled ffmpeg from 6.1 to 7.1.1 - Upgrade NVIDIA docker image Ubuntu base from 20 to 24; bundled ffmpeg from 6.1 to 7.1.1 - Upgrade base, arm, arm64 docker images bundled ffmpeg from 6.1 to 7.1.1 +- Unify all hardware acceleration methods in base docker images (`latest` and `develop`) + - VAAPI, QSV and NVIDIA are now all supported in the base docker image + - Other docker image tags are deprecated and will receive no new updates after the next release + - A health check has been added to notify users (on `-vaapi` or `-nvidia` tags) of this change ### Fixed - Fix error message about synchronizing Plex collections from a Plex server that has zero collections diff --git a/ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs b/ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs new file mode 100644 index 00000000..35e3289a --- /dev/null +++ b/ErsatzTV.Core/Health/Checks/IUnifiedDockerHealthCheck.cs @@ -0,0 +1,5 @@ +namespace ErsatzTV.Core.Health.Checks; + +public interface IUnifiedDockerHealthCheck : IHealthCheck +{ +} diff --git a/ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs b/ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs new file mode 100644 index 00000000..4a0f076e --- /dev/null +++ b/ErsatzTV.Infrastructure/Health/Checks/UnifiedDockerHealthCheck.cs @@ -0,0 +1,23 @@ +using System.Reflection; +using ErsatzTV.Core.Health; +using ErsatzTV.Core.Health.Checks; + +namespace ErsatzTV.Infrastructure.Health.Checks; + +public class UnifiedDockerHealthCheck : BaseHealthCheck, IUnifiedDockerHealthCheck +{ + private static readonly string InfoVersion = Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "unknown"; + + public override string Title => "Unified Docker"; + + public Task<HealthCheckResult> Check(CancellationToken cancellationToken) + { + if (InfoVersion.Contains("docker-vaapi") || InfoVersion.Contains("docker-nvidia")) + { + return WarningResult("VAAPI and NVIDIA docker tag suffixes are deprecated; please remove `-vaapi` or `-nvidia` and pull the default image.") + .AsTask(); + } + + return NotApplicableResult().AsTask(); + } +} diff --git a/ErsatzTV.Infrastructure/Health/HealthCheckService.cs b/ErsatzTV.Infrastructure/Health/HealthCheckService.cs index 7e45d8ef..75b68d4e 100644 --- a/ErsatzTV.Infrastructure/Health/HealthCheckService.cs +++ b/ErsatzTV.Infrastructure/Health/HealthCheckService.cs @@ -21,12 +21,14 @@ public class HealthCheckService : IHealthCheckService IUnavailableHealthCheck unavailableHealthCheck, IVaapiDriverHealthCheck vaapiDriverHealthCheck, IErrorReportsHealthCheck errorReportsHealthCheck, + IUnifiedDockerHealthCheck unifiedDockerHealthCheck, ILogger<HealthCheckService> logger) { _logger = logger; _checks = [ macOsConfigFolderHealthCheck, + unifiedDockerHealthCheck, ffmpegVersionHealthCheck, ffmpegReportsHealthCheck, hardwareAccelerationHealthCheck, @@ -36,7 +38,7 @@ public class HealthCheckService : IHealthCheckService fileNotFoundHealthCheck, unavailableHealthCheck, vaapiDriverHealthCheck, - errorReportsHealthCheck + errorReportsHealthCheck, ]; } diff --git a/ErsatzTV/Startup.cs b/ErsatzTV/Startup.cs index 84cb3d30..9fb3e7f3 100644 --- a/ErsatzTV/Startup.cs +++ b/ErsatzTV/Startup.cs @@ -649,6 +649,7 @@ public class Startup services.AddScoped<IUnavailableHealthCheck, UnavailableHealthCheck>(); services.AddScoped<IVaapiDriverHealthCheck, VaapiDriverHealthCheck>(); services.AddScoped<IErrorReportsHealthCheck, ErrorReportsHealthCheck>(); + services.AddScoped<IUnifiedDockerHealthCheck, UnifiedDockerHealthCheck>(); services.AddScoped<IHealthCheckService, HealthCheckService>(); services.AddScoped<IChannelRepository, ChannelRepository>(); diff --git a/docker/Dockerfile b/docker/Dockerfile index 70dc7cc8..07987c50 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -45,4 +45,5 @@ WORKDIR /app COPY --from=build /app ./ ENV ETV_CONFIG_FOLDER=/config ENV ETV_TRANSCODE_FOLDER=/transcode +ENV ETV_DISABLE_VULKAN=1 ENTRYPOINT ["./ErsatzTV"] diff --git a/docker/nvidia/Dockerfile b/docker/nvidia/Dockerfile index 2d7b0647..07987c50 100644 --- a/docker/nvidia/Dockerfile +++ b/docker/nvidia/Dockerfile @@ -1,6 +1,6 @@ FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble-amd64 AS dotnet-runtime -FROM jasongdove/ersatztv-ffmpeg:7.1.1-nvidia AS runtime-base +FROM jasongdove/ersatztv-ffmpeg:7.1.1 AS runtime-base COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet # https://hub.docker.com/_/microsoft-dotnet diff --git a/docker/vaapi/Dockerfile b/docker/vaapi/Dockerfile index cd613ee0..ce022efd 100644 --- a/docker/vaapi/Dockerfile +++ b/docker/vaapi/Dockerfile @@ -1,6 +1,6 @@ FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble-amd64 AS dotnet-runtime -FROM jasongdove/ersatztv-ffmpeg:7.1.1-vaapi AS runtime-base +FROM jasongdove/ersatztv-ffmpeg:7.1.1 AS runtime-base COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet # https://hub.docker.com/_/microsoft-dotnet