Mopidy is a music server with support for MPD clients and HTTP clients.
- Follows official installation on top of Debian.
- With backend extensions for:
- Mopidy-Spotify for Spotify (Premium)
- Mopidy-GMusic for Google Play Music
- Mopidy-SoundClound for SoundCloud
- Mopidy-Pandora for Pandora
- Mopidy-YouTube for YouTube
- With Mopidy-Moped web extension.
- Can run as any user and runs as UID/GID
84044
user inside the container by default (for security reasons).
You may install additional backend extensions.
There are various ways to have the audio from Mopidy running in your container to play on your system's audio output. Here are various ways, try them and find which one works for you.
Simplest is by adding docker argument: --device /dev/snd
. Try via:
$ docker run --rm \
--user root --device /dev/snd \
wernight/mopidy \
gst-launch-1.0 audiotestsrc ! audioresample ! autoaudiosink
Mount the current user's pulse directory to the pulseuadio user (UID 105
).
Based on https://github.com/TheBiggerGuy/docker-pulseaudio-example.
$ docker run --rm \
--user $UID:$GID -v /run/user/$UID/pulse:/run/user/105/pulse \
wernight/mopidy \
gst-launch-1.0 audiotestsrc ! audioresample ! autoaudiosink
First to make audio work from within a Docker container, you should enable PulseAudio over network; so if you have X11 you may for example do:
-
Install PulseAudio Preferences. Debian/Ubuntu users can do this:
$ sudo apt-get install paprefs
-
Launch
paprefs
(PulseAudio Preferences) > "Network Server" tab > Check "Enable network access to local sound devices" (you may check "Don't require authentication" to avoid mounting cookie file described below). -
Restart PulseAudio:
$ sudo service pulseaudio restart
or
$ pulseaudio -k $ pulseaudio --start
Note: On some distributions, it may be necessary to completely restart your computer. You can confirm that the settings have successfully been applied running pax11publish | grep -Eo 'tcp:[^ ]*'
. You should see something like tcp:myhostname:4713
.
Now set the environment variables:
PULSE_SERVER
- PulseAudio server socket.PULSE_COOKIE_DATA
- Hexadecimal encoded PulseAudio cookie commonly at~/.config/pulse/cookie
.
Example to check it works:
$ docker run --rm \
-e "PULSE_SERVER=tcp:$(hostname -i):4713" \
-e "PULSE_COOKIE_DATA=$(pax11publish -d | grep --color=never -Po '(?<=^Cookie: ).*')" \
wernight/mopidy \
gst-launch-1.0 audiotestsrc ! audioresample ! autoaudiosink
$ docker run -d \
$PUT_HERE_EXRA_DOCKER_ARGUMENTS_FOR_AUDIO_TO_WORK \
-v "$PWD/media:/var/lib/mopidy/media:ro" \
-v "$PWD/local:/var/lib/mopidy/local" \
-p 6600:6600 -p 6680:6680 \
--user $UID:$GID \
wernight/mopidy \
mopidy \
-o spotify/username=USERNAME -o spotify/password=PASSWORD \
-o gmusic/username=USERNAME -o gmusic/password=PASSWORD \
-o soundcloud/auth_token=TOKEN
version: "3.7"
networks:
traefik:
external: true
services:
mopidy:
user: 1000:1000
image: artiume/mopidy
devices:
- /dev/snd
container_name: mopidy
hostname: mopidy
networks:
traefik:
ports:
- "6600:6600"
- "6680:6680"
environment:
TZ: ${TZ}
volumes:
- /data/brick/mopidy:/var/lib/mopidy/local
- /data/unionfs/media/music:/var/lib/mopidy/media:ro
- /data/brick/mopidy/mopidy.conf:/config/mopidy.conf
- /data/brick/mopidy/jellyfin.conf:/config/jellyfin.conf
labels:
traefik.enable: "true"
traefik.docker.network: traefik
traefik.backend: mopidy
traefik.protocol: http
traefik.port: 6680
traefik.frontend.rule: Host:mopidy.${DOMAINNAME},
traefik.frontend.auth.forward.address: http://traefik-forward-auth:4181
traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User
traefik.frontend.auth.forward.trustForwardHeader: "true"
traefik.frontend.passHostHeader: "true"
traefik.frontend.headers.SSLForceHost: "true"
traefik.frontend.headers.SSLHost: mopidy.${DOMAINNAME}
traefik.frontend.headers.SSLRedirect: "true"
traefik.frontend.headers.browserXSSFilter: "true"
traefik.frontend.headers.contentTypeNosniff: "true"
traefik.frontend.headers.forceSTSHeader: "true"
traefik.frontend.headers.STSSeconds: 315360000
traefik.frontend.headers.STSIncludeSubdomains: "true"
traefik.frontend.headers.STSPreload: "true"
traefik.frontend.headers.customResponseHeaders: X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex
traefik.frontend.headers.frameDeny: "true"
traefik.frontend.headers.customFrameOptionsValue: 'allow-from https://${DOMAINNAME}'
restart: always
Most arguments are optional (see some examples below):
- Docker arguments:
$PUT_HERE_EXTRA_DOCKER_ARGUMENTS_FOR_AUDIO_TO_WORK
should be replaced with some arguments that work to play audio from within the docker container as tested above.-v ...:/var/lib/mopidy/media:ro
- (optional) Path to directory with local media files.-v ...:/var/lib/mopidy/local
- (optional) Path to directory to store local metadata such as libraries and playlists in.-p 6600:6600
- (optional) Exposes MPD server (if you use for example ncmpcpp client).-p 6680:6680
- (optional) Exposes HTTP server (if you use your browser as client).-p 5555:5555/udp
- (optional) Exposes UDP streaming for FIFE sink (e.g. for visualizers).--user $UID:$GID
- (optional) You may run as any UID/GID, and by default it'll run as UID/GID84044
(mopidy:audio
from within the container). The main restriction is if you want to read local media files: That the user (UID) you run as should have read access to these files. Similar for other mounts. If you have issues, try first as--user root
.
- Mopidy arguments (see mopidy's command for possible additional options),
replace
USERNAME
,PASSWORD
,TOKEN
accordingly if needed, or disable services (e.g.,-o spotify/enabled=false
):- For Spotify you'll need a Premium account.
- For Google Music use your Google account (if you have 2-Step Authentication, generate an app specific password).
- For SoundCloud, just get a token after registering.
NOTE: Any user on your system may run ps aux
and see the command-line you're running, so your passwords may be exposed.
A safer option if it's a concern, is using putting these passwords in a Mopidy configuration file based on mopidy.conf:
[core]
data_dir = /var/lib/mopidy
[local]
media_dir = /var/lib/mopidy/media
[audio]
output = tee name=t ! queue ! autoaudiosink t. ! queue ! udpsink host=0.0.0.0 port=5555
[m3u]
playlists_dir = /var/lib/mopidy/playlists
[http]
hostname = 0.0.0.0
[mpd]
hostname = 0.0.0.0
[spotify]
username=USERNAME
password=PASSWORD
[gmusic]
username=USERNAME
password=PASSWORD
[soundcloud]
auth_token=TOKEN
Then run it:
$ docker run -d \
$PUT_HERE_EXRA_DOCKER_ARGUMENTS_FOR_AUDIO_TO_WORK \
-v "$PWD/media:/var/lib/mopidy/media:ro" \
-v "$PWD/local:/var/lib/mopidy/local" \
-v "$PWD/mopidy.conf:/config/mopidy.conf" \
-p 6600:6600 -p 6680:6680 \
--user $UID:$GID \
wernight/mopidy
-
Give read access to your audio files to user 84044, group 84044, or all users (e.g.,
$ chgrp -R 84044 $PWD/media && chmod -R g+rX $PWD/media
). -
Index local files:
$ docker run --rm \ --device /dev/snd \ -v "$PWD/media:/var/lib/mopidy/media:ro" \ -v "$PWD/local:/var/lib/mopidy/local" \ -p 6680:6680 \ wernight/mopidy mopidy local scan
-
Start the server:
$ docker run -d \ -e "PULSE_SERVER=tcp:$(hostname -i):4713" \ -e "PULSE_COOKIE_DATA=$(pax11publish -d | grep --color=never -Po '(?<=^Cookie: ).*')" \ -v "$PWD/media:/var/lib/mopidy/media:ro" \ -v "$PWD/local:/var/lib/mopidy/local" \ -p 6680:6680 \ wernight/mopidy
-
Browse to http://localhost:6680/
Example using ncmpcpp MPD console client
$ docker run --name mopidy -d \
-v /run/user/$UID/pulse:/run/user/105/pulse \
wernight/mopidy
$ docker run --rm -it --net container:mopidy wernight/ncmpcpp ncmpcpp
Alternatively if you don't need visualizers you can do:
$ docker run --rm -it --link mopidy:mopidy wernight/ncmpcpp ncmpcpp --host mopidy
Having more issues? Report a bug on GitHub. Also if you need some additional extensions/plugins that aren't already installed (please explain why).
For non debian distros. The gid for audio group in /etc/group must be 29 to match debians default as audio:x:29:<your user outside of docker>
this is to match the user id inside the docker container. You'll also need to add the output = alsasink
config line under the audio section in your mopidy.conf
.
$ docker run -d -rm \
--device /dev/snd \
--name mopidy \
--ipc=host \
--privileged \
-v $HOME/.config/mopidy:/var/lib/mopidy/.config/mopidy/ \
-p 6600:6600/tcp -p 6680:6680/tcp -p 5555:5555/udp \
mopidy