├── LICENSE ├── app └── entrypoint.sh ├── docker-compose.yml ├── .github └── workflows │ └── docker-image.yml ├── Dockerfile └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Jeff C. Jensen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # SPDX-FileCopyrightText: (c) 2021-2025 Jeff C. Jensen 4 | # SPDX-License-Identifier: MIT 5 | 6 | ROON_PACKAGE_URI=${ROON_PACKAGE_URI-"http://download.roonlabs.com/builds/RoonServer_linuxx64.tar.bz2"} 7 | 8 | echo Starting RoonServer with user `whoami` 9 | 10 | # install Roon if not present 11 | if [ ! -f /opt/RoonServer/start.sh ]; then 12 | echo Downloading Roon Server from ${ROON_PACKAGE_URI} 13 | wget --progress=bar:force --tries=2 -O - ${ROON_PACKAGE_URI} | tar -xvj --overwrite -C /opt 14 | if [ $? != 0 ]; then 15 | echo Error: Unable to install Roon Server. 16 | exit 1 17 | fi 18 | fi 19 | 20 | echo Verifying Roon installation 21 | /opt/RoonServer/check.sh 22 | retval=$? 23 | if [ ${retval} != 0 ]; then 24 | echo Verification of Roon installation failed. 25 | exit ${retval} 26 | fi 27 | 28 | # start Roon 29 | # 30 | # since we're invoking from a script, we need to 31 | # catch signals to terminate Roon nicely 32 | /opt/RoonServer/start.sh --ulimit nofile=8192 & 33 | roon_start_pid=$! 34 | trap 'kill -INT ${roon_start_pid}' SIGINT SIGQUIT SIGTERM 35 | wait "${roon_start_pid}" # block until Roon terminates 36 | retval=$? 37 | exit ${retval} 38 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: (c) 2021-2025 Jeff C. Jensen 2 | # SPDX-License-Identifier: MIT 3 | 4 | services: 5 | roon: 6 | container_name: roon-server 7 | build: 8 | context: . 9 | image: elgeeko/roon-server:latest 10 | restart: unless-stopped 11 | init: true 12 | network_mode: host 13 | group_add: 14 | - "${AUDIO_GID:-29}" # set AUDIO_GID=$(getent group audio | cut -d: -f3) 15 | environment: 16 | TZ: "America/Los_Angeles" 17 | volumes: 18 | - ${HOME}/music:/music:ro # TODO: replace ~/music with your music directory 19 | - roon-server-data:/opt/RoonServer 20 | - roon-server-cache:/var/roon 21 | - /etc/localtime:/etc/localtime:ro 22 | stop_grace_period: 45s 23 | logging: 24 | driver: local 25 | # # if using bridged network mode: 26 | # ports: 27 | # - "9003:9003/udp" # multicast 28 | # - "9100-9200:9100-9200/tcp" # Roon API and RAAT 29 | # - "9330-9339:9330-9339/tcp" # remoting/brokerserver and Roon Display 30 | # - "30000-30010:30000-30010/tcp" # Chromecast 31 | # - "55000:55000/tcp" # Roon ARC 32 | 33 | volumes: 34 | roon-server-data: 35 | name: roon-server-data 36 | roon-server-cache: 37 | name: roon-server-cache 38 | 39 | ## if using audio directly connected to the Roon server, add 40 | # devices: 41 | # - /dev/bus/usb 42 | # - /dev/snd 43 | # volumes: 44 | # - /run/udev:/run/udev:ro 45 | 46 | ## try using this if roon is having trouble discovering devices 47 | # cap_add: 48 | # - SYS_ADMIN 49 | # security_opt: 50 | # - apparmor:unconfined 51 | 52 | ## try this if all else fails 53 | # privileged: true 54 | -------------------------------------------------------------------------------- /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: 4 | pull_request: 5 | branches: [ main ] 6 | push: 7 | branches: [ main ] 8 | release: 9 | types: [ published ] 10 | workflow_dispatch: 11 | 12 | concurrency: 13 | group: docker-${{ github.ref }} 14 | cancel-in-progress: true 15 | 16 | permissions: 17 | contents: read 18 | packages: write 19 | id-token: write # for provenance attestations 20 | 21 | env: 22 | IMAGE_NAME: roon-server 23 | REGISTRY: docker.io 24 | NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }} 25 | 26 | jobs: 27 | build-and-push: 28 | runs-on: ubuntu-24.04 29 | timeout-minutes: 10 30 | steps: 31 | - name: Set build date for image tagging 32 | id: date 33 | run: echo "image_date=$(date +'%Y.%m.%d')" >> "$GITHUB_OUTPUT" 34 | 35 | - name: Checkout 36 | uses: actions/checkout@v4 37 | 38 | - name: Setup Docker buildx 39 | uses: docker/setup-buildx-action@v3 40 | 41 | - name: Docker metadata 42 | id: meta 43 | uses: docker/metadata-action@v5 44 | # always publish a sha tag 45 | # date tag on push or release 46 | # latest on push to main or release 47 | # release tag on release 48 | with: 49 | images: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.IMAGE_NAME }} 50 | tags: | 51 | type=raw,value=${{ github.sha }} 52 | type=raw,value=${{ steps.date.outputs.image_date }},enable=${{ github.event_name == 'release' }} 53 | type=raw,value=latest,enable=${{ github.event_name == 'release' }} 54 | type=raw,value=${{ github.event.release.tag_name }},enable=${{ github.event_name == 'release' }} 55 | 56 | - name: Login to Docker Hub 57 | if: github.event_name == 'release' 58 | uses: docker/login-action@v3 59 | with: 60 | username: ${{ secrets.DOCKERHUB_USERNAME }} 61 | password: ${{ secrets.DOCKERHUB_TOKEN }} 62 | 63 | - name: Build (push on push/release) 64 | uses: docker/build-push-action@v6 65 | with: 66 | context: . 67 | file: ./Dockerfile 68 | pull: true 69 | push: ${{ github.event_name == 'release' }} 70 | tags: ${{ steps.meta.outputs.tags }} 71 | labels: ${{ steps.meta.outputs.labels }} 72 | provenance: true 73 | sbom: true 74 | 75 | - name: Validate docker-compose 76 | run: docker compose -f docker-compose.yml config 77 | 78 | # update README on release publish 79 | dockerhub-readme: 80 | if: github.event_name == 'release' 81 | needs: build-and-push 82 | runs-on: ubuntu-24.04 83 | steps: 84 | - name: Checkout 85 | uses: actions/checkout@v4 86 | 87 | - name: Update Docker Hub README 88 | uses: peter-evans/dockerhub-description@v3 89 | with: 90 | username: ${{ secrets.DOCKERHUB_USERNAME }} 91 | password: ${{ secrets.DOCKERHUB_TOKEN }} 92 | repository: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }} 93 | readme-filepath: ./README.md 94 | short-description: ${{ github.event.repository.description }} 95 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: (c) 2021-2025 Jeff C. Jensen 2 | # SPDX-License-Identifier: MIT 3 | 4 | # syntax=docker/dockerfile:1 5 | 6 | ARG BUILDKIT_SBOM_SCAN_CONTEXT=true 7 | ARG BUILDKIT_SBOM_SCAN_STAGE=true 8 | ARG BASEIMAGE=noble-20250716 9 | 10 | ################## 11 | ## base stage 12 | ################## 13 | FROM ubuntu:${BASEIMAGE} AS base 14 | 15 | USER root 16 | 17 | # Preconfigure debconf for non-interactive installation - otherwise complains about terminal 18 | # Avoid ERROR: invoke-rc.d: policy-rc.d denied execution of start. 19 | ENV DEBIAN_FRONTEND=noninteractive 20 | ENV DISPLAY=localhost:0.0 21 | RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 22 | 23 | # configure python 24 | ENV PYTHONDONTWRITEBYTECODE=1 25 | ENV PYTHONUNBUFFERED=1 26 | 27 | # configure apt 28 | RUN apt update -q 29 | RUN apt install --no-install-recommends -y -q ca-certificates 30 | 31 | # install prerequisites 32 | # Roon prerequisites: 33 | # - Roon requirements: ffmpeg libasound2-dev 34 | # - Roon access samba mounts: cifs-utils 35 | # - Roon play to local audio device: alsa 36 | # - Query USB devices inside Docker container: usbutils udev libudev1 37 | RUN apt install --no-install-recommends -y -q ffmpeg libasound2-dev alsa 38 | RUN apt install --no-install-recommends -y -q cifs-utils 39 | RUN apt install --no-install-recommends -y -q usbutils udev libudev1 40 | # app prerequisites 41 | # - Docker healthcheck: curl 42 | # - App entrypoint downloads Roon: wget bzip2 43 | # - set timezone: tzdata 44 | RUN apt install --no-install-recommends -y -q curl wget bzip2 45 | RUN apt install --no-install-recommends -y -q tzdata 46 | 47 | # apt cleanup 48 | RUN apt autoremove -y -q 49 | RUN apt clean -y -q 50 | RUN rm -rf /var/lib/apt/lists/* 51 | 52 | #################### 53 | ## application stage 54 | #################### 55 | FROM scratch 56 | COPY --from=base / / 57 | 58 | LABEL maintainer="elgeeko1" 59 | LABEL source="https://github.com/elgeeko1/roon-server-docker" 60 | LABEL org.opencontainers.image.title="Roon Server" 61 | LABEL org.opencontainers.description="Roon Server" 62 | LABEL org.opencontainers.image.authors="Jeff C. Jensen <11233838+elgeeko1@users.noreply.github.com>" 63 | LABEL org.opencontainers.image.licenses="MIT" 64 | LABEL org.opencontainers.image.version="1.1.0" 65 | LABEL org.opencontainers.image.url="https://hub.docker.com/r/elgeeko/roon-server" 66 | LABEL org.opencontainers.image.source="https://github.com/elgeeko1/roon-server-docker" 67 | 68 | # Roon documented ports 69 | # - multicast (discovery?) 70 | EXPOSE 9003/udp 71 | # - Roon API and RAAT server 72 | # see https://community.roonlabs.com/t/roon-api-on-build-880-connection-refused-error/181619/3 73 | # - RAAT server typically :9200 74 | EXPOSE 9100-9200/tcp 75 | # Chromecast devices 76 | EXPOSE 30000-30010/tcp 77 | 78 | # See https://github.com/elgeeko1/roon-server-docker/issues/5 79 | # https://community.roonlabs.com/t/what-are-the-new-ports-that-roon-server-needs-open-in-the-firewall/186023/16 80 | # remoting/brokerserver (i.e. 9332), and Roon Display (i.e. 9330) 81 | EXPOSE 9093/udp 82 | EXPOSE 9330-9339/tcp 83 | 84 | # Roon Arc 85 | EXPOSE 55000/tcp 86 | 87 | VOLUME ["/opt/RoonServer", "/var/roon", "/music"] 88 | 89 | USER root 90 | 91 | # change to match your local zone. 92 | # matching container to host timezones synchronizes 93 | # last.fm posts, filesystem write times, and user 94 | # expectations for times shown in the Roon client. 95 | ARG TZ="America/Los_Angeles" 96 | ENV TZ=${TZ} 97 | RUN echo "${TZ}" > /etc/timezone \ 98 | && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \ 99 | && dpkg-reconfigure -f noninteractive tzdata 100 | 101 | # non-root container user. 102 | # you may want to randomize the UID to prevent 103 | # accidental collisions with the host filesystem; 104 | # however, this may prevent the container from 105 | # accessing network shares that are not public, 106 | # or if the RoonServer build is mapped in from 107 | # the host filesystem. 108 | ARG CONTAINER_USER=ubuntu 109 | ARG CONTAINER_USER_UID=1000 110 | RUN if [ "${CONTAINER_USER}" != "ubuntu" ]; \ 111 | then useradd \ 112 | --uid ${CONTAINER_USER_UID} \ 113 | --user-group \ 114 | ${CONTAINER_USER}; \ 115 | fi 116 | RUN usermod -aG audio ${CONTAINER_USER} 117 | 118 | # copy application files 119 | COPY --chmod=0755 app/entrypoint.sh /entrypoint.sh 120 | COPY README.md /README.md 121 | 122 | # configure filesystem 123 | ## map a volume to this location to retain Roon Server data 124 | RUN mkdir -p /opt/RoonServer \ 125 | && chown ${CONTAINER_USER}:${CONTAINER_USER} /opt/RoonServer 126 | ## map a volume to this location to retain Roon Server cache 127 | RUN mkdir -p /var/roon \ 128 | && chown ${CONTAINER_USER}:${CONTAINER_USER} /var/roon 129 | 130 | # create /music directory (users may override with a volume) 131 | RUN mkdir -p /music \ 132 | && chown ${CONTAINER_USER}:${CONTAINER_USER} /music \ 133 | && chmod og+r /music 134 | 135 | USER ${CONTAINER_USER} 136 | 137 | # entrypoint 138 | # set environment variables consumed by RoonServer 139 | # startup script 140 | ENV DISPLAY=localhost:0.0 141 | ENV ROON_DATAROOT=/var/roon 142 | ENV ROON_ID_DIR=/var/roon 143 | 144 | ENTRYPOINT ["/entrypoint.sh"] 145 | HEALTHCHECK --start-period=30s --interval=5m --timeout=5s \ 146 | CMD curl -f http://localhost:9330/display 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Roon Server in Docker 2 | 3 | Roon Server in a Docker container. 4 | 5 | ## Features 6 | 7 | - Downloads and installs latest Roon Server on first container start 8 | - Subsequent in-app Roon Server upgrades persist 9 | - Audio input from a local music library 10 | - Audio input from streaming services such as Tidal or Qobuz 11 | - Audio output to USB DAC devices connected to the Roon Server 12 | - Audio output to RAAT devices such as the Roon app, Roon Bridge, RoPieee, etc. 13 | - Audio output to audio peripherals on the Roon Server 14 | - Local timezone support (helpful for accurate last.fm tagging) 15 | - Persistent cache 16 | - Secure execution (unprivileged execution, macvlan network) 17 | 18 | ## Getting Started 19 | 20 | The following steps will work in most configurations and supports all features. 21 | 22 | Install audio packages into the host: 23 | 24 | ```bash 25 | apt install alsa-utils libasound2 libasound2-data libasound2-plugins 26 | ``` 27 | 28 | Create persistent docker volumes and a directory for local audio files: 29 | 30 | ```bash 31 | docker volume create roon-server-data 32 | docker volume create roon-server-cache 33 | mkdir -p ~/roon/music 34 | ``` 35 | 36 | Run the docker container: 37 | 38 | ```bash 39 | AUDIO_GID=$(getent group audio | cut -d: -f3) 40 | docker run \ 41 | --name roon-server \ 42 | --detach \ 43 | --volume roon-server-data:/opt/RoonServer \ 44 | --volume roon-server-cache:/var/roon \ 45 | --volume ~/roon/music:/music:ro \ 46 | --network host \ 47 | --restart unless-stopped \ 48 | --volume /run/udev:/run/udev:ro \ 49 | --device /dev/bus/usb \ 50 | --device /dev/snd \ 51 | --group-add "${AUDIO_GID:-29}" \ 52 | elgeeko/roon-server 53 | ``` 54 | 55 | View logs: 56 | 57 | ```bash 58 | docker logs -f roon-server 59 | ``` 60 | 61 | If your devices can discover the Roon Server and your audio outputs are visible, you're good to go! 62 | What follows is a more detailed guide for advanced setups or customization. 63 | 64 | ## Run Options 65 | 66 | There are three ways to configure the Roon Docker container, each with different security levels. The first option is the easiest and simplest and should work for most users. 67 | 68 | ### Host network - least secure mode (easiest) 69 | 70 | This is the simplest way to run the docker container. Options are to run with or without support for local audio devices. 71 | 72 | #### Run host container (no support for local audio) 73 | 74 | Run the host container without support for sound output from devices local to the roon server (USB, built-in): 75 | 76 | ```bash 77 | docker run \ 78 | --name roon-server \ 79 | --detach \ 80 | --volume roon-server-data:/opt/RoonServer \ 81 | --volume roon-server-cache:/var/roon \ 82 | --volume ~/roon/music:/music:ro \ 83 | --network host \ 84 | --restart unless-stopped \ 85 | elgeeko/roon-server 86 | ``` 87 | 88 | #### Run host container (with support for local audio) 89 | 90 | Run the host container with support for USB DACs or other sound devices connected to the Roon server: 91 | 92 | ```bash 93 | AUDIO_GID=$(getent group audio | cut -d: -f3) 94 | docker run \ 95 | --name roon-server \ 96 | --detach \ 97 | --volume roon-server-data:/opt/RoonServer \ 98 | --volume roon-server-cache:/var/roon \ 99 | --volume ~/roon/music:/music:ro \ 100 | --network host \ 101 | --restart unless-stopped \ 102 | --volume /run/udev:/run/udev:ro \ 103 | --device /dev/bus/usb \ 104 | --device /dev/snd \ 105 | --group-add "${AUDIO_GID:-29}" \ 106 | elgeeko/roon-server 107 | ``` 108 | 109 | #### View logs 110 | 111 | ```bash 112 | docker logs -f roon-server 113 | ``` 114 | 115 | ### Run in macvlan mode (more secure) 116 | 117 | Run in an unprivileged container using macvlan network mode. Replace the subnet, gateway, IP address, and primary ethernet adapter to match your local network. 118 | 119 | > [!NOTE] 120 | > Macvlan generally does not work on wifi networks, and wired ethernet is required. This is a limitation of how 121 | > most wifi adapters handle MAC addresses and frames. 122 | 123 | #### Create docker macvlan network 124 | 125 | ```bash 126 | docker network create \ 127 | --driver macvlan \ 128 | --subnet 192.168.1.0/24 \ 129 | --gateway 192.168.1.1 \ 130 | -o parent=eth0 \ 131 | roon 132 | ``` 133 | 134 | #### Run the macvlan container (no support for local audio) 135 | 136 | Run the macvlan container with support for sound output from devices local to the roon server (USB, built-in): 137 | 138 | ```bash 139 | docker run \ 140 | --name roon-server \ 141 | --detach \ 142 | --volume roon-server-data:/opt/RoonServer \ 143 | --volume roon-server-cache:/var/roon \ 144 | --volume ~/roon/music:/music:ro \ 145 | --network roon \ 146 | --restart unless-stopped \ 147 | --ip 192.168.1.2 \ 148 | elgeeko/roon-server 149 | ``` 150 | 151 | #### Run the macvlan container (with support for local audio) 152 | 153 | Run the macvlan container with support for USB DACs or other sound devices connected to the Roon server: 154 | 155 | ```bash 156 | AUDIO_GID=$(getent group audio | cut -d: -f3) 157 | docker run \ 158 | --name roon-server \ 159 | --detach \ 160 | --volume roon-server-data:/opt/RoonServer \ 161 | --volume roon-server-cache:/var/roon \ 162 | --volume ~/roon/music:/music:ro \ 163 | --network roon \ 164 | --restart unless-stopped \ 165 | --ip 192.168.1.2 \ 166 | --volume /run/udev:/run/udev:ro \ 167 | --device /dev/bus/usb \ 168 | --device /dev/snd \ 169 | --group-add "${AUDIO_GID:-29}" \ 170 | elgeeko/roon-server 171 | ``` 172 | 173 | View logs: 174 | 175 | ```bash 176 | docker logs -f roon-server 177 | ``` 178 | 179 | ### Run the container in bridged mode 180 | 181 | Docker bridge networks generally don’t pass multicast/MDNS used by RAAT discovery of deviceds such as Roon Bridge or RoPiee. Use host or macvlan for full RAAT device discovery, or configure advanced multicast routing/reflectors. In bridge mode, Roon Server is effectively limited to audio devices connected to your Roon Server or your PC. 182 | 183 | See the Dockerfile source for ports to open. See Docker documentation for creating and using a bridged network. 184 | 185 | ## Troubleshooting 186 | 187 | If you're having network connectivity issues, issues discovering other devices, or issues finding your roon server, 188 | try more permissive docker settings. Add one or more of the following to diagnose: 189 | 190 | - `--cap-add SYS_ADMIN` - adds broad admin capabilities (mount/namespace/cgroup ops); helps if the container needs OS-level actions blocked by default confinement. 191 | - `--security-opt apparmor:unconfined` - disables the AppArmor profile; helps when AppArmor denies access to devices/files (e.g., `/dev/snd`, `/run/udev`) or certain syscalls. 192 | - `--privileged` - grants all capabilities and device access, bypassing LSM confinement; helps confirm isolation is the blocker (USB/udev/network), but use only as a last-resort diagnostic. 193 | 194 | ## Feature Details 195 | 196 | ### Use USB DACs connected to the host 197 | 198 | Add the following arguments to the `docker run` command: 199 | 200 | - `--volume /run/udev:/run/udev:ro` - allow Roon see USB device changes (udev events) 201 | - `--device /dev/bus/usb` - allow Roon to access USB devices 202 | - `--device /dev/snd` - allow Roon to access ALSA devices 203 | - `--group-add $(getent group audio | cut -d: -f3)` - add container user to host 'audio' group 204 | 205 | ### Synchronize filesystem and last.fm timestamps with your local timezone 206 | 207 | Add the following arguments to the `docker run` command: 208 | 209 | - `--env TZ=America/Los_Angeles` - set tzdata timezone (substitute yours) 210 | - `--volume /etc/localtime:/etc/localtime:ro` - map local system clock to container clock 211 | 212 | ## Known Issues 213 | 214 | - USB DACs connected to the system for the first time do not appear in Roon. 215 | The workaround is to restart the container. Once the device has been initially 216 | connected, disconnecting and reconnecting is reflected in Roon. 217 | - Mounting network drives via cifs may require root access. The workaround is to 218 | run the container with the `user=root` option in the `docker run` command. 219 | - Fedora CoreOS sets a system parameter `ulimit` to a smaller value than Roon 220 | requires. Add the following argument to the `docker run` command: 221 | `--ulimit nofile=8192` 222 | 223 | ## Ports Used 224 | 225 | The ports used by Roon are not well-documented. The following ports are documented in forums: 226 | 227 | - `9003/udp` - multicast / discovery. 228 | - `9093/udp` - reported by some users as required for discovery. 229 | - `9100-9200/tcp` - Roon API and RAAT server. See [Roon API Connecton Refused Error](https://community.roonlabs.com/t/roon-api-on-build-880-connection-refused-error/181619/3). 230 | - `30000-30010/tcp` - Support for discovery from Chromecast devices. 231 | - `55000/tcp` - Roon Arc (default, changeable by the user). 232 | 233 | ## Building from the Dockerfile 234 | 235 | ```bash 236 | docker build . 237 | ``` 238 | 239 | ## Resources 240 | 241 | - [elgeeko/roon-server](https://hub.docker.com/repository/docker/elgeeko/roon-server) on Docker Hub 242 | - [elgeeko1/roon-server-docker](https://github.com/elgeeko1/roon-server-docker) on Github 243 | - Ansible script to deploy the Roon Server image, as well as an optional Samba server for network sharing of a local music library: [elgeeko1/elgeeko1-roon-server-ansible](https://github.com/elgeeko1/elgeeko1-roon-server-ansible) 244 | - [Roon Labs Linux install instructions](https://help.roonlabs.com/portal/en/kb/articles/linux-install) 245 | 246 | ### Related projects 247 | 248 | - [elgeeko/roon-bridge](https://hub.docker.com/repository/docker/elgeeko/roon-bridge) on Docker Hub 249 | - [elgeeko1/roon-bridge-docker](https://github.com/elgeeko1/roon-bridge-docker) on Github 250 | - Ansible script to deploy the Roon Bridge image: https://github.com/elgeeko1/elgeeko1-roon-bridge-ansible 251 | --------------------------------------------------------------------------------