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."

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