Note: This project is created for personal use only. It is not intended for commercial deployment or redistribution.
A Docker Compose setup for a home media server, featuring qBittorrent for torrenting, Jellyfin for media streaming, and a custom monitoring dashboard to display system stats (disk space) and quick links to the services. The dashboard features a dynamic nature-themed background slideshow.
- qBittorrent: Web-based torrent client for downloading media.
- Jellyfin: Open-source media server for streaming movies, TV shows, and music.
- Monitor Dashboard:
- Displays free disk space for
C:/Docker. - Placeholder for PC temperature (requires host integration).
- Quick links to qBittorrent and Jellyfin using the host's WLAN IP.
- Random nature background images that slide every 5 seconds.
- Displays free disk space for
- Docker Compose: Easy deployment with a single configuration file.
- Custom Network: Isolated
media_networkfor service communication.
- Docker Desktop: Installed and running on Windows (with WSL 2 or Hyper-V enabled).
- Disk Space: At least 10 GB free on
C:for Docker volumes. - Network: Access to the host's WLAN IP (e.g.,
192.168.1.100). - Permissions: User with
PUID=1000andPGID=1000(or adjust environment variables).
media-server-stack/
βββ docker-compose.yml
βββ monitor/
βββ Dockerfile
βββ nginx.conf
βββ app/
β βββ app.py
βββ usr/share/nginx/html/
βββ index.html
-
Clone the Repository:
git clone https://github.com/jericbas/media-server-stack.git cd media-server-stack -
Create Docker Volumes Directory:
- Create
C:/Dockeron your Windows host. - Ensure subdirectories exist:
qbittorrent/config,qbittorrent/downloads,jellyfin/config,jellyfin/cache,jellyfin/media.
mkdir -p C:/Docker/qbittorrent/config C:/Docker/qbittorrent/downloads C:/Docker/jellyfin/config C:/Docker/jellyfin/cache C:/Docker/jellyfin/media
- Create
-
Configure WLAN IP (Optional):
- Edit
docker-compose.ymland set theWLAN_IPenvironment variable in themonitorservice to your host's IP (e.g.,192.168.1.100). - If unset, the dashboard will attempt to detect the IP dynamically (fallback:
192.168.1.100).
- Edit
-
Run Docker Compose:
docker-compose up -d --build
-
Access Services:
- Monitor Dashboard:
http://192.168.1.100 - Jellyfin:
http://192.168.1.100:8096 - qBittorrent:
http://192.168.1.100:8080
- Monitor Dashboard:
-
Ensure Docker Desktop is installed and running on Windows.
-
Create the required directories:
- C:/Docker/qbittorrent/config
- C:/Docker/qbittorrent/downloads
- C:/Docker/jellyfin/config
- C:/Docker/jellyfin/cache
- C:/Docker/jellyfin/media
-
(Optional) Edit
docker-compose.ymlto set your WLAN_IP if needed. -
Open PowerShell in the project directory and run:
docker-compose up -d --build
-
Access the services in your browser:
- Monitor Dashboard: http://[WLAN_IP]
- Jellyfin: http://[WLAN_IP]:8096
- qBittorrent: http://[WLAN_IP]:8080
Note: For qBittorrent, the initial password is randomly generated. Check the container logs with:
docker-compose logs qbittorrentLook for a line like
INFO - qBittorrent password is: ....
- Monitor Dashboard:
- View free disk space for
C:/Docker. - Click quick links to access Jellyfin or qBittorrent.
- Toggle between light and dark themes.
- Background images (nature-themed) change every 5 seconds.
- View free disk space for
- Jellyfin:
- Configure media libraries to point to
/media(maps toC:/Docker/jellyfin/media. - Access via the web interface to stream media.
- Configure media libraries to point to
- qBittorrent:
- Download torrents to
/downloads(maps toC:/Docker/qbittorrent/downloads. - Move completed media to
/mediafor Jellyfin to access.
- Download torrents to
- Service Not Starting:
- Check logs:
docker-compose logs <service>(e.g.,monitor,jellyfin). - Ensure
C:/Dockerexists and is accessible.
- Check logs:
- Dashboard Links Not Working:
- Verify
WLAN_IPindocker-compose.ymlor update the fallback IP inmonitor/usr/share/nginx/html/index.html.
- Verify
- Permission Issues:
- Adjust
PUIDandPGIDindocker-compose.ymlto match your user (runidon Linux or check Windows user SID).
- Adjust
- The monitor dashboard is publicly accessible on port 80. For production, add authentication (e.g., Nginx basic auth).
- Ensure
C:/Dockerhas appropriate permissions (owned byPUID=1000,PGID=1000or equivalent). - Consider a reverse proxy with SSL for external access.
- Temperature Monitoring:
- Implement host-side temperature monitoring (e.g., Open Hardware Monitor on Windows) and mount data into the
monitorcontainer.
- Implement host-side temperature monitoring (e.g., Open Hardware Monitor on Windows) and mount data into the
- Additional Services:
- Add services like Radarr or Sonarr for automated media management.
- Backup:
- Regularly back up
C:/Dockerto prevent data loss.
- Regularly back up
The Monitor Dashboard exposes the following API endpoints (served by the Flask app in monitor/app/app.py):
GET /api/diskβ Returns free disk space forC:/Dockerin JSON format.GET /api/tempβ Returns PC temperature (currently a placeholder; requires host integration).GET /api/linksβ Returns quick links to qBittorrent and Jellyfin using the configured WLAN IP.
Note: Endpoints may be extended or changed as you customize the dashboard. See
monitor/app/app.pyfor implementation details.
This project is licensed under the MIT License. See LICENSE for details.
Contributions are welcome! Please open an issue or submit a pull request on GitHub.
- LinuxServer.io for the qBittorrent image.
- Jellyfin for the media server.
- Unsplash for royalty-free nature images.