diff --git a/Dockerfile b/Dockerfile index 1af76d4..3d59866 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 -FROM ghcr.io/linuxserver/baseimage-ubuntu:jammy +FROM ghcr.io/linuxserver/baseimage-ubuntu:noble # set version label ARG BUILD_DATE @@ -14,7 +14,6 @@ ARG DEBIAN_FRONTEND="noninteractive" # add needed nvidia environment variables for https://github.com/NVIDIA/nvidia-docker ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility" -# install packages RUN \ echo "**** install emby ****" && \ mkdir -p \ @@ -31,9 +30,12 @@ RUN \ mv -t \ /app/emby/ \ /tmp/emby/opt/emby-server/* && \ + printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \ echo "**** cleanup ****" && \ rm -rf \ - /tmp/* + /tmp/* \ + /var/lib/apt/lists/* \ + /var/tmp/* # add local files COPY root/ / diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 3708133..8380b36 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 -FROM ghcr.io/linuxserver/baseimage-ubuntu:arm64v8-jammy +FROM ghcr.io/linuxserver/baseimage-ubuntu:arm64v8-noble # set version label ARG BUILD_DATE @@ -16,8 +16,6 @@ ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility" RUN \ echo "**** add emby deps *****" && \ - curl -s https://keyserver.ubuntu.com/pks/lookup?op=get\&search=0x6587ffd6536b8826e88a62547876ae518cbcf2f2 | gpg --dearmor | tee /usr/share/keyrings/raspbins.gpg >/dev/null && \ - echo "deb [signed-by=/usr/share/keyrings/raspbins.gpg] http://ppa.launchpad.net/ubuntu-raspi2/ppa-nightly/ubuntu focal main">> /etc/apt/sources.list.d/raspbins.list && \ apt-get update && \ apt-get install -y --no-install-recommends \ libomxil-bellagio0 \ @@ -38,6 +36,7 @@ RUN \ mv -t \ /app/emby/ \ /tmp/emby/opt/emby-server/* && \ + printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \ echo "**** cleanup ****" && \ rm -rf \ /tmp/* \ diff --git a/Jenkinsfile b/Jenkinsfile index bd03c81..daf02e3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -33,8 +33,8 @@ pipeline { CI_PORT='8096' CI_SSL='false' CI_DELAY='120' - CI_DOCKERENV='TZ=US/Pacific' - CI_AUTH='user:password' + CI_DOCKERENV='' + CI_AUTH='' CI_WEBPATH='' } stages { diff --git a/README.md b/README.md index 7692e14..4b4d657 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Find us at: [Emby](https://emby.media/) organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server. -[![emby](https://emby.media/community/uploads/inline/3/55626b855503c_logo800.png)](https://emby.media/) +[![emby](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/emby-logo.png)](https://emby.media/) ## Supported Architectures @@ -72,35 +72,55 @@ Webui can be found at `http://:8096` Emby has very complete and verbose documentation located [here](https://github.com/MediaBrowser/Wiki/wiki) . -Hardware acceleration users for Intel Quicksync and AMD VAAPI will need to mount their /dev/dri video device inside of the container by passing the following command when running or creating the container: +### Hardware Acceleration Enhancements -```--device=/dev/dri:/dev/dri``` +This section lists the enhancements we have made for hardware acceleration in this image specifically. -We will automatically ensure the abc user inside of the container has the proper permissions to access this device. +#### OpenMAX (Raspberry Pi) -Hardware acceleration users for Nvidia will need to install the container runtime provided by Nvidia on their host, instructions can be found here: +Hardware acceleration users for Raspberry Pi MMAL/OpenMAX will need to mount their `/dev/vcsm` and `/dev/vchiq` video devices inside of the container and their system OpenMax libs by passing the following options when running or creating the container: -https://github.com/NVIDIA/nvidia-docker - -We automatically add the necessary environment variable that will utilise all the features available on a GPU on the host. Once nvidia-docker is installed on your host you will need to re/create the docker container with the nvidia container runtime `--runtime=nvidia` and add an environment variable `-e NVIDIA_VISIBLE_DEVICES=all` (can also be set to a specific gpu's UUID, this can be discovered by running `nvidia-smi --query-gpu=gpu_name,gpu_uuid --format=csv` ). NVIDIA automatically mounts the GPU and drivers from your host into the emby docker. - -### OpenMAX (Raspberry Pi) - -Hardware acceleration users for Raspberry Pi OpenMAX will need to mount their /dev/vchiq video device inside of the container and their system OpenMax libs by passing the following options when running or creating the container: -``` +```text +--device=/dev/vcsm:/dev/vcsm --device=/dev/vchiq:/dev/vchiq -v /opt/vc/lib:/opt/vc/lib ``` -### V4L2 (Raspberry Pi) +#### V4L2 (Raspberry Pi) -Hardware acceleration users for Raspberry Pi V4L2 will need to mount their /dev/video1X devices inside of the container by passing the following options when running or creating the container: -``` +Hardware acceleration users for Raspberry Pi V4L2 will need to mount their `/dev/video1X` devices inside of the container by passing the following options when running or creating the container: + +```text --device=/dev/video10:/dev/video10 --device=/dev/video11:/dev/video11 --device=/dev/video12:/dev/video12 ``` +### Hardware Acceleration + +Many desktop applications need access to a GPU to function properly and even some Desktop Environments have compositor effects that will not function without a GPU. However this is not a hard requirement and all base images will function without a video device mounted into the container. + +#### Intel/ATI/AMD + +To leverage hardware acceleration you will need to mount /dev/dri video device inside of the container. + +```text +--device=/dev/dri:/dev/dri +``` + +We will automatically ensure the abc user inside of the container has the proper permissions to access this device. + +#### Nvidia + +Hardware acceleration users for Nvidia will need to install the container runtime provided by Nvidia on their host, instructions can be found here: +https://github.com/NVIDIA/nvidia-container-toolkit + +We automatically add the necessary environment variable that will utilise all the features available on a GPU on the host. Once nvidia-container-toolkit is installed on your host you will need to re/create the docker container with the nvidia container runtime `--runtime=nvidia` and add an environment variable `-e NVIDIA_VISIBLE_DEVICES=all` (can also be set to a specific gpu's UUID, this can be discovered by running `nvidia-smi --query-gpu=gpu_name,gpu_uuid --format=csv` ). NVIDIA automatically mounts the GPU and drivers from your host into the container. + +#### Arm Devices + +Best effort is made to install tools to allow mounting in /dev/dri on Arm devices. In most cases if /dev/dri exists on the host it should just work. If running a Raspberry Pi 4 be sure to enable `dtoverlay=vc4-fkms-v3d` in your usercfg.txt. + ## Usage To help you get started creating a container from this image you can either use docker-compose or the docker cli. @@ -118,7 +138,7 @@ services: - PGID=1000 - TZ=Etc/UTC volumes: - - /path/to/library:/config + - /path/to/emby/library:/config - /path/to/tvseries:/data/tvshows - /path/to/movies:/data/movies - /opt/vc/lib:/opt/vc/lib #optional @@ -144,7 +164,7 @@ docker run -d \ -e TZ=Etc/UTC \ -p 8096:8096 \ -p 8920:8920 `#optional` \ - -v /path/to/library:/config \ + -v /path/to/emby/library:/config \ -v /path/to/tvseries:/data/tvshows \ -v /path/to/movies:/data/movies \ -v /opt/vc/lib:/opt/vc/lib `#optional` \ @@ -339,6 +359,8 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64 ## Versions +* **13.08.24:** - Rebase to Ubuntu Noble. +* **12.02.24:** - Use universal hardware acceleration blurb * **19.01.24:** - Fix tonemapping so it's done with hw acceleration. * **06.07.23:** - Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf) * **08.06.23:** - Fix package extraction so it doesn't change /tmp perms. diff --git a/jenkins-vars.yml b/jenkins-vars.yml index 85222d1..9cb6852 100644 --- a/jenkins-vars.yml +++ b/jenkins-vars.yml @@ -24,6 +24,6 @@ repo_vars: - CI_PORT='8096' - CI_SSL='false' - CI_DELAY='120' - - CI_DOCKERENV='TZ=US/Pacific' - - CI_AUTH='user:password' + - CI_DOCKERENV='' + - CI_AUTH='' - CI_WEBPATH='' diff --git a/readme-vars.yml b/readme-vars.yml index ca56477..4fd01b5 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -3,7 +3,7 @@ # project information project_name: emby project_url: "https://emby.media/" -project_logo: "https://emby.media/community/uploads/inline/3/55626b855503c_logo800.png" +project_logo: "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/emby-logo.png" project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}" project_blurb: "[{{ project_name|capitalize }}]({{ project_url }}) organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server." # supported architectures @@ -20,18 +20,13 @@ common_param_env_vars_enabled: true #PGID, PUID, etc param_container_name: "{{ project_name }}" param_usage_include_vols: true param_volumes: - - {vol_path: "/config", vol_host_path: "/path/to/library", desc: "Emby data storage location. *This can grow very large, 50gb+ is likely for a large collection.*"} + - {vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/library", desc: "Emby data storage location. *This can grow very large, 50gb+ is likely for a large collection.*"} - {vol_path: "/data/tvshows", vol_host_path: "/path/to/tvseries", desc: "Media goes here. Add as many as needed e.g. `/data/movies`, `/data/tv`, etc."} - {vol_path: "/data/movies", vol_host_path: "/path/to/movies", desc: "Media goes here. Add as many as needed e.g. `/data/movies`, `/data/tv`, etc."} param_usage_include_ports: true param_ports: - {external_port: "8096", internal_port: "8096", port_desc: "Http webUI."} -param_usage_include_env: true -param_env_vars: - - {env_var: "TZ", env_value: "Europe/London", desc: "Specify a timezone to use EG Europe/London"} # optional container parameters -opt_param_usage_include_env: false -opt_param_env_vars: opt_param_usage_include_vols: true opt_param_volumes: - {vol_path: "/opt/vc/lib", vol_host_path: "/opt/vc/lib", desc: "Path for Raspberry Pi OpenMAX libs *optional*."} @@ -52,36 +47,35 @@ app_setup_block: | Emby has very complete and verbose documentation located [here](https://github.com/MediaBrowser/Wiki/wiki) . - Hardware acceleration users for Intel Quicksync and AMD VAAPI will need to mount their /dev/dri video device inside of the container by passing the following command when running or creating the container: + ### Hardware Acceleration Enhancements - ```--device=/dev/dri:/dev/dri``` + This section lists the enhancements we have made for hardware acceleration in this image specifically. - We will automatically ensure the abc user inside of the container has the proper permissions to access this device. + #### OpenMAX (Raspberry Pi) - Hardware acceleration users for Nvidia will need to install the container runtime provided by Nvidia on their host, instructions can be found here: + Hardware acceleration users for Raspberry Pi MMAL/OpenMAX will need to mount their `/dev/vcsm` and `/dev/vchiq` video devices inside of the container and their system OpenMax libs by passing the following options when running or creating the container: - https://github.com/NVIDIA/nvidia-docker - - We automatically add the necessary environment variable that will utilise all the features available on a GPU on the host. Once nvidia-docker is installed on your host you will need to re/create the docker container with the nvidia container runtime `--runtime=nvidia` and add an environment variable `-e NVIDIA_VISIBLE_DEVICES=all` (can also be set to a specific gpu's UUID, this can be discovered by running `nvidia-smi --query-gpu=gpu_name,gpu_uuid --format=csv` ). NVIDIA automatically mounts the GPU and drivers from your host into the emby docker. - - ### OpenMAX (Raspberry Pi) - - Hardware acceleration users for Raspberry Pi OpenMAX will need to mount their /dev/vchiq video device inside of the container and their system OpenMax libs by passing the following options when running or creating the container: - ``` + ```text + --device=/dev/vcsm:/dev/vcsm --device=/dev/vchiq:/dev/vchiq -v /opt/vc/lib:/opt/vc/lib ``` - ### V4L2 (Raspberry Pi) + #### V4L2 (Raspberry Pi) - Hardware acceleration users for Raspberry Pi V4L2 will need to mount their /dev/video1X devices inside of the container by passing the following options when running or creating the container: - ``` + Hardware acceleration users for Raspberry Pi V4L2 will need to mount their `/dev/video1X` devices inside of the container by passing the following options when running or creating the container: + + ```text --device=/dev/video10:/dev/video10 --device=/dev/video11:/dev/video11 --device=/dev/video12:/dev/video12 ``` + +readme_hwaccel: true # changelog changelogs: + - {date: "13.08.24:", desc: "Rebase to Ubuntu Noble."} + - {date: "12.02.24:", desc: "Use universal hardware acceleration blurb"} - {date: "19.01.24:", desc: "Fix tonemapping so it's done with hw acceleration."} - {date: "06.07.23:", desc: "Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf)"} - {date: "08.06.23:", desc: "Fix package extraction so it doesn't change /tmp perms."} diff --git a/root/etc/s6-overlay/s6-rc.d/init-emby/dependencies.d/init-config b/root/etc/s6-overlay/s6-rc.d/init-emby-config/dependencies.d/init-config similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/init-emby/dependencies.d/init-config rename to root/etc/s6-overlay/s6-rc.d/init-emby-config/dependencies.d/init-config diff --git a/root/etc/s6-overlay/s6-rc.d/init-emby/run b/root/etc/s6-overlay/s6-rc.d/init-emby-config/run similarity index 93% rename from root/etc/s6-overlay/s6-rc.d/init-emby/run rename to root/etc/s6-overlay/s6-rc.d/init-emby-config/run index 3be6f42..1510927 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-emby/run +++ b/root/etc/s6-overlay/s6-rc.d/init-emby-config/run @@ -1,4 +1,5 @@ #!/usr/bin/with-contenv bash +# shellcheck shell=bash # Create folders mkdir -p \ diff --git a/root/etc/s6-overlay/s6-rc.d/init-emby-config/type b/root/etc/s6-overlay/s6-rc.d/init-emby-config/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/init-emby-config/type @@ -0,0 +1 @@ +oneshot diff --git a/root/etc/s6-overlay/s6-rc.d/init-emby-config/up b/root/etc/s6-overlay/s6-rc.d/init-emby-config/up new file mode 100644 index 0000000..81f57d0 --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/init-emby-config/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-emby-config/run diff --git a/root/etc/s6-overlay/s6-rc.d/init-emby/type b/root/etc/s6-overlay/s6-rc.d/init-emby/type deleted file mode 100644 index 3d92b15..0000000 --- a/root/etc/s6-overlay/s6-rc.d/init-emby/type +++ /dev/null @@ -1 +0,0 @@ -oneshot \ No newline at end of file diff --git a/root/etc/s6-overlay/s6-rc.d/init-emby/up b/root/etc/s6-overlay/s6-rc.d/init-emby/up deleted file mode 100644 index 202ea5d..0000000 --- a/root/etc/s6-overlay/s6-rc.d/init-emby/up +++ /dev/null @@ -1 +0,0 @@ -/etc/s6-overlay/s6-rc.d/init-emby/run \ No newline at end of file diff --git a/root/etc/s6-overlay/s6-rc.d/init-video/dependencies.d/init-emby b/root/etc/s6-overlay/s6-rc.d/init-video/dependencies.d/init-emby-config similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/init-video/dependencies.d/init-emby rename to root/etc/s6-overlay/s6-rc.d/init-video/dependencies.d/init-emby-config diff --git a/root/etc/s6-overlay/s6-rc.d/init-video/run b/root/etc/s6-overlay/s6-rc.d/init-video/run index b3e5bde..2fc5601 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-video/run +++ b/root/etc/s6-overlay/s6-rc.d/init-video/run @@ -1,9 +1,9 @@ #!/usr/bin/with-contenv bash +# shellcheck shell=bash FILES=$(find /dev/dri /dev/dvb /dev/vchiq /dev/video1? -type c -print 2>/dev/null) -for i in $FILES -do +for i in ${FILES}; do VIDEO_GID=$(stat -c '%g' "${i}") VIDEO_UID=$(stat -c '%u' "${i}") # check if user matches device @@ -11,13 +11,13 @@ do echo "**** permissions for ${i} are good ****" else # check if group matches and that device has group rw - if id -G abc | grep -qw "${VIDEO_GID}" && [ $(stat -c '%A' "${i}" | cut -b 5,6) = "rw" ]; then + if id -G abc | grep -qw "${VIDEO_GID}" && [[ $(stat -c '%A' "${i}" | cut -b 5,6) == "rw" ]]; then echo "**** permissions for ${i} are good ****" # check if device needs to be added to video group elif ! id -G abc | grep -qw "${VIDEO_GID}"; then # check if video group needs to be created VIDEO_NAME=$(getent group "${VIDEO_GID}" | awk -F: '{print $1}') - if [ -z "${VIDEO_NAME}" ]; then + if [[ -z "${VIDEO_NAME}" ]]; then VIDEO_NAME="video$(head /dev/urandom | tr -dc 'a-z0-9' | head -c4)" groupadd "${VIDEO_NAME}" groupmod -g "${VIDEO_GID}" "${VIDEO_NAME}" @@ -27,7 +27,7 @@ do usermod -a -G "${VIDEO_NAME}" abc fi # check if device has group rw - if [ $(stat -c '%A' "${i}" | cut -b 5,6) != "rw" ]; then + if [[ $(stat -c '%A' "${i}" | cut -b 5,6) != "rw" ]]; then echo -e "**** The device ${i} does not have group read/write permissions, attempting to fix inside the container. ****" chmod g+rw "${i}" fi diff --git a/root/etc/s6-overlay/s6-rc.d/init-video/type b/root/etc/s6-overlay/s6-rc.d/init-video/type index 3d92b15..bdd22a1 100644 --- a/root/etc/s6-overlay/s6-rc.d/init-video/type +++ b/root/etc/s6-overlay/s6-rc.d/init-video/type @@ -1 +1 @@ -oneshot \ No newline at end of file +oneshot diff --git a/root/etc/s6-overlay/s6-rc.d/init-video/up b/root/etc/s6-overlay/s6-rc.d/init-video/up index 5cef990..01141b1 100644 --- a/root/etc/s6-overlay/s6-rc.d/init-video/up +++ b/root/etc/s6-overlay/s6-rc.d/init-video/up @@ -1 +1 @@ -/etc/s6-overlay/s6-rc.d/init-video/run \ No newline at end of file +/etc/s6-overlay/s6-rc.d/init-video/run diff --git a/root/etc/s6-overlay/s6-rc.d/svc-emby/run b/root/etc/s6-overlay/s6-rc.d/svc-emby/run index a030c87..8200be0 100755 --- a/root/etc/s6-overlay/s6-rc.d/svc-emby/run +++ b/root/etc/s6-overlay/s6-rc.d/svc-emby/run @@ -1,4 +1,5 @@ #!/usr/bin/with-contenv bash +# shellcheck shell=bash # env settings APP_DIR="/app/emby" @@ -7,7 +8,7 @@ export FONTCONFIG_PATH="${APP_DIR}"/etc/fonts export OCL_ICD_VENDORS="${APP_DIR}"/extra/etc/OpenCL/vendors export AMDGPU_IDS="${APP_DIR}"/extra/share/libdrm/amdgpu.ids export PCI_IDS_PATH="${APP_DIR}"/share/hwdata/pci.ids -if [ -d "/lib/x86_64-linux-gnu" ]; then +if [[ -d "/lib/x86_64-linux-gnu" ]]; then export LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri:"${APP_DIR}"/extra/lib/dri fi export SSL_CERT_FILE="${APP_DIR}"/etc/ssl/certs/ca-certificates.crt diff --git a/root/etc/s6-overlay/s6-rc.d/svc-emby/type b/root/etc/s6-overlay/s6-rc.d/svc-emby/type index 1780f9f..5883cff 100644 --- a/root/etc/s6-overlay/s6-rc.d/svc-emby/type +++ b/root/etc/s6-overlay/s6-rc.d/svc-emby/type @@ -1 +1 @@ -longrun \ No newline at end of file +longrun diff --git a/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-emby b/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-emby deleted file mode 100644 index e69de29..0000000 diff --git a/root/etc/s6-overlay/s6-rc.d/svc-emby/dependencies.d/init-video b/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-emby-config similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/svc-emby/dependencies.d/init-video rename to root/etc/s6-overlay/s6-rc.d/user/contents.d/init-emby-config