Add Navidrome music streaming server

- Add Navidrome service to docker-compose with Traefik routing
- Route music.jeffemmett.com to Navidrome instead of Jellyfin
- Update README with Navidrome docs and Subsonic-compatible mobile apps
- Add Navidrome environment variables to .env.example

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2025-12-12 15:43:03 -05:00
parent a04f5d0111
commit ed267545d7
3 changed files with 45 additions and 5 deletions

View File

@ -12,6 +12,11 @@ PGID=1000
# Jellyfin
JELLYFIN_PublishedServerUrl=https://movies.jeffemmett.com
# Navidrome
ND_SCANSCHEDULE=1h
ND_LOGLEVEL=info
ND_SESSIONTIMEOUT=24h
# Transmission (optional auth)
TRANSMISSION_USER=admin
TRANSMISSION_PASS=changeme

View File

@ -60,7 +60,8 @@ cp .env.example .env
| Service | Port | Description |
|---------|------|-------------|
| Jellyfin | 8096 | Media player |
| Jellyfin | 8096 | Video streaming (movies & TV) |
| Navidrome | 4533 | Music streaming server |
| Sonarr | 8989 | TV show management |
| Radarr | 7878 | Movie management |
| Prowlarr | 9696 | Indexer management |
@ -69,8 +70,15 @@ cp .env.example .env
## Access
All services accessible via Cloudflare Tunnel:
- **Movies & TV**: https://movies.jeffemmett.com
- **Music**: https://music.jeffemmett.com
- **Movies & TV**: https://movies.jeffemmett.com (Jellyfin)
- **Music**: https://music.jeffemmett.com (Navidrome)
### Navidrome Mobile Apps
Navidrome is Subsonic-compatible. Use any Subsonic client:
- **Android**: Ultrasonic, Symfonium, DSub
- **iOS**: play:Sub, Amperfy, SubStreamer
- **Desktop**: Sonixd, Sublime Music
## Folder Structure

View File

@ -16,14 +16,41 @@ services:
- traefik-public
labels:
- "traefik.enable=true"
# Route both movies.jeffemmett.com and music.jeffemmett.com to Jellyfin
- "traefik.http.routers.jellyfin.rule=Host(`movies.jeffemmett.com`) || Host(`music.jeffemmett.com`)"
- "traefik.http.routers.jellyfin.rule=Host(`movies.jeffemmett.com`)"
- "traefik.http.routers.jellyfin.entrypoints=web"
- "traefik.http.routers.jellyfin.middlewares=jellyfin-headers"
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
- "traefik.http.middlewares.jellyfin-headers.headers.customRequestHeaders.X-Forwarded-Proto=https"
- "traefik.docker.network=traefik-public"
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
restart: unless-stopped
user: 1000:1000
environment:
- ND_SCANSCHEDULE=1h
- ND_LOGLEVEL=info
- ND_SESSIONTIMEOUT=24h
- ND_BASEURL=
- ND_ENABLETRANSCODINGCONFIG=true
- ND_TRANSCODINGCACHESIZE=1GB
- ND_IMAGECACHESIZE=500MB
volumes:
- ./config/navidrome:/data
- ./media/music:/music:ro
networks:
- media-network
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.navidrome.rule=Host(`music.jeffemmett.com`)"
- "traefik.http.routers.navidrome.entrypoints=web"
- "traefik.http.routers.navidrome.middlewares=navidrome-headers"
- "traefik.http.services.navidrome.loadbalancer.server.port=4533"
- "traefik.http.middlewares.navidrome-headers.headers.customRequestHeaders.X-Forwarded-Proto=https"
- "traefik.docker.network=traefik-public"
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr