This repository contains Docker Compose setups for managing self-hosted media services including:
- Plex – media streaming server
- Jellyfin – open-source media server alternative to Plex
- Navidrome – lightweight self-hosted music server
- Nginx Proxy Manager (NPM) – reverse proxy with SSL support and admin UI
Each service has its own folder with an isolated docker-compose.yaml file and environment file. .env.example files are provided for your convenience.
servers/
├── jellyfin/
│ ├── docker-compose.yaml
│ └── .env
├── navidrome/
│ ├── docker-compose.yaml
│ └── .env
├── nginx-proxy-manager/
│ ├── docker-compose.yaml
│ └── .env
└── plex/
├── docker-compose.yaml
└── .env
- Docker
- Docker Compose
- WSL2 (on Windows)
All helper scripts assume you are in the root project directory:
./start_all.sh # Linux/macOS/WSL
.\start_all.ps1 # Windows PowerShell./stop_all.sh # Linux/macOS/WSL
.\stop_all.ps1 # Windows PowerShellYou can expose services to the internet using DuckDNS and free SSL via Nginx Proxy Manager:
- Set up your domain (e.g.,
mynavidrome.duckdns.org) - Point DuckDNS to your public IP
- Add a Proxy Host in Nginx Proxy Manager (eg. port 8096 for Jellyfin)
- Enable SSL and HTTP → HTTPS redirect
Note: Make sure the port exposed in
docker-compose(e.g.,8096:8096) matches what you route in Nginx.
| Service | External Port | Internal Port | Description |
|---|---|---|---|
| Plex | 32400 | 32400 | Web interface / TV |
| Jellyfin | 8096 | 8096 | Web interface / API |
| Navidrome | 4533 | 4533 | Web and API access |
| NPM UI | 81 | 81 | Nginx Manager UI |
| NPM Web | 80/443 | 80/443 | Reverse Proxy HTTP/S |
All secrets (e.g., API keys, Plex claims) are stored in .env files.
To avoid leaking them:
- Make sure your
.gitignoreincludes:
.env
*/.env- Do not hardcode sensitive environment variables in your YAML files.
- Replace any sensitive values with
${VARNAME}and define them in the.env.
- You don’t need
network_modeunless you're doing special networking. - Keep all
docker-compose.yamlfiles isolated but structured consistently. - Use the
.envpattern to keep your repository clean and secure.
Feel free to fork and adapt this stack for your own needs. PRs welcome for improvements, script enhancements, or service additions.
⚠️ Note: Each individual service (e.g., Jellyfin, Plex, Navidrome, Nginx Proxy Manager) is a separate project and is governed by its own license. Refer to their official documentation or GitHub repositories for detailed licensing information.
I have a deep appreciation for music and film. Instead of relying on commercial streaming services, I prefer a more personal, permanent, and high-quality approach:
- I rip my own CDs and DVDs to ensure full control over audio/video quality, metadata, and format.
- My collection is curated with intention not dictated by licensing agreements or shifting catalogs.
- I avoid DRM and platform lock-in to enjoy media on my terms, without ads or compression artifacts.
- My setup supports multiple formats, custom libraries, and subtitles exactly how I want them.
🎵 I believe in supporting your local shops, whether it's independent record shops, used bookstores, or non chain movie retailers buying physical media helps preserve culture, supports small businesses, and gives you ownership that streaming services can't replicate.