Docker

Official BubbleUPnP Server multi-platform docker images based on openSUSE Tumbleweed are available on Docker Hub, for easily running BubbleUPnP Server on Linux x86_64, x86 (32-bit), arm64 and armv7 plaftorms.

It provides everyting needed to run BubbleUPnP Server optimally, including Java and FFmpeg binaries. The image is compatible with Intel QSV (Intel only) and VA-API (Intel/AMD) GPU transcoding, but not NVIDIA.

If your user is not already part of the docker group, you will have to prefix all docker commands with sudo. To avoid this, add you user to the docker group whit this command, then launch a new terminal to make the change effective:

sudo usermod -aG docker $USER

Create a persistent container named bubbleupnpserver from the image:

docker create --name bubbleupnpserver \
       --net=host \
       --device /dev/dri:/dev/dri \
       --restart=unless-stopped \
       bubblesoftapps/bubbleupnpserver 

There is an alternate bubblesoftapps/bubbleupnpserver-openj9 image based on the OpenJ9 JRE instead of OpenJDK. This image uses less memory, making it ideal for memory constrained devices. OpenJ9 is supposedly a bit slower than OpenJDK, but for software such as BubbleUPnP Server, it does not matter.

Moreover, some Synology NAS running DSM7 may crash with the bubblesoftapps/bubbleupnpserver image, and the workaround is to use the bubblesoftapps/bubbleupnpserver-openj9 image.

  • --net=host: required for proper networking
  • --device /dev/dri:/dev/dri: only necessary for Intel QSV or VA-API Chromecast GPU transcoding
  • --restart=unless-stopped: only necessary for starting the bubbleupnpserver container automatically when the docker daemon starts
  • at the end of the line you can pass BubbleUPnP Server command-line arguments

If your Docker installation and BubbleUPnP Server container reside on a spinning hard drive and you do not want the running container to prevent the hard drive to go to sleep, there are additional options required to prevent all periodic writing to disk, both performed by Docker on the host and BubbleUPnP Server in the running container:

  • -e USER_JVM_ARGS="-XX:-UsePerfData": to pass JVM arguments to BubbleUPnP Server to disable the JVM writing performance data at regular intervals into the image’s /tmp folder. This is only needed if using the OpenJDK Docker image. This USER_JVM_ARGS environment variable is only available since the BubbleUPnP Server container released in August 2022.
  • --log-driver none: for Docker to not write to file (stored on host) BubbleUPnP Server’s console output (stdout)
  • --no-healthcheck: for Docker to not write health check status to config.v2.json file (stored on host) at periodic intervals
  • -nologfile: BubbleUPnP Server option for BubbleUPnP Server to not write log files (stored in the running container)

With everything combined:

docker create --name bubbleupnpserver \
       --net=host \
       --device /dev/dri:/dev/dri \
       --log-driver none \
       --no-healthcheck \
       --restart=unless-stopped \
       -e USER_JVM_ARGS="-XX:-UsePerfData" \
       bubblesoftapps/bubbleupnpserver \
       -nologfile

Start the container with:

docker start bubbleupnpserver

On some older Docker versions, the container may fail to start. In that case and if you cannot update Docker to a newer version, recreate the container adding the --security-opt seccomp=unconfined option.

Connect to the web configuration with your web browser: http://localhost:58050 (from your machine) or http://<server LAN ip>:58050 (from another machine on the LAN). The container will always run the latest version of BubbleUPnP Server. There is no need to recreate it just for that purpose.

to stop the container: docker stop bubbleupnpserver
to restart the container: docker restart bubbleupnpserver
to show continuously updated logs: docker logs -f bubbleupnpserver
to remove the container (for uninstalling or recreating it): docker rm -f bubbleupnpserver
to remove the image: docker rmi bubblesoftapps/bubbleupnpserver

If you need to edit configuration.xml, copy it to your host, edit it it, then copy it back to the container and restart it:

docker stop bubbleupnpserver
docker cp bubbleupnpserver:/opt/bubbleupnpserver/configuration.xml .
<edit configuration.xml>
docker cp configuration.xml bubbleupnpserver:/opt/bubbleupnpserver
docker start bubbleupnpserver
docker exec -u root bubbleupnpserver chown bubbleupnpserver.users /opt/bubbleupnpserver/configuration.xml

BubbleUPnP Server running in the container will update automatically to newer versions of the core, as well as FFmpeg binaries, so there is no need to recreate a new container for that. However, the Docker image itself can be updated to newer Java versions (which cannot be auto updated). If you want to upgrade to an updated Docker image, you will need to recreate the container. Prior to that, to keep your existing configuration, you can copy on your local filesystem the configuration.xml from the old container to be able to copy it later to the new container.