Jellystack is a fully containerized and automated media server stack using Docker Compose. It brings together powerful tools like Jellyfin, qBittorrent, Sonarr, Radarr, Prowlarr, Bazarr, and Overseerr.
- Jellyfin – Media server for streaming movies and TV shows
- qBittorrent – Torrent client with Web UI
- Sonarr – Automatic TV show downloads and organization
- Radarr – Movie management and automation
- Prowlarr – Indexer manager for Sonarr and Radarr
- Bazarr – Subtitle downloader for your media library
- Overseerr – Request management and discovery
- Network Isolation – Restricted communication between services via dedicated Docker networks
jellystack/
│
├── .env # Environment file with PUID, PGID and TZ
├── docker-compose.yml # Main media stack configuration
└── media/ # Media storage (local bind)
├── downloads/ # Where qBittorrent downloads go
├── movies/ # Where Radarr stores movies
└── tv/ # Where Sonarr stores TV shows
-
Clone the repository:
git clone https://github.com/0xsharkboy/jellystack.git cd jellystack -
Edit the
.envfile: Define your user and group ID, timezone, and media storage path.PUID=1000 PGID=1000 TZ=Europe/Paris MEDIA_FOLDER=./media
-
Start the stack:
docker-compose up -d
To enable hardlinking (zero-copy moves) and save disk space, all media services share a single /data mount point. You must update the internal paths in each application's Web UI:
| Application | Setting | New Path |
|---|---|---|
| qBittorrent | Default Save Path | /data/downloads |
| Sonarr | Root Folder | /data/tv |
| Radarr | Root Folder | /data/movies |
| Jellyfin | Library Paths | /data/movies and /data/tv |
| Bazarr | Root Folder | /data/movies and /data/tv |
To ensure Sonarr uses hardlinks instead of copies:
- Go to Settings > Media Management.
- Enable Advanced Settings (top toggle).
- Ensure Importing > Use Hardlinks instead of Copy is checked.
- Ensure your download client in Sonarr uses a Category (like
tv-sonarr) to keep the downloads organized within/data/downloads.
Important
Hardlinking only works if the source and destination are on the same filesystem. By using the unified /data mount, this is handled automatically. However, ensure the user defined by PUID/PGID has write permissions to the entire MEDIA_FOLDER.
| Service | Default Port |
|---|---|
| Jellyfin | 8096 |
| qBittorrent | 8888 |
| Sonarr | 8989 |
| Radarr | 7878 |
| Prowlarr | 9696 |
| Bazarr | 6767 |
| Overseerr | 5055 |
This stack builds on the work of many amazing open-source projects:
- Jellyfin
- qBittorrent
- Sonarr
- Radarr
- Prowlarr
- Bazarr
- Overseerr
- linuxserver.io for providing most of the container images used in this project
Built with love and torrents.