Anyone who has researched programs such as Radarr, Sonarr, and other related software has probably come across the famous TRaSH Guides. In short, it is a best-practices guide that explains how to get the most out of these programs when it comes to disk storage.
Most of these media-management applications rely heavily on the concept of hardlinks. Their main use in this scenario is to have the same file in different locations, such as your media library directory (Plex/Jellyfin) and your BitTorrent client’s directory for seeding the media. This is very useful because it avoids duplicating files on your HDD/SSD, while still allowing you to rename the file in the link and add relevant information about the media.
The TRaSH Guides’ suggestion
On their website, they suggest the following directory structure to organize your files:
data
├── torrents
│ ├── books
│ ├── movies
│ ├── music
│ └── tv
├── usenet
│ ├── incomplete
│ └── complete
│ ├── books
│ ├── movies
│ ├── music
│ └── tv
└── media
├── books
├── movies
├── music
└── tv
The data directory contains three folders: torrents, usenet, and
media. The torrents and usenet folders contain categories for keeping
your downloads organized, while media contains the hardlinks pointing to
files in the torrents and usenet directories. Keeping a separate media
folder is useful because Jellyfin/Plex can use it to identify your media,
while the torrents folder may contain unrelated files.
This structure is good, and I have used it ever since I started getting into the world of self-hosting. However, I believe it can be improved.
The structure I currently use
The main issue I see with the TRaSH Guides’ structure is that if you download
something that does not belong in the torrents or usenet folders (because it
was not downloaded by qBittorrent or SABnzbd, for example), there is no suitable
place for it and it ends up being “thrown” somewhere. Creating a separate
folder for every source would also make the structure unnecessarily cluttered.
I use Soulseek for some things, and it would also end up being “thrown” somewhere. Every new download source would mean another folder at an additional directory level, which does not make much sense to me.
In my homelab, I use the following structure:
/mnt/terachad
└── data
├── downloads
│ ├── slskd
│ ├── tidal
│ ├── torrents
│ └── usenet
└── media
├── audiobooks
├── books
├── courses
├── movies
├── music
└── tv
This feels much more intuitive because everything is kept under the downloads
directory. In the Compose file, the volumes look like this (depending on which
container is being used, of course):
- ${DATA_ROOT}:/data
- ${DATA_ROOT}/downloads/torrents:/data/torrents/
- ${DATA_ROOT}/media:/data/media:ro
Conclusion
In my opinion, having a downloads folder makes the structure much more
organized.
At first, this may seem irrelevant, or you may think, “I only use torrents.”
I thought the same thing, but the self-hosting rabbit hole is deep: you will
want more and more services, and you will probably end up with many folders
inside downloads.
Making this change after you are already using your entire container stack is quite troublesome, especially because of hardlinks. You will also have to configure volume mappings in the *arr stack (I had to do this), which is one more thing to remember when troubleshooting.
So, if I were starting today, I would have liked someone to tell me to use this structure from the beginning to avoid rework.
