A complete Docker Compose stack for automated media management and streaming using Jellyfin and the *arr suite.
- Dedicated IP Addresses: Uses macvlan networking to assign each container its own IP address, avoiding port conflicts
- Complete Media Automation: Integrated downloading, organizing, and streaming workflow
- Easy Setup: Automated directory creation with included script
- Modular Design: Each service runs in its own container for easy management
| Service | Description | Default Port |
|---|---|---|
| Jellyfin | Media server for streaming your content | 8096 |
| Sonarr | TV show management and automation | 8989 |
| Radarr | Movie management and automation | 7878 |
| Prowlarr | Indexer manager for *arr apps | 9696 |
| qBittorrent | Torrent client | 8080 |
| Requestrr | Chatbot for Discord/Telegram media requests | 4545 |
- Docker - Install Docker
- Docker Compose - Install Docker Compose
- Linux Server/Host - Ubuntu, Debian, or similar
- Storage Space - Adequate storage for your media library
- Network Knowledge - Understanding of your network's subnet and gateway
First, identify your network adapter name using one of these commands:
ifconfig -aOR
ip link showOR
ip aLook for your primary network interface (typically eth0, ens18, enp0s3, etc.)
Create a Docker macvlan network with your network configuration:
docker network create -d macvlan \
--subnet=[YOUR_SUBNET] \
--gateway=[YOUR_GATEWAY_IP] \
-o parent=[YOUR_NETWORK_ADAPTER] \
mediamacvlanExample:
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
mediamacvlanCreate a parent directory for the media stack:
mkdir ~/mediastack
cd ~/mediastackClone this repository:
git clone https://github.com/gkmayn/jellyfinmediastack.git .Make the directory creation script executable:
chmod +x directory.shRun the script to create all necessary directories:
./directory.shThe script will create the required directory structure and display the paths.
Edit the docker-compose.yml file:
nano docker-compose.ymlUpdate the following:
- IP Addresses: Assign static IPs to each container within your subnet
- Volume Mappings: Verify the paths match those created by
directory.sh - Timezone: Set your timezone (e.g.,
TZ=America/New_York) - PUID/PGID: Set to match your user (run
idto find these values)
Start all containers:
sudo docker-compose up -dVerify containers are running:
sudo docker-compose ps- Prowlarr - Configure indexers first
- Sonarr/Radarr - Connect to Prowlarr for indexers
- qBittorrent - Set download paths
- Sonarr/Radarr - Configure qBittorrent as download client
- Jellyfin - Add media libraries
- Requestrr - Connect to Sonarr/Radarr
If you assigned IPs starting from 192.168.1.100:
- Jellyfin:
http://192.168.1.100:8096 - Sonarr:
http://192.168.1.101:8989 - Radarr:
http://192.168.1.102:7878 - Prowlarr:
http://192.168.1.103:9696 - qBittorrent:
http://192.168.1.104:8080 - Requestrr:
http://192.168.1.105:4545
(Adjust IPs based on your configuration)
The directory.sh script creates the following structure:
mediastack/
βββ config/
β βββ jellyfin/
β βββ sonarr/
β βββ radarr/
β βββ prowlarr/
β βββ qbittorrent/
β βββ requestrr/
βββ media/
β βββ movies/
β βββ tv/
β βββ downloads/
βββ docker-compose.yml
sudo docker-compose up -dsudo docker-compose downsudo docker-compose logs -f [service_name]sudo docker-compose restart [service_name]sudo docker-compose pull
sudo docker-compose up -d- Verify macvlan network exists:
docker network ls - Check IP addresses don't conflict with existing devices
- Ensure subnet and gateway are correct
- Check PUID/PGID in docker-compose.yml
- Verify directory permissions:
ls -la - May need to run:
sudo chown -R $USER:$USER ./config ./media
- Verify containers are running:
docker-compose ps - Check firewall rules
- Ensure IPs are accessible from your network
- Check logs:
docker-compose logs [service_name] - Verify volume paths exist
- Check for port conflicts
- Volumes: This setup creates volumes outside the compose file for better control over storage and permissions
- Network Isolation: Each container gets its own IP, making it easier to manage firewall rules and avoid port conflicts
- Customization: You can add or remove services by editing the docker-compose.yml file
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is open source and available under the MIT License.
- Jellyfin - The free software media system
- Sonarr - Smart PVR for newsgroup and bittorrent users
- Radarr - Movie collection manager
- Prowlarr - Indexer manager/proxy
- qBittorrent - Open-source BitTorrent client
If you have questions or need help:
- Open an Issue
- Check existing issues for solutions
- Review the documentation for each service