Skip to content

dubo-dubon-duponey/docker-roon

Repository files navigation

What

Two Docker images for Roon Bridge & Roon Server.

Bonus / extra features:

  • roon display is served over TLS and announced under mDNS
  • logs are exposed on stdout

Image features

  • multi-architecture:
    • linux/amd64
    • linux/arm64 (bridge only)
    • linux/arm/v7 (bridge only)
  • hardened:
    • image runs read-only
    • image runs with no capabilities
    • process runs as a non-root user, disabled login, no shell
  • lightweight
    • based on our slim Debian Bullseye
    • simple entrypoint script
    • multi-stage build with no installed dependencies for the Bridge runtime image, one dependency for Server (ffmpeg)
  • observable
    • healthcheck (server only)
    • log to stdout

Run

docker run -d \
    --net host \
    --name bridge \
    --read-only \
    --cap-drop ALL \
    --group-add audio \
    --device /dev/snd \
    --rm \
    ghcr.io/dubo-dubon-duponey/roon:bridge-latest

docker run -d \
    --net host \
    --name server \
    --read-only \
    --cap-drop ALL \
    --cap-add NET_BIND_SERVICE \
    --rm \
    ghcr.io/dubo-dubon-duponey/roon:server-latest

GOTCHA

Debian by default limits inotify watches to 8192, which might turns out to be too little.

You probably want to bump that up to prevent your system from crashing / rebooting...

Typically, on the host:

echo "fs.inotify.max_user_watches = 1048576" > /etc/sysctl.conf
echo 1048576 > /proc/sys/fs/inotify/max_user_watches

Notes

Roon packages version

The builder uses the packages stored under cache.

If you want to rebuild with fresh versions, call the ./refresh.sh script first to (re)-download from Roon servers.

Alpine

This is currently running on Debian, and I have no intention in trying again to make this work on Alpine.

If you do, here are some notes:

  • I first tried using gcompat. Past a linker name mismatch, mono-gen will just SIGBUS.
  • I then tried to cross-compile mono (using qemu). This failed as well with some obscure ARM syscall apparently being not implemented in qemu.

At this time, ncopa just enabled armv7 for mono (https://git.alpinelinux.org/aports/tree/testing/mono/APKBUILD): https://pkgs.alpinelinux.org/package/edge/testing/armv7/mono

Whether you can use it as a drop-in replacement for Roon embedded Mono is yet to be determined. Assuming this would work, it's unclear also if gcompat would still be necessary.

Moar?

See DEVELOP.md