Skip to content

garnajee/home-server

Repository files navigation

Home Server

Caution

Disclaimer: The author and contributors do not claim ownership of any services listed or used in this repository and are not legally responsible for any improper or illegal use. It is provided for educational purposes only. The repository does not endorse piracy or copyright infringement. Creating a media platform based on torrents may involve downloading copyrighted content, which, without proper authorization, may be illegal in many jurisdictions. All rights go to the owners of the software used.

This is my Docker setup for a complete media server.

The primary method now uses two Docker Compose files:

  • docker-compose-internal.yml for internal automation and VPN-bound services
  • docker-compose-public.yml for user-facing services

I switched from transmission-openvpn to qbittorrent + gluetun because:

  • VPN and torrent client are now independent and easier to maintain
  • Gluetun is actively maintained and more flexible
  • qBittorrent is better for large torrent libraries (tags, categories, priorities, queueing)
  • Internal updates can be done without disrupting Jellyfin/Seerr users

Note

I've also created a chill-extra folder that can send WhatsApp notifications when media is added in Jellyfin, add removarr, and provide helper scripts.

Important

The legacy method (single compose + transmission-openvpn) is still available in this guide.

Table of Contents

Requirements

Synology:

  • Install Docker/Container Manager from Synology Package Center
  • Create a docker user
    • then run id <username> and note uid/gid as PUID/PGID for your .env
  • Install latest compose plugin if needed
  • Check version: docker compose version (or docker-compose version)

Media Server (Recommended: split internal/public)

What's inside

docker-compose-internal.yml:

docker-compose-public.yml:

Installation

Create folders:

mkdir -p /opt/chill/{qbit,prowlarr,radarr,sonarr,jellyfin,seerr}/config
mkdir -p /opt/chill/storage/downloads/{watch,completed,incomplete,medias/{movies,series}}

Download files in /opt/chill/:

cd /opt/chill
wget https://raw.githubusercontent.com/garnajee/home-server/master/docker-compose-internal.yml -O docker-compose-internal.yml
wget https://raw.githubusercontent.com/garnajee/home-server/master/docker-compose-public.yml -O docker-compose-public.yml
wget https://raw.githubusercontent.com/garnajee/home-server/master/.env-example -O .env

Modify .env

You usually only need to edit .env:

  • WG_PRV_KEY
  • WG_SERVER_COUNTRIES
  • QBIT_WEBUI_PORT
  • BASE, DOWNLOADS
  • PUID, PGID
  • TZ
  • NETWORKIP (detect with ip route | awk '!/ (docker0|br-)/ && /src/ {print $1}')

Example:

# VPN
WG_PRV_KEY="YOUR_WIREGUARD_PRIVATE_KEY"
WG_SERVER_COUNTRIES="Country"
QBIT_WEBUI_PORT=8088

# the rest is unchanged
BASE=/opt/chill
DOWNLOADS=/opt/chill/storage/downloads
PUID=1030
PGID=100
TZ=Europe/Paris
NETWORKIP=192.168.1.0/24

Create a docker network

Optional (it can be auto-created), but manual creation is recommended:

docker network rm net-chill
docker network create net-chill -d bridge --subnet 10.10.66.0/24

Run

Run internal stack:

cd /opt/chill
docker compose -f docker-compose-internal.yml up -d

Run public stack:

docker compose -f docker-compose-public.yml up -d

Check containers:

docker compose -f docker-compose-internal.yml ps -a
docker compose -f docker-compose-public.yml ps -a

Check VPN connection

docker exec -it gluetun wget -qO- https://ifconfig.co

Then check the location of that IP (for example on ifconfig.co).

Update docker images

Update internal stack only:

docker compose -f docker-compose-internal.yml pull
docker compose -f docker-compose-internal.yml up -d

Update public stack only:

docker compose -f docker-compose-public.yml pull
docker compose -f docker-compose-public.yml up -d

Access services

Service Address
qBittorrent WebUI <IP>:${QBIT_WEBUI_PORT}
Prowlarr <IP>:8001
Jellyfin <IP>:8003
Seerr <IP>:8004
Radarr <IP>:8010
Sonarr <IP>:8011

Legacy setup (single compose + Transmission)

This method is still supported.

cd /opt/chill
wget https://raw.githubusercontent.com/garnajee/home-server/master/docker-compose-medias.yml -O docker-compose-medias.yml
wget https://raw.githubusercontent.com/garnajee/home-server/master/.env-example-legacy -O .env
docker compose -f docker-compose-medias.yml up -d

This is no longer the recommended default.

Reverse Proxy

To access Jellyfin and Seerr outside your local network, use a reverse proxy. In this guide, we use Nginx Proxy Manager.

You need to open 2 ports on your router:

Application/Service Internal Port External Port Protocol Equipment
HTTP 8080 80 TCP/UDP Your-Server
HTTPS 4443 443 TCP/UDP Your-Server

What's inside

Installation

Create folders:

mkdir -p /opt/docker/{nginx-proxy-manager,npm-db}

Download compose file:

cd /opt/docker
wget https://raw.githubusercontent.com/garnajee/home-server/master/docker-compose-rp.yml -O docker-compose.yml

Run

cd /opt/docker
docker compose up -d

Service URL: <IP>:81

Default admin:

email: admin@example.com
password: changeme

Get a domain name & SSL certificate

I use OVH:

You'll get values like:

dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = xxxxxxxxxxxxx
dns_ovh_application_secret = xxxxxxxxxxxxx
dns_ovh_consumer_key = xxxxxxxxxxxxx

In NPM:

  • go to SSL Certificates
  • add wildcard + root domain: *.yourdomain.com and yourdomain.com

Setup all services

qBittorrent

Configure categories, tags, queueing, and priorities to match your workflow.

qBittorrent reference config (troubleshooting)

If users run into issues, they can compare with this known working reference:

Radarr & Sonarr

Follow TRaSH guides.

If you want similar quality profiles/custom formats, see recyclarr-setup.

Prowlarr

Add indexers, then connect apps in Settings > Apps:

  • Prowlarr: http://10.10.66.100:9696
  • Radarr: http://10.10.66.110:7878
  • Sonarr: http://10.10.66.111:8989

Jellyfin

Follow initial setup wizard and create users.

For custom menu links:

- ${BASE}/jellyfin/web-config.json:/usr/share/jellyfin/web/config.json

Read more: Jellyfin web config.

Seerr

Sign in with Jellyfin account and use internal Docker IPs for Jellyfin/Radarr/Sonarr connections.

Bonus

Do not want to expose ports?

Warning

Be careful with CloudFlare Tunnel for Jellyfin streaming, it can violate Cloudflare ToS.

Webhooks

Jellyfin webhook templates are available for:

Install plugin first: Jellyfin Dashboard > Plugins > Catalog > Webhook.

Restart Jellyfin:

cd /opt/chill
docker compose -f docker-compose-public.yml restart jellyfin

For WhatsApp workflow examples, see whatsapp-api.

Fake Ratio

If you need to fake upload ratio on private trackers, you can use Ratio.py.

Caution

Not recommended for long-term usage. Consider seeding fairly.

When using the legacy Transmission container, you can run the script there so traffic stays behind VPN.

License

This project is under MIT License.

About

docker-compose for Media Server Automation (Radarr, Sonarr, Jellyfin, ...) and reverse proxy

Resources

License

Stars

Watchers

Forks

Contributors