The Single Mount
A hardlink is one file with two directory entries. Both paths point to the same inode — the same bytes on disk. No duplication. No extra space. The operating system treats them as equal; neither is the "original."
Download path
/data/downloads/torrents/radarr/Movie.mkv inode #3899
Library path
/data/media/movies/Movie (2024)/Movie.mkv Same inode = zero extra disk space
Correct vs Wrong Mounts
Correct
-v /data:/data Single mount. Same filesystem. Hardlinks work.
Wrong
-v /downloads:/downloads
-v /media:/media Separate mounts. Cross-device. Files get COPIED. Disk doubles.
Volume Mount Tiers
Not every container needs full access to /data. Three tiers of Docker volume permissions keep the attack surface small and intentions clear.
Tier 1 Full /data r/w
Transmission SABnzbd Radarr Sonarr Lidarr Bazarr LazyLibrarian
Tier 2 Media only r/o
Jellyfin Kavita Audiobookshelf
Tier 3 Config only
Prowlarr Seerr QuestArr FlareSolverr Gluetun
The Hardlink Flow
1 Download completes —
inode #3899 created at /data/downloads/torrents/radarr/Movie.mkv 2 Torrent continues seeding from original download location
3 Radarr hardlinks to
/data/media/movies/ — same inode, new path 4 Jellyfin streams from the library path
5 Eventually stop seeding — inode persists, library file unaffected
Warning: If downloads and media are on separate mounts (
-v /downloads:/downloads -v /media:/media), hardlinks fail silently. Files get copied instead, doubling disk usage.
Directory Tree
Everything lives under /data. Three top-level directories serve different purposes.
config/
15 service databases
radarr sonarr lidarr bazarr prowlarr transmission sabnzbd jellyfin jellyfin-cache seerr lazylibrarian kavita audiobookshelf audiobookshelf-meta questarr
downloads/
Staging area
torrents/ radarr tv-sonarr lidarr books games
usenet/ movies tv music books audiobooks games
media/
Final library
movies/ Jellyfin
tv/ Jellyfin
music/ Jellyfin + Roon
books/ Kavita
audiobooks/ Audiobookshelf
games/ GameVault