Deploy Navidrome with Docker to Build Your Own Cloud Music Server
In the era of online copyright, playing a song often requires payment. Even with a VIP subscription, downloaded songs are encrypted, and you may lose access to certain tracks once your VIP expires, as seen with some major music platforms.
This led me to search for a self-hosted cloud music service similar to popular streaming apps, allowing playback anytime and anywhere. I found several software options that meet this need:
- Multimedia management: Jellyfin, Emby, Plex
- Airsonic
- Navidrome
- Built-in music suites on Synology and QNAP NAS devices
I have been using the free and open-source Jellyfin for multimedia management. While Jellyfin is excellent for managing and playing movies, its music management capabilities feel lacking. Some lossless tracks experience stuttering or fail to play.
I then tried Airsonic and Navidrome. Airsonic is a Java-based music player with powerful and professional features, offering numerous configurable music parameters. However, as an amateur user, I found these parameters confusing. Being Java-based, it consumes significant memory, and the excessive options make it less simple and convenient. I then discovered Navidrome, a music player developed in Golang. It has very low memory usage, a simple interface, and is compatible with the Subsonic API. Let's proceed with the deployment.

Deploy Navidrome via Docker
Deploy using the Docker command line (modify the paths as needed):
docker run -d \
--name navidrome \
--restart=unless-stopped \
--user $(id -u):$(id -g) \
-v /path/to/music:/music \
-v /path/to/data:/data \
-p 4533:4533 \
-e ND_LOGLEVEL=info \
deluan/navidrome:latest
/path/to/music: Your local host's music folder/path/to/data: Navidrome configuration data folder
However, I do not recommend command-line deployment as it is inconvenient to maintain. If you have installed Docker Compose, I recommend using it. Create a docker-compose.yaml file with the following content:
version: "3"
services:
navidrome:
container_name: navidrome
image: deluan/navidrome:latest
user: 0:0 # 0:0 means running as root
ports:
- "4533:4533"
restart: unless-stopped
environment:
# Optional: put your config options customization here. Examples:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: ""
ND_ENABLETRANSCODINGCONFIG: "true"
ND_TRANSCODINGCACHESIZE: "4000M"
ND_IMAGECACHESIZE: "1000M"
volumes:
- "/apps/navidrome/data:/data"
- "/media/Music:/music:ro"
/apps/navidrome/data: Specify a local path to store Navidrome data/media/Music:/music: Path to your host's music folder
Then run docker-compose up -d. If no errors occur, you can access it via http://IP:4533. The first visit will require setting up an account and password.

Using Navidrome
On a PC, access via http://IP:4533. The interface is clean and fits modern aesthetics.

You can change the language to Chinese by clicking the user button in the top right corner, then selecting Personal - Language, as shown below.

For Android, I recommend the Ultrasonic app, which supports connecting to Navidrome. (iOS official recommended clients include: play:Sub, substreamer, Amperfy, and iSub). This requires setting up public network mapping or using FRP (detailed explanation omitted here).

Navidrome supports a Chinese interface (though not fully localized). However, it seems unable to list all songs, instead showing albums. You can pre-favorite your favorite music on the Ultrasonic web interface. This might not align with Chinese user habits. If you find a better alternative, please leave a comment.
Navidrome Pros and Cons
Pros:
- Low memory usage (around 40MB in idle state)
- Simple interface with Chinese support
- Supports Subsonic API, meaning any client compatible with Subsonic works with Navidrome
Cons:
- Seems unable to display lyrics
- Does not support deleting songs via the interface (the author cites security concerns, though I feel this is overly cautious)
Conclusion
- Navidrome Official Website: https://www.navidrome.org/
- Navidrome Documentation: https://www.navidrome.org/docs/
- Project Repository: https://github.com/navidrome/navidrome/