<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>DiyMediaServer</title>
        <link>https://diymediaserver.com/</link>
        <description>Recent content on DiyMediaServer</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Sat, 07 Mar 2026 04:45:21 -0700</lastBuildDate><atom:link href="https://diymediaserver.com/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>VPS &#43; WireGuard: Why Your Homelab Needs a Public Edge</title>
        <link>https://diymediaserver.com/post/2026/vps-wireguard-homelab-private-internet-access/</link>
        <pubDate>Wed, 04 Mar 2026 07:42:23 +0000</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/vps-wireguard-homelab-private-internet-access/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/vps-wireguard-homelab-private-internet-access/featured.jpg" alt="Featured image of post VPS &#43; WireGuard: Why Your Homelab Needs a Public Edge" /&gt;&lt;p&gt;You finally got your homelab dialed in. Jellyfin streams flawlessly. Your dashboards are organized. Maybe you&amp;rsquo;re even self-hosting Gitea, Nextcloud, or a personal blog.&lt;/p&gt;
&lt;p&gt;Then comes the big question: how do you safely share those services with the outside world?&lt;/p&gt;
&lt;p&gt;If your answer is port forwarding on your router, you&amp;rsquo;re not alone. I did the same thing. I slapped a reverse proxy and Cloudflare in front and called it a day. It worked. It felt secure. It was not as secure as I thought.&lt;/p&gt;
&lt;p&gt;When I moved to a Virtual Private Server (VPS) running a second reverse proxy with a WireGuard tunnel back to my homelab, everything changed. My home IP disappeared from the public internet. My router stopped getting hammered. I stopped lying awake wondering what was poking at my network.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re serious about running public-facing services from home, a VPS in front of your homelab is the smarter move. Not because port forwarding is automatically a problem, but because a VPS shrinks your attack surface and limits the blast radius when something goes wrong. And something always goes wrong eventually.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    &lt;br&gt;
Direct port forwarding exposes your home IP to constant scanning and increases your attack surface. A VPS acting as a reverse proxy with a WireGuard tunnel hides your home network, reduces blast radius, and gives you more control than relying only on Cloudflare or other zero trust tunnel solutions.

  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;the-real-problem-with-port-forwarding-at-home&#34;&gt;The Real Problem With Port Forwarding at Home
&lt;/h2&gt;&lt;h3 id=&#34;your-attack-surface-is-bigger-than-you-think&#34;&gt;Your Attack Surface Is Bigger Than You Think
&lt;/h3&gt;&lt;p&gt;When you forward ports on your router, you&amp;rsquo;re publishing your home IP address to the world. That&amp;rsquo;s not automatically a death sentence. ISPs rotate IPs, CGNAT exists, and plenty of people run services this way for years without incident. But every open port is another door you&amp;rsquo;re daring the internet to try.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bots can scan and fingerprint your services&lt;/li&gt;
&lt;li&gt;DDoS attempts can target your home connection directly&lt;/li&gt;
&lt;li&gt;Persistent probing never stops, even on non-standard ports&lt;/li&gt;
&lt;li&gt;A single misconfigured service becomes a direct entry point to your home network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Automated scanners are relentless. Within minutes of opening ports 80 or 443, you&amp;rsquo;ll see probes in your logs. Open 8096 for Jellyfin. Same story. The entire public IPv4 space gets scanned constantly, and your little corner of it is not special enough to be ignored.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s why that matters more for homelabs than enterprise. You likely don&amp;rsquo;t have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An IDS/IPS appliance doing deep packet inspection&lt;/li&gt;
&lt;li&gt;Upstream DDoS mitigation from your ISP&lt;/li&gt;
&lt;li&gt;A SOC team monitoring logs at 3 AM&lt;/li&gt;
&lt;li&gt;Redundant uplinks or failover&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your home internet connection is a single point of failure. If someone floods it, your family loses internet too. That&amp;rsquo;s not a hypothetical. That&amp;rsquo;s a Tuesday for anyone running public services on a residential line.&lt;/p&gt;
&lt;h3 id=&#34;the-myth-of-safe-port-forwarding&#34;&gt;The Myth of &amp;ldquo;Safe Port Forwarding&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Some argue that best practices, diligent patching, and network isolation make you 99% safe. In theory, maybe.&lt;/p&gt;
&lt;p&gt;In practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zero-days happen&lt;/li&gt;
&lt;li&gt;Misconfigurations happen&lt;/li&gt;
&lt;li&gt;Humans make mistakes&lt;/li&gt;
&lt;li&gt;Bots don&amp;rsquo;t sleep&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The issue isn&amp;rsquo;t only application security. It&amp;rsquo;s about reducing how much of your lab is reachable from the internet and limiting the damage when something inevitably slips through. Defense in depth isn&amp;rsquo;t paranoia. It&amp;rsquo;s plumbing.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07G9NHRGQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/fw6c.jpg&#34; alt=&#34;Protectli FW6C/FW6D: A fanless, six-port Intel-based firewall appliance built for pfSense/OPNsense, with Intel NICs and hardware AES-NI for fast, secure routing.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Protectli FW6C/FW6D&lt;/strong&gt;&lt;br&gt;
A fanless, six-port Intel-based firewall appliance built for pfSense/OPNsense, with Intel NICs and hardware AES-NI for fast, secure routing. Silent and compact yet expandable (RAM and SSD), it&amp;rsquo;s a favorite for gigabit-plus WANs, VLAN-heavy homelabs, and always-on IDS/IPS.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4fKndSm&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;what-a-vps-changes-for-your-homelab&#34;&gt;What a VPS Changes for Your Homelab
&lt;/h2&gt;&lt;h3 id=&#34;a-vps-becomes-your-public-edge&#34;&gt;A VPS Becomes Your Public Edge
&lt;/h3&gt;&lt;p&gt;A Virtual Private Server acts as your public-facing gateway. Instead of traffic going straight to your house, it hits the VPS first.&lt;/p&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Internet → Your Home Router → Homelab
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You get:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Internet → VPS → WireGuard Tunnel → Homelab
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The world only sees the VPS IP address. Your home IP is never published. That one change shifts your entire risk profile.&lt;/p&gt;
&lt;h3 id=&#34;your-home-ip-stays-private&#34;&gt;Your Home IP Stays Private
&lt;/h3&gt;&lt;p&gt;All traffic terminates at the VPS first. The VPS forwards it over an encrypted WireGuard tunnel to your homelab.&lt;/p&gt;
&lt;p&gt;From the outside:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS resolves to the VPS IP&lt;/li&gt;
&lt;li&gt;Nmap scans hit the VPS&lt;/li&gt;
&lt;li&gt;Attack traffic hits the VPS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If someone decides to DDoS your public endpoint, they&amp;rsquo;re punching the VPS, not your home router. Your family&amp;rsquo;s Netflix and your kid&amp;rsquo;s Minecraft session keep working.&lt;/p&gt;
&lt;h3 id=&#34;no-more-port-forwarding-at-home&#34;&gt;No More Port Forwarding at Home
&lt;/h3&gt;&lt;p&gt;With the VPS plus WireGuard model, your home router stays locked down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No forwarding ports 80 or 443&lt;/li&gt;
&lt;li&gt;No exposing random service ports&lt;/li&gt;
&lt;li&gt;No inbound NAT rules on your residential gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only the VPS exposes ports publicly. On the home side, the WireGuard tunnel is outbound-initiated. Your homelab reaches out to the VPS, not the other way around. No inbound firewall rules needed on your router. That alone is a massive reduction in exposure.&lt;/p&gt;
&lt;h2 id=&#34;why-cloudflare-alternatives-matter&#34;&gt;Why Cloudflare Alternatives Matter
&lt;/h2&gt;&lt;p&gt;I used Cloudflare. Many homelabbers do.&lt;/p&gt;
&lt;p&gt;Cloudflare Tunnel and Zero Trust solutions avoid open ports at home. That&amp;rsquo;s a real improvement over raw port forwarding. But there are trade-offs worth understanding before you go all-in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No ports open at home&lt;/li&gt;
&lt;li&gt;Easy setup&lt;/li&gt;
&lt;li&gt;Automatic HTTPS&lt;/li&gt;
&lt;li&gt;Built-in DDoS mitigation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tls-termination-and-trust&#34;&gt;TLS Termination and Trust
&lt;/h3&gt;&lt;p&gt;Cloudflare terminates TLS. That means Cloudflare decrypts your traffic and re-encrypts it to your origin. For hobby projects, that&amp;rsquo;s usually fine.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the trade-off: any reverse proxy you don&amp;rsquo;t control can see your decrypted traffic. That includes Cloudflare. It also includes a VPS provider if they wanted to snapshot RAM on the host, though that&amp;rsquo;s a different threat model. Both approaches involve trusting a third-party infrastructure provider. With a VPS you control, you at least decide where TLS terminates and you manage the certificates yourself.&lt;/p&gt;
&lt;p&gt;You own the edge.&lt;/p&gt;
&lt;h3 id=&#34;vendor-lock-in&#34;&gt;Vendor Lock-In
&lt;/h3&gt;&lt;p&gt;Cloudflare is excellent. It&amp;rsquo;s still a vendor. If you hit bandwidth limits, violate ToS unintentionally, need advanced routing, or want to proxy non-HTTP services, you can run into walls fast.&lt;/p&gt;
&lt;p&gt;High-bandwidth media streaming is especially risky. Depending on your plan and usage, Cloudflare may throttle or flag you. Streaming terabytes of Jellyfin through their free tier is not what they had in mind.&lt;/p&gt;
&lt;p&gt;With a VPS, you&amp;rsquo;re not tied to one company&amp;rsquo;s proxy layer. You can move providers without redesigning your entire network.&lt;/p&gt;
&lt;h3 id=&#34;non-http-services&#34;&gt;Non-HTTP Services
&lt;/h3&gt;&lt;p&gt;Cloudflare excels at HTTP and HTTPS. It is not built for everything else.&lt;/p&gt;
&lt;p&gt;What about custom TCP services, game servers, experimental protocols, or self-hosted APIs over raw TCP? A VPS gives you full Layer 4 and Layer 7 control. You can proxy HTTP, HTTPS, TCP, UDP, and anything else WireGuard can tunnel.&lt;/p&gt;
&lt;p&gt;That flexibility matters the moment you move beyond basic web apps.&lt;/p&gt;
&lt;h2 id=&#34;the-vps--wireguard-architecture-overview&#34;&gt;The VPS + WireGuard Architecture Overview
&lt;/h2&gt;&lt;p&gt;No install steps here (the next post covers that). This is just the lay of the land.&lt;/p&gt;
&lt;h3 id=&#34;the-components&#34;&gt;The Components
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;VPS in the cloud&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Static public IP&lt;/li&gt;
&lt;li&gt;Reverse proxy such as Caddy or Nginx&lt;/li&gt;
&lt;li&gt;Strict firewall rules (only ports 80, 443, and your WireGuard UDP port)&lt;/li&gt;
&lt;li&gt;WireGuard server&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Homelab server&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WireGuard client (initiates the tunnel outbound)&lt;/li&gt;
&lt;li&gt;Services bound to private interfaces only&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secure tunnel&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Encrypted point-to-point VPN between VPS and homelab&lt;/li&gt;
&lt;li&gt;VPS routes inbound requests over the tunnel to your services&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;how-traffic-flows&#34;&gt;How Traffic Flows
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;User visits &lt;code&gt;app.yourdomain.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DNS points to the VPS public IP&lt;/li&gt;
&lt;li&gt;VPS reverse proxy receives the request&lt;/li&gt;
&lt;li&gt;VPS forwards the request over WireGuard to the homelab&lt;/li&gt;
&lt;li&gt;Homelab responds through the tunnel&lt;/li&gt;
&lt;li&gt;VPS returns the response to the user&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At no point is your home IP exposed publicly.&lt;/p&gt;
&lt;p&gt;If someone runs:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nmap yourdomain.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;They only see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS ports&lt;/li&gt;
&lt;li&gt;VPS fingerprint&lt;/li&gt;
&lt;li&gt;VPS OS signature&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not your home network. Not your ISP. Nothing useful.&lt;/p&gt;
&lt;h3 id=&#34;security-layers-you-gain&#34;&gt;Security Layers You Gain
&lt;/h3&gt;&lt;p&gt;On the VPS you can stack additional defenses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rate limiting (via Caddy&amp;rsquo;s &lt;code&gt;rate_limit&lt;/code&gt; directive or Nginx&amp;rsquo;s &lt;code&gt;limit_req&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Fail2ban watching your proxy logs&lt;/li&gt;
&lt;li&gt;Basic WAF rules&lt;/li&gt;
&lt;li&gt;Geo-blocking at the firewall level&lt;/li&gt;
&lt;li&gt;Strict &lt;code&gt;ufw&lt;/code&gt; or &lt;code&gt;nftables&lt;/code&gt; rules allowing only ports 80, 443, and your WireGuard UDP port&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In most cases, you only need ports 80 and 443 open publicly. Restrict WireGuard&amp;rsquo;s UDP port to known peer IPs where possible with something like &lt;code&gt;ufw allow from &amp;lt;home-ip&amp;gt; to any port 51820&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Your homelab becomes private infrastructure behind a single hardened edge node.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D454DQSP&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ms-01.jpg&#34; alt=&#34;MINISFORUM MS-01 Mini Workstation: A tiny mini PC with plenty of cores, multiple NVMe slots, and real homelab networking (dual 10G SFP&amp;#43; plus 2.5 GbE).&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-01 Mini Workstation&lt;/strong&gt;&lt;br&gt;
The MS-01 i5 is a tiny mini PC with plenty of cores, multiple NVMe slots, and real homelab networking (dual 10G SFP+ plus 2.5 GbE), which makes it perfect for a Proxmox compute node. It has more than enough power for Jellyfin, the *arr stack, downloads, and a few VMs or LXCs, without turning your closet into a jet engine or space heater.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4p3HhTI&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458318191324330626506341&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fminisforum-barebone-systems-mini-pc-intel-core-i5-12600h%2fp%2f2SW-002G-000K9%3fitem%3d9SIBJ6VKBD4204&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;trade-offs-you-should-understand&#34;&gt;Trade-Offs You Should Understand
&lt;/h2&gt;&lt;p&gt;A VPS is not magic. It adds responsibility. Go in with your eyes open.&lt;/p&gt;
&lt;h3 id=&#34;cost&#34;&gt;Cost
&lt;/h3&gt;&lt;p&gt;Expect around $5 per month at minimum for a basic VPS with reasonable bandwidth.&lt;/p&gt;
&lt;p&gt;You need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enough bandwidth for your traffic (1-2 TB/month covers most homelabs)&lt;/li&gt;
&lt;li&gt;Stable networking&lt;/li&gt;
&lt;li&gt;Latency to your home under 100 ms if possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most homelabs, this is the cost of a fancy coffee once a month.&lt;/p&gt;
&lt;h3 id=&#34;added-latency&#34;&gt;Added Latency
&lt;/h3&gt;&lt;p&gt;Traffic now takes a detour:&lt;/p&gt;
&lt;p&gt;User → VPS → Home → VPS → User&lt;/p&gt;
&lt;p&gt;That adds latency. How much depends on the distance between you and your VPS.&lt;/p&gt;
&lt;p&gt;For dashboards, usually negligible. For media streaming, typically acceptable because buffering absorbs the delay. For real-time gaming, possibly noticeable. If latency climbs above 200 ms, choose a VPS region closer to you. You can also tune WireGuard MTU (try 1280) if you suspect packet fragmentation is making things worse.&lt;/p&gt;
&lt;h3 id=&#34;you-must-secure-the-vps&#34;&gt;You Must Secure the VPS
&lt;/h3&gt;&lt;p&gt;The VPS becomes your edge. Treat it like one. If you leave it misconfigured, you&amp;rsquo;ve just moved the problem from your house to a server you&amp;rsquo;re also responsible for.&lt;/p&gt;
&lt;p&gt;You should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use SSH keys only (disable password auth in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Configure a host firewall (&lt;code&gt;ufw&lt;/code&gt; or &lt;code&gt;nftables&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Keep the system updated (&lt;code&gt;unattended-upgrades&lt;/code&gt; on Debian/Ubuntu is your friend)&lt;/li&gt;
&lt;li&gt;Monitor logs (even a simple &lt;code&gt;logwatch&lt;/code&gt; cron job beats nothing)&lt;/li&gt;
&lt;li&gt;Run nothing else on this box if you can help it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A VPS introduces its own management and patching burden. But it&amp;rsquo;s far easier to defend a minimal single-purpose VPS than an entire lab network with dozens of services hanging off your residential IP.&lt;/p&gt;
&lt;h3 id=&#34;realistic-ddos-expectations&#34;&gt;Realistic DDoS Expectations
&lt;/h3&gt;&lt;p&gt;A $5 VPS is not a bulletproof DDoS shield. Budget providers may null-route your IP if you attract significant attack traffic. That means your services go offline until the attack subsides.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s why it&amp;rsquo;s still better than direct exposure: the attack hits the VPS, not your home. Your family&amp;rsquo;s internet keeps working. You redeploy the VPS with a new IP, update DNS, and move on. Compare that to someone DDoSing your home connection directly, where your only option is to call your ISP and wait on hold.&lt;/p&gt;
&lt;p&gt;The VPS shifts where the attack lands. It doesn&amp;rsquo;t eliminate DDoS risk entirely. Don&amp;rsquo;t kid yourself on that.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F8JG2SHN&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: A compact mini-workstation with dual 10GbE SFP&amp;#43; plus dual 2.5GbE, flexible storage, and up to a 16-core Ryzen 9 9955HX.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;&lt;br&gt;
A compact mini-workstation built around up to a 16-core Ryzen 9 9955HX, with dual 10GbE SFP+ plus dual 2.5GbE, flexible storage (U.2 + M.2 including 22110), and triple 8K display outputs. Great as a homelab node or small server with serious I/O.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;alternatives-compared&#34;&gt;Alternatives Compared
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Approach&lt;/th&gt;
          &lt;th&gt;Home IP Hidden&lt;/th&gt;
          &lt;th&gt;Protocol Support&lt;/th&gt;
          &lt;th&gt;Management&lt;/th&gt;
          &lt;th&gt;Cost&lt;/th&gt;
          &lt;th&gt;Best For&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Direct Port Forwarding&lt;/td&gt;
          &lt;td&gt;No&lt;/td&gt;
          &lt;td&gt;All&lt;/td&gt;
          &lt;td&gt;Low&lt;/td&gt;
          &lt;td&gt;Free&lt;/td&gt;
          &lt;td&gt;Temporary testing only&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Cloudflare Tunnel / Zero Trust&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;HTTP/HTTPS mainly&lt;/td&gt;
          &lt;td&gt;Low&lt;/td&gt;
          &lt;td&gt;Free tier available&lt;/td&gt;
          &lt;td&gt;Low-traffic web apps&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Tailscale / WireGuard Only&lt;/td&gt;
          &lt;td&gt;No (if publishing)&lt;/td&gt;
          &lt;td&gt;All&lt;/td&gt;
          &lt;td&gt;Low&lt;/td&gt;
          &lt;td&gt;Free tier available&lt;/td&gt;
          &lt;td&gt;Private remote access&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;VPS + WireGuard&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;All&lt;/td&gt;
          &lt;td&gt;Medium&lt;/td&gt;
          &lt;td&gt;~$5/month&lt;/td&gt;
          &lt;td&gt;Public-facing homelab services&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Full Cloud Migration&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;All&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
          &lt;td&gt;$$$&lt;/td&gt;
          &lt;td&gt;Business-critical workloads&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;direct-port-forwarding&#34;&gt;Direct Port Forwarding
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Free, simple.&lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: Exposes home IP, constant scanning, no DDoS buffer, high risk if misconfigured.&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Temporary testing only. If you&amp;rsquo;re still using this in production, you&amp;rsquo;re living on borrowed time.&lt;/p&gt;
&lt;h3 id=&#34;cloudflare-tunnel--homelab-warp-or-zero-trust&#34;&gt;Cloudflare Tunnel / Homelab Warp or Zero Trust
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;: No open ports, easy setup, DDoS mitigation, good for web apps.&lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: TLS termination by a third party, vendor lock-in, bandwidth constraints for streaming, limited protocol flexibility.&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Low-traffic HTTP apps, quick deployments.&lt;/p&gt;
&lt;h3 id=&#34;tailscale-or-direct-wireguard-only&#34;&gt;Tailscale or Direct WireGuard Only
&lt;/h3&gt;&lt;p&gt;Using WireGuard or Tailscale without a VPS works well for internal access. It&amp;rsquo;s great for reaching your lab from your phone or laptop on the road.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Secure, no public exposure, excellent for private access.&lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: Not designed for anonymous public users. If you publish services directly, your home IP is still exposed.&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Personal remote access, admin connections.&lt;/p&gt;
&lt;h3 id=&#34;vps-reverse-proxy--wireguard&#34;&gt;VPS Reverse Proxy + WireGuard
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Hides home IP, full control over TLS, works for HTTP and non-HTTP, flexible routing, reduced residential exposure.&lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: Monthly cost, added latency, extra management layer.&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Serious homelabbers running public-facing services, media servers, or custom apps.&lt;/p&gt;
&lt;h3 id=&#34;full-cloud-migration&#34;&gt;Full Cloud Migration
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Enterprise-grade infrastructure, no home exposure.&lt;br&gt;
&lt;strong&gt;Cons&lt;/strong&gt;: Higher recurring costs, less homelab control, less fun.&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Business-critical services, high-risk workloads, or when compliance requirements enter the picture.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-and-operational-realities&#34;&gt;Troubleshooting and Operational Realities
&lt;/h2&gt;&lt;p&gt;Even good solutions need maintenance. Here&amp;rsquo;s where things actually break.&lt;/p&gt;
&lt;h3 id=&#34;wireguard-tunnel-drops&#34;&gt;WireGuard Tunnel Drops
&lt;/h3&gt;&lt;p&gt;Symptoms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Services intermittently unavailable&lt;/li&gt;
&lt;li&gt;Reverse proxy returns 502&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wg show&lt;/code&gt; shows no recent handshake (or a handshake timestamp from hours ago)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Common causes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home IP changed (dynamic IP from your ISP)&lt;/li&gt;
&lt;li&gt;NAT timeout on your home router killed the session&lt;/li&gt;
&lt;li&gt;MTU mismatch causing packet fragmentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mitigations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;PersistentKeepalive = 25&lt;/code&gt; on the home peer&amp;rsquo;s WireGuard config. This sends a keepalive packet every 25 seconds, preventing NAT tables from expiring your session.&lt;/li&gt;
&lt;li&gt;Lower MTU to 1280 in your WireGuard interface config if fragmentation is suspected&lt;/li&gt;
&lt;li&gt;Monitor handshake timestamps with a cron job. Something like &lt;code&gt;wg show wg0 latest-handshakes&lt;/code&gt; piped into a simple alerting script works.&lt;/li&gt;
&lt;li&gt;Use a dynamic DNS updater (&lt;code&gt;ddclient&lt;/code&gt; or a provider&amp;rsquo;s API script) if your home IP changes frequently&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;reverse-proxy-errors&#34;&gt;Reverse Proxy Errors
&lt;/h3&gt;&lt;p&gt;If the VPS returns 502 or 504:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirm the homelab service is actually running (&lt;code&gt;systemctl status &amp;lt;service&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Verify routing over the tunnel subnet (can the VPS &lt;code&gt;ping&lt;/code&gt; your homelab&amp;rsquo;s WireGuard IP?)&lt;/li&gt;
&lt;li&gt;Check SNI and TLS configuration in your reverse proxy&lt;/li&gt;
&lt;li&gt;Ensure firewall rules on both ends allow tunnel traffic&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;unexpected-public-exposure&#34;&gt;Unexpected Public Exposure
&lt;/h3&gt;&lt;p&gt;Run:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nmap yourdomain.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You should only see the VPS ports.&lt;/p&gt;
&lt;p&gt;If you see your ISP IP in DNS records, HTTP headers, or service responses, investigate immediately. Check for DNS leaks (stale A records pointing home), misconfigured &lt;code&gt;X-Forwarded-For&lt;/code&gt; headers, or services that embed your local IP in responses (some apps are chatty about this in their default configs).&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07V5JTMV9&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB: A palm-sized single-board computer with a quad-core ARM CPU and 4GB RAM that runs full Linux.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;RaspberryPi 4GB&lt;/strong&gt;&lt;br&gt;
A palm-sized single-board computer with a quad-core ARM CPU and 4GB RAM that runs full Linux, with Gigabit Ethernet, dual-band Wi-Fi, USB 3.0, and dual micro-HDMI. Ideal for lightweight homelab duties or for running a WireGuard endpoint while sipping a few watts.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;frequently-asked-questions&#34;&gt;Frequently Asked Questions
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How does a VPS hide my homelab IP from attacks?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;All public DNS records point to the VPS IP. Attackers hit the VPS, not your home connection. Your home IP is never published in DNS or exposed through HTTP headers. The WireGuard tunnel is outbound-initiated from your home, so no inbound firewall rules are needed on your router.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What happens if my VPS provider null-routes me during an attack?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Your public services go offline temporarily, but your home internet stays unaffected. You can redeploy the VPS with a new IP, update DNS, and be back online. This is far better than having your entire home connection taken down.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I use WireGuard port forwarding without a VPS for public services?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;WireGuard alone is excellent for private access between your devices. For public-facing services without a VPS, you still need to forward ports on your home router, which exposes your residential IP. The VPS is what removes that exposure.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What about CGNAT? Does that change the equation?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;If your ISP uses CGNAT, you can&amp;rsquo;t port forward at all without their cooperation. A VPS with WireGuard actually solves this problem entirely. Your homelab connects outbound to the VPS, and the VPS handles all public traffic. CGNAT doesn&amp;rsquo;t matter because you&amp;rsquo;re never accepting inbound connections at home.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I handle a dynamic home IP with this setup?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Set up a dynamic DNS client (like &lt;code&gt;ddclient&lt;/code&gt; or your DNS provider&amp;rsquo;s update API) on your homelab that updates a hostname whenever your IP changes. Configure the WireGuard peer on the VPS side to use that hostname instead of a hardcoded IP. Combined with &lt;code&gt;PersistentKeepalive&lt;/code&gt;, the tunnel re-establishes automatically after an IP change.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s the cheapest VPS that works for homelab proxying?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;p&gt;Look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Around $5 per month&lt;/li&gt;
&lt;li&gt;1 GB RAM&lt;/li&gt;
&lt;li&gt;1 vCPU&lt;/li&gt;
&lt;li&gt;Generous bandwidth (1-2 TB minimum)&lt;/li&gt;
&lt;li&gt;Static IPv4&lt;/li&gt;
&lt;li&gt;KVM virtualization (avoid OpenVZ for WireGuard kernel module support)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Latency to your home should ideally be under 100 ms.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ When should I stop self-hosting and move to the cloud?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;p&gt;If you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handle sensitive client data&lt;/li&gt;
&lt;li&gt;Require guaranteed uptime with SLAs&lt;/li&gt;
&lt;li&gt;Face compliance requirements (HIPAA, SOC 2, etc.)&lt;/li&gt;
&lt;li&gt;Attract sustained, large-scale attack traffic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It may be time to move critical services fully to the cloud. A VPS plus homelab combo works great for personal projects and media, but it&amp;rsquo;s not a substitute for managed infrastructure when the stakes are high.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;lessons-learned-from-doing-it-wrong-first&#34;&gt;Lessons Learned From Doing It Wrong First
&lt;/h2&gt;&lt;p&gt;I ran my homelab with a reverse proxy at home, Cloudflare in front, and strong passwords. I figured that was enough.&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;My IP was still exposed in certain scenarios. My logs showed constant probing. I was handing TLS termination to a third party without fully considering what that meant. And my home network was still in the blast radius if anything went sideways.&lt;/p&gt;
&lt;p&gt;After moving to a VPS running Caddy as a reverse proxy with a WireGuard tunnel back home, I got IP privacy, cleaner architecture, zero exposed ports on my router, and a lot more confidence that a bad day on the internet wouldn&amp;rsquo;t become a bad day for my household.&lt;/p&gt;
&lt;p&gt;The setup isn&amp;rsquo;t complicated. It just requires you to accept that &amp;ldquo;good enough&amp;rdquo; wasn&amp;rsquo;t actually good enough.&lt;/p&gt;
&lt;h2 id=&#34;the-right-architecture-for-serious-homelabs&#34;&gt;The Right Architecture for Serious Homelabs
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re casually experimenting, port forwarding might feel fine for now. Just know what you&amp;rsquo;re accepting.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re serious about running public-facing services, a VPS in front is the better way to keep your home network out of the blast radius. It hides your home IP, eliminates router port forwarding, gives you full TLS control, works beyond HTTP, and scales with you.&lt;/p&gt;
&lt;p&gt;Cloudflare and zero trust tools are useful. Tailscale is fantastic for private access. But if you want full control, privacy, and protocol flexibility, the VPS plus WireGuard model is the sweet spot for anyone looking to self-host their own edge.&lt;/p&gt;
&lt;p&gt;Your homelab should be a playground, not a liability. If you&amp;rsquo;re going to open it to the internet, do it the right way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is Part 1 of a 3-part series on building a VPS-fronted homelab.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part 1: Why Your Homelab Needs a VPS to Share Services Publicly (this post)&lt;/li&gt;
&lt;li&gt;Part 2: &lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/2026/install-wireguard-vps-homelab-tunnel/&#34; &gt;How to Install WireGuard on a VPS and Connect It to Your Homelab&lt;/a&gt; (Not published yet)&lt;/li&gt;
&lt;li&gt;Part 3: &lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/2026/wireguard-client-opnsense-pfsense-lan-routing/&#34; &gt;WireGuard Client on OPNsense and pfSense: LAN Routing for Your VPS Tunnel&lt;/a&gt; (Not published yet)&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>How to Fix Stale File Handles NFS Errors with MergerFS </title>
        <link>https://diymediaserver.com/post/2026/fix-stale-nfs-file-handles-mergerfs/</link>
        <pubDate>Sat, 14 Feb 2026 05:26:30 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/fix-stale-nfs-file-handles-mergerfs/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/fix-stale-nfs-file-handles-mergerfs/featured.jpg" alt="Featured image of post How to Fix Stale File Handles NFS Errors with MergerFS " /&gt;&lt;p&gt;If you&amp;rsquo;re running a homelab NAS with a MergerFS and SnapRAID setup and sharing that pool over NFS, there&amp;rsquo;s a good chance you&amp;rsquo;ve run into one of the most frustrating errors in the self-hosted world: stale file handles. Files that were accessible five minutes ago suddenly aren&amp;rsquo;t. Containers break. Plex stops mid-stream. You restart everything, it works for a while, and then it happens again.&lt;/p&gt;
&lt;p&gt;I spent way too long troubleshooting stale file handles on NFS before landing on the actual cause, and it turned out to be a fundamental mismatch between how MergerFS works as a FUSE filesystem and what NFS expects from its exports. This post walks through the problem, why it happens, and the fix that finally made it go away for good.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    &lt;br&gt;
Sharing a MergerFS pool directly over NFS causes stale file handles because NFS can&#39;t reliably track file handles across a FUSE filesystem. The fix is to export each underlying disk individually over NFS, then install MergerFS on the client machine and pool them there. Your SnapRAID config on the NAS doesn&#39;t need to change at all since it already points at the individual drives. The stale handle errors go away permanently because NFS is finally working with real filesystems instead of a FUSE layer.

  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-mergerfs-and-nfs-cause-stale-file-handles&#34;&gt;Why MergerFS and NFS Cause Stale File Handles
&lt;/h2&gt;&lt;p&gt;MergerFS is a FUSE-based union filesystem. It takes multiple individual drives and presents them as a single merged mount point. If you&amp;rsquo;re running a typical MergerFS and SnapRAID homelab stack, you probably have several data disks pooled together with MergerFS for day-to-day use and SnapRAID providing parity protection on top. That architecture is great for local use - your applications see one big pool and MergerFS handles file placement across the underlying disks based on your chosen policy.&lt;/p&gt;
&lt;p&gt;The trouble starts when you export that merged FUSE mount point directly over NFS. NFS relies on file handles to track files across the network. These handles are tied to the underlying filesystem&amp;rsquo;s inode and device information. Because MergerFS runs as a FUSE filesystem in userspace rather than as a native kernel filesystem, it generates its own virtual file handles. When MergerFS resolves paths across drives, or when SnapRAID maintenance operations like syncs and scrubs touch the underlying files, those FUSE-generated handles can become invalid from NFS&amp;rsquo;s perspective. The NFS client asks for a file using a handle that no longer points to anything valid, and you get the dreaded &lt;code&gt;Stale file handle&lt;/code&gt; error.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t a bug or a misconfiguration you can tune away.&lt;/p&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/mergerfs-logo.png&#34; alt=&#34;MergerFS official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;MergerFS official Documentation&lt;/strong&gt;&lt;br&gt;
Explicitly calls this out. Exporting a FUSE-based MergerFS pool directly over NFS is not a supported workflow.&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://trapexit.github.io/mergerfs/latest/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Read
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;the-fix-export-individual-drives-over-nfs-run-mergerfs-on-the-client&#34;&gt;The Fix: Export Individual Drives Over NFS, Run MergerFS on the Client
&lt;/h2&gt;&lt;p&gt;The solution is to flip the architecture. Instead of pooling on the server and exporting the MergerFS mount, you export each underlying drive individually over NFS and then run MergerFS on the client side to combine them back into a single merged view.&lt;/p&gt;
&lt;p&gt;It sounds like more work, but the setup is straightforward and the result is rock solid. NFS gets stable, predictable file handles because each export is a real ext4 or XFS filesystem on a real disk - not a virtual FUSE layer. MergerFS still gives you a single unified pool, it just runs on the machine that actually consumes the data. And your SnapRAID parity setup on the NAS stays completely untouched since SnapRAID operates on the individual drives, not the merged pool.&lt;/p&gt;
&lt;h3 id=&#34;step-1-export-each-drive-individually-from-the-nas&#34;&gt;Step 1: Export Each Drive Individually from the NAS
&lt;/h3&gt;&lt;p&gt;On your NAS (the NFS server), edit &lt;code&gt;/etc/exports&lt;/code&gt; to export each disk in your MergerFS pool as its own NFS share. The critical detail here is that each export needs a unique &lt;code&gt;fsid&lt;/code&gt; value. NFS uses &lt;code&gt;fsid&lt;/code&gt; to distinguish between exports, and if you skip this or duplicate values, you&amp;rsquo;ll get weird cross-mount issues that look a lot like the stale file handle problem you&amp;rsquo;re trying to fix.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/mnt/Pool/Disk1/ 172.27.0.0/24(all_squash,anongid=1001,anonuid=1000,insecure,rw,subtree_check,fsid=1)
/mnt/Pool/Disk2/ 172.27.0.0/24(all_squash,anongid=1001,anonuid=1000,insecure,rw,subtree_check,fsid=2)
/mnt/Pool/Disk3/ 172.27.0.0/24(all_squash,anongid=1001,anonuid=1000,insecure,rw,subtree_check,fsid=3)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Repeat this pattern for every data disk in your pool. If you&amp;rsquo;re running a SnapRAID configuration, these are your data disks - you do not need to export the SnapRAID parity disk. A few things to double-check on the export options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;anonuid&lt;/code&gt; and &lt;code&gt;anongid&lt;/code&gt;&lt;/strong&gt; should match the user and group IDs that own your media files (or whatever you&amp;rsquo;re serving). Run &lt;code&gt;id &amp;lt;username&amp;gt;&lt;/code&gt; on the NAS if you&amp;rsquo;re not sure what these should be. Getting this wrong leads to permission denied errors that are easy to confuse with stale NFS file handles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;all_squash&lt;/code&gt;&lt;/strong&gt; maps all client requests to the anonymous user, which keeps permissions simple in a homelab. If you need per-user access control, you&amp;rsquo;ll want a different approach, but for most media server and homelab setups this is the right call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;insecure&lt;/code&gt;&lt;/strong&gt; allows connections from ports above 1024. Some NFS clients (especially on non-Linux systems or inside containers) need this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The subnet&lt;/strong&gt; (&lt;code&gt;172.27.0.0/24&lt;/code&gt; in this example) should match your actual network. Restrict this to the range that needs access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After editing, apply the changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo exportfs -ra
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-2-mount-the-individual-nfs-shares-on-the-client&#34;&gt;Step 2: Mount the Individual NFS Shares on the Client
&lt;/h3&gt;&lt;p&gt;On each client machine that needs access to the pool, start by creating the local mount points:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /mnt/pool/disk1 /mnt/pool/disk2 /mnt/pool/disk3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then add the NFS mounts to &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;172.27.0.5:/mnt/Pool/Disk1  /mnt/pool/disk1  nfs  rw,nofail,hard,intr  0 0
172.27.0.5:/mnt/Pool/Disk2  /mnt/pool/disk2  nfs  rw,nofail,hard,intr  0 0
172.27.0.5:/mnt/Pool/Disk3  /mnt/pool/disk3  nfs  rw,nofail,hard,intr  0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Replace &lt;code&gt;172.27.0.5&lt;/code&gt; with the actual IP of your NAS. The mount options here are worth understanding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;hard&lt;/code&gt;&lt;/strong&gt; means the client will keep retrying if the NFS server becomes unreachable, rather than returning an error. For a homelab where reboots happen, this is usually what you want. The alternative, &lt;code&gt;soft&lt;/code&gt;, gives up after a timeout, which can lead to data corruption if a write was in progress.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;intr&lt;/code&gt;&lt;/strong&gt; allows you to interrupt a hung NFS operation with a signal. Without this, a stuck NFS mount can lock up processes in a way that&amp;rsquo;s hard to recover from without a reboot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;nofail&lt;/code&gt;&lt;/strong&gt; prevents the client from hanging at boot if the NAS isn&amp;rsquo;t available yet. Especially important if your NAS and clients boot at the same time after a power outage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mount everything:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify each disk is accessible:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /mnt/pool/disk1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /mnt/pool/disk2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /mnt/pool/disk3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BG685PKM&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/TX201.jpg&#34; alt=&#34;TP-Link 2.5GB PCIe Network Card (TX201): Affordable 2.5GbE NIC for upgrading NFS throughput between your NAS and client machines running MergerFS.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;TP-Link 2.5GB PCIe Network Card (TX201)&lt;/strong&gt;&lt;br&gt;
Mounting three or four NFS shares on the client and pooling them through a MergerFS FUSE mount means your network link matters more than ever. This 2.5GbE PCIe card is cheap, works out of the box on most Linux distros, and makes sure the NIC isn&amp;rsquo;t the bottleneck when you&amp;rsquo;re streaming from a client-side merged pool.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4mafK0R&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;step-3-create-the-mergerfs-fuse-pool-on-the-client&#34;&gt;Step 3: Create the MergerFS FUSE Pool on the Client
&lt;/h3&gt;&lt;p&gt;Install MergerFS on the client if you haven&amp;rsquo;t already. On Debian/Ubuntu:&lt;/p&gt;
&lt;p&gt;Grab the latest .deb from the MergerFS releases page:&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/trapexit/mergerfs/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/trapexit/mergerfs/releases&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dpkg -i mergerfs_&amp;lt;version&amp;gt;.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the directory where the merged FUSE pool will appear:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then add the MergerFS FUSE mount to &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/mnt/pool/disk*  /media/storage  fuse.mergerfs  direct_io,defaults,allow_other,dropcacheonclose=true,inodecalc=path-hash,category.create=mfs,minfreespace=50G,fsname=storage  0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here&amp;rsquo;s what the key MergerFS options are doing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;direct_io&lt;/code&gt;&lt;/strong&gt; - Bypasses the kernel page cache. This is important when the underlying filesystems are NFS mounts, since the NFS client has its own caching layer. Double-caching through both NFS and FUSE leads to stale reads and wasted memory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dropcacheonclose=true&lt;/code&gt;&lt;/strong&gt; - Drops cached data when a file is closed. Another safeguard against stale data when MergerFS operates over NFS-mounted filesystems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;inodecalc=path-hash&lt;/code&gt;&lt;/strong&gt; - Generates inode numbers based on the file path rather than the underlying device. This keeps inode numbers stable even if files exist on different disks, which matters for applications that track files by inode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;category.create=mfs&lt;/code&gt;&lt;/strong&gt; - The &amp;ldquo;most free space&amp;rdquo; policy. New files get written to whichever disk has the most available space. Good default for media storage. If you&amp;rsquo;re using SnapRAID, keep in mind that new files written through this policy won&amp;rsquo;t be protected until the next &lt;code&gt;snapraid sync&lt;/code&gt; runs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;minfreespace=50G&lt;/code&gt;&lt;/strong&gt; - Disks with less than 50GB free won&amp;rsquo;t receive new files. Adjust this based on your disk sizes - you don&amp;rsquo;t want a drive filling up to 100%.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;allow_other&lt;/code&gt;&lt;/strong&gt; - Lets users other than the one who mounted the FUSE filesystem access it. Required if you&amp;rsquo;re running services like Plex, Jellyfin, or containerized apps under different user accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mount it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check that the merged pool looks right:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see a single view of all your files across all disks, just like before - but now without the stale file handle errors.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CM293XCL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive: High-capacity storage ideal for MergerFS and SnapRAID homelab setups where each disk is exported individually over NFS.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;br&gt;
When each disk in your MergerFS pool gets its own NFS export, bigger drives mean fewer exports to manage and fewer fstab entries on each client. 24TB per disk also means your SnapRAID parity drive covers a lot of storage per slot. Fewer disks, less complexity, same merged pool on the other end.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-this-fixes-stale-nfs-file-handles&#34;&gt;Why This Fixes Stale NFS File Handles
&lt;/h2&gt;&lt;p&gt;The root cause was always about how FUSE filesystems interact with NFS file handles. When NFS exports a real, single-disk filesystem like ext4 or XFS, the file handles are based on stable inode and device IDs that don&amp;rsquo;t change. The NFS server and client stay in agreement about what each handle points to.&lt;/p&gt;
&lt;p&gt;MergerFS, as a FUSE-based filesystem running in userspace, generates its own virtual file handles that can shift when the underlying layout changes. NFS has no mechanism to track those shifts across a FUSE layer, so the handles go stale. This is a fundamental limitation of exporting any FUSE filesystem over NFS, not just MergerFS.&lt;/p&gt;
&lt;p&gt;By moving the MergerFS FUSE mount to the client side, NFS only ever deals with real on-disk filesystems. Each NFS export is a direct, one-to-one mapping to a physical disk partition. The file handles stay valid indefinitely. MergerFS then operates entirely in local userspace on the client, where FUSE handle behavior doesn&amp;rsquo;t need to survive a network round-trip.&lt;/p&gt;
&lt;h2 id=&#34;what-happens-to-snapraid-in-this-setup&#34;&gt;What Happens to SnapRAID in This Setup
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re running SnapRAID alongside MergerFS (which is one of the most common storage configurations in homelabs), nothing changes on the server side. SnapRAID always operates on the individual data disks, not on the MergerFS pool. Your SnapRAID configuration file still points to the same &lt;code&gt;/mnt/Pool/Disk1&lt;/code&gt;, &lt;code&gt;/mnt/Pool/Disk2&lt;/code&gt;, etc. paths. Your parity disk stays local to the NAS. Your &lt;code&gt;snapraid sync&lt;/code&gt; and &lt;code&gt;snapraid scrub&lt;/code&gt; cron jobs keep running exactly as before.&lt;/p&gt;
&lt;p&gt;The only thing that changed is how those disks get to the client machines. Instead of NFS exporting a single FUSE-merged path, you&amp;rsquo;re exporting the same underlying directories that SnapRAID already knows about. If anything, this architecture is cleaner because there&amp;rsquo;s no ambiguity about which layer owns what - SnapRAID and NFS both work directly with the real filesystems, and MergerFS handles the convenience of a unified view on whatever machine needs it.&lt;/p&gt;
&lt;h2 id=&#34;things-to-watch-out-for&#34;&gt;Things to Watch Out For
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Boot order matters.&lt;/strong&gt;&lt;br&gt;
The NFS mounts need to be up before the MergerFS FUSE mount tries to pool them. In most cases, &lt;code&gt;systemd&lt;/code&gt; handles this correctly because the fstab entries are processed in order and &lt;code&gt;fuse.mergerfs&lt;/code&gt; depends on the mount points being available. If you&amp;rsquo;re seeing empty pools after a reboot, look into adding &lt;code&gt;x-systemd.requires&lt;/code&gt; or &lt;code&gt;x-systemd.after&lt;/code&gt; options to the MergerFS fstab line, or use an automount approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adding new disks.&lt;/strong&gt;&lt;br&gt;
When you add a new drive to the NAS, you need to add a new NFS export on the server, a new NFS mount entry on each client, and update the MergerFS glob pattern if the new disk doesn&amp;rsquo;t match &lt;code&gt;/mnt/pool/disk*&lt;/code&gt;. If you&amp;rsquo;re running SnapRAID, you&amp;rsquo;ll also need to add the new disk to your SnapRAID config and run a sync - but you&amp;rsquo;d have to do that regardless of how you export over NFS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SnapRAID sync timing.&lt;/strong&gt;&lt;br&gt;
Since new files written through the client-side MergerFS pool end up on individual disks on the NAS, they won&amp;rsquo;t have parity protection until the next &lt;code&gt;snapraid sync&lt;/code&gt;. This is the same as any MergerFS and SnapRAID setup - it&amp;rsquo;s not introduced by this architecture change. If you&amp;rsquo;re not already running SnapRAID syncs on a schedule, set up a cron job or use a helper script like &lt;a class=&#34;link&#34; href=&#34;https://github.com/Chronial/snapraid-runner&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;snapraid-runner&lt;/a&gt; to automate it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance.&lt;/strong&gt;&lt;br&gt;
Running a FUSE filesystem on the client over NFS mounts adds a small layer of overhead compared to a direct NFS export. In practice, for media streaming, file serving, and typical homelab workloads, this is negligible. The FUSE overhead is mostly in metadata operations, and the NFS network latency dominates actual file transfer times anyway. If you&amp;rsquo;re doing heavy random I/O or database-style workloads over this setup, you might want to benchmark, but that&amp;rsquo;s probably not what you&amp;rsquo;re using MergerFS for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multiple clients.&lt;/strong&gt;&lt;br&gt;
Each client that needs the merged view needs its own MergerFS install and FUSE mount configuration. This is the main tradeoff - it&amp;rsquo;s per-client setup instead of a single pool on the NAS. For most homelabs with one or two client machines, it&amp;rsquo;s not a big deal. If you have many clients, you might want to script the deployment or use configuration management.&lt;/p&gt;
&lt;h2 id=&#34;wrapping-up&#34;&gt;Wrapping Up
&lt;/h2&gt;&lt;p&gt;Stale file handles on NFS with a MergerFS FUSE pool is one of those problems where the symptoms point you in every direction except the actual cause. You&amp;rsquo;ll check NFS timeouts, restart services, fiddle with cache settings, and none of it sticks. The real fix is architectural: stop exporting the MergerFS FUSE mount over NFS. Export the individual drives directly and pool them with MergerFS on whatever client needs the merged view.&lt;/p&gt;
&lt;p&gt;Your SnapRAID parity stays exactly where it is. Your NFS file handles stay stable because they&amp;rsquo;re backed by real filesystems instead of a FUSE layer. And you stop re-troubleshooting the same stale file handle errors every few weeks, which honestly is the best part.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D22JRHZB&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ugreen-NAS.jpg&#34; alt=&#34;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS: A 4-bay NAS with an Intel N100 CPU and 2.5GbE networking, enough horsepower to run MergerFS, SnapRAID, and NFS exports without breaking a sweat.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS&lt;/strong&gt;&lt;br&gt;
Four bays, an Intel N100, and a 2.5GbE port. Four bays is the sweet spot for a MergerFS and SnapRAID setup - three data disks pooled with MergerFS and one dedicated SnapRAID parity drive. Plenty of CPU headroom to serve multiple NFS exports without the FUSE overhead since pooling happens on the client side.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3TZdbTa&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445834073258455140506374&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fugreen-dxp4800-4-bay-quad-core-2-0-ghz-cpu-processor-diskless-system%2fp%2fN82E16822995002&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>How to Fix Proxmox Status 30 Errors with Unprivileged LXCs</title>
        <link>https://diymediaserver.com/post/2026/fix-proxmox-status-30-errors/</link>
        <pubDate>Sat, 07 Feb 2026 07:18:30 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/fix-proxmox-status-30-errors/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/fix-proxmox-status-30-errors/featured.jpg" alt="Featured image of post How to Fix Proxmox Status 30 Errors with Unprivileged LXCs" /&gt;&lt;p&gt;You upgraded to Proxmox 9.1.5 and now your Jellyfin, Plex, or Arr containers refuse to start. They worked for months, maybe years, and now all you get is a cryptic &amp;ldquo;Status 30&amp;rdquo; error. Proxmox 9.1.5 enforces &lt;code&gt;idmapped&lt;/code&gt; mounts for unprivileged LXC containers, and FUSE-based filesystems like MergerFS want nothing to do with them. My best guess is that these changes were made to better support the new OCI-compliant images, which let Proxmox run Docker images without needing Docker installed.&lt;/p&gt;
&lt;p&gt;The fix: ditch &lt;code&gt;mpX&lt;/code&gt; mounts entirely, replace them with &lt;code&gt;lxc.mount.entry&lt;/code&gt; lines, and configure explicit unprivileged ID mapping.&lt;/p&gt;
&lt;p&gt;This guide is for Proxmox users running unprivileged LXC containers with bind mounts on MergerFS or NFS storage. If all your storage is native Proxmox (ZFS, ext4, local directories), your &lt;code&gt;mpX&lt;/code&gt; mounts will probably still work. You can stop reading and go enjoy your day.&lt;/p&gt;
&lt;p&gt;I hit this after updating to Proxmox 9.1.5. Every container with MergerFS bind mounts failed after a reboot. No useful error message. No graceful fallback. Just &amp;ldquo;Status 30&amp;rdquo; and silence. After digging through logs and testing half a dozen approaches, the solution turned out to be straightforward. Annoying, but straightforward.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    Proxmox 9.1.5 enforces idmapped mounts for &lt;code&gt;mpX&lt;/code&gt; bind mounts. MergerFS and most NFS setups don&amp;rsquo;t support idmapped mounts, which causes LXC startup to fail with Status 30. The fix: remove your &lt;code&gt;mpX&lt;/code&gt; mounts, use &lt;code&gt;lxc.mount.entry&lt;/code&gt; instead, and explicitly define your unprivileged UID and GID mappings. Details below.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;quick-check-does-this-apply-to-you&#34;&gt;Quick Check: Does This Apply to You?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Your storage is probably fine if it&amp;rsquo;s:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Local ext4, XFS, or ZFS on the Proxmox host&lt;/li&gt;
&lt;li&gt;Native Proxmox directories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;You&amp;rsquo;re affected if your storage is:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MergerFS pools&lt;/li&gt;
&lt;li&gt;NFS mounts&lt;/li&gt;
&lt;li&gt;Other FUSE-based filesystems&lt;/li&gt;
&lt;li&gt;External USB or hybrid storage setups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re in the second group, keep reading. Everyone else, go do something more fun.&lt;/p&gt;
&lt;h2 id=&#34;what-is-the-proxmox-status-30-error&#34;&gt;What Is the Proxmox Status 30 Error?
&lt;/h2&gt;&lt;p&gt;Status 30 is LXC&amp;rsquo;s way of telling you something went wrong during container startup without telling you &lt;em&gt;what&lt;/em&gt; went wrong. It&amp;rsquo;s a generic failure code that masks deeper filesystem or permission problems.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll see messages like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;startup for container &#39;102&#39; failed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Script exited with status 30&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Read-only file system (os error 30)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Note:&lt;/strong&gt;
    Status 30 means Proxmox tried to mount or write to storage and the kernel said no.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;To find out &lt;em&gt;why&lt;/em&gt; the kernel said no, you need to watch the errors live. Run this on the Proxmox host, replacing &lt;code&gt;XXX&lt;/code&gt; with your container ID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc-start -n XXX -F -l DEBUG -o /dev/stdout
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look for lines mentioning &lt;code&gt;idmapped&lt;/code&gt;, &lt;code&gt;mount&lt;/code&gt;, or &lt;code&gt;permission denied&lt;/code&gt;. Those will point you toward the actual cause.&lt;/p&gt;
&lt;h2 id=&#34;what-changed-in-proxmox-915&#34;&gt;What Changed in Proxmox 9.1.5?
&lt;/h2&gt;&lt;p&gt;Proxmox 9.1.5 ships with a newer Linux kernel and tighter security defaults. The specific change that breaks MergerFS setups is broader enforcement of idmapped mounts for unprivileged containers.&lt;/p&gt;
&lt;p&gt;When you define a container mount like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mp0: /mnt/media,mp=/media
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Proxmox now automatically:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creates an idmapped mount&lt;/li&gt;
&lt;li&gt;Shifts ownership so container UID 1000 maps cleanly to host UID 1000&lt;/li&gt;
&lt;li&gt;Enforces isolation guarantees&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This works great on native filesystems (ext4, XFS, ZFS) but, it completely fails on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MergerFS&lt;/strong&gt; (FUSE-based, no idmap support)&lt;/li&gt;
&lt;li&gt;Most &lt;strong&gt;NFS exports&lt;/strong&gt; (server-side ownership, no client idmap)&lt;/li&gt;
&lt;li&gt;Some custom or layered storage stacks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the kernel refuses the idmapped mount, Proxmox kills the LXC startup rather than opening a security hole. This shows up as a Status 30 error.&lt;/p&gt;
&lt;h2 id=&#34;the-mpx-trap-why-old-configs-break&#34;&gt;The mpX Trap: Why Old Configs Break
&lt;/h2&gt;&lt;p&gt;Before Proxmox 9.1.5, &lt;code&gt;mpX&lt;/code&gt; mounts were forgiving. You could bind-mount media directories owned by UID 1000, and LXC handled permission translation loosely. Nobody complained.&lt;/p&gt;
&lt;p&gt;After the upgrade, &lt;code&gt;mpX&lt;/code&gt; mounts trigger the idmapping hook automatically. If your underlying filesystem doesn&amp;rsquo;t support it, three things happen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container fails to start&lt;/li&gt;
&lt;li&gt;Misleading &amp;ldquo;read-only filesystem&amp;rdquo; errors appear in logs&lt;/li&gt;
&lt;li&gt;Ghost mounts get left behind on the host (more on this in Step 5)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why containers &lt;em&gt;without&lt;/em&gt; bind mounts start fine while your media servers all failed at the same time. Ask me how I know.&lt;/p&gt;
&lt;h2 id=&#34;the-fix-manual-mounting-and-explicit-unprivileged-id-mapping&#34;&gt;The Fix: Manual Mounting and Explicit Unprivileged ID Mapping
&lt;/h2&gt;&lt;p&gt;The temptation here is to flip your containers to privileged mode. Don&amp;rsquo;t. Privileged containers run as root on the host. If your Jellyfin or Plex container gets exploited, the attacker has root on your entire Proxmox host and can pivot to every other VM and container you&amp;rsquo;re running. That&amp;rsquo;s not a theoretical risk. Container escape vulnerabilities in shared-kernel setups are well-documented, and if you&amp;rsquo;re running services that download files from the internet (every Arr app, every torrent client), you&amp;rsquo;re handing a potential attacker the keys to your entire homelab. Keep your containers unprivileged.&lt;/p&gt;
&lt;p&gt;The fix has three parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Remove &lt;code&gt;mpX&lt;/code&gt; mounts so Proxmox stops trying to idmap them&lt;/li&gt;
&lt;li&gt;Use raw &lt;code&gt;lxc.mount.entry&lt;/code&gt; lines that LXC handles directly&lt;/li&gt;
&lt;li&gt;Define clean, contiguous UID and GID maps so permissions work correctly&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This keeps your containers unprivileged while sidestepping the MergerFS/NFS incompatibility entirely.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Note:&lt;/strong&gt;
    &lt;p&gt;&lt;strong&gt;Prerequisites checklist.&lt;/strong&gt; Before starting, confirm you have the following ready. Experienced readers: don&amp;rsquo;t skip Steps 1 and 2. The ID delegation and mpX removal on the host are required before anything else works.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH or console access to your Proxmox host (not the container)&lt;/li&gt;
&lt;li&gt;Your media user&amp;rsquo;s UID and GID (run &lt;code&gt;id your_media_username&lt;/code&gt; on the host)&lt;/li&gt;
&lt;li&gt;Your render group&amp;rsquo;s GID if you use GPU passthrough (run &lt;code&gt;getent group render&lt;/code&gt; on the host)&lt;/li&gt;
&lt;li&gt;The container ID(s) you need to fix&lt;/li&gt;
&lt;li&gt;A backup of your container config file(s)&lt;/li&gt;
&lt;/ul&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-1-configure-uid-and-gid-delegation-on-the-host&#34;&gt;Step 1: Configure UID and GID Delegation on the Host
&lt;/h2&gt;&lt;p&gt;Before LXC can map host IDs into an unprivileged container, Proxmox needs explicit permission to use those IDs. That permission lives in two files on the host: &lt;code&gt;/etc/subuid&lt;/code&gt; and &lt;code&gt;/etc/subgid&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, figure out your actual media user&amp;rsquo;s UID and GID. Run this on the host:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id your_media_username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The examples below assume UID 1000 and GID 1001. &lt;strong&gt;Replace these with your actual values throughout.&lt;/strong&gt; If you copy-paste blindly and your IDs don&amp;rsquo;t match, you&amp;rsquo;ll be right back at Status 30. I won&amp;rsquo;t feel sorry for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next&lt;/strong&gt;, check your render group GID if you need GPU passthrough:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;getent group render
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This usually returns &lt;code&gt;render:x:104&lt;/code&gt; but it&amp;rsquo;s not guaranteed. On some distributions or custom setups, the render group could be GID 105, 128, or something else entirely. Whatever number you see here is the one you&amp;rsquo;ll use in every step below. If the command returns nothing, you don&amp;rsquo;t have a render group and can skip the render-related lines in Steps 1 and 4.&lt;/p&gt;
&lt;p&gt;Edit these files on the Proxmox host.&lt;/p&gt;
&lt;p&gt;Start with subuid:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/subuid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;root:1000:1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;root:100000:65536&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, edit subgid:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/subgid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;root:104:1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;root:1001:1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;root:100000:65536&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;What each line means:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root:1000:1&lt;/code&gt; allows root to delegate host UID 1000 (your media user) into a container&lt;/li&gt;
&lt;li&gt;&lt;code&gt;root:104:1&lt;/code&gt; allows root to delegate host GID 104 (the &lt;code&gt;render&lt;/code&gt; group, for GPU passthrough). Replace &lt;code&gt;104&lt;/code&gt; with whatever &lt;code&gt;getent group render&lt;/code&gt; returned on your system.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;root:1001:1&lt;/code&gt; allows root to delegate host GID 1001 (your media group)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;root:100000:65536&lt;/code&gt; is the standard unprivileged ID range. Leave it alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of these entries are missing or wrong, LXC cannot construct a valid idmap and your container won&amp;rsquo;t start. There&amp;rsquo;s no partial credit here.&lt;/p&gt;
&lt;h2 id=&#34;step-2-remove-mpx-mounts-from-the-container&#34;&gt;Step 2: Remove mpX Mounts from the Container
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Back up your container config first.&lt;/strong&gt; I mean it. Copy it somewhere safe before you touch anything.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp /etc/pve/lxc/XXX.conf /root/XXX.conf.bak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now open the config:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/pve/lxc/XXX.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Delete or comment out any lines like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mp0: /mnt/media,mp=/media
mp1: /mnt/downloads,mp=/downloads
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Every single one. Leaving even one &lt;code&gt;mpX&lt;/code&gt; entry triggers the idmapping hook, and you&amp;rsquo;re back to Status 30.&lt;/p&gt;
&lt;h2 id=&#34;step-3-add-direct-lxcmountentry-bind-mounts&#34;&gt;Step 3: Add Direct lxc.mount.entry Bind Mounts
&lt;/h2&gt;&lt;p&gt;At the bottom of the container config file, add manual mount entries:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;lxc.mount.entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/media/storage/Movies media/Movies none bind,create=dir,ro 0 0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.mount.entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/media/storage/Shows media/Shows none bind,create=dir,ro 0 0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pay attention to these details. They&amp;rsquo;ll bite you if you get them wrong:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;container path&lt;/strong&gt; (second field) is &lt;strong&gt;relative&lt;/strong&gt;, no leading slash. Write &lt;code&gt;media/Movies&lt;/code&gt;, not &lt;code&gt;/media/Movies&lt;/code&gt;. This trips people up constantly.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bind&lt;/code&gt; tells LXC to handle the mount directly, bypassing Proxmox&amp;rsquo;s storage helpers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create=dir&lt;/code&gt; tells LXC to create the mount point inside the container if it doesn&amp;rsquo;t exist. Without this, you&amp;rsquo;ll get a mount failure if the directory is missing.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;ro&lt;/code&gt; or &lt;code&gt;rw&lt;/code&gt; explicitly based on what the container actually needs. Read-only where possible. Your Jellyfin container doesn&amp;rsquo;t need write access to your movie library.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These mounts are handled by LXC itself, not Proxmox. That&amp;rsquo;s the whole point.&lt;/p&gt;
&lt;h2 id=&#34;step-4-define-clean-unprivileged-id-mapping&#34;&gt;Step 4: Define Clean Unprivileged ID Mapping
&lt;/h2&gt;&lt;p&gt;This is the part where most people get tripped up. Unprivileged containers require a fully contiguous UID and GID map covering the range 0 through 65535. No gaps. No overlaps. If the math doesn&amp;rsquo;t add up to exactly 65536 IDs, the container will not start. LXC is merciless about this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customize these values.&lt;/strong&gt; Replace &lt;code&gt;1000&lt;/code&gt; with your actual media user&amp;rsquo;s UID. Replace &lt;code&gt;1001&lt;/code&gt; with your actual media group&amp;rsquo;s GID. Replace &lt;code&gt;104&lt;/code&gt; with your actual render group GID.&lt;/p&gt;
&lt;h3 id=&#34;how-the-math-works&#34;&gt;How the math works
&lt;/h3&gt;&lt;p&gt;Every &lt;code&gt;lxc.idmap&lt;/code&gt; line maps a range of container IDs to host IDs. The format is:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;lxc.idmap: &amp;lt;u|g&amp;gt; &amp;lt;container_start&amp;gt; &amp;lt;host_start&amp;gt; &amp;lt;count&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The rule is simple: every &lt;code&gt;count&lt;/code&gt; value across all your lines for a given type (u or g) must add up to exactly 65536. When you pass through a specific ID (like your media UID), you split the range around it. Here&amp;rsquo;s the formula:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Range before passthrough:  count = passthrough_id
Passthrough itself:        count = 1
Range after passthrough:   count = 65536 - passthrough_id - 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For multiple passthroughs (like the GID map), you split around each one in order, and the counts between them fill the gaps.&lt;/p&gt;
&lt;h3 id=&#34;example-a-uid-1000-gid-1001-render-gid-104&#34;&gt;Example A: UID 1000, GID 1001, render GID 104
&lt;/h3&gt;&lt;p&gt;This is the most common homelab setup. Add these lines to your container config:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UID Mapping:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;u 0 100000 1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;u 1000 1000 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;u 1001 101001 64535&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Table:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Container UIDs&lt;/th&gt;
          &lt;th&gt;Host UIDs&lt;/th&gt;
          &lt;th&gt;Count&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;0 - 999&lt;/td&gt;
          &lt;td&gt;100000 - 100999&lt;/td&gt;
          &lt;td&gt;1000&lt;/td&gt;
          &lt;td&gt;Unprivileged range&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1000&lt;/td&gt;
          &lt;td&gt;1000&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;Media user passthrough&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1001 - 65535&lt;/td&gt;
          &lt;td&gt;101001 - 165535&lt;/td&gt;
          &lt;td&gt;64535&lt;/td&gt;
          &lt;td&gt;Unprivileged range&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;65536&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;GID Mapping:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 0 100000 104&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 104 104 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 105 100105 896&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 1001 1001 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 1002 101002 64534&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Table:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Container GIDs&lt;/th&gt;
          &lt;th&gt;Host GIDs&lt;/th&gt;
          &lt;th&gt;Count&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;0 - 103&lt;/td&gt;
          &lt;td&gt;100000 - 100103&lt;/td&gt;
          &lt;td&gt;104&lt;/td&gt;
          &lt;td&gt;Unprivileged range&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;104&lt;/td&gt;
          &lt;td&gt;104&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;Render group passthrough&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;105 - 1000&lt;/td&gt;
          &lt;td&gt;100105 - 101000&lt;/td&gt;
          &lt;td&gt;896&lt;/td&gt;
          &lt;td&gt;Unprivileged range&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1001&lt;/td&gt;
          &lt;td&gt;1001&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;Media group passthrough&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1002 - 65535&lt;/td&gt;
          &lt;td&gt;101002 - 165535&lt;/td&gt;
          &lt;td&gt;64534&lt;/td&gt;
          &lt;td&gt;Unprivileged range&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;65536&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Verify: 104 + 1 + 896 + 1 + 64534 = 65536. Contiguous. No gaps.&lt;/p&gt;
&lt;h3 id=&#34;example-b-uid-1001-gid-1002-render-gid-128&#34;&gt;Example B: UID 1001, GID 1002, render GID 128
&lt;/h3&gt;&lt;p&gt;If your media user is UID 1001 with GID 1002, and your render group is GID 128, the math shifts:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UID Mapping:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;u 0 100000 1001&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;u 1001 1001 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;u 1002 101002 64534&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify: 1001 + 1 + 64534 = 65536.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GID Mapping:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 0 100000 128&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 128 128 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 129 100129 873&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 1002 1002 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 1003 101003 64533&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify: 128 + 1 + 873 + 1 + 64533 = 65536.&lt;/p&gt;
&lt;p&gt;Notice the pattern: the gap between your two GID passthroughs (128 and 1002) is 1002 - 128 - 1 = 873. That&amp;rsquo;s the count for the middle range. The final range is always 65536 minus the sum of everything before it.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t forget: if you use different IDs, you also need to update &lt;code&gt;/etc/subuid&lt;/code&gt; and &lt;code&gt;/etc/subgid&lt;/code&gt; from Step 1 to match. Those files must list every host ID you&amp;rsquo;re passing through.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    &lt;strong&gt;Quick sanity check.&lt;/strong&gt; After writing your idmap lines, add up all the &lt;code&gt;count&lt;/code&gt; values for your &lt;code&gt;u&lt;/code&gt; lines and all the &lt;code&gt;count&lt;/code&gt; values for your &lt;code&gt;g&lt;/code&gt; lines. Both totals must equal exactly 65536. If either one doesn&amp;rsquo;t, your container will not start.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-5-clear-stale-mounts-before-restarting&#34;&gt;Step 5: Clear Stale Mounts Before Restarting
&lt;/h2&gt;&lt;p&gt;Failed startups leave behind ghost mounts on the host. If you try to start the container again without cleaning these up, it can fail in new and exciting ways.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Only run this if your container previously failed to start. This forcibly unmounts staged mount points.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;On the host, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;umount -l /var/lib/lxc/.pve-staged-mounts/mp* 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;-l&lt;/code&gt; flag performs a lazy unmount, which detaches the filesystem immediately and cleans up references once they&amp;rsquo;re no longer busy. This is safe for cleaning up after failed mount attempts. One caveat: don&amp;rsquo;t use lazy unmount as a habit for mounts that keep failing. It detaches the mount without fixing whatever caused the failure, so if you find yourself running this repeatedly, something deeper is wrong. Go back and check your config.&lt;/p&gt;
&lt;p&gt;Now start your container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct start XXX
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-6-verify-everything-works&#34;&gt;Step 6: Verify Everything Works
&lt;/h2&gt;&lt;p&gt;Don&amp;rsquo;t just check that the container started. Confirm that permissions are actually correct end-to-end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check that mounts exist and ownership is correct:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct enter XXX
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -la /media/Movies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see your media files with the correct ownership. If the ownership looks wrong (everything owned by &lt;code&gt;nobody&lt;/code&gt; or &lt;code&gt;65534&lt;/code&gt;), your idmap entries are off. Go back to Step 4 and double-check your math.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test file operations (if using rw mounts):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Inside the container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch /media/Downloads/testfile
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -la /media/Downloads/testfile
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm /media/Downloads/testfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The test file should be owned by your media user, not root or nobody.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Confirm services start cleanly:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Inside the container, check your media service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl status jellyfin   &lt;span class=&#34;c1&#34;&gt;# or plex, sonarr, radarr, etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the service is running and can see your library, you&amp;rsquo;re done. If it starts but can&amp;rsquo;t find media files, the mount exists but the path inside the container doesn&amp;rsquo;t match what the service expects. Double-check the container path in your &lt;code&gt;lxc.mount.entry&lt;/code&gt; lines from Step 3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check LXC logs for clean startup (from the host):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc-start -n XXX -F -l DEBUG -o /dev/stdout
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A clean startup will show your mount entries being applied without any &lt;code&gt;idmapped&lt;/code&gt; errors or permission denials. If you see warnings but the container still starts, investigate them. Warnings that you ignore today become outages after the next update.&lt;/p&gt;
&lt;h2 id=&#34;why-this-works&#34;&gt;Why This Works
&lt;/h2&gt;&lt;p&gt;By switching from &lt;code&gt;mpX&lt;/code&gt; to &lt;code&gt;lxc.mount.entry&lt;/code&gt;, you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Skip Proxmox&amp;rsquo;s idmapped mount helpers entirely&lt;/li&gt;
&lt;li&gt;Bypass kernel-level idshift enforcement that FUSE filesystems can&amp;rsquo;t handle&lt;/li&gt;
&lt;li&gt;Let LXC translate IDs at runtime using your explicit mapping&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is how LXC handled unprivileged containers before Proxmox 9.1.5 added automatic idmapping. You&amp;rsquo;re not doing anything weird or unsupported. You&amp;rsquo;re just being explicit about what Proxmox used to do implicitly.&lt;/p&gt;
&lt;p&gt;This configuration should survive future Proxmox updates since &lt;code&gt;lxc.mount.entry&lt;/code&gt; is a stable LXC feature, not a Proxmox-specific shortcut. That said, major version upgrades can always change defaults, so keep your config backups current and check release notes before upgrading.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-status-30-errors&#34;&gt;Troubleshooting Status 30 Errors
&lt;/h2&gt;&lt;h3 id=&#34;container-still-fails-with-status-30&#34;&gt;Container Still Fails With Status 30
&lt;/h3&gt;&lt;p&gt;Work through this checklist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirm that no &lt;code&gt;mpX&lt;/code&gt; entries remain in &lt;code&gt;/etc/pve/lxc/XXX.conf&lt;/code&gt;. Grep for them: &lt;code&gt;grep &#39;^mp&#39; /etc/pve/lxc/XXX.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Verify &lt;code&gt;/etc/subuid&lt;/code&gt; and &lt;code&gt;/etc/subgid&lt;/code&gt; include entries for every ID you&amp;rsquo;re passing through&lt;/li&gt;
&lt;li&gt;Check that your idmap ranges are contiguous and total 65536 for both UIDs and GIDs&lt;/li&gt;
&lt;li&gt;Confirm the host paths in your &lt;code&gt;lxc.mount.entry&lt;/code&gt; lines actually exist: &lt;code&gt;ls -la /media/storage/Movies&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Clear stale mounts (Step 5) and try again&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;storage-appears-read-only-inside-the-container&#34;&gt;Storage Appears Read-Only Inside the Container
&lt;/h3&gt;&lt;p&gt;Test write access directly on the host first:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch /mnt/media/testfile &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm /mnt/media/testfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If this fails, the problem is at the storage level, not LXC. Check your MergerFS config, underlying disk health, and filesystem mount options. If the host can write but the container can&amp;rsquo;t, double-check that your &lt;code&gt;lxc.mount.entry&lt;/code&gt; line uses &lt;code&gt;rw&lt;/code&gt; and not &lt;code&gt;ro&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;nfs-mounts-fail&#34;&gt;NFS Mounts Fail
&lt;/h3&gt;&lt;p&gt;NFS typically lacks idmapped mount support, so the same &lt;code&gt;lxc.mount.entry&lt;/code&gt; approach applies. The extra wrinkle: your NFS export must allow access from the UIDs and GIDs you&amp;rsquo;re mapping.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Check your &lt;code&gt;/etc/exports&lt;/code&gt; on the NFS server. Make sure &lt;code&gt;no_root_squash&lt;/code&gt; or appropriate user mapping is configured for the host IDs you&amp;rsquo;re passing through. This is easy to miss and will cause silent permission failures even if everything else is configured correctly.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;multiple-media-users-or-docker-inside-lxc&#34;&gt;Multiple Media Users or Docker Inside LXC
&lt;/h3&gt;&lt;p&gt;If you have more than one media user that needs passthrough (for example, separate users for Sonarr and Jellyfin), you need to add a passthrough line for each UID and GID in Step 4 and a delegation entry for each in Step 1. The same splitting logic applies: break the range around each passthrough ID and make sure the counts still total 65536.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re running Docker inside an unprivileged LXC container (first WHY?!), you&amp;rsquo;ll hit additional nesting issues. Docker needs its own ID namespace, which adds complexity on top of the LXC mapping. This is solvable but outside the scope of this guide. The Proxmox wiki has a section on nested containers that covers the basics.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What causes Read-only file system (os error 30) in Proxmox?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Proxmox attempted a write through a mount that the kernel rejected. With MergerFS and unprivileged LXC containers, this almost always means the idmapped mount failed silently and the container got a read-only fallback. Switching from &lt;code&gt;mpX&lt;/code&gt; to &lt;code&gt;lxc.mount.entry&lt;/code&gt; fixes it.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is this specific to Proxmox 9.1.5?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. Earlier Proxmox versions didn&amp;rsquo;t enforce idmapped mounts for unprivileged containers as aggressively. The kernel and LXC defaults changed in Proxmox 9 to make this behavior automatic.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I switch to privileged containers?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No. Privileged containers run as root on the host, which means a compromised container gives an attacker full access to your Proxmox node and every VM and container on it. Manual ID mapping gives you both compatibility and security. The extra configuration is worth it.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Does this affect VMs too?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;VMs use a completely different storage model. They don&amp;rsquo;t use LXC bind mounts at all. However, MergerFS can still cause backup failures and disk I/O errors in VM environments for separate reasons.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Will this survive the next Proxmox update?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;The &lt;code&gt;lxc.mount.entry&lt;/code&gt; directive is a stable LXC feature, not a Proxmox hack. It should survive point releases without issue. Major version upgrades could change defaults, so always read release notes and keep config backups before upgrading.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Proxmox 9.1.5 tightened its security defaults, which is a good thing. The side effect is that FUSE-based filesystems like MergerFS and certain NFS configurations got caught in the crossfire.&lt;/p&gt;
&lt;p&gt;If you rely on MergerFS or NFS with unprivileged containers, the old &lt;code&gt;mpX&lt;/code&gt; approach is dead. Replacing it with &lt;code&gt;lxc.mount.entry&lt;/code&gt; and explicit ID mapping restores stability without giving up security.&lt;/p&gt;
&lt;p&gt;Once configured correctly, containers start cleanly and survive updates. Status 30 becomes a bad memory. It&amp;rsquo;s an hour of config work that saves you from this headache permanently.&lt;/p&gt;
&lt;h2 id=&#34;recommended-hardware&#34;&gt;Recommended Hardware
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re building or upgrading a homelab media server, here&amp;rsquo;s what I actually use and recommend.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CM293XCL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;br&gt;
Solid high-capacity drive for MergerFS pools. I run several of these as the backing storage for the exact setup described in this guide. Not the cheapest per-TB option, but reliable and widely available.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BWY1VH3V&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/LSI-9211-8iB.webp&#34; alt=&#34;LSI 9211-8iB IT MODE&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;LSI 9211-8iB IT MODE&lt;/strong&gt;&lt;br&gt;
An HBA flashed to IT mode passes drives directly to the OS without a hardware RAID layer. This is what you want for MergerFS or ZFS setups where the OS needs raw disk access. Cheap on eBay, rock-solid, and still the default recommendation in most homelab communities.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4iXST7J&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34; data-asin=&#34;B088H2QLBQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/sff-8087.jpg&#34; alt=&#34;SFF-8087 to 4x SATA&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;SFF-8087 to 4x SATA&lt;/strong&gt;&lt;br&gt;
You&amp;rsquo;ll need these breakout cables to connect SATA drives to the LSI HBA above. One cable handles four drives. Grab two if you&amp;rsquo;re filling a larger chassis.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42fXWsQ&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>OPNsense vs pfSense for Homelabs: Complete Comparison</title>
        <link>https://diymediaserver.com/post/2026/opnsense-vs-pfsense-homelab-2026/</link>
        <pubDate>Fri, 23 Jan 2026 08:22:37 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/opnsense-vs-pfsense-homelab-2026/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/opnsense-vs-pfsense-homelab-2026/featured.jpg" alt="Featured image of post OPNsense vs pfSense for Homelabs: Complete Comparison" /&gt;&lt;h2 id=&#34;what-are-opnsense-and-pfsense-and-why-it-matters-for-homelabs-in-2026&#34;&gt;What are OPNsense and pfSense and Why It Matters for Homelabs in 2026
&lt;/h2&gt;&lt;p&gt;OPNsense versus pfSense is the most debated firewall choice in homelab communities. Both are FreeBSD-based firewalls that handle routing, VPNs, intrusion detection, and traffic management. The difference isn&amp;rsquo;t capability. It&amp;rsquo;s philosophy, user experience, and whether you trust the vendor not to change the deal later.&lt;/p&gt;
&lt;p&gt;I ran pfSense for years because it was &amp;ldquo;the standard.&amp;rdquo; Then Netgate started moving features to pfSense Plus. The line between &amp;ldquo;free&amp;rdquo; and &amp;ldquo;pay us&amp;rdquo; kept shifting. I woke up one morning and realized I was building critical infrastructure on a platform where the vendor could arbitrarily decide which features belonged to paying customers. I rebuilt on OPNsense that weekend.&lt;/p&gt;
&lt;p&gt;Neither firewall is objectively &amp;ldquo;better.&amp;rdquo; But one might fit your tolerance for corporate shenanigans a lot better.&lt;/p&gt;
&lt;p&gt;This guide is for homelabbers who want to pick one firewall, deploy it, and move on. You&amp;rsquo;ll know which one by the end.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    &lt;br&gt;
Both OPNsense and pfSense are excellent FreeBSD-based firewalls. If you want a modern UI, more built-in features, and development that won&#39;t suddenly go closed-source, pick OPNsense. If you want conservative releases and massive legacy documentation (and trust Netgate), pfSense works fine.

  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;quick-comparison-opnsense-vs-pfsense-at-a-glance&#34;&gt;Quick Comparison: OPNsense vs pfSense at a Glance
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;OPNsense&lt;/th&gt;
          &lt;th&gt;pfSense&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;License&lt;/td&gt;
          &lt;td&gt;Fully Open Source&lt;/td&gt;
          &lt;td&gt;CE: Open, Plus: Proprietary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;UI Style&lt;/td&gt;
          &lt;td&gt;Modern sidebar navigation&lt;/td&gt;
          &lt;td&gt;Traditional top menu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Update Frequency&lt;/td&gt;
          &lt;td&gt;Bi-yearly major releases&lt;/td&gt;
          &lt;td&gt;Annual major releases&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Built-in IDS&lt;/td&gt;
          &lt;td&gt;Yes (Suricata)&lt;/td&gt;
          &lt;td&gt;Requires package install&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;WireGuard&lt;/td&gt;
          &lt;td&gt;Built-in by default&lt;/td&gt;
          &lt;td&gt;Requires plugin&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Security Patches&lt;/td&gt;
          &lt;td&gt;Days after FreeBSD&lt;/td&gt;
          &lt;td&gt;CE waits for Plus first&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Best For&lt;/td&gt;
          &lt;td&gt;Modern workflows, open-source advocates&lt;/td&gt;
          &lt;td&gt;Conservative updates, legacy setups&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;core-similarities-why-this-choice-is-hard&#34;&gt;Core Similarities: Why This Choice Is Hard
&lt;/h2&gt;&lt;p&gt;Both platforms do the same basic job:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FreeBSD-based firewall and router&lt;/li&gt;
&lt;li&gt;Stateful packet inspection and NAT&lt;/li&gt;
&lt;li&gt;VLANs, LAGG (bond NICs together), multi-WAN failover&lt;/li&gt;
&lt;li&gt;VPN: IPsec, OpenVPN, WireGuard&lt;/li&gt;
&lt;li&gt;Runs on bare metal or VMs&lt;/li&gt;
&lt;li&gt;Works great on Proxmox&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For basic WAN-to-LAN routing and site-to-site VPN, either one will work. You could pick based on a coin flip and be fine.&lt;/p&gt;
&lt;p&gt;The differences matter when you live with the system for months or years.&lt;/p&gt;
&lt;h2 id=&#34;ui-and-usability-opnsense-vs-pfsense-interface-comparison&#34;&gt;UI and Usability: OPNsense vs pfSense Interface Comparison
&lt;/h2&gt;&lt;h3 id=&#34;opnsense-ui-philosophy&#34;&gt;OPNsense UI Philosophy
&lt;/h3&gt;&lt;p&gt;OPNsense broke from pfSense&amp;rsquo;s interface years ago. That decision has paid off.&lt;/p&gt;
&lt;p&gt;The UI uses a left-side collapsible menu. Interfaces are under Interfaces. Firewall rules are under Firewall. Services are under Services. Interface descriptions are editable during assignment, not buried three clicks deep where you&amp;rsquo;ll never find them again.&lt;/p&gt;
&lt;p&gt;Virtual NICs live under Interfaces, not Firewall. Intrusion Detection lives under Services, not hidden in a package submenu. When you&amp;rsquo;re trying to fix something late at night, you won&amp;rsquo;t spend five minutes hunting for the setting you need.&lt;/p&gt;
&lt;p&gt;If you experiment, break things, and rebuild regularly, this consistency may keep you sane.&lt;/p&gt;
&lt;h3 id=&#34;pfsense-ui-philosophy&#34;&gt;pfSense UI Philosophy
&lt;/h3&gt;&lt;p&gt;pfSense uses a top navigation bar with nested dropdowns. It works. It also shows its age.&lt;/p&gt;
&lt;p&gt;Strengths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More default dashboard widgets (about 22 vs OPNsense&amp;rsquo;s 17)&lt;/li&gt;
&lt;li&gt;Consistent with documentation from 2015&lt;/li&gt;
&lt;li&gt;Familiar if you&amp;rsquo;ve used pfSense for years&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Weaknesses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Settings scattered across Firewall, System, and Services (good luck)&lt;/li&gt;
&lt;li&gt;Interface descriptions require extra clicks after assignment&lt;/li&gt;
&lt;li&gt;Package settings bolted onto the side like afterthoughts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you learned pfSense first, you know where everything is. If you&amp;rsquo;re new, you&amp;rsquo;ll spend time hunting. I&amp;rsquo;ve watched people stare at the top menu for 30 seconds trying to remember where DHCP server settings live. (Services, if you&amp;rsquo;re wondering.)&lt;/p&gt;
&lt;h3 id=&#34;real-world-ui-example-setting-up-vlans&#34;&gt;Real-World UI Example: Setting Up VLANs
&lt;/h3&gt;&lt;p&gt;To create a guest VLAN with internet access but blocked LAN access:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OPNsense:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Interfaces &amp;gt; Other Types &amp;gt; VLAN (create VLAN 10)&lt;/li&gt;
&lt;li&gt;Interfaces &amp;gt; Assignments (assign to OPT1)&lt;/li&gt;
&lt;li&gt;Firewall &amp;gt; Rules &amp;gt; OPT1 (add allow-internet rule)&lt;/li&gt;
&lt;li&gt;Firewall &amp;gt; Rules &amp;gt; OPT1 (add block-LAN rule above it)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;pfSense:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Interfaces &amp;gt; Assignments &amp;gt; VLANs (create VLAN 10)&lt;/li&gt;
&lt;li&gt;Interfaces &amp;gt; Assignments (assign to OPT1)&lt;/li&gt;
&lt;li&gt;Interfaces &amp;gt; OPT1 (enable and configure)&lt;/li&gt;
&lt;li&gt;Firewall &amp;gt; Rules &amp;gt; OPT1 (add rules)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both work. OPNsense puts VLANs under Interfaces where you&amp;rsquo;d look for them. pfSense buries VLAN creation under Assignments. One extra click that always feels wrong.&lt;/p&gt;
&lt;p&gt;UI clarity matters? Pick OPNsense. Years of muscle memory? Stick with pfSense.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07G9NHRGQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/fw6c.jpg&#34; alt=&#34;Protectli FW6C/FW6D: Why it fits this post: Purpose-built for pfSense/OPNsense, this fanless firewall appliance is ideal for readers comparing and deploying …&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Protectli FW6C/FW6D&lt;/strong&gt;
Purpose-built for pfSense/OPNsense, this fanless firewall box is ideal for folks comparing and deploying either solution in a homelab, with reliable Intel NICs and silent operation; the main tradeoff is higher cost versus repurposing old hardware.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4fKndSm&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;plugin-ecosystems-and-built-in-features&#34;&gt;Plugin Ecosystems and Built-In Features
&lt;/h2&gt;&lt;h3 id=&#34;opnsense-more-included-by-default&#34;&gt;OPNsense: More Included by Default
&lt;/h3&gt;&lt;p&gt;OPNsense ships with these features enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intrusion Detection (watches your network traffic, alerts on sketchy behavior)&lt;/li&gt;
&lt;li&gt;Traffic reporting dashboards&lt;/li&gt;
&lt;li&gt;Monit service monitoring (restarts dead services automatically)&lt;/li&gt;
&lt;li&gt;CPU, memory, disk widgets&lt;/li&gt;
&lt;li&gt;Built-in WireGuard VPN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can enable most of these without installing a plugin. Fewer plugins mean fewer things that can break during upgrades. (I learned this the hard way with pfBlockerNG, which ate an entire Saturday once.)&lt;/p&gt;
&lt;p&gt;Optional plugins exist for SMART monitoring, Wake-on-LAN, and Zenarmor traffic inspection. But the core firewall works fine without them.&lt;/p&gt;
&lt;h3 id=&#34;pfsense-package-driven-power&#34;&gt;pfSense: Package-Driven Power
&lt;/h3&gt;&lt;p&gt;pfSense CE relies more on packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suricata or Snort for intrusion detection&lt;/li&gt;
&lt;li&gt;ntopng for traffic analysis (shows you what&amp;rsquo;s eating bandwidth)&lt;/li&gt;
&lt;li&gt;SMART monitoring&lt;/li&gt;
&lt;li&gt;Additional dashboards&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The package manager is powerful. It&amp;rsquo;s also a maintenance risk. When pfSense updates the core system, packages sometimes lag. Sometimes they break. Sometimes they just stop working until the maintainer catches up.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also the CE/Plus split:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pfSense CE: free, open-source (for now)&lt;/li&gt;
&lt;li&gt;pfSense Plus: closed-source features, faster updates, tied to Netgate hardware or subscriptions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This matters if you care whether your firewall config depends on features that could disappear behind a paywall. I don&amp;rsquo;t want to wake up one day and find out the feature I rely on is Plus-only now.&lt;/p&gt;
&lt;p&gt;Fewer plugins and more built-in functionality? OPNsense. Specific pfSense packages you can&amp;rsquo;t live without? pfSense.&lt;/p&gt;
&lt;h3 id=&#34;the-pfblockerng-lesson&#34;&gt;The pfBlockerNG Lesson
&lt;/h3&gt;&lt;p&gt;I ran pfBlockerNG for ad blocking and threat feeds. Worked great for eight months. Then a pfSense core update hit. pfBlockerNG didn&amp;rsquo;t update in time. The firewall booted fine. DNS stopped working completely.&lt;/p&gt;
&lt;p&gt;Spent three hours troubleshooting. Checked DNS forwarder settings. Verified upstream resolvers. Restarted services. Nothing. The logs showed DNS queries arriving but pfBlockerNG was silently dropping everything because its threat feed database was incompatible with the new pfSense version.&lt;/p&gt;
&lt;p&gt;Removed pfBlockerNG. DNS came back instantly.&lt;/p&gt;
&lt;p&gt;This is the package problem in miniature. When your ad blocker can take down your entire network and the logs don&amp;rsquo;t quite tell you why, you start questioning your architecture. That Saturday convinced me to rebuild on a platform with fewer external dependencies.&lt;/p&gt;
&lt;h2 id=&#34;opnsense-vs-pfsense-performance-and-hardware-requirements&#34;&gt;OPNsense vs pfSense Performance and Hardware Requirements
&lt;/h2&gt;&lt;h3 id=&#34;hardware-requirements-and-virtualization&#34;&gt;Hardware Requirements and Virtualization
&lt;/h3&gt;&lt;p&gt;For self-hosting, OPNsense hardware requirements match pfSense:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;x86-64 CPU&lt;/li&gt;
&lt;li&gt;4 GB RAM minimum, 8 GB recommended&lt;/li&gt;
&lt;li&gt;2 NICs minimum (Intel NICs strongly recommended, Realtek will make you question your sanity)&lt;/li&gt;
&lt;li&gt;SSD storage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Proxmox Deployment:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Both run well as VMs. Pass through physical NICs or use virtio adapters. Give it 2 vCPUs minimum, 4+ if you&amp;rsquo;re running IDS. Hardware offloading can cause weird issues with some hypervisors, test it. Back up your configs before hypervisor updates. (You do this already, right?)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve run both on Proxmox with 4 vCPUs and 8GB RAM handling 500Mbps WAN without issues.&lt;/p&gt;
&lt;h3 id=&#34;real-world-performance&#34;&gt;Real-World Performance
&lt;/h3&gt;&lt;p&gt;Both deliver similar throughput on identical hardware. The bottleneck is your NIC or CPU, not the firewall software.&lt;/p&gt;
&lt;p&gt;On a quad-core i5 with Intel NICs, expect near line-rate for basic routing (900+ Mbps on gigabit). WireGuard pushes 600-800 Mbps. OpenVPN is CPU-bound, usually 200-400 Mbps. Turn on IDS and lose 10-30% depending on rulesets.&lt;/p&gt;
&lt;p&gt;If your numbers are terrible, it&amp;rsquo;s probably hardware offloading or bad NIC drivers. (Realtek, I&amp;rsquo;m looking at you.)&lt;/p&gt;
&lt;p&gt;Performance is a tie. Choose based on other factors.&lt;/p&gt;
&lt;h3 id=&#34;performance-benchmarks-real-numbers&#34;&gt;Performance Benchmarks: Real Numbers
&lt;/h3&gt;&lt;p&gt;Tested on identical hardware (i5-8500, 16GB RAM, Intel i350-T4 NICs):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Routing Performance:&lt;/strong&gt;&lt;br&gt;
OPNsense: 940 Mbps WAN-to-LAN (line rate)&lt;br&gt;
pfSense: 938 Mbps WAN-to-LAN (line rate)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WireGuard VPN:&lt;/strong&gt;&lt;br&gt;
OPNsense: 720 Mbps&lt;br&gt;
pfSense: 710 Mbps&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenVPN:&lt;/strong&gt;&lt;br&gt;
OPNsense: 380 Mbps&lt;br&gt;
pfSense: 375 Mbps&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With IDS Enabled (Suricata, 3 rulesets):&lt;/strong&gt;&lt;br&gt;
OPNsense: 680 Mbps (-27%)&lt;br&gt;
pfSense: 670 Mbps (-28%)&lt;/p&gt;
&lt;p&gt;Performance difference is negligible. Your hardware matters more than your platform.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Note:&lt;/strong&gt;
    These are not my numbers I had a friend who has a 1Gbps test. Made for easier math.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;update-philosophy-opnsense-vs-pfsense-release-cycle&#34;&gt;Update Philosophy: OPNsense vs pfSense Release Cycle
&lt;/h2&gt;&lt;h3 id=&#34;opnsense-updates&#34;&gt;OPNsense Updates
&lt;/h3&gt;&lt;p&gt;OPNsense follows a predictable schedule:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Major releases twice yearly (January and July)&lt;/li&gt;
&lt;li&gt;Security updates and patches as needed&lt;/li&gt;
&lt;li&gt;Plugin updates independent of core system&lt;/li&gt;
&lt;li&gt;Clear change logs and migration guides&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The web UI shows pending updates with one-click installation. Rollback options exist if something breaks. Development is transparent. Community input matters.&lt;/p&gt;
&lt;p&gt;Updates feel modern and reliable.&lt;/p&gt;
&lt;h3 id=&#34;pfsense-updates&#34;&gt;pfSense Updates
&lt;/h3&gt;&lt;p&gt;pfSense CE takes a more conservative approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Major releases roughly annually&lt;/li&gt;
&lt;li&gt;Minor updates and security patches as needed&lt;/li&gt;
&lt;li&gt;pfSense Plus gets updates first&lt;/li&gt;
&lt;li&gt;CE trails behind (sometimes weeks)&lt;/li&gt;
&lt;li&gt;Some features migrate to Plus-only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This frustrates people. CE users wait for security patches that Plus users already have. You&amp;rsquo;re constantly aware of what you&amp;rsquo;re missing. The free tier feels like a free tier.&lt;/p&gt;
&lt;p&gt;For &amp;ldquo;set it and forget it&amp;rdquo; homelabs, pfSense&amp;rsquo;s slower pace could be a feature or a frustration. Depends on your perspective.&lt;/p&gt;
&lt;p&gt;Regular updates and transparency? OPNsense. Conservative updates and slower pace? pfSense.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B08C4QM3DF&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/dell7070.jpg&#34; alt=&#34;Dell OptiPlex 7070 Micro: Why it fits this post: A cost-effective, quiet mini PC that can be repurposed as a pfSense/OPNsense box for homelab beginners, thou…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Dell OptiPlex 7070 Micro&lt;/strong&gt;
A cost-effective, quiet mini PC that can be repurposed as a pfSense/OPNsense box for homelab beginners, though it lacks multiple NICs out of the box and will require USB or PCIe NICs for full functionality.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3JkmsDm&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;trust-and-long-term-viability&#34;&gt;Trust and Long-Term Viability
&lt;/h2&gt;&lt;p&gt;This is where it gets personal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OPNsense:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fully open-source, no proprietary split&lt;/li&gt;
&lt;li&gt;Community-driven development&lt;/li&gt;
&lt;li&gt;No vendor lock-in&lt;/li&gt;
&lt;li&gt;Decool GmbH sponsors but doesn&amp;rsquo;t control features&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;pfSense:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Netgate controls everything&lt;/li&gt;
&lt;li&gt;CE is open, Plus is closed&lt;/li&gt;
&lt;li&gt;CE feels like the free tier of a paid product&lt;/li&gt;
&lt;li&gt;Netgate&amp;rsquo;s business goals don&amp;rsquo;t align with homelab users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I switched to OPNsense because I don&amp;rsquo;t want my firewall&amp;rsquo;s future tied to quarterly earnings calls. pfSense CE isn&amp;rsquo;t dying tomorrow. But I don&amp;rsquo;t like the trajectory.&lt;/p&gt;
&lt;p&gt;When a company starts moving features behind paywalls, it doesn&amp;rsquo;t stop. It accelerates. I&amp;rsquo;ve seen this before.&lt;/p&gt;
&lt;p&gt;Open-source purity matters? OPNsense. Netgate ecosystem matters more? pfSense.&lt;/p&gt;
&lt;h2 id=&#34;my-migration-weekend-what-actually-happened&#34;&gt;My Migration Weekend: What Actually Happened
&lt;/h2&gt;&lt;p&gt;I ran pfSense for four years before switching. The migration took six hours over one weekend.&lt;/p&gt;
&lt;h3 id=&#34;saturday---setup-and-config-migration&#34;&gt;Saturday - Setup and Config Migration
&lt;/h3&gt;&lt;p&gt;Spun up OPNsense VM on Proxmox. Exported pfSense config to XML, tried importing. It accepted the file but only 60% transferred cleanly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What worked:&lt;/strong&gt; Interface assignments, VLANs, basic firewall rules, DHCP scopes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What broke:&lt;/strong&gt; NAT rules needed manual recreation. VPN configs had to be rebuilt from scratch. DNS forwarder settings didn&amp;rsquo;t transfer.&lt;/p&gt;
&lt;p&gt;WireGuard rebuild: 20 minutes.&lt;/p&gt;
&lt;h3 id=&#34;sunday---testing-and-cutover&#34;&gt;Sunday - Testing and Cutover
&lt;/h3&gt;&lt;p&gt;Ran both firewalls in parallel for testing. Shut down pfSense, changed VLAN assignments on switch, updated DHCP gateway IPs.&lt;/p&gt;
&lt;p&gt;Total downtime: about 20 minutes.&lt;/p&gt;
&lt;p&gt;Kept pfSense VM around for two weeks as backup. Never needed it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I&amp;rsquo;d Do Differently&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Export VPN client configs before starting. I had to message six people with new configs during the cutover.&lt;/p&gt;
&lt;p&gt;Test VLAN isolation more thoroughly. Found a misconfigured rule Monday morning that let guest traffic reach management VLAN. Fixed in five minutes but should&amp;rsquo;ve caught it Sunday.&lt;/p&gt;
&lt;p&gt;Been running OPNsense for 18 months now. No regrets.&lt;/p&gt;
&lt;h2 id=&#34;when-you-should-stay-on-pfsense&#34;&gt;When You Should Stay on pfSense
&lt;/h2&gt;&lt;p&gt;Don&amp;rsquo;t switch if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You have complex pfBlockerNG configs you can&amp;rsquo;t easily recreate.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zenarmor exists on OPNsense but it&amp;rsquo;s not identical. If you&amp;rsquo;ve got custom threat feeds and DNSBL configs that took months to tune, migration pain might not be worth it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your network depends on pfSense-specific packages.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some packages don&amp;rsquo;t have OPNsense equivalents. Check before committing to migration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You have working configs and no pain points.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Migration has costs. If pfSense works, and you&amp;rsquo;re not frustrated, stay put. I switched because the CE/Plus split bothered me and I had a package break. If you don&amp;rsquo;t have these problems, you don&amp;rsquo;t need to solve them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;practical-decision-guide-for-homelab-firewalls&#34;&gt;Practical Decision Guide for Homelab Firewalls
&lt;/h2&gt;&lt;p&gt;Ask yourself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modern UI that reduces mistakes? → &lt;strong&gt;OPNsense&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Rely on specific pfSense packages? → &lt;strong&gt;pfSense&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Care about open-source purity? → &lt;strong&gt;OPNsense&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Want ultra-conservative updates? → &lt;strong&gt;pfSense&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Run everything in Proxmox VMs? → Either works, &lt;strong&gt;OPNsense&lt;/strong&gt; slightly easier&lt;/li&gt;
&lt;li&gt;Need maximum plugin flexibility? → &lt;strong&gt;pfSense&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re undecided, install both in VMs. Spend an afternoon configuring VLANs and WireGuard. Your preference will become obvious. Don&amp;rsquo;t agonize over this for weeks. Spin them up, click around, pick one.&lt;/p&gt;
&lt;h2 id=&#34;decision-tree-which-firewall-should-you-pick&#34;&gt;Decision Tree: Which Firewall Should You Pick?
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Do you already run pfSense with no issues?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YES → Stay on pfSense (don&amp;rsquo;t fix what isn&amp;rsquo;t broken).&lt;/li&gt;
&lt;li&gt;NO → Continue&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you rely on pfSense-specific packages?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YES → Stay on pfSense (migration pain isn&amp;rsquo;t worth it).&lt;/li&gt;
&lt;li&gt;NO → Continue&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Does the CE/Plus split bother you?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YES → Switch to OPNsense.&lt;/li&gt;
&lt;li&gt;NO → Continue&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you want a modern UI with better organization?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YES → Switch to OPNsense.&lt;/li&gt;
&lt;li&gt;NO → Continue&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you want faster security updates?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YES → Switch to OPNsense.&lt;/li&gt;
&lt;li&gt;NO → Stay on pfSense (conservative updates suit you).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you end up at &amp;ldquo;Stay on pfSense&amp;rdquo; but still feel uncertain, that uncertainty is telling you something. Listen to it.&lt;/p&gt;
&lt;h2 id=&#34;common-mistakes-that-will-bite-you&#34;&gt;Common Mistakes That Will Bite You
&lt;/h2&gt;&lt;h3 id=&#34;dont-virtualize-on-hardware-youre-using-for-other-things&#34;&gt;Don&amp;rsquo;t Virtualize on Hardware You&amp;rsquo;re Using for Other Things
&lt;/h3&gt;&lt;p&gt;Your firewall VM needs dedicated hardware or a hypervisor that&amp;rsquo;s always on. I&amp;rsquo;ve watched people wonder why their network dies when they reboot their workstation to install updates. Because your firewall is on it. Obviously.&lt;/p&gt;
&lt;p&gt;Run your firewall on a dedicated box, a separate hypervisor, or accept that rebooting your daily driver takes down your entire network. There&amp;rsquo;s no middle ground here.&lt;/p&gt;
&lt;h3 id=&#34;dont-skip-backups-before-updates&#34;&gt;Don&amp;rsquo;t Skip Backups Before Updates
&lt;/h3&gt;&lt;p&gt;Both platforms make this easy:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OPNsense:&lt;/strong&gt; System &amp;gt; Configuration &amp;gt; Backups &amp;gt; Download configuration&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pfSense:&lt;/strong&gt; Diagnostics &amp;gt; Backup &amp;amp; Restore &amp;gt; Download configuration as XML&lt;/p&gt;
&lt;p&gt;Save it locally with the date in the filename: &lt;code&gt;firewall-backup-2026-01-31.xml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Do this before updates. Do this before changing anything important. Do this monthly even if you&amp;rsquo;re not changing anything. Store it somewhere that&amp;rsquo;s not the firewall. Your NAS, your workstation, cloud storage, doesn&amp;rsquo;t matter. Just not on the firewall itself.&lt;/p&gt;
&lt;p&gt;When (not if) you need to restore, you&amp;rsquo;ll thank past-you for being paranoid.&lt;/p&gt;
&lt;h3 id=&#34;dont-enable-every-ids-rule&#34;&gt;Don&amp;rsquo;t Enable Every IDS Rule
&lt;/h3&gt;&lt;p&gt;More rules ≠ more security. You&amp;rsquo;ll kill performance and get flooded with false positives you&amp;rsquo;ll ignore.&lt;/p&gt;
&lt;p&gt;Start with recommended rulesets. Monitor for a week. Add more only if you need them. I ran with three rulesets for 18 months before adding a fourth. You don&amp;rsquo;t need 47 different threat feeds.&lt;/p&gt;
&lt;h3 id=&#34;dont-use-realtek-nics-if-you-can-avoid-it&#34;&gt;Don&amp;rsquo;t Use Realtek NICs If You Can Avoid It
&lt;/h3&gt;&lt;p&gt;They work. They also cause weird throughput issues, driver headaches, and inexplicable packet loss under load.&lt;/p&gt;
&lt;p&gt;Intel NICs cost $20 more used on eBay. Buy Intel. The i350-T2 and i350-T4 are solid choices. Your future self will appreciate it when you&amp;rsquo;re not troubleshooting phantom network issues at midnight.&lt;/p&gt;
&lt;h3 id=&#34;dont-trust-default-settings-for-production&#34;&gt;Don&amp;rsquo;t Trust Default Settings for Production
&lt;/h3&gt;&lt;p&gt;Both platforms ship with sensible defaults for home use. But &amp;ldquo;sensible defaults&amp;rdquo; means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No firewall rules blocking RFC1918 (private IP addesses) traffic on WAN (fine for home, terrible for dual-WAN or VPS)&lt;/li&gt;
&lt;li&gt;DNS resolver allowing queries from all interfaces (convenient, not secure)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Review the defaults. Adjust for your environment. Lock down access to the web UI. Enable stricter firewall rules. Don&amp;rsquo;t assume &amp;ldquo;default&amp;rdquo; means &amp;ldquo;secure.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;minimum-viable-firewall-setup&#34;&gt;Minimum Viable Firewall Setup
&lt;/h2&gt;&lt;p&gt;Stop overthinking the initial config. Day one, you need:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;WAN interface configured&lt;/strong&gt; - DHCP from ISP or static IP, whichever your ISP provides&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAN interface with DHCP enabled&lt;/strong&gt; - Both do this automatically during install&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default allow rule on LAN&lt;/strong&gt; - Both create this automatically&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS set to upstream resolvers&lt;/strong&gt; - 1.1.1.1 and 8.8.8.8, or your preference&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it. Everything else is optional.&lt;/p&gt;
&lt;p&gt;VLANs? Add them when you need device isolation.&lt;br&gt;
VPNs? Add them when you need remote access.&lt;br&gt;
IDS? Add it when you want visibility into traffic.&lt;br&gt;
Custom dashboards? Add them when the defaults feel limiting.&lt;/p&gt;
&lt;p&gt;Start simple. Add complexity only when you have a specific need. Your firewall&amp;rsquo;s job is routing packets and blocking threats, not looking impressive in screenshots.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-common-opnsense-and-pfsense-issues&#34;&gt;Troubleshooting Common OPNsense and pfSense Issues
&lt;/h2&gt;&lt;h3 id=&#34;internet-works-but-throughput-is-terrible&#34;&gt;Internet Works, but Throughput Is Terrible
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt; Slow speeds despite fast connection&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;
Disable hardware offloading first. This is the most common culprit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OPNsense:&lt;/strong&gt; Interfaces &amp;gt; Settings &amp;gt; Disable &amp;ldquo;Hardware CRC&amp;rdquo;, &amp;ldquo;Hardware TSO&amp;rdquo;, &amp;ldquo;Hardware LRO&amp;rdquo;&lt;br&gt;
&lt;strong&gt;pfSense:&lt;/strong&gt; System &amp;gt; Advanced &amp;gt; Networking &amp;gt; Disable all hardware checksum offloading&lt;/p&gt;
&lt;p&gt;Reboot. Test again.&lt;/p&gt;
&lt;p&gt;If that doesn&amp;rsquo;t fix it, check IDS rulesets. Too many active rules kills performance. System &amp;gt; Intrusion Detection &amp;gt; Download &amp;gt; verify only 2-3 rulesets are enabled.&lt;/p&gt;
&lt;p&gt;Reboot. Test again.&lt;/p&gt;
&lt;p&gt;If that doesn&amp;rsquo;t fix it, check IDS rulesets. Too many active rules kills performance. System &amp;gt; Intrusion Detection &amp;gt; Download &amp;gt; verify only 2-3 rulesets are enabled.&lt;/p&gt;
&lt;p&gt;Verify your NIC drivers are loaded correctly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SSH into firewall, check what driver your NIC is using&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ifconfig -a &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -A &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;em0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see &amp;ldquo;re0&amp;rdquo; (Realtek), you found your problem. Intel NICs use &amp;ldquo;em&amp;rdquo;, &amp;ldquo;igb&amp;rdquo;, or &amp;ldquo;ix&amp;rdquo; drivers. Realtek uses &amp;ldquo;re&amp;rdquo;. Replace the NIC.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re seeing 100 Mbps on gigabit, the NIC negotiated wrong. Check System &amp;gt; Interfaces &amp;gt; [Interface] and verify it&amp;rsquo;s set to auto-negotiate or manually force 1000baseT full-duplex.&lt;/p&gt;
&lt;h3 id=&#34;vpn-is-slow&#34;&gt;VPN Is Slow
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt; WireGuard or OpenVPN performing poorly&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
Verify WireGuard is using kernel implementation (not userspace).&lt;br&gt;
Check VPN &amp;gt; WireGuard &amp;gt; Instances &amp;gt; verify &amp;ldquo;Type&amp;rdquo; shows kernel implementation.&lt;/p&gt;
&lt;p&gt;Disable unnecessary logging (verbose logging kills performance).&lt;br&gt;
VPN &amp;gt; WireGuard &amp;gt; Advanced &amp;gt; set log level to &amp;ldquo;error&amp;rdquo; only.&lt;/p&gt;
&lt;p&gt;Test without IDS. Suricata inspecting VPN traffic = very slow.&lt;br&gt;
Services &amp;gt; Intrusion Detection &amp;gt; disable temporarily, test VPN speed.&lt;/p&gt;
&lt;p&gt;WireGuard should be fast. If it&amp;rsquo;s not, your config or hardware is wrong.&lt;/p&gt;
&lt;h3 id=&#34;upgrade-broke-something&#34;&gt;Upgrade Broke Something
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt; Features missing or broken after update&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
Restore config backup (you made one, right?).&lt;br&gt;
System &amp;gt; Configuration &amp;gt; Backups &amp;gt; restore previous config.&lt;/p&gt;
&lt;p&gt;Check package compatibility in changelogs.&lt;br&gt;
Before updating, read the release notes. They list package compatibility issues.
Review deprecated features list. Sometimes features get removed. Check migration guides.&lt;/p&gt;
&lt;p&gt;Test packages individually after core upgrade.&lt;br&gt;
Update core first, reboot, then update packages one at a time.&lt;/p&gt;
&lt;p&gt;Restore your backup. Try again. Five minutes reading release notes can save an hour troubleshooting. (Yes, I have learned this the hard way.)&lt;/p&gt;
&lt;h2 id=&#34;security-differences-that-actually-matter&#34;&gt;Security Differences That Actually Matter
&lt;/h2&gt;&lt;p&gt;Both platforms are secure by default. The differences are operational, not architectural.&lt;/p&gt;
&lt;h3 id=&#34;opnsense-security-advantages&#34;&gt;OPNsense Security Advantages
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Two-factor authentication built-in.&lt;/strong&gt; No plugin needed. System &amp;gt; Access &amp;gt; Users &amp;gt; [Select User] &amp;gt; Generate new secret. Works with Google Authenticator, Authy, or any TOTP app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IDS integrated and easier to configure.&lt;/strong&gt; Services &amp;gt; Intrusion Detection &amp;gt; Download tab. Select rulesets, enable IDS, done. No separate package installation or config files to manage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faster security patches.&lt;/strong&gt; No CE/Plus delay. When a FreeBSD security advisory drops, OPNsense patches hit within days. pfSense CE users wait for Plus to get patched first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More frequent security updates.&lt;/strong&gt; Bi-yearly major releases plus security patches as needed. pfSense CE releases are annual with longer gaps between security updates.&lt;/p&gt;
&lt;h3 id=&#34;pfsense-security-advantages&#34;&gt;pfSense Security Advantages
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;More mature IDS rulesets.&lt;/strong&gt; Snort has been around longer than Suricata. More documentation, more tuned rules for specific scenarios. If you need very specific detection rules for niche attacks, pfSense&amp;rsquo;s Snort documentation is a deep rabbit hole.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More third-party security plugins.&lt;/strong&gt; ntopng integration is tighter. More options for anomaly detection and traffic analysis. If you want to build a full security monitoring stack, pfSense has more plugin options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More documented attack mitigation examples.&lt;/strong&gt; Decade of forum posts, blog tutorials, and Stack Overflow answers. If you&amp;rsquo;re mitigating a specific attack, someone&amp;rsquo;s documented how to do it on pfSense.&lt;/p&gt;
&lt;h3 id=&#34;what-actually-matters&#34;&gt;What Actually Matters
&lt;/h3&gt;&lt;p&gt;Neither platform has had a major security incident in recent years. Your security posture depends more on configuration than platform choice.&lt;/p&gt;
&lt;p&gt;Common security mistakes I see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web UI exposed to WAN (don&amp;rsquo;t do this)&lt;/li&gt;
&lt;li&gt;Default admin passwords (change them immediately)&lt;/li&gt;
&lt;li&gt;No firewall rules blocking RFC1918 on WAN (matters for dual-WAN setups)&lt;/li&gt;
&lt;li&gt;Permissive outbound rules on LAN (most people allow all, should be more restrictive)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fix these regardless of platform. A misconfigured OPNsense box is less secure than a properly configured pfSense box, and vice versa.&lt;/p&gt;
&lt;h2 id=&#34;what-surprised-me-after-switching&#34;&gt;What Surprised Me After Switching
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;OPNsense updates are faster.&lt;/strong&gt; pfSense updates took 10-15 minutes and always required a reboot. OPNsense updates finish in 2-3 minutes. Most don&amp;rsquo;t need a reboot. The few that do reboot in under 60 seconds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The documentation is different.&lt;/strong&gt; pfSense has more forum posts and third-party tutorials dating back to 2008. Google any pfSense problem and you&amp;rsquo;ll find 47 blog posts about it. OPNsense has cleaner official docs but fewer community tutorials. Took me a few weeks to adjust to reading official docs instead of blog posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Built-in features I didn&amp;rsquo;t know I wanted.&lt;/strong&gt; Monit caught a failing DNS resolver once and restarted it before I noticed. I woke up, checked logs, saw &amp;ldquo;unbound died, Monit restarted it 3 hours ago.&amp;rdquo; That alone justified the switch. On pfSense I would&amp;rsquo;ve woken up to &amp;ldquo;DNS is broken&amp;rdquo; messages from family.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The community is smaller but more active.&lt;/strong&gt; pfSense has more users. OPNsense has more engaged users. Forum questions get answered faster on OPNsense because there are fewer &amp;ldquo;have you tried turning it off and on again&amp;rdquo; responses. People assume competence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plugin updates don&amp;rsquo;t break things.&lt;/strong&gt; Because most features are built-in, there are fewer plugins to break during core updates. I haven&amp;rsquo;t had a plugin break in 18 months on OPNsense. On pfSense, I had plugin breakage every 3-4 months.&lt;/p&gt;
&lt;h2 id=&#34;quick-wins-after-installation&#34;&gt;Quick Wins After Installation
&lt;/h2&gt;&lt;p&gt;First 30 minutes with either platform:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Change default admin password&lt;/li&gt;
&lt;li&gt;Enable automatic config backups&lt;/li&gt;
&lt;li&gt;Set up 2FA (OPNsense: built-in, pfSense: use package)&lt;/li&gt;
&lt;li&gt;Configure DNS over TLS (prevents ISP snooping)&lt;/li&gt;
&lt;li&gt;Enable basic IDS with recommended rulesets&lt;/li&gt;
&lt;li&gt;Test failover to backup DNS resolver&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do these immediately. Everything else can wait.&lt;/p&gt;
&lt;h2 id=&#34;what-i-was-wrong-about&#34;&gt;What I Was Wrong About
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;I thought migration would take all weekend.&lt;/strong&gt; Took six hours of actual work. Most of that was rebuilding OpenVPN configs because I didn&amp;rsquo;t export them properly first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I thought I&amp;rsquo;d miss pfSense packages.&lt;/strong&gt; Haven&amp;rsquo;t needed a single pfSense-specific package in 18 months. Everything I relied on either exists natively in OPNsense or has an equivalent plugin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I thought OPNsense would be less stable.&lt;/strong&gt; It&amp;rsquo;s been rock-solid. Only reboots are for updates. Uptime between reboots averages 6-8 weeks. On pfSense I was rebooting every 3-4 weeks when packages broke.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I thought the smaller community would be a problem.&lt;/strong&gt; Smaller community means better signal-to-noise ratio. Questions get answered by people who actually know the codebase, not people guessing based on pfSense experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I thought performance would be identical.&lt;/strong&gt; It is, mostly. But OPNsense&amp;rsquo;s update speed and reboot time makes maintenance faster. Shaving 10 minutes off update time doesn&amp;rsquo;t sound like much until you&amp;rsquo;re doing it monthly.&lt;/p&gt;
&lt;h2 id=&#34;when-your-firewall-is-good-enough&#34;&gt;When Your Firewall Is Good Enough
&lt;/h2&gt;&lt;p&gt;Stop tweaking when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WAN to LAN routing works at line rate&lt;/li&gt;
&lt;li&gt;VPNs connect reliably and stay connected&lt;/li&gt;
&lt;li&gt;You haven&amp;rsquo;t touched the config in a month&lt;/li&gt;
&lt;li&gt;Uptime is measured in weeks, not hours&lt;/li&gt;
&lt;li&gt;Family/roommates don&amp;rsquo;t complain about the network&lt;/li&gt;
&lt;li&gt;You stop checking the dashboard daily&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your firewall&amp;rsquo;s job is to be invisible. Once it disappears into the background, you&amp;rsquo;ve won. Move on to other projects.&lt;/p&gt;
&lt;p&gt;The best firewall is the one you forget about. If you&amp;rsquo;re thinking about your firewall daily, something&amp;rsquo;s wrong. Fix it or replace it.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F8JG2SHN&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: Why it fits this post: With multiple 10GbE and 2.5GbE ports, this mini workstation offers flexible, high-performance hardware for running O…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
&lt;strong&gt;Nice to have, not required.&lt;/strong&gt;
Why it fits this post: With multiple 10GbE and 2.5GbE ports, this mini workstation offers flexible, high-performance hardware for running OPNsense/pfSense or as a multi-role homelab node, though it may be overkill for simple firewall-only setups.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;faqs-opnsense-vs-pfsense-for-homelabs&#34;&gt;FAQs: OPNsense vs pfSense for Homelabs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s the easiest firewall for a homelab?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;OPNsense. Better UI, fewer required plugins. You&amp;rsquo;ll spend less time hunting through menus.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Does OPNsense run better on low-end hardware than pfSense?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No meaningful difference. Hardware quality matters more. A good Intel NIC beats a bad Realtek NIC regardless of firewall choice.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Why do pfSense updates feel delayed?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;pfSense CE trails pfSense Plus. Netgate prioritizes Plus for paying customers. CE gets updates eventually. You wait.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I set up WireGuard without plugins?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;pfSense requires installing the plugin. OPNsense ships with it by default.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is OPNsense&amp;#39;s IDPS as good as pfSense &amp;#43; Suricata?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;They both use Suricata. Same engine, same rules, same detection. OPNsense integrates it cleaner.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ pfSense menu is confusing, how does OPNsense compare?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;OPNsense uses a left-side menu with clearer grouping. Things are where you&amp;rsquo;d expect them. Not revolutionary, but noticeably better.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I trust Netgate long-term?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Netgate is a for-profit company. They need revenue. OPNsense is community-driven. If the CE/Plus split bothers you now, it&amp;rsquo;ll only get worse. Pick accordingly.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Best plugins for homelab monitoring?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;ntopng on pfSense for traffic analysis. Zenarmor on OPNsense for deep packet inspection. Both work well.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I migrate from pfSense to OPNsense?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Export XML config, import selectively, manually verify interfaces and rules. Plan for manual reconfiguration. Not one-click, but doable in an afternoon. (Make a backup first. Obviously.)&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion-pick-your-homelab-firewall-and-move-on&#34;&gt;Conclusion: Pick Your Homelab Firewall and Move On
&lt;/h2&gt;&lt;p&gt;In 2026, choosing between OPNsense and pfSense isn&amp;rsquo;t about raw capability. It&amp;rsquo;s about philosophy, workflow, and trust.&lt;/p&gt;
&lt;p&gt;pfSense is powerful, stable, and widely documented. OPNsense feels more modern, more open, and more forgiving when you experiment.&lt;/p&gt;
&lt;p&gt;I want my firewall to fade into the background. For me, that&amp;rsquo;s OPNsense. For you, it might be pfSense.&lt;/p&gt;
&lt;p&gt;Pick one. Document your setup. Back up before upgrades. Get back to building the fun parts of your homelab.&lt;/p&gt;
&lt;p&gt;Your firewall should be boring. That&amp;rsquo;s the whole point.&lt;/p&gt;
&lt;h2 id=&#34;sources&#34;&gt;Sources
&lt;/h2&gt;&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/logo-opnsense.svg&#34; alt=&#34;OPNsense Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://docs.opnsense.org/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/pfSense.png&#34; alt=&#34;pfSense Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://docs.netgate.com/pfsense/en/latest/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        </item>
        <item>
        <title>How to Install, Configure, and Migrate to a Consolidated PostgreSQL Server</title>
        <link>https://diymediaserver.com/post/2026/consolidate-postgresql-server-docker-migration/</link>
        <pubDate>Sat, 17 Jan 2026 06:48:12 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/consolidate-postgresql-server-docker-migration/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/consolidate-postgresql-server-docker-migration/featured.jpg" alt="Featured image of post How to Install, Configure, and Migrate to a Consolidated PostgreSQL Server" /&gt;&lt;p&gt;If you&amp;rsquo;re running more than a couple of Docker stacks, chances are you&amp;rsquo;re also running more PostgreSQL containers than you want to admit. I hit my breaking point at six separate Postgres containers, each with its own volume, backup strategy, and maintenance quirks. Every time I ran: &lt;code&gt;docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;/code&gt; it felt risky.&lt;/p&gt;
&lt;p&gt;Consolidating PostgreSQL databases into a single dedicated server eliminates scattered backups, reduces resource bloat, and makes future migrations trivial, which is exactly what you want from a database. In this guide, you&amp;rsquo;ll learn how to install PostgreSQL on Debian, configure remote database access, and migrate Docker PostgreSQL containers to a centralized VM without breaking your apps or losing data.&lt;/p&gt;
&lt;p&gt;This PostgreSQL migration guide moves you from multiple Docker-based instances to one dedicated server running in a Debian 13 VM on Proxmox. Expected downtime: 10-30 minutes per app during migration. Risk level: Medium, but I&amp;rsquo;ll also cover recovery strategies.&lt;/p&gt;
&lt;p&gt;This is written for users who already understand Docker, basic Linux administration, and Postgres fundamentals, but want a clean, repeatable way to consolidate databases.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    Create a Debian 13 VM in Proxmox, install PostgreSQL natively, enable secure remote access, migrate each Docker database using &lt;code&gt;pg_dump&lt;/code&gt;, then update your Docker stacks to point at the new centralized server for simpler management and backups.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-a-dedicated-postgresql-vm-beats-multiple-containers&#34;&gt;Why a Dedicated PostgreSQL VM Beats Multiple Containers
&lt;/h2&gt;&lt;p&gt;Before running any commands, let&amp;rsquo;s talk about why this is worth the effort.&lt;/p&gt;
&lt;p&gt;When each Docker stack runs its own Postgres container, you&amp;rsquo;re dealing with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Duplicated memory and CPU usage across every instance&lt;/li&gt;
&lt;li&gt;Backups scattered across volumes (good luck finding the right one when you need it)&lt;/li&gt;
&lt;li&gt;Version upgrades happening at different times (or not at all)&lt;/li&gt;
&lt;li&gt;Monitoring and tuning that&amp;rsquo;s inconsistent at best&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A single PostgreSQL server in a VM gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One place to back up and restore, your future self will thank you&lt;/li&gt;
&lt;li&gt;Centralized performance tuning that actually matters&lt;/li&gt;
&lt;li&gt;Cleaner Docker stacks with fewer moving parts&lt;/li&gt;
&lt;li&gt;Easier upgrades and security patching (do it once, not six times)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the thing: databases need to be treated as infrastructure, not app dependencies. Treating Postgres like shared infrastructure pays off quickly. I wish I&amp;rsquo;d done this years ago.&lt;/p&gt;
&lt;p&gt;More details on why you should do this:
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/post/2026/consolidate-postgresql-databases-one-vm/featured.jpg&#34; alt=&#34;My post on why you Should consolidate your PostgreSQL Docker Containers in to on consolidated VM&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;My post on why you should consolidate your PostgreSQL Docker Containers in to on consolidated VM&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://diymediaserver.com/post/2026/consolidate-postgresql-databases-one-vm/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id=&#34;prepare-the-proxmox-vm-debian-13&#34;&gt;Prepare the Proxmox VM (Debian 13)
&lt;/h2&gt;&lt;h3 id=&#34;vm-sizing-and-creation&#34;&gt;VM Sizing and Creation
&lt;/h3&gt;&lt;p&gt;In Proxmox, create a new VM with these baseline specs. These specs work well for 5 to 10 typical homelab apps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; OS: Debian 13 ISO&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; CPU: 2 to 4 cores&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; RAM: 4 to 8 GB&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Disk: 20 to 50 GB SSD, VirtIO&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Network: Bridge to your homelab subnet&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Enable QEMU Guest Agent in VM options&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PostgreSQL benefits more from RAM and fast storage than raw CPU. If you have the memory to spare, err on the side of more, you won&amp;rsquo;t regret it.&lt;/p&gt;
&lt;h3 id=&#34;install-debian-13-minimal&#34;&gt;Install Debian 13 (Minimal)
&lt;/h3&gt;&lt;p&gt;During the Debian installer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose a minimal install, no desktop environment (you don&amp;rsquo;t need it)&lt;/li&gt;
&lt;li&gt;Assign a static IP, saves headaches later&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;openssh-server&lt;/code&gt;, so you can manage the VM remotely with SSH&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the first login, update the system and install the QEMU guest agent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y qemu-guest-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now qemu-guest-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The guest agent improves shutdown handling, IP reporting, and backup consistency in Proxmox. It&amp;rsquo;s not required, but it&amp;rsquo;s one of those &amp;ldquo;install it now, appreciate it later&amp;rdquo; things.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F8JG2SHN&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: This compact mini-workstation offers powerful CPU options and serious I/O, making it ideal for running a consolidate…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;&lt;br&gt;
This compact mini-workstation offers powerful CPU options and serious I/O, making it ideal for running a consolidated PostgreSQL server in a Proxmox VM with room for future growth.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;install-postgresql-on-debian-13&#34;&gt;Install PostgreSQL on Debian 13
&lt;/h2&gt;&lt;h3 id=&#34;decision-default-debian-repo-or-official-postgresql-repo&#34;&gt;Decision: Default Debian Repo or Official PostgreSQL Repo?
&lt;/h3&gt;&lt;p&gt;Alright, this is the first real fork in the road. Your choice here affects file paths and version numbers for the rest of the guide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option A: Debian default repository (RECOMMENDED)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pros: simpler, stable, fewer surprises&lt;/li&gt;
&lt;li&gt;Cons: version may lag behind upstream (Debian 13 uses PostgreSQL 17)&lt;/li&gt;
&lt;li&gt;Install paths: &lt;code&gt;/etc/postgresql/17/main/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Service name: &lt;code&gt;postgresql&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y postgresql postgresql-contrib
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Option B: Official PostgreSQL APT repository&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pros: access to PostgreSQL 18 or newer features&lt;/li&gt;
&lt;li&gt;Cons: slightly more setup complexity, one more thing to maintain&lt;/li&gt;
&lt;li&gt;Install paths: &lt;code&gt;/etc/postgresql/18/main/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Service name: &lt;code&gt;postgresql&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want the latest features:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y curl ca-certificates
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo install -m &lt;span class=&#34;m&#34;&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -o /etc/apt/keyrings/pgdg.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod a+r /etc/apt/keyrings/pgdg.asc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/pgdg.asc] https://apt.postgresql.org/pub/repos/apt &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-pgdg main&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/pgdg.list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y postgresql-18 postgresql-contrib-18
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Note:&lt;/strong&gt;
    The rest of this guide assumes Debian 13&amp;rsquo;s default PostgreSQL 17. If you chose PGDG, replace &lt;code&gt;/etc/postgresql/17/main/&lt;/code&gt; with &lt;code&gt;/etc/postgresql/18/main/&lt;/code&gt; in all config file paths. I know, I know, it&amp;rsquo;s annoying, but that&amp;rsquo;s the price you pay for bleeding edge.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;verify-the-service&#34;&gt;Verify the Service
&lt;/h3&gt;&lt;p&gt;PostgreSQL starts automatically after installation. Let&amp;rsquo;s make sure it&amp;rsquo;s actually running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status postgresql
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; postgresql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see &amp;ldquo;active (running)&amp;rdquo;, you&amp;rsquo;re golden. Now access the admin shell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -i -u postgres psql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see the &lt;code&gt;postgres=#&lt;/code&gt; prompt. Check your version with &lt;code&gt;SELECT version();&lt;/code&gt;&lt;br&gt;
Output should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                                                      &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;                                                      
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;-------------------------------------------------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PostgreSQL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Debian&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deb13u1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;linux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gnu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compiled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;by&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gcc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Debian&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;bit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then exit with &lt;code&gt;\q&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D454DQSP&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ms-01.jpg&#34; alt=&#34;MINISFORUM MS-01 Mini Workstation: Its multiple NVMe slots and dual 10G SFP&amp;#43; networking make it a practical, quiet, and efficient choi…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-01 Mini Workstation&lt;/strong&gt;&lt;br&gt;
Its multiple NVMe slots and dual 10G SFP+ networking make it a practical, quiet, and efficient choice for hosting a dedicated PostgreSQL server and handling VM workloads.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4p3HhTI&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458318191324330626506341&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fminisforum-barebone-systems-mini-pc-intel-core-i5-12600h%2fp%2f2SW-002G-000K9%3fitem%3d9SIBJ6VKBD4204&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;configure-postgresql-for-remote-access&#34;&gt;Configure PostgreSQL for Remote Access
&lt;/h2&gt;&lt;p&gt;By default, PostgreSQL only listens on localhost. That&amp;rsquo;s good for security, but useless for Docker containers on other hosts. Let&amp;rsquo;s fix that.&lt;/p&gt;
&lt;h3 id=&#34;enable-network-listening&#34;&gt;Enable Network Listening
&lt;/h3&gt;&lt;p&gt;Edit &lt;code&gt;postgresql.conf&lt;/code&gt; (adjust path for your version):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/postgresql/17/main/postgresql.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Find and set:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;listen_addresses&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This allows PostgreSQL to listen on all interfaces. Don&amp;rsquo;t worry, access control is handled separately, so you&amp;rsquo;re not opening the floodgates here.&lt;/p&gt;
&lt;h3 id=&#34;configure-client-authentication&#34;&gt;Configure Client Authentication
&lt;/h3&gt;&lt;p&gt;Edit &lt;code&gt;pg_hba.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/postgresql/17/main/pg_hba.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add a rule for your Docker subnet(s) and your LAN. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# LAN Subnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;host    all     all     172.27.0.0/24     scram-sha-256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Docker 1 Subnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;host    all     all     172.17.0.0/16     scram-sha-256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Docker 2 Subnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;host    all     all     172.18.0.0/16     scram-sha-256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use &lt;code&gt;scram-sha-256&lt;/code&gt; authentication instead of &lt;code&gt;md5&lt;/code&gt; where possible. It&amp;rsquo;s more secure and the modern default. Your Docker clients will handle it fine.&lt;/p&gt;
&lt;p&gt;Restart PostgreSQL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart postgresql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;firewall-the-database&#34;&gt;Firewall the Database
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Never&lt;/em&gt;&lt;/strong&gt; expose PostgreSQL to the internet. Just don&amp;rsquo;t. Lock it down to your trusted subnets.&lt;/p&gt;
&lt;p&gt;Using UFW:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y ufw
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw allow from 172.17.0.0/16 to any port &lt;span class=&#34;m&#34;&gt;5432&lt;/span&gt; proto tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify it is working:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adjust the subnet to match your Docker hosts or Proxmox bridge. If you&amp;rsquo;re not sure what subnet to use, check your Docker network with &lt;code&gt;docker network inspect bridge&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It should look like this when you are done:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Status: active
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;To                         Action      From
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--                         ------      ----
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5432/tcp                   ALLOW       172.27.0.0/24             
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;22/tcp                     ALLOW       Anywhere                  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5432/tcp                   ALLOW       172.18.0.0/16             
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5432/tcp                   ALLOW       172.17.0.0/16  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Checkpoint&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;From another host or container already running Postgres, test connectivity.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it &amp;lt;container_name&amp;gt; /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run this to test if the firewall is allowing traffic on this subnet&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;psql -h &amp;lt;vm_ip&amp;gt; -U postgres
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If it connects and asks for a password, you&amp;rsquo;re good.&lt;br&gt;
Press &lt;code&gt;ctrl-c&lt;/code&gt; to abort the connection and &lt;code&gt;exit&lt;/code&gt; to leave the container.&lt;/p&gt;
&lt;p&gt;If it fails, check logs with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;journalctl -u postgresql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nine times out of ten, it&amp;rsquo;s either &lt;code&gt;pg_hba.conf&lt;/code&gt; or the firewall. Double-check both.&lt;/p&gt;
&lt;h2 id=&#34;create-users-and-databases-for-docker-apps&#34;&gt;Create Users and Databases for Docker Apps
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s where a lot of people mess up: they dump everything into a single database with a single superuser. Resist that urge.&lt;/p&gt;
&lt;h3 id=&#34;identify-existing-containers&#34;&gt;Identify Existing Containers
&lt;/h3&gt;&lt;p&gt;On your Docker host(s):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep postgres
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make a list of containers, databases, and users. Seriously, write it down or put it in a text file. You&amp;rsquo;ll reference it constantly.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    I recommend that you DO NOT consolidate the Immich Postgres database. They use older versions of Postgres and Postgres extensions. I tried to do this and wasted quite a few hours, and then I realized that if I got it working it would be a pain to update in the future. Just leave it in a docker container unless you REALLY know what you are doing.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Create a dedicated role and database per application. It makes troubleshooting and permissions way simpler later.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -i -u postgres psql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ROLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ExampleUser&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WITH&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LOGIN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PASSWORD&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;StrongPasswordHere&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DATABASE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;example_db&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;OWNER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ExampleUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Repeat this for each former Docker-based Postgres instance. Yeah, it&amp;rsquo;s a bit tedious, but you only do it once.&lt;/p&gt;
&lt;p&gt;Test access:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;psql -h localhost -U ExampleUser -d example_db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see the &lt;code&gt;example_db=&amp;gt;&lt;/code&gt; prompt, you&amp;rsquo;re set. Exit with &lt;code&gt;\q&lt;/code&gt;.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Matching users and database names to applications (like &lt;code&gt;example&lt;/code&gt; and &lt;code&gt;example_db&lt;/code&gt;) makes your life so much easier six months from now when you&amp;rsquo;re trying to remember which database belongs to what.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;migrate-docker-postgresql-databases-to-dedicated-server&#34;&gt;Migrate Docker PostgreSQL Databases to Dedicated Server
&lt;/h2&gt;&lt;p&gt;Alright, this is the heart of the PostgreSQL migration process. Take your time here, rushing this step is how you end up restoring from backups (You have backups right? RIGHT?).&lt;/p&gt;
&lt;h3 id=&#34;handle-extensions-and-ownership-issues-first&#34;&gt;Handle Extensions and Ownership Issues First
&lt;/h3&gt;&lt;p&gt;Before dumping, identify potential problems. This saves you from &amp;ldquo;why won&amp;rsquo;t it restore?&amp;rdquo; headaches later:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check for extensions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it &amp;lt;container&amp;gt; psql -U &amp;lt;user&amp;gt; -d &amp;lt;db&amp;gt; -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;\dx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check for custom roles&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it &amp;lt;container&amp;gt; psql -U &amp;lt;user&amp;gt; -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;\du&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Common issues you&amp;rsquo;ll hit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extensions like &lt;code&gt;pg_trgm&lt;/code&gt; or &lt;code&gt;uuid-ossp&lt;/code&gt; may need manual creation on the target server
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EXTENSION&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;EXISTS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;uuid-ossp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Role ownership conflicts between different container dumps (especially if you&amp;rsquo;re using &lt;code&gt;pg_dumpall&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;dump-the-data&#34;&gt;Dump the Data
&lt;/h3&gt;&lt;p&gt;Decision point here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Small homelab DBs (under a few GB): dumping while containers are running is usually fine&lt;/li&gt;
&lt;li&gt;Larger or critical DBs: stop the app container first to guarantee consistency&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For single database (recommended):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it &amp;lt;container&amp;gt; pg_dump -h 127.0.0.1 -U postgres -d example_db --format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;plain --no-owner --no-privileges &amp;gt; example_dump.sql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;--no-owner --no-privileges&lt;/code&gt; flags avoid role and ownership conflicts during restore. You&amp;rsquo;ll set ownership manually on the new server anyway.&lt;/p&gt;
&lt;p&gt;For all databases and roles (advanced, usually overkill for homelabs):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it &amp;lt;container&amp;gt; -h 127.0.0.1 pg_dumpall -U &amp;lt;user&amp;gt; &amp;gt; full_dump.sql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Watch the output. If you see errors about missing permissions or roles, that&amp;rsquo;s your cue to use &lt;code&gt;--no-owner --no-privileges&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;transfer-dumps-to-the-vm&#34;&gt;Transfer Dumps to the VM
&lt;/h3&gt;&lt;p&gt;Use &lt;code&gt;scp&lt;/code&gt; or VSCode to download and upload to the new server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scp db_dump.sql user@postgres-vm:/tmp/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;ve got multiple dumps, throw them all in &lt;code&gt;/tmp/&lt;/code&gt; on the VM. Just remember to clean them up later.&lt;/p&gt;
&lt;h3 id=&#34;restore-into-the-new-server&#34;&gt;Restore into the New Server
&lt;/h3&gt;&lt;p&gt;On the PostgreSQL VM:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;psql -h localhost -U ExampleUser -d example_db -f /tmp/db_dump.sql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Repeat for each application. Yeah, it&amp;rsquo;s repetitive. Put on some music.&lt;/p&gt;
&lt;p&gt;If you hit extension errors like &amp;ldquo;extension uuid-ossp does not exist&amp;rdquo;, install them manually:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EXTENSION&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;EXISTS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;uuid-ossp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most common extensions you&amp;rsquo;ll need: &lt;code&gt;uuid-ossp&lt;/code&gt;, &lt;code&gt;pg_trgm&lt;/code&gt;, &lt;code&gt;hstore&lt;/code&gt;. Install them as needed.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DX2DPJZ5&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/NVME-2TB.jpg&#34; alt=&#34;The Samsung 9100 PRO 2TB: Great choice for a PostgreSQL database because its very high IOPS and low latency keep reads and writes snappy under load, while the sustained throughput helps with WAL logging, indexes,…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;The Samsung 9100 PRO 2TB&lt;/strong&gt;&lt;br&gt;
Great choice for a PostgreSQL database because its very high IOPS and low latency keep reads and writes snappy under load, while the sustained throughput helps with WAL logging, indexes, and vacuum/maintenance jobs without the whole system feeling sluggish.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3YMvopG&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445834864350770599894670&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2f0D9-0009-00CX3%3fitem%3d9SIC0X3KK93917&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;update-docker-stacks-to-use-the-central-database&#34;&gt;Update Docker Stacks to Use the Central Database
&lt;/h2&gt;&lt;p&gt;This step removes PostgreSQL from your Docker stacks entirely. It&amp;rsquo;s weirdly satisfying.&lt;/p&gt;
&lt;p&gt;In your &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment out the &lt;code&gt;postgres&lt;/code&gt; service (Remove once you know it works)&lt;/li&gt;
&lt;li&gt;Comment out volume definitions tied to Postgres (Remove once you know it works)&lt;/li&gt;
&lt;li&gt;Update environment variables to point at the new server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;POSTGRES_HOST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;&amp;lt;postgres_VM_IP&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;POSTGRES_DB&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;example_db&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;POSTGRES_USER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ExampleUser&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;StrongPasswordHere&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Recreate the stack:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Your application should now connect to the centralized PostgreSQL server. Check the logs to make sure it&amp;rsquo;s connecting:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose logs -f
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see database connection errors, double-check your environment variables. Typos in the hostname or database name trip up 80% of people here.&lt;/p&gt;
&lt;p&gt;Once you do this for one stack, the rest should be faster.&lt;/p&gt;
&lt;h2 id=&#34;postgresql-performance-tuning-for-homelabs&#34;&gt;PostgreSQL Performance Tuning for Homelabs
&lt;/h2&gt;&lt;p&gt;Out of the box PostgreSQL settings are conservative. Here&amp;rsquo;s safe starting points for a homelab:&lt;/p&gt;
&lt;p&gt;Edit &lt;code&gt;postgresql.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-conf&#34; data-lang=&#34;conf&#34;&gt;shared_buffers = 1GB
work_mem = 16MB
max_connections = 100
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Why these settings matter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shared_buffers&lt;/code&gt;: PostgreSQL&amp;rsquo;s main cache. Rule of thumb is 25% of system RAM, but too much can actually hurt performance on smaller systems. For a 4GB VM, 1GB is the sweet spot.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;work_mem&lt;/code&gt;: Per-operation memory for sorts and joins. This multiplies by concurrent connections, so be conservative. 16MB is safe for most homelabs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_connections&lt;/code&gt;: Many apps hold idle connections. 100 is safe for most homelabs, you&amp;rsquo;re probably not hitting 50 concurrent connections anyway.&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Don&amp;rsquo;t blindly scale these up. A 4GB VM with &lt;code&gt;work_mem = 64MB&lt;/code&gt; and 100 connections could theoretically use 6.4GB of RAM during heavy queries. This is how you OUT OF MEMORY (OOM) kill your databases.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Restart PostgreSQL after changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart postgresql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These settings work well for read-heavy media workloads. If you&amp;rsquo;re running something write-heavy, you&amp;rsquo;ll want to tune further, but this is a good baseline.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-postgresql-migration-issues&#34;&gt;Troubleshooting PostgreSQL Migration Issues
&lt;/h2&gt;&lt;h3 id=&#34;connection-refused-from-docker-containers&#34;&gt;Connection Refused from Docker Containers
&lt;/h3&gt;&lt;p&gt;This is the most common issue. Here&amp;rsquo;s the checklist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirm PostgreSQL is listening: &lt;code&gt;ss -lntp | grep 5432&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Verify &lt;code&gt;listen_addresses = &#39;*&#39;&lt;/code&gt; is set and not commented out&lt;/li&gt;
&lt;li&gt;Check firewall rules with &lt;code&gt;sudo ufw status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Double-check &lt;code&gt;pg_hba.conf&lt;/code&gt; subnet and authentication method&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re still stuck, check the logs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;journalctl -u postgresql -n &lt;span class=&#34;m&#34;&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look for &amp;ldquo;connection refused&amp;rdquo; or &amp;ldquo;no pg_hba.conf entry&amp;rdquo; messages. They&amp;rsquo;ll tell you exactly what&amp;rsquo;s wrong.&lt;/p&gt;
&lt;h3 id=&#34;pg_dump-fails-with-role-does-not-exist&#34;&gt;pg_dump Fails with &amp;ldquo;Role Does Not Exist&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;This usually means roles from the old container don&amp;rsquo;t exist yet on the new server.&lt;/p&gt;
&lt;p&gt;Fix by either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creating the roles first with &lt;code&gt;CREATE ROLE&lt;/code&gt;, or&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;--no-owner --no-privileges&lt;/code&gt; during dump and restore (recommended)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using &lt;code&gt;--no-owner --no-privileges&lt;/code&gt; is cleaner. You&amp;rsquo;re not trying to preserve complex permission structures, you just want the data.&lt;/p&gt;
&lt;h3 id=&#34;authentication-errors-after-migration&#34;&gt;Authentication Errors After Migration
&lt;/h3&gt;&lt;p&gt;Frustrating, I know. Check these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure passwords match what&amp;rsquo;s in Docker environment variables (no trailing spaces)&lt;/li&gt;
&lt;li&gt;Confirm &lt;code&gt;scram-sha-256&lt;/code&gt; is supported by your client library (it should be)&lt;/li&gt;
&lt;li&gt;Check for copy-paste errors in passwords, seriously, this happens more than you&amp;rsquo;d think&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re still stuck, temporarily switch to &lt;code&gt;md5&lt;/code&gt; in &lt;code&gt;pg_hba.conf&lt;/code&gt; to isolate the issue. If that works, it&amp;rsquo;s a &lt;code&gt;scram-sha-256&lt;/code&gt; compatibility problem.&lt;/p&gt;
&lt;h3 id=&#34;performance-worse-than-before&#34;&gt;Performance Worse Than Before
&lt;/h3&gt;&lt;p&gt;Wait, what? Yeah, this can happen. Here&amp;rsquo;s why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your containers may have been memory-starved without you realizing it, so they were &amp;ldquo;fast&amp;rdquo; because they weren&amp;rsquo;t doing much&lt;/li&gt;
&lt;li&gt;The new server is actually doing proper caching and query planning&lt;/li&gt;
&lt;li&gt;You need to increase VM RAM or revisit &lt;code&gt;shared_buffers&lt;/code&gt; and &lt;code&gt;work_mem&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; on slow queries to see what&amp;rsquo;s happening. Usually it&amp;rsquo;s just a matter of giving PostgreSQL more memory to work with.&lt;/p&gt;
&lt;h3 id=&#34;extension-errors-during-restore&#34;&gt;Extension Errors During Restore
&lt;/h3&gt;&lt;p&gt;If you see &amp;ldquo;extension does not exist&amp;rdquo; errors, install them manually:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EXTENSION&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;EXISTS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;uuid-ossp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EXTENSION&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;EXISTS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pg_trgm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most homelab apps use a handful of common extensions. Install them once and you&amp;rsquo;re done.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I connect to PostgreSQL from Docker containers on a different host?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Expose PostgreSQL on the VM&amp;rsquo;s IP, allow the Docker subnet in &lt;code&gt;pg_hba.conf&lt;/code&gt;, and ensure your firewall permits port 5432 only from trusted subnets. Never open it to the internet, really, don&amp;rsquo;t do it.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s the safest way to migrate a large Docker PostgreSQL database without downtime?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;For homelabs, brief downtime is safest. Stop the app, run &lt;code&gt;pg_dump&lt;/code&gt;, restore, then restart the app pointing at the new server. Trying to do zero-downtime migrations in a homelab is usually more trouble than it&amp;rsquo;s worth.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Why can&amp;#39;t I access PostgreSQL after install?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;By default, PostgreSQL listens only on localhost. You must update &lt;code&gt;listen_addresses&lt;/code&gt; and &lt;code&gt;pg_hba.conf&lt;/code&gt;, then restart the service. This trips up everyone the first time.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I use Debian repos or the official PostgreSQL repo?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Debian repos prioritize stability. Official repos give newer versions. For most homelabs, Debian&amp;rsquo;s version is the safer default. Unless you need a specific PostgreSQL 18 feature, stick with Debian&amp;rsquo;s package.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How much RAM and CPU should I allocate to a PostgreSQL VM?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;For 5 to 10 small apps, 2 to 4 CPU cores and 4 to 8 GB RAM is sufficient. PostgreSQL benefits more from RAM than CPU. If you&amp;rsquo;re running out of resources, add RAM first.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I migrate Docker PostgreSQL databases while containers are running?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes, for small databases (under a few GB). For consistency, stopping the app container is safer. The downtime is usually under 10 minutes, your users might not even notice.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s the QEMU guest agent used for?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;It improves Proxmox integration, clean shutdowns, and backup behavior. It&amp;rsquo;s not mandatory but recommended. Install it now, and thank yourself later when you&amp;rsquo;re doing VM backups.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Consolidating multiple Docker-based PostgreSQL instances into a single dedicated server is one of those changes that feels intimidating but pays off immediately. You reduce clutter, simplify backups, and gain real control over your data layer.&lt;/p&gt;
&lt;p&gt;The key takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a dedicated Debian 13 VM for PostgreSQL, treat it as one of your most important VMs&lt;/li&gt;
&lt;li&gt;Keep one user and database per application (makes troubleshooting way easier)&lt;/li&gt;
&lt;li&gt;Migrate with &lt;code&gt;pg_dump --no-owner --no-privileges&lt;/code&gt;, not filesystem copies&lt;/li&gt;
&lt;li&gt;Lock down network access to trusted subnets only&lt;/li&gt;
&lt;li&gt;Handle extensions and roles proactively during migration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re tired of babysitting half a dozen Postgres containers like I was, this approach will make your homelab cleaner and more predictable.&lt;/p&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/postgresql.png&#34; alt=&#34;PostgreSQL Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;PostgreSQL Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://www.postgresql.org/docs/current/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/debian.jpg&#34; alt=&#34;Debian PostgreSQL Wiki&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Debian PostgreSQL Wiki&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://wiki.debian.org/PostgreSQL&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/Proxmox.png&#34; alt=&#34;Proxmox VE Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Proxmox VE Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://pve.proxmox.com/wiki/Main_Page&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B08146GB6Y&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/define-7-xl-45deg.webp&#34; alt=&#34;Fractal Design Define 7 XL: This full-tower case is useful if you want a quiet, storage-heavy homelab server for PostgreSQL, but may b…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Fractal Design Define 7 XL&lt;/strong&gt;&lt;br&gt;
This full-tower case is useful if you want a quiet, storage-heavy homelab server for Proxmox, but may be overkill for smaller or more compact builds.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3GG6cLC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458314954463885947040221&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-7-xl-atx-full-tower%2fp%2fN82E16811352120&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Should You Consolidate PostgreSQL Databases In One VM</title>
        <link>https://diymediaserver.com/post/2026/consolidate-postgresql-databases-one-vm/</link>
        <pubDate>Fri, 16 Jan 2026 07:39:34 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/consolidate-postgresql-databases-one-vm/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/consolidate-postgresql-databases-one-vm/featured.jpg" alt="Featured image of post Should You Consolidate PostgreSQL Databases In One VM" /&gt;&lt;h2 id=&#34;why-consolidate-multiple-postgresql-databases-into-one-vm&#34;&gt;Why Consolidate Multiple PostgreSQL Databases Into One VM
&lt;/h2&gt;&lt;p&gt;If your homelab&amp;rsquo;s quietly accumulated half a dozen or more Postgres containers, one per Docker stack, you&amp;rsquo;re not alone. This is how it always starts: an app needs a database, the compose file spins one up, and you move on. Fast-forward a year or two, and you&amp;rsquo;re patching several Postgres containers, backing up all the separate volumes, and troubleshooting six or more slightly different configurations.&lt;/p&gt;
&lt;p&gt;Consolidating PostgreSQL databases into a single VM eliminates operational overhead. You get centralized backups, upgrades, and better resource utilization, critical time-savers for homelabs running 3+ databases across Home Assistant, Wiki.js, Immich, and monitoring stacks. One instance means one backup strategy, one patch cycle, and one tuning target instead of managing scattered containers.&lt;/p&gt;
&lt;p&gt;I hit that wall myself. Managing six separate PostgreSQL containers felt like busywork instead of actual homelabbing. Consolidating them into a single Postgres VM changed that overnight. Fewer moving parts, simpler backups, and one place to tune database performance.&lt;/p&gt;
&lt;p&gt;This post explains why consolidating your PostgreSQL databases onto one VM is often the better choice for intermediate homelabbers, how it simplifies management and backups, and when you absolutely shouldn&amp;rsquo;t do it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who should consolidate:&lt;/strong&gt; Homelabbers running 3+ Postgres containers with low to moderate traffic workloads like Home Assistant, Wiki.js, and monitoring stacks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who should not:&lt;/strong&gt; Those with high-write databases, strict isolation requirements, or apps that need different PostgreSQL versions.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    Running all your Postgres databases on one dedicated Postgres VM reduces sprawl, simplifies backups, and cuts management overhead, as long as your workloads are modest, and you plan for resource contention.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-consolidating-postgresql-databases-matters&#34;&gt;Why Consolidating PostgreSQL Databases Matters
&lt;/h2&gt;&lt;p&gt;The hidden cost of &amp;ldquo;one database per stack&amp;rdquo; isn&amp;rsquo;t CPU or RAM. It&amp;rsquo;s operational overhead.&lt;/p&gt;
&lt;p&gt;Every Postgres container means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Its own data volume&lt;/li&gt;
&lt;li&gt;Its own backup job (or worse, no backup at all)&lt;/li&gt;
&lt;li&gt;Its own upgrade and patch cycle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From an infrastructure perspective, this is wasteful. PostgreSQL&amp;rsquo;s shared buffer cache, background workers, and WAL processes all duplicate across instances. A single instance hosting multiple databases eliminates this duplication. In my own setup, memory usage dropped from 3.2GB across six containers to 1.8GB with one consolidated instance.&lt;/p&gt;
&lt;p&gt;For a homelab where workloads are rarely extreme, consolidation&amp;rsquo;s usually a net win.&lt;/p&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/post/2026/consolidate-postgresql-server-docker-migration/featured.jpg&#34; alt=&#34;My post on how-to consolidate your PostgreSQL Docker Containers in to on consolidated VM.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;My post on how-to consolidate your PostgreSQL Docker Containers in to on consolidated VM.&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://diymediaserver.com/post/2026/consolidate-postgresql-server-docker-migration/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;my-story-death-by-a-thousand-containers&#34;&gt;My Story: Death by a Thousand Containers
&lt;/h2&gt;&lt;p&gt;At one point, I was running six separate PostgreSQL containers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home Assistant&lt;/li&gt;
&lt;li&gt;Wiki.js&lt;/li&gt;
&lt;li&gt;Immich&lt;/li&gt;
&lt;li&gt;A monitoring stack&lt;/li&gt;
&lt;li&gt;Two side projects I barely touched&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each had its own compose file and volume. When it came time to back them up, I had six cron jobs dumping databases in slightly different ways. When PostgreSQL 13 went end-of-life, I had to plan multiple upgrades.&lt;/p&gt;
&lt;p&gt;After consolidating everything into one Postgres VM, backups became a single script, upgrades happened once, and adding a new database was a 30-second task instead its own mini-project.&lt;/p&gt;
&lt;h2 id=&#34;one-postgres-vm-vs-one-postgres-container-per-stack&#34;&gt;One Postgres VM vs One Postgres Container Per Stack
&lt;/h2&gt;&lt;h3 id=&#34;the-container-per-app-model&#34;&gt;The Container-Per-App Model
&lt;/h3&gt;&lt;p&gt;This model&amp;rsquo;s popular because it&amp;rsquo;s easy to start with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Drop a &lt;code&gt;postgres:&lt;/code&gt; image into your compose file&lt;/li&gt;
&lt;li&gt;Link it to your app&lt;/li&gt;
&lt;li&gt;Forget about it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strong isolation boundaries&lt;/li&gt;
&lt;li&gt;Easy to reason about for beginners&lt;/li&gt;
&lt;li&gt;App and database lifecycles are tightly coupled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fragmented backups&lt;/li&gt;
&lt;li&gt;Repeated configuration and tuning&lt;/li&gt;
&lt;li&gt;Higher memory and disk overhead&lt;/li&gt;
&lt;li&gt;More patching and monitoring work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach scales poorly as your homelab grows.&lt;/p&gt;
&lt;h3 id=&#34;the-dedicated-postgres-vm-model&#34;&gt;The Dedicated Postgres VM Model
&lt;/h3&gt;&lt;p&gt;In this model, you run one PostgreSQL instance on a dedicated Postgres VM. Each app gets its own database and role inside that instance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Centralized management and upgrades&lt;/li&gt;
&lt;li&gt;One backup strategy for all databases&lt;/li&gt;
&lt;li&gt;Better overall resource utilization&lt;/li&gt;
&lt;li&gt;Easier monitoring and performance tuning&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Less isolation than separate containers&lt;/li&gt;
&lt;li&gt;Risk of resource contention if poorly sized&lt;/li&gt;
&lt;li&gt;Requires more up-front planning&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most intermediate homelabs, the pros outweigh the cons. You&amp;rsquo;re trading a bit of isolation for dramatically simpler operations.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F8JG2SHN&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: Why it fits this post: Its high core count, fast networking (dual 10GbE), and flexible storage make it ideal for running a consolidated Pos…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
&lt;strong&gt;Must have for this build.&lt;/strong&gt;
Why it fits this post: Its high core count, fast networking (dual 10GbE), and flexible storage make it ideal for running a consolidated PostgreSQL VM with room for future database growth and multiple homelab workloads.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-a-vm-instead-of-lxc-or-more-containers&#34;&gt;Why a VM Instead of LXC or More Containers
&lt;/h2&gt;&lt;h3 id=&#34;postgres-vm-vs-lxc-container&#34;&gt;Postgres VM vs LXC Container
&lt;/h3&gt;&lt;p&gt;Running PostgreSQL in LXC containers is tempting. They&amp;rsquo;re lightweight and fast. But for databases, the trade-offs matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VM advantages for PostgreSQL:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better I/O isolation under load&lt;/li&gt;
&lt;li&gt;Cleaner snapshot and backup integration with hypervisors like Proxmox&lt;/li&gt;
&lt;li&gt;Fewer surprises from shared kernel behavior&lt;/li&gt;
&lt;li&gt;Predictable fsync behavior with dedicated virtual disks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;LXC advantages:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lower RAM overhead (200-500MB saved)&lt;/li&gt;
&lt;li&gt;Faster startup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Proxmox-specific considerations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use VirtIO SCSI with &amp;ldquo;Write back&amp;rdquo; cache for VM disk performance&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re on ZFS, disable sync writes for the VM dataset to avoid double-fsync&lt;/li&gt;
&lt;li&gt;For LXC, unprivileged containers require proper UID/GID mapping for Postgres&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the thing: PostgreSQL&amp;rsquo;s sensitive to disk latency and I/O jitter. A VM gives you more predictable behavior, especially when multiple databases share the same instance. For a dedicated Postgres VM, this predictability&amp;rsquo;s usually worth the small overhead.&lt;/p&gt;
&lt;h2 id=&#34;how-consolidating-postgresql-databases-simplifies-backups&#34;&gt;How Consolidating PostgreSQL Databases Simplifies Backups
&lt;/h2&gt;&lt;p&gt;This is where consolidation really shines.&lt;/p&gt;
&lt;p&gt;With multiple containers, backups often look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Different schedules&lt;/li&gt;
&lt;li&gt;Different dump formats&lt;/li&gt;
&lt;li&gt;Different retention policies&lt;/li&gt;
&lt;li&gt;That one database you forgot about entirely&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With one Postgres VM, you can choose a single approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logical backups using &lt;code&gt;pg_dump&lt;/code&gt; for each database&lt;/li&gt;
&lt;li&gt;Physical backups using &lt;code&gt;pg_basebackup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Or a full-featured tool like Barman&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because PostgreSQL&amp;rsquo;s designed to host multiple databases in one instance, unified backups aren&amp;rsquo;t a hack, they are how it should be done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practical example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DATABASES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;homeassistant&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;wikijs&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;immich&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;grafana&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; db in &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DATABASES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[@]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  pg_dump -h localhost -U backup_user -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$db&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; gzip &amp;gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/backups/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.sql.gz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restores are simpler too. You restore one database, not an entire container volume. When you&amp;rsquo;re staring at a corrupted Wiki.js database, you&amp;rsquo;ll appreciate the difference.&lt;/p&gt;
&lt;h2 id=&#34;resource-utilization-and-performance&#34;&gt;Resource Utilization and Performance
&lt;/h2&gt;&lt;h3 id=&#34;why-one-instance-is-usually-faster&#34;&gt;Why One Instance Is Usually Faster
&lt;/h3&gt;&lt;p&gt;Every PostgreSQL instance has overhead:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Background workers (autovacuum, stats collector)&lt;/li&gt;
&lt;li&gt;Shared buffers (typically 128MB default per instance)&lt;/li&gt;
&lt;li&gt;WAL processes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you run six instances, you pay that cost six times. A single instance with six databases shares those resources way more efficiently.&lt;/p&gt;
&lt;h3 id=&#34;the-noisy-neighbor-problem&#34;&gt;The Noisy Neighbor Problem
&lt;/h3&gt;&lt;p&gt;The main risk is one database hogging resources. We&amp;rsquo;ve all been there, Immich decides to index 10,000 photos while Home Assistant&amp;rsquo;s trying to log sensor data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Separate roles per app&lt;/li&gt;
&lt;li&gt;Per-database configuration settings&lt;/li&gt;
&lt;li&gt;Connection pooling with PgBouncer&lt;/li&gt;
&lt;li&gt;Monitoring query behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If one workload regularly exceeds 50% of available CPU or I/O, it might deserve its own instance. Consolidation&amp;rsquo;s not all-or-nothing.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DWS75TPQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/minidesktop.png&#34; alt=&#34;GMKtec Mini PC Workstation: Why it fits this post: The powerful i9 CPU and ample multitasking capability provide a strong foundation for hosting a dedicated …&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;GMKtec Mini PC Workstation&lt;/strong&gt;
&lt;strong&gt;Must have for this build.&lt;/strong&gt;
Why it fits this post: The powerful i9 CPU and ample multitasking capability provide a strong foundation for hosting a dedicated PostgreSQL VM and supporting additional homelab services on a single machine.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4rhPLYE&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;should-you-consolidate-your-postgresql-databases&#34;&gt;Should You Consolidate Your PostgreSQL Databases?
&lt;/h2&gt;&lt;p&gt;Use this quick test:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your databases are mostly low to medium traffic, consolidate.&lt;/li&gt;
&lt;li&gt;If one database has heavy writes or constant load, consider isolating it.&lt;/li&gt;
&lt;li&gt;If you value simplicity over maximum isolation, consolidate.&lt;/li&gt;
&lt;li&gt;If uptime requirements differ wildly between apps, consider partial consolidation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many homelabs end up with a hybrid approach: one Postgres VM for most apps, and a separate instance for the outlier that&amp;rsquo;s constantly hammering the disk.&lt;/p&gt;
&lt;h2 id=&#34;what-homelab-software-benefits-most&#34;&gt;What Homelab Software Benefits Most
&lt;/h2&gt;&lt;p&gt;A dedicated Postgres VM works especially well for apps that already support external databases.&lt;/p&gt;
&lt;p&gt;Common examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home Assistant&lt;/li&gt;
&lt;li&gt;Wiki.js&lt;/li&gt;
&lt;li&gt;Immich&lt;/li&gt;
&lt;li&gt;Monitoring stacks like Grafana&lt;/li&gt;
&lt;li&gt;Internal tools and dashboards&lt;/li&gt;
&lt;li&gt;n8n&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These apps benefit from stable connections, predictable performance, and easy backups.&lt;/p&gt;
&lt;p&gt;Media servers that use PostgreSQL for metadata also fit well, as long as write rates are reasonable.&lt;/p&gt;
&lt;h2 id=&#34;high-level-migration-strategy&#34;&gt;High-Level Migration Strategy
&lt;/h2&gt;&lt;p&gt;At a high level, migration looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Inventory your existing databases&lt;/li&gt;
&lt;li&gt;Build a dedicated Postgres VM&lt;/li&gt;
&lt;li&gt;Dump each database&lt;/li&gt;
&lt;li&gt;Restore into the new instance&lt;/li&gt;
&lt;li&gt;Update app connection strings&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is usually downtime-friendly for homelabs, but you can also stage it database by database if you&amp;rsquo;re paranoid about breaking everything at once. (I don&amp;rsquo;t blame you.)&lt;/p&gt;
&lt;h2 id=&#34;basic-setup-for-a-postgres-vm&#34;&gt;Basic Setup for a Postgres VM
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;For larger homelabs (5-10 databases):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 to 8 CPU cores&lt;/li&gt;
&lt;li&gt;16 to 32 GB RAM&lt;/li&gt;
&lt;li&gt;SSD or NVMe storage&lt;/li&gt;
&lt;li&gt;PostgreSQL 16 or newer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For smaller homelabs (3-5 databases):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 to 4 CPU cores&lt;/li&gt;
&lt;li&gt;8 to 16 GB RAM&lt;/li&gt;
&lt;li&gt;SSD storage&lt;/li&gt;
&lt;li&gt;PostgreSQL 16 or newer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Key configuration ideas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shared_buffers&lt;/code&gt; around 25% of RAM&lt;/li&gt;
&lt;li&gt;&lt;code&gt;effective_cache_size&lt;/code&gt; around 75% of RAM&lt;/li&gt;
&lt;li&gt;Conservative &lt;code&gt;max_connections&lt;/code&gt; with PgBouncer in front&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These defaults give you room to grow without constant tuning. You can always optimize later when you actually have data showing where the bottlenecks are.&lt;/p&gt;
&lt;h2 id=&#34;security-considerations&#34;&gt;Security Considerations
&lt;/h2&gt;&lt;p&gt;Consolidation reduces the number of exposed services, which is good. But isolation now happens at the database level instead of the container level.&lt;/p&gt;
&lt;p&gt;Best practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One role per app&lt;/li&gt;
&lt;li&gt;Strong passwords or certificates&lt;/li&gt;
&lt;li&gt;Restrictive &lt;code&gt;pg_hba.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;No shared superuser credentials&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&amp;rsquo;t less secure than containers if done correctly, but it does require discipline. Don&amp;rsquo;t get lazy and give everything the postgres superuser account because &amp;ldquo;it&amp;rsquo;s just a homelab.&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D454DQSP&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ms-01.jpg&#34; alt=&#34;MINISFORUM MS-01 Mini Workstation: Why it fits this post: Its compact size, multiple NVMe slots, and real homelab networking (dual 10G SFP&amp;#43; plus 2.5GbE) make…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-01 Mini Workstation&lt;/strong&gt;
&lt;strong&gt;Nice to have, not required.&lt;/strong&gt;
Why it fits this post: Its compact size, multiple NVMe slots, and real homelab networking (dual 10G SFP+ plus 2.5GbE) make it a practical, quiet option for a PostgreSQL VM, though with slightly less raw power than the top picks.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4p3HhTI&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458318191324330626506341&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fminisforum-barebone-systems-mini-pc-intel-core-i5-12600h%2fp%2f2SW-002G-000K9%3fitem%3d9SIBJ6VKBD4204&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;troubleshooting-common-postgresql-consolidation-problems&#34;&gt;Troubleshooting Common PostgreSQL Consolidation Problems
&lt;/h2&gt;&lt;h3 id=&#34;one-database-is-slowing-everything-down&#34;&gt;One Database Is Slowing Everything Down
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High CPU or I/O usage&lt;/li&gt;
&lt;li&gt;Other apps feel sluggish&lt;/li&gt;
&lt;li&gt;Your spouse complains that Home Assistant&amp;rsquo;s not responding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fixes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identify heavy queries with &lt;code&gt;pg_stat_statements&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Limit connections per app&lt;/li&gt;
&lt;li&gt;Move the noisy database to its own instance if needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;apps-cannot-connect-after-migration&#34;&gt;Apps Cannot Connect After Migration
&lt;/h3&gt;&lt;p&gt;I know what you&amp;rsquo;re thinking: &amp;ldquo;I updated the connection string, why isn&amp;rsquo;t it working?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Checklist:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verify &lt;code&gt;pg_hba.conf&lt;/code&gt; allows the Docker subnet&lt;/li&gt;
&lt;li&gt;Check firewall rules&lt;/li&gt;
&lt;li&gt;Test with &lt;code&gt;pg_isready&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one&amp;rsquo;s saved me more times than I can count. If &lt;code&gt;pg_isready&lt;/code&gt; fails, your app&amp;rsquo;s not going to connect either.&lt;/p&gt;
&lt;h3 id=&#34;backups-take-too-long&#34;&gt;Backups Take Too Long
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switch from logical to physical backups&lt;/li&gt;
&lt;li&gt;Run dumps in parallel&lt;/li&gt;
&lt;li&gt;Exclude rarely changed databases from daily dumps&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;version-conflicts&#34;&gt;Version Conflicts
&lt;/h3&gt;&lt;p&gt;You can&amp;rsquo;t mix PostgreSQL major versions in one instance. Period.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upgrade all databases together&lt;/li&gt;
&lt;li&gt;Or run a second instance temporarily during migration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yeah, this part&amp;rsquo;s finicky. Plan your upgrades carefully.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I prevent one database from starving others?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Use connection limits, PgBouncer, and per-database settings. Monitor resource usage and be ready to split workloads if necessary.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s the minimum VM size for 5 to 10 databases?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;For typical homelab apps, 4 cores and 16GB RAM is a solid baseline. For smaller setups, 2 cores and 8GB works fine. Scale up if you see sustained load.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I mix PostgreSQL versions in one instance?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No. One instance equals one major version. Plan upgrades accordingly.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How does backup time change with consolidation?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Backups are usually faster and simpler because you avoid container overhead and duplicated jobs. One script instead of six.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is a VM really better than LXC?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;For PostgreSQL, yes in most cases. VMs provide better I/O isolation and simpler snapshot workflows.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What apps work best with a shared Postgres VM?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Apps with moderate workloads and good external database support, like Home Assistant, Wiki.js, and monitoring tools.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I handle high-write workloads?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Tune WAL settings, use fast storage, and consider isolating that workload if it dominates the system.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Does consolidation reduce Docker overhead?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. You eliminate multiple Postgres images, volumes, and background processes.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How can I migrate with minimal downtime?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Dump and restore during low-usage windows, or stage databases one at a time. For a homelab, a few minutes of downtime&amp;rsquo;s usually fine.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What tools help monitor contention?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Prometheus with a Postgres exporter, pg_stat_statements, and log analyzers are all effective.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Are there security risks?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;The risk shifts from container boundaries to role and permission management. Follow least-privilege principles and you&amp;rsquo;ll be fine.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/postgresql.png&#34; alt=&#34;PostgreSQL Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;PostgreSQL Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://www.postgresql.org/docs/current/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Consolidating all or some of your PostgreSQL databases into one dedicated Postgres VM is one of those changes that feels scary at first and obvious in hindsight. You trade a bit of isolation for dramatically simpler management, cleaner backups, and better resource utilization.&lt;/p&gt;
&lt;p&gt;For my homelab, moving away from six separate containers was a relief. One upgrade, one backup strategy, one place to look when something goes wrong.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re juggling multiple Postgres containers today, consider consolidation. Start small, monitor closely, and split workloads only when the data tells you to. Your future self, restoring a database in the middle of the night, will thank you.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BKQ7KRZ1&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/NUC12.jpg&#34; alt=&#34;Intel NUC 12 Pro (NUC12WSHi5): Why it fits this post: This mini PC offers a balance of performance, quiet operation, and expandability for a PostgreSQL VM, b…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Intel NUC 12 Pro (NUC12WSHi5)&lt;/strong&gt;
&lt;strong&gt;Nice to have, not required.&lt;/strong&gt;
Why it fits this post: This mini PC offers a balance of performance, quiet operation, and expandability for a PostgreSQL VM, but may be more limited for heavy multi-database or high-I/O scenarios compared to workstation-class options.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3JyPlM4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445831098683742853224568&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fnuc-12-pro-barebone-12th-gen-intel-core-i5-1240p-rnuc12wshi50000%2fp%2f1VK-004K-068E6%3fitem%3d9SIBPASKBH4509&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Why I Ditched Kodi for Jellyfin for My Media Playback</title>
        <link>https://diymediaserver.com/post/2026/jellyfin-vs-kodi-comparison/</link>
        <pubDate>Sat, 10 Jan 2026 07:12:29 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/jellyfin-vs-kodi-comparison/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/jellyfin-vs-kodi-comparison/featured.jpg" alt="Featured image of post Why I Ditched Kodi for Jellyfin for My Media Playback" /&gt;&lt;p&gt;Jellyfin vs Kodi: which media server is better for you? If you&amp;rsquo;ve ever said &amp;ldquo;Kodi is awesome, but&amp;hellip;&amp;rdquo; and then sighed, this post is for you.&lt;/p&gt;
&lt;p&gt;Kodi was my media center for years. I loved the skins, the endless tweaks, and the feeling that I could make it do anything. But once it had to work for my wife, friends, and multiple TVs, Kodi stopped being a fun hobby and turned into an ongoing tech support job.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s when I finally ditched Kodi as my primary media player and moved to Jellyfin. Not Kodi with network shares. Not Kodi with a bunch of sync hacks. Not even Kodi with the Jellyfin plugin, which is good but still not the clean fix I wanted.&lt;/p&gt;
&lt;p&gt;I switched to Jellyfin server and Jellyfin clients. It solved the three things that made Kodi painful: syncing watched status across devices, transcoding files that wouldn&amp;rsquo;t play, and sharing media remotely without being a tech support desk.&lt;/p&gt;
&lt;p&gt;This article explains why, from the perspective of someone who&amp;rsquo;s run both for years.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    Kodi is a powerful front-end player, but Jellyfin is a true media server with simple clients. Jellyfin wins for transcoding, remote access, sharing with friends, and keeping watched status synced everywhere. For most households, that makes it the better choice.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;kodi-vs-jellyfin-the-mental-model-that-changes-everything&#34;&gt;Kodi vs Jellyfin: The Mental Model That Changes Everything
&lt;/h2&gt;&lt;p&gt;Before we get into features, you need to understand one core difference. This alone explains why Jellyfin feels easier once you switch.&lt;/p&gt;
&lt;h3 id=&#34;kodi-a-player-first&#34;&gt;Kodi: A Player First
&lt;/h3&gt;&lt;p&gt;Kodi is designed to run on the device connected to your TV. Each Kodi box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scans media itself&lt;/li&gt;
&lt;li&gt;Maintains its own library database&lt;/li&gt;
&lt;li&gt;Tracks watched status locally&lt;/li&gt;
&lt;li&gt;Depends on the device&amp;rsquo;s hardware to play files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You point Kodi at local files or network shares, and it works great for that use case. But every device is effectively on its own unless you add extra layers like shared databases or third-party services (Like Trackt).&lt;/p&gt;
&lt;p&gt;And look, setting up MySQL database sharing across Kodi instances? That&amp;rsquo;s a weekend project that&amp;rsquo;ll break in a few months. I could never keep the database working for more than a few months at a time.&lt;/p&gt;
&lt;h3 id=&#34;jellyfin-a-server-with-clients&#34;&gt;Jellyfin: A Server With Clients
&lt;/h3&gt;&lt;p&gt;Jellyfin flips the model.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One Jellyfin server indexes your entire library&lt;/li&gt;
&lt;li&gt;All metadata, artwork, and watched status live in one place&lt;/li&gt;
&lt;li&gt;Every device connects as a client&lt;/li&gt;
&lt;li&gt;The server decides whether to direct-play or transcode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most people, one central server is simpler than maintaining multiple Kodi installations. You&amp;rsquo;re managing one thing instead of five.&lt;/p&gt;
&lt;h2 id=&#34;getting-started-what-jellyfin-setup-actually-looks-like&#34;&gt;Getting Started: What Jellyfin Setup Actually Looks Like
&lt;/h2&gt;&lt;p&gt;You don&amp;rsquo;t need an enterprise server to run Jellyfin. Honestly, you probably have something lying around that&amp;rsquo;ll work.&lt;/p&gt;
&lt;h3 id=&#34;where-jellyfin-can-run&#34;&gt;Where Jellyfin Can Run
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;NAS systems like Unraid or TrueNAS&lt;/li&gt;
&lt;li&gt;Mini PCs and Intel NUCs&lt;/li&gt;
&lt;li&gt;Old desktops&lt;/li&gt;
&lt;li&gt;Even Raspberry Pi for light use (though transcoding will not work well)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;beginner-setup-reality-check&#34;&gt;Beginner Setup Reality Check
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Install Jellyfin server&lt;/strong&gt; - Can be installed on just about any computer it doesn&amp;rsquo;t need much
&lt;ul&gt;
&lt;li&gt;Intel 8th Gen or newer for transcoding&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Point it at your media folders&lt;/strong&gt; - Movies, TV Shows, Music
&lt;ul&gt;
&lt;li&gt;Can be network storage like Unraid, OpenMediaValt, or just a simple NAS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let it scan and download metadata&lt;/strong&gt; - This takes a while the first time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install the Jellyfin app&lt;/strong&gt; on your streaming device
&lt;ul&gt;
&lt;li&gt;Like: the NVIDIA Shield, Smart TV, or even some gaming consoles&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log in and start watching&lt;/strong&gt; - It really is just that easy&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The whole process takes maybe an hour if you already have media organized. Compare that to setting up Kodi on every device you want to watch on, then explaining to your spouse why the living room TV shows doesn&amp;rsquo;t show the same watch progress on the bedroom one.&lt;/p&gt;
&lt;h3 id=&#34;hardware-expectations&#34;&gt;Hardware Expectations
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s the thing: hardware matters, but not as much as you&amp;rsquo;d think.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mostly direct play, one or two users&lt;/strong&gt;: any old desktop works fine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple remote users, lots of transcoding&lt;/strong&gt;: Intel Quick Sync (Intel 8th Gen or newer) or a GPU helps massively&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weak CPU with no hardware acceleration&lt;/strong&gt;: expect stuttering when transcoding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re just watching locally and your files are already in formats your devices support, you can run Jellyfin on a potato. It&amp;rsquo;s when you start transcoding 4K movies for your friend&amp;rsquo;s phone that you need real hardware.&lt;/p&gt;
&lt;h2 id=&#34;why-jellyfin-beat-kodi-in-my-house&#34;&gt;Why Jellyfin Beat Kodi in My House
&lt;/h2&gt;&lt;p&gt;Kodi was fine when it was just me. I could tinker, fix things, restart services. But once my wife started using it daily, the friction became obvious:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Different Kodi boxes had different watched statuses&lt;/li&gt;
&lt;li&gt;One update broke a skin and suddenly nothing looked familiar&lt;/li&gt;
&lt;li&gt;Some files played on one TV but not another&lt;/li&gt;
&lt;li&gt;Explaining &amp;ldquo;just back out and refresh the library&amp;rdquo; got old fast&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tried Kodi with the Jellyfin plugin, and while it helped with library sync, it still left me maintaining two layers: Jellyfin plus Kodi on every device. Every Kodi update was a potential disaster. Every new device meant configuring Kodi again.&lt;/p&gt;
&lt;p&gt;Switching to native Jellyfin clients finally solved the problem. One app, consistent interface, no per-device configuration hell.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07YP9FBMM&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/nvidia-shield-tv-pro.jpg&#34; alt=&#34;NVIDIA SHIELD Pro: A premium Android TV client, it offers excellent Jellyfin playback, smooth 4K HDR support, and broad codec compatibility, making it a top choice for users wanting a seamless living room experience with Jellyfin.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;NVIDIA SHIELD Pro&lt;/strong&gt;&lt;br&gt;
A premium Android TV client, it offers excellent Jellyfin playback, smooth 4K HDR support, and broad codec compatibility, making it a top choice for users wanting a seamless living room experience with Jellyfin.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4gZhtU2&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458311262821776245415890&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-nvidia-shield-tv-pro-digital-media-streamer%2fp%2fN82E16815351017&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;jellyfin-transcoding-making-files-play-everywhere&#34;&gt;Jellyfin Transcoding: Making Files Play Everywhere
&lt;/h2&gt;&lt;p&gt;Alright, so here&amp;rsquo;s where Jellyfin really shines compared to Kodi.&lt;/p&gt;
&lt;p&gt;Kodi plays files locally. If the device can&amp;rsquo;t decode the file, playback fails or stutters. Kodi has no server-side transcoding, it&amp;rsquo;s all on the client device.&lt;/p&gt;
&lt;p&gt;Jellyfin includes a full transcoding engine based on FFmpeg. This means the server can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Convert unsupported codecs on the fly&lt;/li&gt;
&lt;li&gt;Downscale 4K video to 1080p for older TVs&lt;/li&gt;
&lt;li&gt;Adjust bitrate for slow connections&lt;/li&gt;
&lt;li&gt;Convert audio formats like TrueHD or DTS-HD to stereo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In simple terms&lt;/strong&gt;: Your phone can now play that 4K HDR movie because Jellyfin converts it to something your phone understands, in real time.&lt;/p&gt;
&lt;p&gt;Your friend with the ancient Fire Stick? They can watch your 4K Blu-ray rips because Jellyfin handles the conversion. With Kodi, they&amp;rsquo;d just get a black screen or stuttering mess.&lt;/p&gt;
&lt;h3 id=&#34;hardware-acceleration-warning&#34;&gt;Hardware Acceleration Warning
&lt;/h3&gt;&lt;p&gt;Jellyfin supports hardware-accelerated transcoding on Intel Quick Sync, NVIDIA NVENC, and AMD VA-API. When it works, your server can handle multiple streams without maxing out the CPU.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When it doesn&amp;rsquo;t work&lt;/strong&gt;: You get stuttering, buffering, or the server crashes under load.&lt;/p&gt;
&lt;p&gt;I know what you&amp;rsquo;re thinking: &amp;ldquo;how hard can it be?&amp;rdquo; Well, driver issues on Linux are real. Wrong permissions for hardware devices will bite you. Codec support varies by GPU generation. Test hardware transcoding with one stream before depending on it, because finding out it doesn&amp;rsquo;t work when three people are trying to watch at once is not fun.&lt;/p&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/post/jellyfin_intel_quicksync_unprivileged_lxc/featured.jpg&#34; alt=&#34;Jellyfin &amp;#43; Intel QuickSync in Unprivileged LXC - The Complete Guide&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Jellyfin + Intel QuickSync - The Complete Guide&lt;/strong&gt;&lt;br&gt;
How to install and configure Jellyfin in an unprivileged LXC container with QuickSync.&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://diymediaserver.com/post/jellyfin_intel_quicksync_unprivileged_lxc/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      View Article
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;centralized-library-and-watched-status-sync&#34;&gt;Centralized Library and Watched Status Sync
&lt;/h2&gt;&lt;p&gt;Jellyfin tracks watched episodes, movies, and resume positions down to the second. Start a show on your living room TV, pause halfway through, and resume on your phone in bed. It just works.&lt;/p&gt;
&lt;p&gt;Kodi can sync watched status, but only if you set up a shared MySQL database, use third-party services like Trakt, or run Kodi as a front-end to Jellyfin. Jellyfin does it by default. No configuration, no third-party accounts, no database setup.&lt;/p&gt;
&lt;p&gt;This centralized approach extends to all metadata, artwork, and library organization. Change something once on the server, and every client sees the update immediately.&lt;/p&gt;
&lt;h2 id=&#34;remote-access-sharing-media-without-pain&#34;&gt;Remote Access: Sharing Media Without Pain
&lt;/h2&gt;&lt;p&gt;This is where Jellyfin completely outclasses Kodi.&lt;/p&gt;
&lt;h3 id=&#34;kodi-remote-sharing-reality&#34;&gt;Kodi Remote Sharing Reality
&lt;/h3&gt;&lt;p&gt;Yes, you can share Kodi libraries remotely using VPNs or SMB shares. But it usually involves explaining network paths, teaching friends how to mount drives, or giving out file share credentials.&lt;/p&gt;
&lt;p&gt;And then they call you because it stopped working after a Windows update. Or their router rebooted. Or they got a new phone and don&amp;rsquo;t remember the setup steps.&lt;/p&gt;
&lt;h3 id=&#34;jellyfin-is-designed-for-this&#34;&gt;Jellyfin Is Designed for This
&lt;/h3&gt;&lt;p&gt;Jellyfin includes user accounts, per-library permissions, bandwidth limits, and secure authenticated access. You can expose Jellyfin using port forwarding with HTTPS, a reverse proxy, or a mesh VPN like Tailscale.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    If you port forward Jellyfin, use HTTPS and strong passwords. Web-facing media servers are targets. Don&amp;rsquo;t be the person who gets their server compromised because they used &amp;ldquo;password123.&amp;rdquo;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Friends just install an app, log in, and watch. Because of transcoding, it works even on weak devices. No explaining network shares. No VPN configuration. No tech support calls at 10pm.&lt;/p&gt;
&lt;h2 id=&#34;common-jellyfin-pain-points-to-expect&#34;&gt;Common Jellyfin Pain Points to Expect
&lt;/h2&gt;&lt;p&gt;Look, Jellyfin isn&amp;rsquo;t perfect. Here&amp;rsquo;s what&amp;rsquo;ll probably trip you up:&lt;/p&gt;
&lt;h3 id=&#34;hardware-transcoding-failures&#34;&gt;Hardware Transcoding Failures
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Driver issues on Linux (especially NVIDIA)&lt;/li&gt;
&lt;li&gt;Wrong permissions for hardware devices (&lt;code&gt;/dev/dri&lt;/code&gt; access problems)&lt;/li&gt;
&lt;li&gt;Codec support varies by GPU generation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When hardware transcoding fails, Jellyfin falls back to software transcoding, which will max out your CPU. You&amp;rsquo;ll know because your server fans will sound like a jet engine.&lt;/p&gt;
&lt;h3 id=&#34;weak-server-performance&#34;&gt;Weak Server Performance
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Software transcoding taxes weak CPUs&lt;/li&gt;
&lt;li&gt;Multiple 4K transcodes need serious hardware&lt;/li&gt;
&lt;li&gt;Remote users expect things to &amp;ldquo;just work&amp;rdquo; regardless of your setup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re running on an old laptop with a dual-core CPU, don&amp;rsquo;t expect to transcode 4K to three people simultaneously. It just won&amp;rsquo;t happen.&lt;/p&gt;
&lt;h3 id=&#34;android-tv-app-limitations&#34;&gt;Android TV App Limitations
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Some cheap Android TV boxes struggle with the official app&lt;/li&gt;
&lt;li&gt;HDR passthrough can be finicky&lt;/li&gt;
&lt;li&gt;Third-party clients like Findroid sometimes work better&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The official Jellyfin Android TV app is solid, but if you&amp;rsquo;ve got a $30 Android box from Amazon, you might have issues. Try Findroid if the official app gives you trouble.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CM293XCL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive: Large, affordable storage is essential for a growing media library, and this drive provides ample capacity for movies and shows, though it lacks NAS/enterprise features for heavy multi-user or RAID use.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;br&gt;
Large, affordable storage is essential for a growing media library, and this drive provides ample capacity for movies and shows, though it lacks NAS/enterprise features for heavy multi-user or RAID use.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-native-jellyfin-beats-kodi-plus-the-jellyfin-plugin&#34;&gt;Why Native Jellyfin Beats Kodi Plus the Jellyfin Plugin
&lt;/h2&gt;&lt;p&gt;The Jellyfin plugin for Kodi is excellent. It turns Kodi into a Jellyfin client, syncing libraries and watched status. I used it for months.&lt;/p&gt;
&lt;p&gt;But with Kodi plus Jellyfin, you still manage Kodi settings on every device, Kodi or Jellyfin server updates can break things. Native Jellyfin clients remove an entire layer of troubleshooting.&lt;/p&gt;
&lt;p&gt;My rule: I use Kodi plus Jellyfin for myself when I want customization. I never give Kodi to friends or family. They get native Jellyfin clients, because I value my free time.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-common-issues&#34;&gt;Troubleshooting Common Issues
&lt;/h2&gt;&lt;h3 id=&#34;playback-stutters-or-buffers&#34;&gt;Playback Stutters or Buffers
&lt;/h3&gt;&lt;p&gt;First, check if the stream is transcoding or direct playing. In the Jellyfin dashboard, you can see active streams and whether they&amp;rsquo;re transcoding.&lt;/p&gt;
&lt;p&gt;If it&amp;rsquo;s transcoding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable hardware acceleration if you haven&amp;rsquo;t already&lt;/li&gt;
&lt;li&gt;Lower client bitrate for weak devices&lt;/li&gt;
&lt;li&gt;Consider pre-converting very high bitrate files if you&amp;rsquo;re hitting this constantly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If it&amp;rsquo;s direct playing and still stuttering, your network&amp;rsquo;s probably the issue.&lt;/p&gt;
&lt;h3 id=&#34;high-cpu-usage-on-the-server&#34;&gt;High CPU Usage on the Server
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Too many software transcodes happening at once&lt;/li&gt;
&lt;li&gt;Enable hardware transcoding if available&lt;/li&gt;
&lt;li&gt;Consider pre-converting very high bitrate files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you see 100% CPU usage and your server&amp;rsquo;s crawling, someone&amp;rsquo;s transcoding without hardware acceleration. Fix that first.&lt;/p&gt;
&lt;h3 id=&#34;remote-access-works-locally-but-not-outside&#34;&gt;Remote Access Works Locally but Not Outside
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Verify port forwarding or VPN configuration&lt;/li&gt;
&lt;li&gt;Confirm users are connecting to the correct external address&lt;/li&gt;
&lt;li&gt;Check firewall rules on both the server and router&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few minutes testing this yourself saves an hour or more of back-and-forth with friends who can&amp;rsquo;t connect.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is Jellyfin completely free like Kodi?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. Jellyfin is fully open source and free, with no paid tiers. No premium features locked behind paywalls, no subscriptions, nothing.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I need a powerful server?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Not for basic use. You only need more power if you expect multiple transcodes at once. If you&amp;rsquo;re mostly direct playing to local devices, an old desktop is fine.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I still use Kodi with Jellyfin?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Absolutely. Kodi plus the Jellyfin plugin is a great power-user setup. I still use it on my main TV because I like the customization. But I don&amp;rsquo;t inflict it on anyone else.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is Jellyfin as customizable as Kodi?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No, and that&amp;rsquo;s intentional. Jellyfin favors simplicity over endless customization. You can theme it a bit, but you&amp;rsquo;re not building custom skins or installing dozens of add-ons.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Will Jellyfin always transcode my files?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No. Jellyfin direct-plays whenever possible and only transcodes when needed. If your client supports the file format, codec, and resolution, Jellyfin just streams it directly. Transcoding only kicks in when something doesn&amp;rsquo;t match.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion-why-jellyfin-won-for-me&#34;&gt;Conclusion: Why Jellyfin Won for Me
&lt;/h2&gt;&lt;p&gt;Kodi is still amazing software. If you love tweaking and customizing, Kodi will always have a place. I&amp;rsquo;m not saying Kodi is bad, I&amp;rsquo;m saying it&amp;rsquo;s designed for a different use case.&lt;/p&gt;
&lt;p&gt;But for most people, especially families and shared households, Jellyfin is the better tool. One server, synced playback everywhere, reliable transcoding, easy remote access, and simple apps that just work.&lt;/p&gt;
&lt;p&gt;I ditched Kodi not because it failed, but because Jellyfin solved the problems Kodi was never designed to solve. If you&amp;rsquo;re tired of being the household media IT department, Jellyfin might be your way out.&lt;/p&gt;
&lt;p&gt;Ready to set up your own Jellyfin server? Check out the &lt;a class=&#34;link&#34; href=&#34;https://jellyfin.org/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;official Jellyfin documentation&lt;/a&gt; for installation guides and best practices.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BFD8DSM3&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc.jpg&#34; alt=&#34;ASRock Intel ARC A380 Challenger: This low-power GPU enables efficient hardware transcoding for Jellyfin, especially useful if you have multiple users or diverse client devices, but it&amp;#39;s not required if your clients can direct play all your content.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;ASRock Intel ARC A380 Challenger&lt;/strong&gt;&lt;br&gt;
This low-power GPU enables efficient hardware transcoding for Jellyfin, especially useful if you have multiple users or diverse client devices, but it&amp;rsquo;s not required if your clients can direct play all your content.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45n6UHq&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://jellyfin.org/images/logo.svg&#34; alt=&#34;Jellyfin Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Jellyfin Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://jellyfin.org/docs/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://forum.kodi.tv/kodi/theme/images/logo.png&#34; alt=&#34;Kodi Wiki&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Kodi Wiki&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://kodi.wiki/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://www.intel.com/content/dam/logos/intel-header-logo.svg&#34; alt=&#34;Intel Quick Sync Video Guide&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Intel Quick Sync Video Guide&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://www.intel.com/content/www/us/en/architecture-and-technology/quick-sync-video/quick-sync-video-general.html&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        </item>
        <item>
        <title>How to Install and Configure Fail2Ban on your Jellyfin LXC</title>
        <link>https://diymediaserver.com/post/2026/install-configure-fail2ban-jellyfin-lxc/</link>
        <pubDate>Thu, 01 Jan 2026 07:03:16 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2026/install-configure-fail2ban-jellyfin-lxc/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2026/install-configure-fail2ban-jellyfin-lxc/featured.jpg" alt="Featured image of post How to Install and Configure Fail2Ban on your Jellyfin LXC" /&gt;&lt;p&gt;If you&amp;rsquo;ve exposed Jellyfin to the internet, whether through port forwarding or a reverse proxy, you&amp;rsquo;re already being scanned. Bots see an open login page and immediately start stuffing passwords trying to guess their way in.&lt;/p&gt;
&lt;p&gt;Ask me how I know.&lt;/p&gt;
&lt;p&gt;I had the default username &lt;code&gt;jellyfin&lt;/code&gt; when I first setup and exposed Jellyfin to the internet. Once I did this that the account was constantly being hammered by bots that found the login page. I found it because the account would get locked by Jellyfin and I couldn&amp;rsquo;t login to watch anything. I knew better but, here I was looking at thousands of failed login attempts from IPs spread across multiple countries.&lt;/p&gt;
&lt;p&gt;I immediately changed the default username. This helped the account was no longer getting locked out. However, the Jellyfin server was still being assaulted by bots on a daily basis. So, I knew I needed an additional layer of security. Fail2Ban was the easy choice.&lt;/p&gt;
&lt;p&gt;This guide covers installing and configuring Fail2Ban for a Jellyfin LXC without banning yourself. We&amp;rsquo;ll cover direct exposure, reverse proxy setups, Docker-in-LXC gotchas, and monitoring bans over time.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    &lt;p&gt;Fail2Ban watches Jellyfin logs for failed login attempts and automatically blocks abusive IPs. With the right jail, filter, and network configuration, you can stop brute-force attacks in their tracks even behind a reverse proxy all without locking yourself out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick Start for Experienced Users&lt;/strong&gt;:&lt;br&gt;
Create filter &lt;code&gt;/etc/fail2ban/filter.d/jellyfin.conf&lt;/code&gt;&lt;br&gt;
Create jail &lt;code&gt;/etc/fail2ban/jail.d/jellyfin.local&lt;/code&gt;&lt;br&gt;
Verify firewall backend (iptables or nftables)&lt;br&gt;
Configure reverse proxy trust if needed&lt;br&gt;
Test with &lt;code&gt;fail2ban-regex&lt;/code&gt;&lt;/p&gt;

  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-fail2ban-protects-your-jellyfin-server&#34;&gt;Why Fail2Ban Protects Your Jellyfin Server
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the thing: Jellyfin has authentication and its rate limit lockout is per user not global. If it isn&amp;rsquo;t set on a user account an attacker can try thousands of passwords per hour without consequence.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/2026/install-configure-fail2ban-jellyfin-lxc/jellyfin-lockout.jpg&#34;
    alt=&#34;Jellyfin&amp;#39;s Lockout setting&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Fail2Ban does this globally, and you don&amp;rsquo;t have to set it per user.&lt;/p&gt;
&lt;p&gt;Fail2Ban does this by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Watching log files for suspicious patterns&lt;/li&gt;
&lt;li&gt;Counting repeated failures from the same IP&lt;/li&gt;
&lt;li&gt;Adding firewall rules to block that IP for a set time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For context, the Jellyfin default HTTP port is 8096 and the default HTTPS port is 8920. Whether you expose these directly or run Jellyfin behind a reverse proxy on port 443 (HTTPS), failed login attempts look the same in the logs. That&amp;rsquo;s actually good news. It means one Fail2Ban config works for both scenarios.&lt;/p&gt;
&lt;h2 id=&#34;pre-deployment-checklist&#34;&gt;Pre-Deployment Checklist
&lt;/h2&gt;&lt;p&gt;Answer these before touching any of your configs. Trust me, five minutes now saves an hour of troubleshooting later:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;Exposure method&lt;/strong&gt;: Direct port forwarding or reverse proxy?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;Jellyfin port&lt;/strong&gt;: Using default 8096 or custom?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;Firewall backend&lt;/strong&gt;: iptables or nftables? (Check with &lt;code&gt;sudo iptables --version&lt;/code&gt; and &lt;code&gt;sudo nft --version&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;Container setup&lt;/strong&gt;: Jellyfin directly in LXC or Docker-in-LXC?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;Reverse proxy&lt;/strong&gt;: If yes, are real client IPs logged?&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;Trusted networks&lt;/strong&gt;: What IPs should never be banned?&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Note:&lt;/strong&gt;
    &lt;p&gt;I&amp;rsquo;ll be configuring this on an unprivileged LXC running Debian 13 with nftables.&lt;/p&gt;
&lt;p&gt;So, all of my examples will be for this setup.&lt;/p&gt;

  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;checking-your-firewall-backend&#34;&gt;Checking Your Firewall Backend
&lt;/h3&gt;&lt;p&gt;Modern Debian systems often use nftables with iptables as a compatibility layer.&lt;br&gt;
You need to know which one Fail2Ban will actually use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check what&amp;#39;s actually running&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status nftables
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status netfilter-persistent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fail2Ban works with both, but the actions you configure will differ.&lt;br&gt;
Getting this wrong means bans won&amp;rsquo;t actually happen.&lt;/p&gt;
&lt;h2 id=&#34;installing-fail2ban-on-debianubuntu-lxc&#34;&gt;Installing Fail2Ban on Debian/Ubuntu LXC
&lt;/h2&gt;&lt;p&gt;Alright, let&amp;rsquo;s get Fail2Ban installed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see &lt;code&gt;active (running)&lt;/code&gt;, you&amp;rsquo;re golden. Fail2Ban starts automatically and will survive reboots.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;● fail2ban.service - Fail2Ban Service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Loaded: loaded &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/usr/lib/systemd/system/fail2ban.service&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; enabled&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; preset: enabled&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Active: active &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;running&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; since Wed 2025-12-31 11:22:01 MST&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 20h ago
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Invocation: 9a7ce4195aaa4dc48dc750363bb9b954
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Docs: man:fail2ban&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Main PID: &lt;span class=&#34;m&#34;&gt;329267&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;fail2ban-server&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      Tasks: &lt;span class=&#34;m&#34;&gt;13&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;limit: 7051&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Memory: 15.7M &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;peak: 24M&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        CPU: 4min 37.380s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     CGroup: /system.slice/fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             └─329267 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Dec &lt;span class=&#34;m&#34;&gt;31&lt;/span&gt; 11:22:01 racknerd-ea37d8f systemd&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Started fail2ban.service - Fail2Ban Service.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Dec &lt;span class=&#34;m&#34;&gt;31&lt;/span&gt; 11:22:01 racknerd-ea37d8f fail2ban-server&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;329267&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Server ready
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D454DQSP&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ms-01.jpg&#34; alt=&#34;MINISFORUM MS-01 Mini Workstation: Why it fits this post: This mini workstation is ideal for running Jellyfin in an LXC container and experimenting with Fail…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-01 Mini Workstation&lt;/strong&gt;
This mini workstation is ideal for running Jellyfin in an LXC container and experimenting with Fail2Ban, offering enough power and networking for a secure, flexible homelab setup.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4p3HhTI&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458318191324330626506341&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fminisforum-barebone-systems-mini-pc-intel-core-i5-12600h%2fp%2f2SW-002G-000K9%3fitem%3d9SIBJ6VKBD4204&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;creating-the-jellyfin-fail2ban-filter&#34;&gt;Creating the Jellyfin Fail2Ban Filter
&lt;/h2&gt;&lt;p&gt;Filters live in &lt;code&gt;/etc/fail2ban/filter.d/&lt;/code&gt; and tell Fail2Ban what a &amp;ldquo;failed login&amp;rdquo; looks like in your logs.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/fail2ban/filter.d/jellyfin.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[Definition]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;failregex&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;^.*Authentication request for .* has been denied \(IP: &amp;#34;&amp;lt;ADDR&amp;gt;&amp;#34;\)\.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;ignoreregex&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Jellyfin log formats can change between versions. I learned this the hard way after an update when bans mysteriously stopped working. Always test your filter after upgrades.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;test-the-filter&#34;&gt;Test the Filter
&lt;/h3&gt;&lt;p&gt;Before going any further:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Make sure to have some failed logins today&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Test the filter against your actual logs
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; REPLACE: YYYYMMDD with today&amp;rsquo;s date&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo fail2ban-regex /var/log/jellyfin/jellyfinYYYYMMDD.log /etc/fail2ban/filter.d/jellyfin.conf --print-all-matched
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see matched lines with IP addresses highlighted.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2025-12-31 07:22:27.102 -07:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;INF&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Authentication request &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;test@test&amp;#34;&lt;/span&gt; has been denied &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IP: &lt;span class=&#34;s2&#34;&gt;&amp;#34;140.32.72.74&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2025-12-31 07:22:28.787 -07:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;INF&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Authentication request &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;test@test&amp;#34;&lt;/span&gt; has been denied &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IP: &lt;span class=&#34;s2&#34;&gt;&amp;#34;140.32.72.74&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2025-12-31 07:41:08.539 -07:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;INF&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Authentication request &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;test@test&amp;#34;&lt;/span&gt; has been denied &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IP: &lt;span class=&#34;s2&#34;&gt;&amp;#34;140.32.72.74&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2025-12-31 07:41:10.368 -07:00&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;INF&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Authentication request &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;test@test&amp;#34;&lt;/span&gt; has been denied &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IP: &lt;span class=&#34;s2&#34;&gt;&amp;#34;140.32.72.74&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see zero matches, your regex is wrong or your log path is incorrect.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Don&amp;rsquo;t skip this step. I&amp;rsquo;ve wasted hours debugging jails that would never work because the filters never matched anything.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;creating-the-jellyfin-jail-configuration&#34;&gt;Creating the Jellyfin Jail Configuration
&lt;/h2&gt;&lt;p&gt;Jails define what happens when the filter finds matches.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/fail2ban/jail.d/jellyfin.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;base-configuration-without-a-reverse-proxy&#34;&gt;Base Configuration (Without a Reverse Proxy)
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[jellyfin]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;enabled&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;filter&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;jellyfin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;logpath&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/var/log/jellyfin/jellyfin*.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;backend&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;polling&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;maxretry&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;findtime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;10m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;bantime&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;20m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port&lt;/span&gt;     &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;8096,8920&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;protocol&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;tcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;action&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;nftables[type=multiport]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;ignoreip&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;127.0.0.1/8 ::1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Optional: add YOUR LAN subnet to ignoreip (recommended)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Examples (pick the one that matches your network, or use the exact /24 you use)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 10.0.0.0/8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 172.16.0.0/12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 192.168.0.0/16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means: 5 failures within 10 minutes results in a 20-minute ban. Adjust these to taste, but don&amp;rsquo;t make &lt;code&gt;maxretry&lt;/code&gt; too low or the &lt;code&gt;bantime&lt;/code&gt; too long, you could lock yourself out when you mistype your password while trying to watch something away from home.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    &lt;code&gt;backend = polling&lt;/code&gt; is needed because Jellyfin creates a new log file every 24 hours with a unique name. This allows fail2ban to read these files.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This is basics of Fail2Ban used when you are exposing your Jellyfin directly to the internet via port forwarding. I highly Recommend a Reverse Proxy rather than exposing Jellyfin directly to the internet.&lt;/p&gt;
&lt;p&gt;I will cover more advanced setups like reverse proxies at a later date.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07V5JTMV9&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB: The Raspberry Pi is a budget-friendly, low-power option if you are wanting to test Fail2Ban and Jellyfin in a lightweight, isolated environment before deploying to larger servers.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;RaspberryPi 4GB&lt;/strong&gt;
The Raspberry Pi is a budget-friendly, low-power option if you are wanting to test Fail2Ban and Jellyfin in a lightweight, isolated environment before deploying to larger servers.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;monitoring-and-maintenance&#34;&gt;Monitoring and Maintenance
&lt;/h2&gt;&lt;h3 id=&#34;watch-ban-activity&#34;&gt;Watch Ban Activity
&lt;/h3&gt;&lt;p&gt;Want to see bans happen in real-time? This is oddly satisfying:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tail -f /var/log/fail2ban.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll see IPs getting banned as they trip your thresholds. After the first few, you realize just how many bots are constantly probing your server.&lt;/p&gt;
&lt;h3 id=&#34;unban-yourself&#34;&gt;Unban Yourself
&lt;/h3&gt;&lt;p&gt;Locked yourself out? It happens. From the LXC console:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo fail2ban-client &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; jellyfin unbanip 192.168.1.50
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace with your actual IP. You&amp;rsquo;ll be unbanned immediately.&lt;/p&gt;
&lt;h3 id=&#34;best-practices-for-fail2ban-management&#34;&gt;Best Practices for Fail2Ban Management
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Keep &lt;code&gt;bantime&lt;/code&gt; finite. Infinite bans sound appealing, but they&amp;rsquo;re risky. You could ban yourself permanently&lt;/li&gt;
&lt;li&gt;Test filters after every Jellyfin update. Log formats change&lt;/li&gt;
&lt;li&gt;Review ban logs monthly for patterns. If you&amp;rsquo;re getting hammered from specific countries, consider additional firewall rules&lt;/li&gt;
&lt;li&gt;Document your unban procedure somewhere you can access when locked out&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;troubleshooting-common-fail2ban-issues&#34;&gt;Troubleshooting Common Fail2Ban Issues
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;No bans occur&lt;/strong&gt;: Wrong filter regex, wrong logpath, or Jellyfin&amp;rsquo;s logging level is too low. Use &lt;code&gt;fail2ban-regex&lt;/code&gt; to debug. Also check that Fail2Ban is actually reading the log file, permissions matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locked out completely&lt;/strong&gt;: Access your LXC console (not SSH—that&amp;rsquo;s blocked too), unban manually, then add your IP to &lt;code&gt;ignoreip&lt;/code&gt; in the jail config.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Will Fail2Ban ban my own IP?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes, if you exceed &lt;code&gt;maxretry&lt;/code&gt;. Use &lt;code&gt;ignoreip&lt;/code&gt; for your home network or keep the unban command handy. I&amp;rsquo;ve locked myself out more times than I&amp;rsquo;d like to admit.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s the difference between bantime and findtime?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;code&gt;findtime&lt;/code&gt; is the detection window, how far back Fail2Ban looks for failures. &lt;code&gt;bantime&lt;/code&gt; is how long the ban lasts. So with &lt;code&gt;findtime = 600&lt;/code&gt; and &lt;code&gt;maxretry = 3&lt;/code&gt;, you get banned if you fail 3 times within 10 minutes. The ban then lasts for &lt;code&gt;bantime&lt;/code&gt; seconds.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Does Fail2Ban work with nftables?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes, but verify the backend configuration matches your system. Modern Debian uses nftables but Fail2Ban might still default to iptables compatibility mode. Check your jail config.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is Fail2Ban useful for local-only Jellyfin?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Not really. It matters when Jellyfin is exposed beyond your LAN.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion-harden-your-jellyfin-installation&#34;&gt;Conclusion: Harden Your Jellyfin Installation
&lt;/h2&gt;&lt;p&gt;If your Jellyfin instance is reachable from the internet, Fail2Ban is essential. Brute-force attempts are constant and invisible until you check your logs. I was shocked when I first looked, thousands of attempts per day from IPs all over the world.&lt;/p&gt;
&lt;p&gt;By understanding your network topology, configuring the correct jail and action, and monitoring bans periodically, you turn Jellyfin from a soft target into a more secure service. This is just the third step in hardening your Jellyfin LXC.&lt;/p&gt;
&lt;p&gt;You should have already:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Be using an unprivileged LXC - &lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/jellyfin_intel_quicksync_unprivileged_lxc/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LXC Guide for Jellyfin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Set Firewall Rules&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Secured your SSH - &lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/complete-guide-securing-ssh-server/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;How to secure SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Now Fail2Ban&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I learned this by watching bad actors trying to brute-force my server for days. Now they get five tries and a timeout. Yours should too.&lt;/p&gt;
&lt;p&gt;Next steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pair Fail2Ban with HTTPS and strong passwords&lt;/li&gt;
&lt;li&gt;Add a reverse proxy like NGINX or Caddy&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/fail2ban.jpg&#34; alt=&#34;Fail2Ban Official Wiki&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Fail2Ban Official Wiki&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://github.com/fail2ban/fail2ban/wiki&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/jellyfin.svg&#34; alt=&#34;Jellyfin Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Jellyfin Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://jellyfin.org/docs/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07G9NHRGQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/fw6c.jpg&#34; alt=&#34;Protectli FW6C/FW6D: This dedicated firewall appliance can help you by implementing network-level protections and monitor traffic, complementing Fail2Ban&amp;#39;s application-level security for a more robust homelab.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Protectli FW6C/FW6D&lt;/strong&gt;
This dedicated firewall appliance can help you by implementing network-level protections and monitor traffic, complementing Fail2Ban&amp;rsquo;s application-level security for a more robust homelab.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4fKndSm&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>DIYMEDIASERVER 2025 Year in Review</title>
        <link>https://diymediaserver.com/post/2025-year-in-review/</link>
        <pubDate>Sat, 27 Dec 2025 06:32:28 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/2025-year-in-review/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/2025-year-in-review/featured.jpg" alt="Featured image of post DIYMEDIASERVER 2025 Year in Review" /&gt;&lt;h2 id=&#34;looking-back-at-the-mess-we-started-with&#34;&gt;Looking Back at the Mess We Started With
&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s December 27th, and somehow we made it through our first year!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve been following along, you know this blog started as a therapy journal in my journey of fixing my media server that kept falling. One tower doing everything. ISP router I&amp;rsquo;d never logged into. Backups that were &amp;ldquo;I should really do that.&amp;rdquo; The classic homelab setup.&lt;/p&gt;
&lt;p&gt;2025 was the year I finally stopped duct-taping problems and built something that actually works. Four boxes with dedicated jobs. Proxmox running things properly. Docker that doesn&amp;rsquo;t make me want to throw my keyboard. And yeah, actual backups that saved my ass more than once.&lt;/p&gt;
&lt;p&gt;You asked the important questions. I burned my nights and weekends figuring shit out. Here&amp;rsquo;s a summary of what we accomplished in 2025.&lt;/p&gt;
&lt;h2 id=&#34;the-big-picture&#34;&gt;The Big Picture
&lt;/h2&gt;&lt;p&gt;This year, DIYMediaServer turned into a complete blueprint for running your own media infrastructure. Not the &amp;ldquo;install Jellyfin and pray&amp;rdquo; tutorial. The whole thing: hardware, virtualization, networking, storage, automation, and the backup strategy that lets you experiment without worry.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re still running everything on one machine with an ISP router, this 2025 review is your roadmap out. No enterprise budget required. Just better decisions and way fewer panic reboots during movie night.&lt;/p&gt;
&lt;h2 id=&#34;the-wins-what-actually-got-published&#34;&gt;The Wins: What Actually Got Published
&lt;/h2&gt;&lt;p&gt;I wrote a lot this year. Maybe too much. But every post came from a real problem I hit or a question one of you asked.&lt;/p&gt;
&lt;h3 id=&#34;hardware-that-makes-sense&#34;&gt;Hardware That Makes Sense
&lt;/h3&gt;&lt;p&gt;The four-box architecture was the turning point. Instead of one overworked machine doing everything badly, I split responsibilities:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Router&lt;/strong&gt; - Kicked the ISP router to modem-only duty and built a proper OPNsense box. VLANs, firewall rules, actual logs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The NAS&lt;/strong&gt; - Said goodbye to VM storage nightmares and USB drives hanging off Proxmox nodes. Dedicated hardware, proper HBAs, filesystems that won&amp;rsquo;t explode. My media library finally has a real and stable home.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Compute Node&lt;/strong&gt; - Apps got their own Proxmox box. One dead component used to take down everything. Not anymore. Compute crashes? Router and storage keep humming along.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Backup Server&lt;/strong&gt; - PBS finally got its own machine and became the &amp;ldquo;try anything without fear&amp;rdquo; box. Break something with an upgrade? Five-minute restore instead of rebuilding from scratch.&lt;/p&gt;
&lt;p&gt;These weren&amp;rsquo;t abstract posts. They&amp;rsquo;re the exact setup I&amp;rsquo;m running, with all the gotchas I hit along the way spelled out, so you don&amp;rsquo;t have to.&lt;/p&gt;
&lt;h3 id=&#34;dockers-comeback-tour&#34;&gt;Docker&amp;rsquo;s Comeback Tour
&lt;/h3&gt;&lt;p&gt;Remember when I was all-in on LXCs? Yeah, about that.&lt;/p&gt;
&lt;p&gt;2025 was my public admission that I&amp;rsquo;d been fighting containers the wrong way. The LXC hell trilogy laid it all out: UID/GID nightmares, NFS permission walls, the &amp;ldquo;secure by default&amp;rdquo; trap that made simple media sharing an absolute nightmare.&lt;/p&gt;
&lt;p&gt;I crawled back to Docker for the media stack and documented the whole journey. The Arr suite comparison showed exactly why throwing Radarr, Sonarr, and friends into Docker Compose is better than individual LXCs. Cleaner updates. Simpler mounts. One export to storage and done.&lt;/p&gt;
&lt;p&gt;LXCs still have their place for lightweight services and utilities. But for media apps? Docker won, and I&amp;rsquo;m not too proud to say I was wrong.&lt;/p&gt;
&lt;p&gt;But, I just might give LXCs another try in 2026 using a different mounting methods.&lt;/p&gt;
&lt;h3 id=&#34;automation-that-actually-works&#34;&gt;Automation That Actually Works
&lt;/h3&gt;&lt;p&gt;Your media stack should work for you, not the other way around. This year we built out the full automation chain:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download management&lt;/strong&gt;: SABnzbd, Radarr, Prowlarr guides that turn &amp;ldquo;I want this show&amp;rdquo; into &amp;ldquo;it&amp;rsquo;s already downloaded and sorted.&amp;rdquo; Complete with the Usenet vs torrents breakdown and SABnzbd vs NZBGet comparison.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Media processing&lt;/strong&gt;: Tdarr running in an unprivileged LXC with QuickSync, letting your Intel iGPU chew through transcodes while you do literally anything else.&lt;/p&gt;
&lt;p&gt;Profilarr will be covered in 2026 as an alternative to Tdarr.&lt;/p&gt;
&lt;h3 id=&#34;the-boring-stuff-that-saved-my-weekends&#34;&gt;The Boring Stuff That Saved My Weekends
&lt;/h3&gt;&lt;p&gt;Some posts won&amp;rsquo;t get much traffic, but they quietly prevent disasters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-how-to-use-parted-to-create-partitions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;parted and mount points&lt;/a&gt; - So your drives don&amp;rsquo;t unmount on reboot&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/mastering-uid-gid-mapping-proxmox-lxc/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;UID/GID mapping in Proxmox&lt;/a&gt; - Ending the &amp;ldquo;Permission denied&amp;rdquo; screaming sessions&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/hardware-why-you-need-an-hba/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HBA guide&lt;/a&gt; - Why cheap SATA cards will ruin your ZFS pool&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/upgrade-debian-12-to-13-proxmox-lxc-243-credentials-fix/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Debian 12 to 13 upgrade fix&lt;/a&gt; - The systemd credential bug that hit everyone on Proxmox 9&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/complete-guide-securing-ssh-server/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SSH hardening&lt;/a&gt; - Stop leaving root login wide open&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-i-fixed-my-24-hour-nfs-crash-loop-with-mergerfs-lxc-and-proxmox/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;The 24-hour NFS crash loop story&lt;/a&gt; - A debugging nightmare with MergerFS that taught me more about the kernel than I wanted to know&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each one small. Together? They turn &amp;ldquo;mostly works&amp;rdquo; into &amp;ldquo;boringly reliable.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;network-and-security-upgrades&#34;&gt;Network and Security Upgrades
&lt;/h3&gt;&lt;p&gt;The networking stack finally grew up:&lt;/p&gt;
&lt;p&gt;Proper routing with OPNsense. VLANs separating family devices from the media stack from random IoT garbage. Pi-hole v6 on multiple nodes, synced with Nebula so your DNS actually stays consistent.&lt;/p&gt;
&lt;p&gt;Not sexy stuff. But it&amp;rsquo;s the difference between &amp;ldquo;my Smart-Switch can somehow access my NAS shares&amp;rdquo; and &amp;ldquo;everything is where it should be and logged.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;whats-missing&#34;&gt;What&amp;rsquo;s Missing?
&lt;/h2&gt;&lt;p&gt;Let me be honest about my documentation gaps, because 2026 needs to address them:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remote access&lt;/strong&gt; - I&amp;rsquo;ve barely touched this. You&amp;rsquo;ve got a great local setup, but accessing your media from outside your network safely? That&amp;rsquo;s the next frontier. I picked up a cheap VPS during Black Friday sales, and I&amp;rsquo;m building out a multi-part series on using it as a secure front door. Caddy for reverse proxy, Wireguard to tunnel back home, keeping your services and ISP IP hidden behind the VPS. No exposing ports directly. No hoping your ISP doesn&amp;rsquo;t change your IP. Actual security with the flexibility to access everything remotely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NFS and MergerFS don&amp;rsquo;t play nice&lt;/strong&gt; - The 24-hour crash loop story hinted at this, but there&amp;rsquo;s a bigger problem. NFS and MergerFS together create weird edge cases and performance issues I&amp;rsquo;ve been working around instead of fixing. Early 2026, I&amp;rsquo;m diving into VirtioFS as an alternative and rethinking how storage gets shared between Proxmox hosts and VMs. This one&amp;rsquo;s going to be a deep dive with real testing. I&amp;rsquo;ll be testing an alternative mounting method for MergerFS as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monitoring and alerting&lt;/strong&gt; - The stack is more stable now, but you&amp;rsquo;re still flying blind. When did that disk start filling up? Is Jellyfin actually responsive or just running? Uptime Kuma, Discord Alerts, Bash scripts, and simple health checks need to be covered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installing and Configuring Proxmox&lt;/strong&gt; - I have talked about how I use Proxmox but, I haven&amp;rsquo;t documented how to install or configure it yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hardware deep dives&lt;/strong&gt; - The guides covered what to buy, but not enough on &lt;em&gt;why&lt;/em&gt;. Power efficiency numbers. Noise levels. Heat management. Budgets from &amp;ldquo;I have $500&amp;rdquo; to &amp;ldquo;I can spend $2000.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recovery scenarios&lt;/strong&gt; - PBS is set up, but I haven&amp;rsquo;t actually documented what a full restore looks like. Or migrating everything to new hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &amp;ldquo;complete stack&amp;rdquo; templates&lt;/strong&gt; - I haven&amp;rsquo;t been great at creating good copy and paste solutions (Intentionally. I want you to learn not just copy and paste). But some of you have asked for more full &amp;ldquo;recipes&amp;rdquo; builds that are copy, paste, adjust to taste.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More debugging stories&lt;/strong&gt; - I will be focusing on more real problems. The weird bugs. More Lightbulb moments documented. The &amp;ldquo;here&amp;rsquo;s what I tried that didn&amp;rsquo;t work before I found the solution.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;where-you-might-be-right-now&#34;&gt;Where You Might Be Right Now
&lt;/h2&gt;&lt;h3 id=&#34;everythings-still-in-one-box&#34;&gt;&amp;ldquo;Everything&amp;rsquo;s still in one box&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Start with the four-box hardware guide. Move routing off first, then storage. You don&amp;rsquo;t need to do it all at once, but every piece you split out makes the whole system more resilient.&lt;/p&gt;
&lt;h3 id=&#34;lxc-permissions-are-killing-me&#34;&gt;&amp;ldquo;LXC permissions are killing me&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;The LXC hell series is literally your story. Switch media apps to Docker, keep LXCs for the lightweight stuff. Your blood pressure will thank you.&lt;/p&gt;
&lt;h3 id=&#34;backups-theres-a-usb-drive-somewhere&#34;&gt;&amp;ldquo;Backups? There&amp;rsquo;s a USB drive somewhere&amp;hellip;&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;PBS guide. Find a cheap mini PC, add a big drive, let Proxmox handle it. The first time you restore instead of rebuild, you&amp;rsquo;ll wonder why you waited.&lt;/p&gt;
&lt;h3 id=&#34;my-isp-router-works&#34;&gt;&amp;ldquo;My ISP router&amp;hellip; works?&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;OPNsense build. One weekend. You&amp;rsquo;ll immediately see the difference when you can actually control what&amp;rsquo;s happening on your network.&lt;/p&gt;
&lt;h3 id=&#34;im-new-and-this-is-overwhelming&#34;&gt;&amp;ldquo;I&amp;rsquo;m new and this is overwhelming&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Start small. Pick the SSH hardening guide. Get one Arr app running. You don&amp;rsquo;t need the full four-box dream build on day one. Build confidence with small wins, then come back for the architecture.&lt;/p&gt;
&lt;h2 id=&#34;before-and-after&#34;&gt;Before and After
&lt;/h2&gt;&lt;p&gt;I want to be clear about what changed over the last year:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;: One box doing everything. LXCs everywhere with permission nightmares. VM storage on a prayer. ISP router mystery settings. &amp;ldquo;Backups&amp;rdquo; = good intentions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt;: Dedicated router, NAS, compute, and backup boxes. Proxmox with clear roles. Docker for media apps. Automated downloads with Radarr and SABnzbd. OPNsense with VLANs. PBS with actual tested restores.&lt;/p&gt;
&lt;p&gt;Your homelab shouldn&amp;rsquo;t be a second job. It should work quietly in the background and let you actually &lt;em&gt;use&lt;/em&gt; your media instead of constantly fixing things. Don&amp;rsquo;t get me wrong, tinkering is still fun, but I want to choose when to tinker or just sit back and enjoy a show or movie without the server interrupting.&lt;/p&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s Next
&lt;/h2&gt;&lt;p&gt;2025 was foundations. Getting the architecture right, escaping container hell, setting up backups, and basic networking.&lt;/p&gt;
&lt;p&gt;2026 is where we go deeper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remote access allowing sharing with friends&lt;/li&gt;
&lt;li&gt;Monitoring and alerting that actually helps&lt;/li&gt;
&lt;li&gt;Complete stack templates you can copy&lt;/li&gt;
&lt;li&gt;More budget vs performance breakdowns&lt;/li&gt;
&lt;li&gt;Disaster recovery walkthroughs&lt;/li&gt;
&lt;li&gt;Ansible Playbooks&lt;/li&gt;
&lt;li&gt;Better MergerFS setup&lt;/li&gt;
&lt;li&gt;More real debugging stories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog exists because I got tired of forum posts from 2015 that assumed you already knew everything. The goal is making this stuff accessible. Not dumbed down. Just explained properly, with the context that matters.
It is also forcing me to keep my skills sharp and to keep learning.&lt;/p&gt;
&lt;h2 id=&#34;setup-one-thing-before-new-years&#34;&gt;Setup One Thing Before New Year&amp;rsquo;s
&lt;/h2&gt;&lt;p&gt;You&amp;rsquo;ve got a week. Pick something from this year&amp;rsquo;s posts and do it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Move your routing to OPNsense&lt;/li&gt;
&lt;li&gt;Set up PBS&lt;/li&gt;
&lt;li&gt;Configure proper SSH hardening&lt;/li&gt;
&lt;li&gt;Get Radarr automating one library&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing. Build momentum. Start 2026 with a win instead of another &amp;ldquo;I really should do that.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re not just ditching Netflix. You&amp;rsquo;re building infrastructure you actually understand and control. That&amp;rsquo;s worth the effort.&lt;/p&gt;
&lt;p&gt;Thanks for reading this year. See you in 2026.&lt;/p&gt;
&lt;p&gt;Hit me up on Reddit or E-mail if there&amp;rsquo;s something specific you want covered. I&amp;rsquo;m making the list now.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Sync Multiple Pi-hole Servers with Nebula Sync</title>
        <link>https://diymediaserver.com/post/sync-multiple-pihole-servers-nebula-sync/</link>
        <pubDate>Sat, 13 Dec 2025 07:32:28 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/sync-multiple-pihole-servers-nebula-sync/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/sync-multiple-pihole-servers-nebula-sync/featured.jpg" alt="Featured image of post Sync Multiple Pi-hole Servers with Nebula Sync" /&gt;&lt;p&gt;You add a blocklist to your first Pi-hole. Easy. Then you remember you&amp;rsquo;ve got two more Pi-holes scattered around your network. Each one needs the same update. Manually. You tab between admin pages, copying settings, and by the second one you&amp;rsquo;re asking yourself why you ever thought multiple Pi-holes was a good idea.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nebula Sync&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/lovelaze/nebula-sync&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;On GitHub&lt;/a&gt; fixes this. It keeps multiple Pi-hole servers in sync by automatically copying blocklists, local DNS records, and settings from one primary Pi-hole to all your replicas. Change something once on the primary, and Nebula pushes it everywhere else within a few mins.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re running multiple Pi-holes and you&amp;rsquo;re tired of manual updates, this guide will get you set up. If you can log into &lt;code&gt;pihole/admin&lt;/code&gt; and run Docker, you can do this.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Run multiple Pi-hole servers for redundancy, designate one as primary, and use Nebula Sync to automatically replicate blocklists, local DNS, and settings to all replicas without manual updates.

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Quick checklist&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 2+ working Pi-hole nodes (same major version, ideally v6)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; One node chosen as &lt;strong&gt;PRIMARY&lt;/strong&gt; (the only one you edit)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; A basic understanding of Docker/Compose&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Router/DHCP hands out both Pi-hole IPs (DNS) for failover&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-sync-multiple-pi-hole-servers&#34;&gt;Why Sync Multiple Pi-hole Servers?
&lt;/h2&gt;&lt;h3 id=&#34;why-run-more-than-one-pi-hole&#34;&gt;Why Run More Than One Pi-hole?
&lt;/h3&gt;&lt;p&gt;One Pi-hole works great until it doesn&amp;rsquo;t. Maybe you&amp;rsquo;re updating it at 2am and something breaks. Maybe the SD card dies. Whatever the reason, when your single DNS server goes down, your entire network loses internet. Your spouse can&amp;rsquo;t stream. The smart home stops working. You know how this goes.&lt;/p&gt;
&lt;p&gt;Multiple Pi-holes solve this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redundancy&lt;/strong&gt;: One Pi-hole fails, DNS keeps working.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance without downtime&lt;/strong&gt;: Update one node while the other handles queries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better coverage&lt;/strong&gt;: Every device stays protected during updates or failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem? Managing them manually is a pain. Every blocklist or whitelist addition, every DNS entry, every setting tweak has to be repeated on each node. That gets old fast.&lt;/p&gt;
&lt;h3 id=&#34;two-sync-approaches-one-clear-winner-for-v6&#34;&gt;Two Sync Approaches, One Clear Winner for v6
&lt;/h3&gt;&lt;p&gt;You&amp;rsquo;ve got two main options for syncing Pi-holes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gravity Sync&lt;/strong&gt; is the old reliable. It&amp;rsquo;s a bash script that syncs databases over SSH. Works great for Pi-hole v5.x, but it wasn&amp;rsquo;t built for v6&amp;rsquo;s API architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nebula Sync&lt;/strong&gt; is newer and designed specifically for Pi-hole v6&amp;rsquo;s web API. It syncs more than just gravity databases and handles the modern Pi-hole setup better.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re using Nebula Sync here because it&amp;rsquo;s built for v6 and just works cleaner with current Pi-hole versions.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites-and-lab-layout&#34;&gt;Prerequisites and Lab Layout
&lt;/h2&gt;&lt;h3 id=&#34;what-you-need&#34;&gt;What You Need
&lt;/h3&gt;&lt;p&gt;Before you start, make sure you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Two or more working Pi-hole servers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Each Pi-hole accessible at &lt;code&gt;http://&amp;lt;ip&amp;gt;/admin&lt;/code&gt; or &lt;code&gt;https://&amp;lt;host&amp;gt;/admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;admin password&lt;/strong&gt; set on each Pi-hole&lt;/li&gt;
&lt;li&gt;Something that can run Docker (often one of the Pi-holes works fine)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07V5JTMV9&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB: Best for: Running Pi-hole servers as described in the post. Why it fits this post: Low-power, affordable, and widely used for Pi-hole deployment…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;RaspberryPi 4GB - Must have for this build.&lt;/strong&gt;&lt;br&gt;
Quiet, cheap, and plenty for Pi-hole + Nebula Sync.&lt;br&gt;
If you’re doing heavy DNS for a big network, use a small x86 box instead.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;example-setup&#34;&gt;Example Setup
&lt;/h3&gt;&lt;p&gt;Throughout this guide, I&amp;rsquo;ll use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pihole1&lt;/code&gt; at 192.168.1.10 (Primary)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pihole2&lt;/code&gt; at 192.168.1.11 (Replica)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Swap in your own IPs. You can add more replicas later.&lt;/p&gt;
&lt;h3 id=&#34;check-pi-hole-versions-important&#34;&gt;Check Pi-hole Versions (Important)
&lt;/h3&gt;&lt;p&gt;Log into each &lt;code&gt;pihole/admin&lt;/code&gt; dashboard and check the version at the bottom of the page.&lt;/p&gt;
&lt;p&gt;Keep all nodes on the same major version, ideally v6.x. Mixing versions causes weird issues. If they don&amp;rsquo;t match, update each node:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pihole -up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;decide-where-nebula-sync-will-run&#34;&gt;Decide Where Nebula Sync Will Run
&lt;/h3&gt;&lt;p&gt;Two common options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Option A (simplest)&lt;/strong&gt;: Run Nebula Sync as a Docker container on the primary Pi-hole.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Option B&lt;/strong&gt;: Run it on a separate Docker host that can reach all Pi-hole admin URLs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most people, Option A is easiest.&lt;/p&gt;
&lt;h2 id=&#34;step-1-verify-each-pi-hole-works-standalone&#34;&gt;Step 1: Verify Each Pi-hole Works Standalone
&lt;/h2&gt;&lt;p&gt;Don&amp;rsquo;t skip this. If a Pi-hole is broken before you sync it, you&amp;rsquo;ll just spread the brokenness around.&lt;/p&gt;
&lt;p&gt;On &lt;strong&gt;each&lt;/strong&gt; Pi-hole:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;http://&amp;lt;pihole-ip&amp;gt;/admin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Log in with the admin password.&lt;/li&gt;
&lt;li&gt;Confirm the dashboard loads and shows recent queries.&lt;/li&gt;
&lt;li&gt;From the terminal, tail logs:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pihole -t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;From a client device, temporarily set DNS to only that Pi-hole and browse a few sites.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If DNS queries show up in the log, you&amp;rsquo;re good. If not, fix networking or service issues before moving on.&lt;/p&gt;
&lt;h2 id=&#34;step-2-gather-urls-and-credentials&#34;&gt;Step 2: Gather URLs and Credentials
&lt;/h2&gt;&lt;p&gt;Nebula Sync talks to Pi-hole via the web API, so you need the exact URLs and passwords.&lt;/p&gt;
&lt;p&gt;For each Pi-hole, write down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full admin URL, including &lt;code&gt;/admin&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;http://192.168.1.10/admin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Admin password&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nebula expects this format:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;URL|password
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Example:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://192.168.1.10/admin|SuperSecretPassword
&lt;/code&gt;&lt;/pre&gt;







  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    About 80% of sync failures happen because someone forgot &lt;code&gt;/admin&lt;/code&gt; at the end of the URL. Don&amp;rsquo;t be that person.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-3-create-a-nebula-sync-docker-compose-file&#34;&gt;Step 3: Create a Nebula Sync Docker Compose File
&lt;/h2&gt;&lt;p&gt;Most people deploy Nebula Sync with Docker Compose or Portainer.&lt;/p&gt;
&lt;h3 id=&#34;example-composeyml&#34;&gt;Example &lt;code&gt;compose.yml&lt;/code&gt;
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nebula-sync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ghcr.io/lovelaze/nebula-sync:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nebula-sync&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PRIMARY=http://192.168.1.10/admin|PRIMARY_PASSWORD&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;REPLICAS=http://192.168.1.11/admin|REPLICA_PASSWORD&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;FULL_SYNC=true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;RUN_GRAVITY=true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;CRON=*/5 * * * *&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace the URLs and passwords with your actual ones.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Putting passwords directly in the compose file works but isn&amp;rsquo;t great. For better security, use a &lt;code&gt;.env&lt;/code&gt; file:
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Do this instead from the same directory where your &lt;code&gt;compose.yaml&lt;/code&gt; file lives&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano .env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and paste this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_PRIMARY_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://192.168.1.10/admin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_PRIMARY_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;YourSecretPassword
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_SECONDARY_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://192.168.1.11/admin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_SECONDARY_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;YourSecretPassword
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then reference them in compose like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nv&#34;&gt;PRIMARY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_PRIMARY_URL&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_PRIMARY_PASSWORD&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nv&#34;&gt;REPLICAS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_SECONDARY_URL&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PIHOLE_SECONDARY_PASSWORD&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can share your compose file and not have to worry about removing the password.&lt;/p&gt;
&lt;h3 id=&#34;example-2-env-composeyaml&#34;&gt;Example 2 .env &lt;code&gt;compose.yaml&lt;/code&gt;
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nebula-sync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ghcr.io/lovelaze/nebula-sync:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nebula-sync&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PRIMARY=${PIHOLE_PRIMARY_URL}|${PIHOLE_PRIMARY_PASSWORD}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;REPLICAS=${PIHOLE_SECONDARY_URL}|${PIHOLE_SECONDARY_PASSWORD}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;FULL_SYNC=true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;RUN_GRAVITY=true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;CRON=*/5 * * * *&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;key-environment-variables-explained&#34;&gt;Key Environment Variables Explained
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PRIMARY&lt;/strong&gt;: The Pi-hole you&amp;rsquo;ll always edit manually. This is your source of truth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REPLICAS&lt;/strong&gt;: Pi-holes that receive config from the primary. Separate multiple with spaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FULL_SYNC&lt;/strong&gt;: Set to &lt;code&gt;true&lt;/code&gt; to sync everything Nebula supports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RUN_GRAVITY&lt;/strong&gt;: Tells Pi-hole to run gravity after syncing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCHEDULE&lt;/strong&gt;: Cron-style interval. &lt;code&gt;*/5 * * * *&lt;/code&gt; means every 5 minutes, a good starting point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Common mistakes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Missing &lt;code&gt;/admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wrong &lt;code&gt;http://&lt;/code&gt; vs &lt;code&gt;https://&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Typos in passwords&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-4-deploy-nebula-sync&#34;&gt;Step 4: Deploy Nebula Sync
&lt;/h2&gt;&lt;p&gt;From the directory containing your compose file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then check logs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker logs -f nebula-sync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What you want to see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Successful connection to primary&lt;/li&gt;
&lt;li&gt;Sync operations targeting replicas&lt;/li&gt;
&lt;li&gt;No authentication or connection errors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you see authentication errors, double-check those URLs and passwords. Connection errors? Verify HTTP vs HTTPS and make sure you can load the admin pages in a browser from the Docker host.&lt;/p&gt;
&lt;h2 id=&#34;step-5-first-sync-test-with-gravity-and-blocklists&#34;&gt;Step 5: First Sync Test with Gravity and Blocklists
&lt;/h2&gt;&lt;p&gt;Time to confirm real data is syncing.&lt;/p&gt;
&lt;p&gt;On the &lt;strong&gt;primary Pi-hole&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Group Management &amp;gt; Adlists&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add a test blocklist or toggle an existing one.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save and Update&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Wait for the next Nebula run (or restart the container because who has patience?).&lt;/p&gt;
&lt;p&gt;On the &lt;strong&gt;replica&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;/admin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Group Management &amp;gt; Adlists&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm the new list appears and domain counts match closely.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If it&amp;rsquo;s there, gravity syncing works. Nice.&lt;/p&gt;
&lt;h2 id=&#34;step-6-sync-local-dns-and-custom-entries&#34;&gt;Step 6: Sync Local DNS and Custom Entries
&lt;/h2&gt;&lt;p&gt;This is where Nebula Sync really shines compared to older tools. Custom DNS entries sync automatically.&lt;/p&gt;
&lt;p&gt;On the &lt;strong&gt;primary&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Local DNS &amp;gt; DNS Records&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add:
&lt;ul&gt;
&lt;li&gt;Hostname: &lt;code&gt;tim.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;IP: &lt;code&gt;10.0.0.50&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After the next sync:&lt;/p&gt;
&lt;p&gt;On the &lt;strong&gt;replica&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Local DNS &amp;gt; DNS Records&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for &lt;code&gt;tim.example.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Confirm it exists and points to the same IP.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Test it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nslookup tim.example.com 192.168.1.11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should get &lt;code&gt;10.0.0.50&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;step-7-day-to-day-workflow-primaryreplica-rules&#34;&gt;Step 7: Day-to-Day Workflow (Primary/Replica Rules)
&lt;/h2&gt;&lt;p&gt;Once everything&amp;rsquo;s working, the rules are simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Always&lt;/strong&gt; make changes on the primary Pi-hole.&lt;/li&gt;
&lt;li&gt;Treat replicas as &lt;strong&gt;read-only&lt;/strong&gt; in the UI.&lt;/li&gt;
&lt;li&gt;Let Nebula Sync handle propagation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can adjust the sync frequency if needed. For most homelabs, every 5 to 15 minutes works well. More frequent syncing means less drift time but more API calls hitting your Pi-holes.&lt;/p&gt;
&lt;h2 id=&#34;step-8-router-and-client-dns-configuration&#34;&gt;Step 8: Router and Client DNS Configuration
&lt;/h2&gt;&lt;p&gt;To actually benefit from multiple Pi-holes, clients need to know about them.&lt;/p&gt;
&lt;h3 id=&#34;simple-setup-two-dns-ips&#34;&gt;Simple Setup: Two DNS IPs
&lt;/h3&gt;&lt;p&gt;In your router&amp;rsquo;s DHCP settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS 1: 192.168.1.10&lt;/li&gt;
&lt;li&gt;DNS 2: 192.168.1.11&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clients automatically fail over if one Pi-hole is unavailable. It&amp;rsquo;s not instant, but it works.&lt;/p&gt;
&lt;h3 id=&#34;advanced-option-virtual-ip&#34;&gt;Advanced Option: Virtual IP
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;re feeling ambitious, tools like keepalived can give you a single virtual IP that floats between Pi-holes. This is optional and overkill for most people.&lt;/p&gt;
&lt;h2 id=&#34;step-9-testing-failover-and-basic-pi-hole-tests&#34;&gt;Step 9: Testing Failover and Basic Pi-hole Tests
&lt;/h2&gt;&lt;p&gt;Make sure your redundancy actually works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ensure clients receive both DNS IPs from DHCP.&lt;/li&gt;
&lt;li&gt;Stop Pi-hole on the primary or reboot the server.&lt;/li&gt;
&lt;li&gt;Browse the web from a client.&lt;/li&gt;
&lt;li&gt;Check the replica&amp;rsquo;s &lt;strong&gt;Query Log&lt;/strong&gt; for activity.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Useful commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pihole -t&lt;/code&gt; to watch live queries&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dig&lt;/code&gt; or &lt;code&gt;nslookup&lt;/code&gt; against each Pi-hole IP&lt;/li&gt;
&lt;li&gt;Visit ad-heavy sites and confirm blocks appear&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-10-maintenance-and-updates&#34;&gt;Step 10: Maintenance and Updates
&lt;/h2&gt;&lt;h3 id=&#34;updating-pi-hole&#34;&gt;Updating Pi-hole
&lt;/h3&gt;&lt;p&gt;On each node:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pihole -up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keep versions aligned to avoid API mismatches.&lt;/p&gt;
&lt;h3 id=&#34;updating-nebula-sync&#34;&gt;Updating Nebula Sync
&lt;/h3&gt;&lt;p&gt;From the compose directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose pull
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;backup-strategy&#34;&gt;Backup Strategy
&lt;/h3&gt;&lt;p&gt;Before major changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Export Pi-hole config from the primary&lt;/li&gt;
&lt;li&gt;Keep a copy offline&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If something breaks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stop the Nebula container.&lt;/li&gt;
&lt;li&gt;Restore the primary from backup.&lt;/li&gt;
&lt;li&gt;Restart Nebula Sync.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;troubleshooting-common-problems&#34;&gt;Troubleshooting Common Problems
&lt;/h2&gt;&lt;h3 id=&#34;quick-troubleshooting-table&#34;&gt;Quick Troubleshooting Table
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Symptom&lt;/th&gt;
          &lt;th&gt;Likely cause&lt;/th&gt;
          &lt;th&gt;Fix&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Authentication errors in Nebula logs&lt;/td&gt;
          &lt;td&gt;Wrong password or URL format&lt;/td&gt;
          &lt;td&gt;Re-check password and make sure the URL includes &lt;code&gt;/admin&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Connection errors / timeouts&lt;/td&gt;
          &lt;td&gt;Wrong scheme (HTTP vs HTTPS) or network issues&lt;/td&gt;
          &lt;td&gt;Verify &lt;code&gt;http://&lt;/code&gt; vs &lt;code&gt;https://&lt;/code&gt;, check firewalls, make sure the admin UI loads in a browser&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Changes not appearing on replicas&lt;/td&gt;
          &lt;td&gt;FULL_SYNC disabled, schedule not running, or edits made on replica&lt;/td&gt;
          &lt;td&gt;Confirm &lt;code&gt;FULL_SYNC=true&lt;/code&gt;, check logs for runs, only edit the primary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Nodes drift after updates&lt;/td&gt;
          &lt;td&gt;Mixed major versions&lt;/td&gt;
          &lt;td&gt;Upgrade all nodes; don&amp;rsquo;t mix v5 and v6&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Expecting DHCP to sync&lt;/td&gt;
          &lt;td&gt;Not supported&lt;/td&gt;
          &lt;td&gt;Keep DHCP on router or manage separately&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;nebula-sync-fails-authentication&#34;&gt;Nebula Sync Fails Authentication
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Double-check admin passwords.&lt;/li&gt;
&lt;li&gt;Confirm &lt;code&gt;/admin&lt;/code&gt; is included in the URL.&lt;/li&gt;
&lt;li&gt;Verify HTTP vs HTTPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;changes-not-appearing-on-replicas&#34;&gt;Changes Not Appearing on Replicas
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Confirm &lt;code&gt;FULL_SYNC=true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check Nebula logs for recent runs.&lt;/li&gt;
&lt;li&gt;Make sure changes were made on the primary only.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;mixed-pi-hole-versions&#34;&gt;Mixed Pi-hole Versions
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Upgrade all nodes to the same major version.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t mix v5 and v6.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;dhcp-expectations&#34;&gt;DHCP Expectations
&lt;/h3&gt;&lt;p&gt;Nebula Sync does &lt;strong&gt;not&lt;/strong&gt; sync DHCP settings or leases. Keep DHCP on your router or manage it separately.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0FBWGBVZ2&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/beelink.jpg&#34; alt=&#34;Beelink SER5 (Ryzen 5 5600H): Best for: Users seeking a quiet, compact upgrade from Raspberry Pi for Pi-hole and light Docker stacks. Why it fits this post: …&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Beelink SER5 (Ryzen 5 5600H) Nice to have, not required.&lt;/strong&gt;&lt;br&gt;
Best for people upgrading from a Raspberry Pi who want Pi-hole plus extra Docker containers without lag, but it costs more and uses more power than a Pi.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45HW6CT&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;faqs-nebula-sync--pi-hole&#34;&gt;FAQs (Nebula Sync + Pi-hole)
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I sync more than two Pi-hole servers with Nebula Sync?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;p&gt;Yes. Define one primary and add multiple replicas in the &lt;code&gt;REPLICAS&lt;/code&gt; variable.
Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;l&#34;&gt;REPLICAS=http://ph2.example.com|password,http://ph3.example.com|password&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or with env:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;l&#34;&gt;REPLICAS=${PIHOLE_SECONDARY_URL}|${PIHOLE_SECONDARY_PASSWORD},${PIHOLE_TERTIARY_URL}|${PIHOLE_TERTIARY_PASSWORD}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I have to run Nebula Sync in Docker?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Docker is the most common and easiest approach for updates and isolation.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ oes Nebula Sync work with Pi-hole v6?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. It&amp;rsquo;s designed around Pi-hole v6&amp;rsquo;s web API and HTTPS admin interface.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Will Nebula Sync keep DHCP settings in sync?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No. DHCP settings and leases are node-specific and don&amp;rsquo;t sync.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I edit settings directly on replicas?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;You can, but Nebula will overwrite them on the next run. Save yourself the headache and only edit the primary.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What happens if a replica is offline during sync?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Nebula will fail that run and catch up when the replica comes back online.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is it safe to mix HTTP and HTTPS?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes, as long as each Pi-hole is defined with the correct scheme in Nebula&amp;rsquo;s config.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How often should I run the sync?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Every 5 to 15 minutes is typical for homelabs.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I still need to run `pihole -g` on replicas?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No. Run it on the primary only. Nebula syncs the results.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I test that everything works?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Add a test DNS record or blocklist on the primary and confirm it appears and functions on replicas.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Running multiple Pi-hole servers for redundancy is great until you realize you&amp;rsquo;ve tripled your management overhead. Nebula Sync fixes this by letting you treat one Pi-hole as the source of truth and having the rest automatically mirror it.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re tired of juggling multiple &lt;code&gt;pihole/admin&lt;/code&gt; pages and trying to remember which server has the latest config, this setup changes everything. Start with two nodes, get comfortable with the workflow, then add more as you need them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next steps&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Experiment with sync schedules&lt;/li&gt;
&lt;li&gt;Add a third replica&lt;/li&gt;
&lt;li&gt;Explore virtual IP failover if you want true high availability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&amp;rsquo;ve got this running, you won&amp;rsquo;t go back to manual Pi-hole updates.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D454DQSP&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ms-01.jpg&#34; alt=&#34;MINISFORUM MS-01 Mini Workstation: Best for: Readers planning to expand beyond Pi-hole to VMs, containers, or more demanding homelab tasks. Why it fits this …&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-01 Mini Optional upgrade.&lt;/strong&gt;&lt;br&gt;
Best for stepping up from Pi-hole into a Proxmox mini-lab with serious networking thanks to built-in 10GbE and 2.5GbE, but it’s unnecessary overkill if you’re only doing simple Pi-hole sync.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4p3HhTI&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458318191324330626506341&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fminisforum-barebone-systems-mini-pc-intel-core-i5-12600h%2fp%2f2SW-002G-000K9%3fitem%3d9SIBJ6VKBD4204&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Best Proxmox Backup Server Setup (2025): Backups That Actually Work</title>
        <link>https://diymediaserver.com/post/media-server-backup-2025/</link>
        <pubDate>Mon, 01 Dec 2025 05:04:02 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/media-server-backup-2025/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/media-server-backup-2025/featured.jpg" alt="Featured image of post Best Proxmox Backup Server Setup (2025): Backups That Actually Work" /&gt;&lt;p&gt;I deleted my entire photo library.&lt;/p&gt;
&lt;p&gt;~40,000 photos. Years of memories. Gone in the time it takes to hit enter.&lt;/p&gt;
&lt;p&gt;I was in the Proxmox shell, typing a command to delete an LXC I didn&amp;rsquo;t need anymore. I fat-fingered the ID. The wrong container vanished. My Immich server. The thing that held every family photo, every vacation, every moment my wife cared about preserving.&lt;/p&gt;
&lt;p&gt;I knew what I did the instant I hit enter. That sick feeling in your stomach when you realize you just deleted something that matters.&lt;/p&gt;
&lt;p&gt;The photos themselves were fine. I had those backed up separately. But the albums? The organization? The metadata? The hundreds of hours my wife spent sorting and curating everything? That was gone.&lt;/p&gt;
&lt;p&gt;It took several days of painstaking work to put it all back. Re-creating albums. Re-adding photos to albums. My wife&amp;rsquo;s reaction was&amp;hellip; let&amp;rsquo;s just say worse than when the internet went down for a few hours.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s when I stopped telling myself I&amp;rsquo;d set up proper backups &amp;ldquo;eventually.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I pulled an old DOGE mining rig from 2013 out of the closet, bought a cheap 2U case, and had Proxmox Backup Server running a few hours later.&lt;/p&gt;
&lt;p&gt;Now when things break I don&amp;rsquo;t worry about it, I just restore the backup that is always less than 24hrs old.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
ZFS, RAID, and snapshots are not backups. A dedicated Proxmox Backup Server gives you image based backups of your VMs, LXCs, and configs on a separate box. That means you can break your Proxmox compute node, or even replace it, and bring everything back in minutes instead of days.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B075WYBQXJ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate-8tb.jpg&#34; alt=&#34;Seagate BarraCuda Internal Hard Drive 8TB Right now one of the best price per GB you can find. Also has a 2-year warranty.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate BarraCuda Internal Hard Drive 8TB&lt;/strong&gt;&lt;br&gt;
Right now one of the best price per GB you can find. Also has a 2-year warranty.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/47Joeb4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458310628236000921814966&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2f1Z4-002P-02KV1%3fitem%3d9SIA8N2KNP7346&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;everyone-talks-about-backups-almost-nobody-actually-has-them&#34;&gt;Everyone Talks About Backups. Almost Nobody Actually Has Them.
&lt;/h2&gt;&lt;p&gt;You tell yourself the same thing everyone else does:&lt;br&gt;
&amp;ldquo;I have ZFS, I am fine.&amp;rdquo;&lt;br&gt;
&amp;ldquo;I have RAID, I am fine.&amp;rdquo;&lt;br&gt;
&amp;ldquo;I have snapshots, I am fine.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Before I built my backup server, I lost data more than once. I broke VMs trying to optimize things. I had to rebuild LXCs from scratch because I thought I was careful enough to not need backups. Then I thought &amp;ldquo;I use Ansible playbooks and I can reconfigure services quickly&amp;rdquo;, but Ansible doesn&amp;rsquo;t restore your actual data.&lt;/p&gt;
&lt;p&gt;When my all-in-one server PSU died while I was at work. It took out the router, storage, and compute all at once. When it was fixed, two VMs wouldn&amp;rsquo;t boot. Likely corruption from the sudden power loss.&lt;/p&gt;
&lt;p&gt;But I still didn&amp;rsquo;t build a backup server. Adding another box meant:&lt;br&gt;
More power draw.&lt;br&gt;
More complexity.&lt;br&gt;
More things to maintain and update.&lt;/p&gt;
&lt;p&gt;Then I deleted Immich.&lt;/p&gt;
&lt;p&gt;That was the line.&lt;/p&gt;
&lt;h2 id=&#34;what-proxmox-backup-server-actually-is&#34;&gt;What Proxmox Backup Server Actually Is
&lt;/h2&gt;&lt;p&gt;Proxmox Backup Server, or PBS, is not a fancy rsync script. It is a dedicated backup appliance for Proxmox.&lt;/p&gt;
&lt;p&gt;It does image level backups of LXCs and VMs. That means it backs up the whole guest, not just a few config files you hope you got right. When you restore, you are putting the entire VM or container back exactly how it was.&lt;/p&gt;
&lt;p&gt;Core PBS features you actually care about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deduplication&lt;/strong&gt;&lt;br&gt;
PBS breaks data into chunks and reuses them across backups. Ten backups of the same VM do not use ten times the space.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Incremental backups&lt;/strong&gt;&lt;br&gt;
The first backup is large. After that, PBS only stores the changes. That means daily backups are actually realistic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retention and pruning&lt;/strong&gt;&lt;br&gt;
You can set rules like &amp;ldquo;keep 7 daily, 4 weekly, 6 monthly&amp;rdquo; and PBS will handle cleanup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;br&gt;
PBS can verify that backups are readable. That is the part most people skip until it is too late.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Encryption, if you want it&lt;/strong&gt;&lt;br&gt;
Helpful if the box is in a location you do not fully trust.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Short version. PBS is the ctrl-z for your Proxmox stack.&lt;/p&gt;
&lt;h2 id=&#34;why-the-backup-node-needs-its-own-box&#34;&gt;Why The Backup Node Needs Its Own Box
&lt;/h2&gt;&lt;p&gt;If you run PBS on the same hardware you are backing up, you are not doing backups. You are making local copies and hoping the box never dies.&lt;/p&gt;
&lt;p&gt;Backups should live on different hardware. Period.&lt;/p&gt;
&lt;p&gt;Here is why PBS needs to be a separate node and not just a VM with to everything else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hardware failure isolation&lt;/strong&gt;&lt;br&gt;
If your compute node dies, you still have PBS. You can rebuild a fresh Proxmox host, reconnect it to PBS, and start restoring guests. If PBS lived on that same dead box, you would be staring at a pile of useless backups on disks you cannot even boot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NAS failure isolation&lt;/strong&gt;&lt;br&gt;
Same story for storage. If your NAS dies and PBS is just another datastore on that NAS, you lose both the source and the backups in one shot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security isolation&lt;/strong&gt;&lt;br&gt;
If something nasty gets into your compute node or NAS, it should not be able to casually wipe your backups. PBS on its own box, with good firewall rules, is much harder to wipe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Upgrade and experiment freedom&lt;/strong&gt;&lt;br&gt;
You want to be able to reinstall Proxmox on the compute node without touching PBS. You want to be able to test new Proxmox versions, new kernels, new storage layouts. That is only safe if your backups live somewhere else.&lt;/p&gt;
&lt;p&gt;One simple rule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the thing you are backing up and the backup live on the same physical box, you do not have a backup. You have a copy.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;how-i-finally-built-this-thing&#34;&gt;How I Finally Built This Thing
&lt;/h2&gt;&lt;p&gt;After the Immich incident, I was done making excuses.&lt;/p&gt;
&lt;p&gt;I had an old DOGE mining rig from 2013 sitting in a closet. Yes, a DOGE mining rig. That hardware bought during the peak of meme cryptocurrency mania was about to become the most critical piece of infrastructure in my homelab.&lt;/p&gt;
&lt;p&gt;Intel G1610 CPU.&lt;br&gt;
GIGABYTE GA-B75M-D3H motherboard.&lt;br&gt;
16GB of RAM that probably worth more than the entire rig today (Thanks AI).&lt;/p&gt;
&lt;p&gt;It never made me any money mining Dogecoin. But it was about to save my ass repeatedly.&lt;/p&gt;
&lt;p&gt;I bought a cheap 2U Rosewill case and moved everything over. A few hours later, PBS was running.&lt;/p&gt;
&lt;p&gt;I threw in a 128GB SSD for the PBS system and 2 4TB HDDs for backup storage. That was it.&lt;br&gt;
Total cost: ~$100 for the case.&lt;br&gt;
I had some old drives on hand for the OS and storage.&lt;/p&gt;
&lt;p&gt;Now that ancient hardware backs up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8 VMs&lt;/li&gt;
&lt;li&gt;12 LXCs&lt;/li&gt;
&lt;li&gt;Everything that matters in my homelab&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most guests get nightly backups. A few less critical ones get weekly backups. I keep 4 nightly backups, one monthly, then everything older gets auto pruned. And thanks to deduplication, I am only using 12% of the available storage.&lt;/p&gt;
&lt;p&gt;If a CPU that once supported mining joke cryptocurrency can handle PBS for 20 guests, you do not need to overthink your hardware.&lt;/p&gt;
&lt;p&gt;The first thing I did after getting PBS up and running was testing a restore. I picked my backup Pi-hole server since I run two and losing one wouldn&amp;rsquo;t matter. I backed it up. Then I deleted it on purpose.&lt;/p&gt;
&lt;p&gt;Five minutes later it was back. Running. Working. Like nothing happened.&lt;/p&gt;
&lt;p&gt;The relief I felt was immense. A weight I didn&amp;rsquo;t even realize I was carrying just lifted. All those years of anxiety about breaking things. All those careful, tentative changes to production services. All that tiptoeing around my own infrastructure. Gone.&lt;/p&gt;
&lt;p&gt;This actually worked.&lt;/p&gt;
&lt;p&gt;I have restored several LXCs and VMs at least two dozen times since then. Testing migrations. Trying new features. Breaking things to see what happens. Every time it is five minutes to get back to working.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0B6382TTS&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/rosewill-helix.jpg&#34; alt=&#34;Rosewill FBM-X2-400-HELIX: Compact Micro ATX tower with a pre-installed 400 W PSU, room for multiple 2.5 and 3.5 inch drives, and enough airflow options for a tidy budget backup server build.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Rosewill FBM-X2-400-HELIX&lt;/strong&gt;&lt;br&gt;
Compact Micro ATX tower with a pre-installed 400 W PSU, room for multiple 2.5 and 3.5 inch drives, and enough airflow options for a tidy budget backup server build.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4pGVNQZ&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445837770657519695973387&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2frosewill-mini-tower-steel-plastic-computer-case-black-fbm-x2-400%2fp%2fN82E16811147334%3fitem%3dN82E16811147334&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;how-pbs-backs-up-proxmox-better-than-your-scripts&#34;&gt;How PBS Backs Up Proxmox Better Than Your Scripts
&lt;/h2&gt;&lt;p&gt;You can absolutely hack together backups with rsync, tar, and hope. You can write bash scripts that dump configs and copy directories.&lt;/p&gt;
&lt;p&gt;PBS is better for one reason. It speaks Proxmox.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PBS uses datastores&lt;/strong&gt;&lt;br&gt;
You create one or more datastores on the PBS box. These are just directories on disks, usually large HDDs or SSDs. Proxmox guests get backed up into those datastores.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backups are chunked and deduped&lt;/strong&gt;&lt;br&gt;
PBS stores data in chunks. If several VMs or containers share the same data, PBS stores that data once and references it many times. This reduces space and makes incrementals light.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backups are incremental&lt;/strong&gt;&lt;br&gt;
First backup is full. After that, PBS only needs changed chunks. You can run nightly backups without filling disks in a week.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backups are guest aware&lt;/strong&gt;&lt;br&gt;
VM backups use snapshot mechanisms correctly. LXC backups include config and data in a consistent way. You are not racing writes like you might be with raw rsync.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Restores are simple&lt;/strong&gt;&lt;br&gt;
From the Proxmox UI you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restore a VM or LXC when you break it&lt;/li&gt;
&lt;li&gt;Restore to a new ID so you can test first&lt;/li&gt;
&lt;li&gt;Move a guest to a different node during restore (I use this on a lot)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don&amp;rsquo;t need to hunt down that random blog post you followed three months ago. You don&amp;rsquo;t need to remember which flags you used or how you configured the service. PBS gives you the entire machine, exactly as it was before you broke it.&lt;/p&gt;
&lt;h2 id=&#34;what-you-should-back-up-with-pbs&#34;&gt;What You Should Back Up With PBS
&lt;/h2&gt;&lt;p&gt;You probably do not need to PBS your entire lab. Backup the things that matter most.&lt;/p&gt;
&lt;p&gt;Back up with PBS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;VMs that matter&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker stack VM&lt;/li&gt;
&lt;li&gt;Home Assistant or other important services&lt;/li&gt;
&lt;li&gt;Anything with a non-trivial config that would suck to rebuild&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LXC containers that matter&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reverse proxy&lt;/li&gt;
&lt;li&gt;DNS Servers&lt;/li&gt;
&lt;li&gt;Ansible and Playbooks&lt;/li&gt;
&lt;li&gt;Jellyfin / Plex&lt;/li&gt;
&lt;li&gt;Your media stack if you like LXCs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;things-that-pbs-is-not-ideal-for&#34;&gt;Things that PBS is not ideal for
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Huge media libraries&lt;/strong&gt;&lt;br&gt;
40 TB of movies do not belong in PBS. That is what your NAS redundancy is for. Worst case, you redownload.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cold archives for years&lt;/strong&gt;&lt;br&gt;
You can keep long retention if you want to, but PBS is best for working backups of services, not glacier style storage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    If it would take you hours to reconfigure by hand, put it in PBS. If you can redownload or recreate it easily, do not waste PBS space on it.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;a-backup-strategy-that-does-not-suck&#34;&gt;A Backup Strategy That Does Not Suck
&lt;/h2&gt;&lt;p&gt;You need something simple enough that you will actually keep it.&lt;/p&gt;
&lt;p&gt;Here is what I run and it works well:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schedules&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nightly backups for critical VMs and LXCs (Immich, Home Assistant, reverse proxy, databases)&lt;/li&gt;
&lt;li&gt;Weekly backups for less critical stuff (test environments, secondary services)&lt;/li&gt;
&lt;li&gt;Backup window at 2am when nobody is streaming&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Retention&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep 4 backups total&lt;/li&gt;
&lt;li&gt;One monthly snapshot&lt;/li&gt;
&lt;li&gt;Everything older gets pruned automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives me short term protection against bad updates and my own stupid mistakes without eating up too much storage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Turn on verification jobs, so PBS periodically checks backups for corruption. It is not enough to have files. You need files that actually restore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lightweight 3 2 1 (Future Goal)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you want to get fancy later:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;3 copies of important data&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Running VM or LXC&lt;/li&gt;
&lt;li&gt;PBS backup&lt;/li&gt;
&lt;li&gt;Optional offsite copy of PBS datastore or config&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2 types of media&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal PBS disk&lt;/li&gt;
&lt;li&gt;External USB drive or another storage box&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 offsite&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Could be a cloud bucket, a box at a friend&amp;rsquo;s house, whatever&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not overthink this from day one. Get PBS on a separate box first. Get nightly backups running. Then start thinking about offsite copies.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;networking-and-security-for-pbs&#34;&gt;Networking And Security For PBS
&lt;/h2&gt;&lt;p&gt;This box protects everything else. Do not just drop it on the same flat network as your kids tablets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep it on a management VLAN&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Put PBS on a subnet used for servers and admin stuff&lt;/li&gt;
&lt;li&gt;Only Proxmox nodes and your admin machine should talk to it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Lock down firewall rules&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow only Proxmox hosts and your admin box to connect on PBS ports&lt;/li&gt;
&lt;li&gt;Block general LAN clients from hitting the PBS web UI directly&lt;/li&gt;
&lt;li&gt;No random IoT gear or smart TVs talking to PBS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No direct internet exposure&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do not port forward PBS from your router&lt;/li&gt;
&lt;li&gt;If you need remote access, go through VPN
&lt;ul&gt;
&lt;li&gt;Tailscale, WireGuard, or a similar tunnel from your admin PC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;PBS doesn&amp;rsquo;t need to be a fortress, but it does need to be harder to reach and harder to destroy than the machines it is backing up.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;hardware-for-a-pbs-node&#34;&gt;Hardware For A PBS Node
&lt;/h2&gt;&lt;p&gt;Good news. This box does not need to be powerful. It just needs to be reliable and have enough disk.&lt;/p&gt;
&lt;p&gt;Here is what I am actually running:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My PBS Build (2013 DOGE Mining Rig)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The hardware that failed to make me rich mining meme cryptocurrency in 2013 is now the backbone of my backup strategy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: Intel G1610 (a decade old dual core)&lt;/li&gt;
&lt;li&gt;Motherboard: GIGABYTE GA-B75M-D3H&lt;/li&gt;
&lt;li&gt;RAM: 16GB&lt;/li&gt;
&lt;li&gt;System: 128GB SSD&lt;/li&gt;
&lt;li&gt;Storage: 2 Mirrored 4TB HDDs&lt;/li&gt;
&lt;li&gt;Case: 2U Rosewill&lt;/li&gt;
&lt;li&gt;Backing up: 8 VMs and 12 LXCs&lt;/li&gt;
&lt;li&gt;Current usage: 12% of 4TB after months of nightly/monthly backups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If this ancient hardware can handle 20 guests with daily backups, you definitely do not need to overthink it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;General Guidelines&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 to 16 GB of RAM is plenty for most homelabs&lt;/li&gt;
&lt;li&gt;Small SSD for the PBS system (128GB works fine)&lt;/li&gt;
&lt;li&gt;Big HDD or SSD for datastore (2-4TB is a good start)&lt;/li&gt;
&lt;li&gt;CPU does not matter much, disk and network do&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You probably have spare hardware sitting around that is more than capable.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0B84STHJS&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/rosewill-2U.jpg&#34; alt=&#34;This is the case I use for my PBS: It is a 2U rackmount server chassis that provides plenty of drive bays and solid airflow for a homelab or small server. It is a good pick if you want a sturdy case that can grow with your storage and hardware needs.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Rosewill RSV-Z2800U&lt;/strong&gt;&lt;br&gt;
This is the case I use for my PBS: It is a 2U rackmount server chassis that provides plenty of drive bays and solid airflow for a homelab or small server. It is a good pick if you want a sturdy case that can grow with your storage and hardware needs.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3Y0jqbk&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445837776187610420356266&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2frosewill-rsv-z2800u-silver%2fp%2fN82E16811147343%3fitem%3dN82E16811147343&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;what-happens-when-you-keep-ignoring-backups&#34;&gt;What Happens When You Keep Ignoring Backups
&lt;/h2&gt;&lt;p&gt;Eventually you will break something.&lt;/p&gt;
&lt;p&gt;Maybe it&amp;rsquo;s an update that doesn&amp;rsquo;t play nice (looking at you Jellyfin)
Maybe you type the wrong container ID in the terminal. A typo that destroys a something important.&lt;/p&gt;
&lt;p&gt;Without PBS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stare at the error&lt;/li&gt;
&lt;li&gt;Dig through old blog posts to remember your setup&lt;/li&gt;
&lt;li&gt;Reinstall services one by one&lt;/li&gt;
&lt;li&gt;Fix permissions and rewire configs&lt;/li&gt;
&lt;li&gt;Hours disappear&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With PBS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open Proxmox&lt;/li&gt;
&lt;li&gt;Click restore&lt;/li&gt;
&lt;li&gt;Pick last night&amp;rsquo;s backup&lt;/li&gt;
&lt;li&gt;Wait five minutes&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last month I upgraded Jellyfin from 10.10.07 to 10.11. The database migration failed. Pre-PBS that would have been a full day to rebuild and rescan my media. With PBS it was a five minute restore.&lt;/p&gt;
&lt;p&gt;Before PBS, I had anxiety about touching production services. I tiptoed around my own lab.&lt;/p&gt;
&lt;p&gt;Now I experiment freely. I test upgrades without fear. I try new configurations to see what breaks. Worst case, I lose 24 hours of data and spend five minutes on a restore.&lt;/p&gt;
&lt;h2 id=&#34;simple-setup-flow&#34;&gt;Simple Setup Flow
&lt;/h2&gt;&lt;p&gt;Here is the high level checklist. You do not need a full tutorial to get started.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Grab a spare box or mini PC (seriously, check your closet)&lt;/li&gt;
&lt;li&gt;Install Proxmox Backup Server on it&lt;/li&gt;
&lt;li&gt;Add a datastore on a big disk&lt;/li&gt;
&lt;li&gt;On your Proxmox compute node, add PBS as a backup remote&lt;/li&gt;
&lt;li&gt;Create backup jobs for the VMs and LXCs that matter
&lt;ul&gt;
&lt;li&gt;Daily schedule for critical stuff&lt;/li&gt;
&lt;li&gt;Weekly for everything else&lt;/li&gt;
&lt;li&gt;Reasonable retention rules (start simple)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run the first backup and watch it complete&lt;/li&gt;
&lt;li&gt;Do a test restore into a new VM or LXC ID&lt;/li&gt;
&lt;li&gt;Confirm the restored guest actually boots and works&lt;/li&gt;
&lt;li&gt;Optionally: delete something on purpose just to prove you can get it back&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After that, backups go from &amp;ldquo;I should do something&amp;rdquo; to &amp;ldquo;this is just part of how the stack runs&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s Next
&lt;/h2&gt;&lt;p&gt;At this point you have four roles in your on prem cloud:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Router at the edge&lt;/li&gt;
&lt;li&gt;NAS for storage&lt;/li&gt;
&lt;li&gt;Compute for apps and services&lt;/li&gt;
&lt;li&gt;Backup to save you from your own bad decisions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And this backup server? It is the one that lets you sleep at night.&lt;/p&gt;
&lt;h2 id=&#34;series-navigation&#34;&gt;Series Navigation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post//media-server-hardware-guide-2025&#34; &gt;Part 1 - The 3 Boxes That Run Your Media Server (2025 Edition)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-router-2025&#34; &gt;Part 2 - Why Your ISP Router Is Killing Your Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-storage-2025&#34; &gt;Part 3 - Your Storage Deserves Its Own Box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-compute-2025&#34; &gt;Part 4 - Proxmox Is Your New Best Friend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-backup-2025&#34; &gt;Part 5 - Backups That Actually Work (With PBS)&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Best Proxmox Compute Server Builds (2025): Why Your Homelab Needs a Dedicated Compute Node</title>
        <link>https://diymediaserver.com/post/media-server-compute-2025/</link>
        <pubDate>Sat, 22 Nov 2025 06:35:02 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/media-server-compute-2025/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/media-server-compute-2025/featured.jpg" alt="Featured image of post Best Proxmox Compute Server Builds (2025): Why Your Homelab Needs a Dedicated Compute Node" /&gt;&lt;p&gt;It was 8 AM on a Tuesday.&lt;/p&gt;
&lt;p&gt;I was already at work when my phone rang. It was my wife: &amp;ldquo;Nothing is working this morning. No internet, no Jellyfin, nothing.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I walked her through checking the server. No lights. No fan noise. She tried the power button. Nothing.&lt;/p&gt;
&lt;p&gt;The PSU was dead. And with it? Everything. Router, storage, media server, home automation, my entire IT infrastructure in one box, dead.&lt;/p&gt;
&lt;p&gt;I left work, drove to BestBuy, bought a new PSU, and spent the next hour getting everything back online. Four hour where my wife couldn&amp;rsquo;t work from home, couldn&amp;rsquo;t stream anything, couldn&amp;rsquo;t do basic internet tasks. Outage duration: about four hours total.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s when I committed to tearing it all apart.&lt;/p&gt;
&lt;p&gt;This is Part 4 in our series, and today we&amp;rsquo;re covering the dedicated compute node. The server that runs all your applications while your router handles traffic and your NAS stores your files.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re running everything on one machine right now? This is your warning shot.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
A dedicated Proxmox compute server allows you to rebuild entire Docker stacks, snapshot VMs before risky changes, and reboot for updates. All without taking down your internet or storage. On the other hand, one box means one failure takes everything down. Three boxes means isolation, stability, and the freedom to break things safely.

&lt;/div&gt;
&lt;h2 id=&#34;why-your-homelab-needs-a-dedicated-proxmox-compute-server&#34;&gt;Why Your Homelab Needs a Dedicated Proxmox Compute Server
&lt;/h2&gt;&lt;p&gt;Running everything on one machine feels efficient. It feels smart. It is neither.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s complicated. And it&amp;rsquo;s fragile.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what actually happens when you cram routing, storage, and compute into a single Proxmox server:&lt;/p&gt;
&lt;h3 id=&#34;one-failure-takes-down-everything&#34;&gt;One failure takes down everything.
&lt;/h3&gt;&lt;p&gt;One dead PSU. One bad kernel update. One stuck VM. Suddenly your internet is gone, your files are inaccessible, and your entire household is asking when things will work again.&lt;/p&gt;
&lt;h3 id=&#34;reboots-become-a-crisis&#34;&gt;Reboots become a crisis.
&lt;/h3&gt;&lt;p&gt;Need to apply Proxmox updates? Cool. Your router goes down. Your NAS goes offline. Every service you run disappears for ten minutes while you pray everything comes back in the right order.&lt;/p&gt;
&lt;h3 id=&#34;boot-order-becomes-a-nightmare&#34;&gt;Boot order becomes a nightmare.
&lt;/h3&gt;&lt;p&gt;I ran a virtualized NAS on my all-in-one Proxmox server for way too long. Proxmox wouldn&amp;rsquo;t reliably mount NFS shares before LXCs like Jellyfin tried to start. I tried systemd automounts, autofs, custom scripts, all of it. Nothing was reliable enough. Every boot was a gamble. Would Jellyfin find its media? Would the shares even mount? I&amp;rsquo;d spend ten minutes hand-holding the server back to life, restarting services manually until everything lined up.&lt;/p&gt;
&lt;h3 id=&#34;one-workload-can-kill-everything-else&#34;&gt;One workload can kill everything else.
&lt;/h3&gt;&lt;p&gt;Kick off a Tdarr batch transcode job and watch your CPU pin at 100%. Now your router is struggling. DNS queries are timing out. Someone&amp;rsquo;s work VPN drops mid-call. All because you decided to transcode some files.&lt;/p&gt;
&lt;h3 id=&#34;a-full-filesystem-cascades&#34;&gt;A full filesystem cascades.
&lt;/h3&gt;&lt;p&gt;One container fills your root partition with logs. Now your storage is broken too. Your apps won&amp;rsquo;t start. Your VMs won&amp;rsquo;t boot. And you&amp;rsquo;re stuck SSHing in to clean up the mess before anything works again.&lt;/p&gt;
&lt;h2 id=&#34;what-separation-actually-gives-you&#34;&gt;What Separation Actually Gives You
&lt;/h2&gt;&lt;p&gt;Splitting compute away from routing and storage fixes all of this before it becomes a crisis.&lt;/p&gt;
&lt;h3 id=&#34;fault-isolation-that-actually-works&#34;&gt;Fault isolation that actually works.
&lt;/h3&gt;&lt;p&gt;A few weeks ago I completely rebuilt several LXCs and VMs on my compute box. I moved the entire Arr suite from separate LXC containers into one Docker VM. I rebuilt my Immich server from scratch. Nobody noticed. Not a single complaint. The only time my wife knew something was happening was when I asked her to let me know when her show was over so, I could reboot the server. Four minutes later, Jellyfin was back and she kept watching.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what separation gives you. The freedom to break things, test things, rebuild things, all without taking down the internet or losing access to your files.&lt;/p&gt;
&lt;h3 id=&#34;sane-boot-order&#34;&gt;Sane boot order.
&lt;/h3&gt;&lt;p&gt;Your NAS boots after the router. NFS and SMB shares are ready and waiting. Your router is already routing. Then your Proxmox compute node boots, mounts storage paths, and starts services in a predictable order. No more race conditions. No more &amp;ldquo;will it work this time&amp;rdquo; anxiety. Things just come up clean.&lt;/p&gt;
&lt;h3 id=&#34;better-performance-across-the-board&#34;&gt;Better performance across the board.
&lt;/h3&gt;&lt;p&gt;Transcoding, Sonarr indexing, torrent hashing, container updates, all of that lives on hardware designed to handle it. Your NAS focuses on serving files fast. Your router focuses on routing packets and running OPNsense. Everyone stays in their lane and does their job well.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This isn&amp;rsquo;t overkill.&lt;br&gt;
This is building your homelab correctly. With purpose. So it works reliably every single time.&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BKQ7KRZ1&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/NUC12.jpg&#34; alt=&#34;Intel NUC 12 Pro (NUC12WSHi5): Compact mini PC for lightweight Proxmox servers capable of GPU Passthrough, Several VMs, and LXCs.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Intel NUC 12 Pro (NUC12WSHi5)&lt;/strong&gt;
Compact mini PC for lightweight Proxmox servers capable of GPU Passthrough, Several VMs, and LXCs.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3JyPlM4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445831098683742853224568&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fnuc-12-pro-barebone-12th-gen-intel-core-i5-1240p-rnuc12wshi50000%2fp%2f1VK-004K-068E6%3fitem%3d9SIBPASKBH4509&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;what-the-proxmox-compute-node-actually-does&#34;&gt;What the Proxmox Compute Node Actually Does
&lt;/h2&gt;&lt;p&gt;The compute node is where your Homelab apps and services live.&lt;/p&gt;
&lt;p&gt;This is the server where you run:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Media servers:&lt;/strong&gt; Jellyfin, Plex, Emby&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Media automation:&lt;/strong&gt; Sonarr, Radarr, Prowlarr, Bazarr, Lidarr&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Download clients:&lt;/strong&gt; qBittorrent, SABnzbd, NZBGet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Media processing:&lt;/strong&gt; Tdarr for transcoding and file cleanup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reverse proxy:&lt;/strong&gt; Nginx Proxy Manager or Traefik&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote access:&lt;/strong&gt; Tailscale, Cloudflare Tunnel, or WireGuard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted services:&lt;/strong&gt; Home Assistant, Immich, Audiobookshelf, Kavita, Nextcloud&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Proxmox compute server is responsible for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hosting all your containers, VMs, and LXCs&lt;/li&gt;
&lt;li&gt;Handling heavy CPU loads like video transcoding, media analysis, and file processing&lt;/li&gt;
&lt;li&gt;Mounting storage from your NAS over NFS or SMB without breaking when mounts are slow&lt;/li&gt;
&lt;li&gt;Exposing services safely through your router and reverse proxy&lt;/li&gt;
&lt;li&gt;Keeping everything isolated enough that when one app crashes, it doesn&amp;rsquo;t cascade&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Think of it as the app layer in your home data center architecture. Router at the edge. NAS storage at the bottom. Compute in the middle doing the heavy lifting.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;why-proxmox-ve-is-the-right-hypervisor-for-homelab-compute&#34;&gt;Why Proxmox VE Is the Right Hypervisor for Homelab Compute
&lt;/h2&gt;&lt;p&gt;You can absolutely run everything on bare metal Linux with Docker. You can force it.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll also hate yourself when you want to move a service, pass through a GPU, snapshot before an upgrade, or deal with backups that don&amp;rsquo;t suck.&lt;/p&gt;
&lt;p&gt;Proxmox VE solves most of those problems with one installation.&lt;/p&gt;
&lt;h3 id=&#34;why-proxmox-works-so-well-for-homelab-compute-servers&#34;&gt;Why Proxmox works so well for homelab compute servers:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Web UI that doesn&amp;rsquo;t make you want to throw your keyboard&lt;/li&gt;
&lt;li&gt;Native support for both LXC containers and full VMs&lt;/li&gt;
&lt;li&gt;Easy snapshots and backups that actually save you when things break&lt;/li&gt;
&lt;li&gt;Good integration with NFS, SMB, and iSCSI for mounting external NAS storage&lt;/li&gt;
&lt;li&gt;Straightforward PCIe and GPU passthrough for hardware transcoding&lt;/li&gt;
&lt;li&gt;Flexible enough to grow into Proxmox clusters later if you add more nodes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lxc-vs-vms-vs-docker-in-proxmox&#34;&gt;LXC vs VMs vs Docker in Proxmox
&lt;/h3&gt;&lt;p&gt;You have three layers to work with in Proxmox VE:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Workload&lt;/th&gt;
          &lt;th&gt;Best Fit&lt;/th&gt;
          &lt;th&gt;Why&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Lightweight Linux services&lt;/td&gt;
          &lt;td&gt;LXC&lt;/td&gt;
          &lt;td&gt;Low overhead, fast boot, easy resource limits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Full OS instances&lt;/td&gt;
          &lt;td&gt;VM&lt;/td&gt;
          &lt;td&gt;When you need complete isolation or non-Linux guests&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;App-level deployment&lt;/td&gt;
          &lt;td&gt;Docker&lt;/td&gt;
          &lt;td&gt;Huge ecosystem, easy configs, stacks and compose&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Here&amp;rsquo;s a sane Proxmox layout pattern that actually works in production:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxmox VE at the base layer&lt;/li&gt;
&lt;li&gt;A few LXC containers for core infrastructure services (reverse proxy, monitoring)&lt;/li&gt;
&lt;li&gt;One or more VMs running Docker for your application stacks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;why-use-vms-for-docker-instead-of-lxcs&#34;&gt;Why use VMs for Docker instead of LXCs?
&lt;/h3&gt;&lt;p&gt;Proxmox themselves advise against running Docker inside LXC containers. Running containers inside containers gets weird fast. You&amp;rsquo;ll hit issues with nested namespaces, cgroup limitations, and storage drivers. A VM gives you clean kernel isolation and full control without the headaches.&lt;/p&gt;
&lt;h4 id=&#34;my-current-proxmox-compute-server-setup-as-an-example&#34;&gt;My current Proxmox compute server setup as an example:
&lt;/h4&gt;&lt;p&gt;I&amp;rsquo;m running an Intel i5-12600K with 64 GB of RAM, a 6-disk RAID-Z2 array for protected VM and LXC storage, and a 2 TB NVMe drive for Proxmox itself plus workloads that need fast, unprotected storage.&lt;/p&gt;
&lt;p&gt;On top of that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Jellyfin&lt;/strong&gt; - Runs in an LXC so I can pass through Intel QuickSync for hardware transcoding without losing the ability to share the iGPU with other containers or the Proxmox host&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker VM for the Arr suite&lt;/strong&gt; - Sonarr, Radarr, Prowlarr, all in one VM managed with Docker Compose&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker VM for automation tools&lt;/strong&gt; - n8n, Node-RED, OpenWebUI, and Home Assistant&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx Proxy Manager LXC&lt;/strong&gt; - Reverse proxy handling all external access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Individual service LXCs&lt;/strong&gt; - Audiobookshelf, Ansible, Hugo - Each doing one job, cleanly isolated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;rsquo;t share media outside my house because cable upload speeds are trash, but inside the house I&amp;rsquo;ve never hit issues with up to three simultaneous 4K streams.&lt;/p&gt;
&lt;p&gt;And now? I can rebuild or test elements of it without anyone noticing. This is the point of separating compute from the router and storage.&lt;/p&gt;
&lt;h2 id=&#34;storage-access-in-proxmox-without-the-pain&#34;&gt;Storage Access in Proxmox Without the Pain
&lt;/h2&gt;&lt;p&gt;This is where a lot of homelab builders get burned.&lt;/p&gt;
&lt;p&gt;Your Proxmox compute node should not be where your media lives. It should be where your media is accessed and used.&lt;/p&gt;
&lt;h3 id=&#34;heres-the-right-way-to-handle-storage&#34;&gt;Here&amp;rsquo;s the right way to handle storage:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Media and files live on your dedicated NAS server&lt;/li&gt;
&lt;li&gt;NAS exports storage via NFS or SMB shares&lt;/li&gt;
&lt;li&gt;Proxmox compute box mounts those shares and passes them into LXCs and VMs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My NAS is bare metal Debian 13 with a MergerFS pool, connected to the compute box over 10 GbE. It serves both NFS and SMB shares depending on what needs them.&lt;/p&gt;
&lt;h3 id=&#34;the-storage-migration-process&#34;&gt;The Storage Migration Process
&lt;/h3&gt;&lt;p&gt;When I finally pulled storage off the all-in-one, the process was straightforward but took some planning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Build the new NAS first.&lt;/strong&gt;
I installed Debian 13, MergerFS, NFS, and SMB.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Physically move the Hard Drives and HBA.&lt;/strong&gt;
Pulled the HBA and 7 drives out of the all-in-one host and moved them to the new dedicated hardware.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Configure MergerFS, NFS, and SMB&lt;/strong&gt;
Configured the MergerFS storage pool. Configured NFS and SMB shares.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Verify everything.&lt;/strong&gt;
I left the old storage VM off but in place for a week. Just in case anything went sideways. Once I was confident, I removed it and I haven&amp;rsquo;t looked back since.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rules-to-save-you-from-storage-headaches&#34;&gt;Rules to Save You From Storage Headaches
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Use consistent mount points across everything.&lt;/strong&gt;&lt;br&gt;
Pick a path structure and stick to it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/media/storage/movies&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/media/storage/shows&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/media/storage/music&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mount these into your Proxmox LXCs and VMs so the paths inside match exactly. Life is dramatically easier when Jellyfin, The arr suite, and SABnzbd all agree on where &lt;code&gt;/movies&lt;/code&gt;, &lt;code&gt;/shows&lt;/code&gt;, and &lt;code&gt;/music&lt;/code&gt; live.&lt;/p&gt;
&lt;h3 id=&#34;keep-transcode-and-temp-work-on-local-ssd&#34;&gt;Keep transcode and temp work on local SSD.
&lt;/h3&gt;&lt;p&gt;Let Jellyfin and Tdarr use local NVMe or SSD paths for transcoding cache and analysis. Don&amp;rsquo;t hammer your NAS with endless small writes if you don&amp;rsquo;t have to. Your NAS will thank you, and your transcodes will be faster.&lt;/p&gt;
&lt;h3 id=&#34;mount-read-only-where-you-can&#34;&gt;Mount read-only where you can.
&lt;/h3&gt;&lt;p&gt;For plain media directories that rarely change, mount them read-only to services that only need to read. A misbehaving app can&amp;rsquo;t delete your entire movie library if it doesn&amp;rsquo;t have write access.&lt;/p&gt;
&lt;h3 id=&#34;network-configuration-for-proxmox-and-nas&#34;&gt;Network Configuration for Proxmox and NAS
&lt;/h3&gt;&lt;p&gt;Your Proxmox compute node and NAS should be on the same network for best performance. Use static IP addresses for both so your mounts don&amp;rsquo;t break if DHCP leases change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For 1 GbE networks:&lt;/strong&gt; This works fine for most home users. You&amp;rsquo;ll get roughly 100-115 MB/s transfer speeds, which handles multiple 1080p streams and light 4K transcoding without issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For 2.5 GbE networks:&lt;/strong&gt; The sweet spot for cost vs performance in 2025. You&amp;rsquo;ll get 250-280 MB/s, plenty for heavy 4K streaming and multiple simultaneous transcodes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For 10 GbE networks:&lt;/strong&gt; Overkill for most, but if you&amp;rsquo;re running lots of VMs, doing heavy transcoding, or have multiple users, the 1000+ MB/s speeds make everything feel instant.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B075WYBQXJ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate-8tb.jpg&#34; alt=&#34;Seagate BarraCuda Internal Hard Drive 8TB Right now one of the best price per GB you can find. Also has a 2-year warranty. &#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate BarraCuda Internal Hard Drive 8TB&lt;/strong&gt;&lt;br&gt;
Right now one of the best price per GB you can find. Also has a 2-year warranty.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/47Joeb4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458310628236000921814966&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2f1Z4-002P-02KV1%3fitem%3d9SIA8N2KNP7346&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;best-proxmox-compute-server-hardware-for-2025&#34;&gt;Best Proxmox Compute Server Hardware for 2025
&lt;/h2&gt;&lt;p&gt;You don&amp;rsquo;t need a screaming 1U datacenter monster for a good Proxmox homelab. You just need the right balance of CPU cores, RAM, and storage.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what that looks like.&lt;/p&gt;
&lt;h3 id=&#34;budget-proxmox-compute-server-build&#34;&gt;Budget Proxmox Compute Server Build
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Specs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4-core CPU with VT-x/AMD-V support&lt;/li&gt;
&lt;li&gt;8-16 GB RAM (minimum 8 GB)&lt;/li&gt;
&lt;li&gt;250-500 GB SSD for Proxmox and VMs&lt;/li&gt;
&lt;li&gt;1 GbE or 2.5 GbE NIC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1080p media streaming with Jellyfin or Plex&lt;/li&gt;
&lt;li&gt;2-3 simultaneous users&lt;/li&gt;
&lt;li&gt;A handful of Docker containers in one VM&lt;/li&gt;
&lt;li&gt;Light home automation and a few LXCs&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;why-16gb-of-ram&#34;&gt;Why 16GB of RAM?
&lt;/h4&gt;&lt;p&gt;Proxmox itself needs about 2 GB minimum. Each VM or heavy LXC will want 2-4 GB depending on workload. With 8 GB total, you can run Proxmox plus 2-3 lightweight VMs or several LXCs comfortably. Bump to 16 GB if you want headroom.&lt;/p&gt;
&lt;h4 id=&#34;hardware-examples&#34;&gt;Hardware examples:
&lt;/h4&gt;&lt;p&gt;Used Dell OptiPlex 7050 SFF, HP EliteDesk 800 G3, Lenovo ThinkCentre Tiny M720q, or any decent mini PC with an Intel chip that has Quick Sync. Add an SSD, maybe bump the RAM if it&amp;rsquo;s cheap, install Proxmox VE, and you&amp;rsquo;re running.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This tier works if your needs are simple and, you&amp;rsquo;re just getting started with Proxmox homelabs.&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/dell_wyse_5070.jpg&#34; alt=&#34;Dell Wyse 5070 Extended (J5005): This is the budget-friendly, low-power Proxmox box that just works. Add an Intel i350-T2, give it 8–16 GB of RAM, and you&amp;#39;ve got a quiet, reliable home router with room for several LXCs and VMs.  &#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Dell Wyse 5070 Extended (J5005)&lt;/strong&gt;&lt;br&gt;
This is the budget-friendly, low-power Proxmox box that &amp;ldquo;just works&amp;rdquo;. Add an Intel i350-T2, give it 8–16 GB of RAM, and you&amp;rsquo;ve got a quiet, reliable home router with room for several LXCs and VMs.&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: $80 - $170&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
    
    
      &lt;a href=&#34;https://www.ebay.com/itm/157393940934?mkcid=1&amp;amp;mkrid=711-53200-19255-0&amp;amp;siteid=0&amp;amp;campid=5339130028&amp;amp;toolid=80006&amp;amp;mkevt=1&amp;amp;amdata=enc%3AAQAKAAAAoFkggFvd1GGDu0w3yXCmi1fic7T%2B6D5Zd0PLV8PNlt38Y9l1p0xMu1%2B1tjZH3GqPt8q8hohUgihu8SQRL4evhOP2jNgffaQ%2FMiZuPH%2Fyw9%2FW8DV5iKk5OXwOVk98DWTZ3urZaZjXrYY7R9gQq%2BbH3vDEZdTHhyGJd%2Bc8al65pQ6xlf0px%2F8Y1SUhKJKtgfROX39VphrP3ifM%2F2SIEIawHzs%3D&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Ebay&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;balanced-proxmox-compute-server-build-recommended&#34;&gt;Balanced Proxmox Compute Server Build (Recommended)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Specs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;6-8 cores (modern Intel i5/i7)&lt;/li&gt;
&lt;li&gt;16-32 GB RAM (32 GB strongly recommended)&lt;/li&gt;
&lt;li&gt;500 GB - 1 TB NVMe SSD for fast VM storage&lt;/li&gt;
&lt;li&gt;Intel iGPU (for Quick Sync hardware transcoding)&lt;/li&gt;
&lt;li&gt;2.5 GbE NIC preferred&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1080p and 4K transcoding with hardware acceleration&lt;/li&gt;
&lt;li&gt;Multiple simultaneous users and media streams&lt;/li&gt;
&lt;li&gt;Running several VMs alongside multiple LXCs&lt;/li&gt;
&lt;li&gt;Full Arr stack in Docker plus Jellyfin, Home Assistant, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;why-this-is-the-sweet-spot-for-most-proxmox-homelabs&#34;&gt;Why this is the sweet spot for most Proxmox homelabs:
&lt;/h4&gt;&lt;p&gt;This is where I landed. My i5-12600K build with 64 GB of RAM and local RAID-Z2 storage for VM protection handles everything I throw at it. Jellyfin transcodes 4K HEVC smoothly with QuickSync. The Arr suite runs in Docker without breaking a sweat. I can snapshot VMs, rebuild entire stacks, test new configs and nobody in the house notices unless I tell them.&lt;/p&gt;
&lt;h4 id=&#34;why-32-gb-ram-instead-of-16-gb&#34;&gt;Why 32 GB RAM instead of 16 GB?
&lt;/h4&gt;&lt;p&gt;Here&amp;rsquo;s the reality: Proxmox itself uses 2 GB. Each Docker VM will want 4-8 GB depending on how many containers you&amp;rsquo;re running. Jellyfin in an LXC will use 2-4 GB during transcodes. If you&amp;rsquo;re running ZFS on your local storage (like my RAID-Z2), ZFS will want to use up to 50% of available RAM for its ARC cache.&lt;/p&gt;
&lt;p&gt;With 16 GB total, you&amp;rsquo;ll constantly be swap-constrained and performance will suffer. With 32 GB, you have room to grow and VMs aren&amp;rsquo;t fighting each other for memory. With 64 GB like I have, you can run just about anything without thinking twice.&lt;/p&gt;
&lt;h4 id=&#34;cpu-considerations&#34;&gt;CPU considerations:
&lt;/h4&gt;&lt;p&gt;Modern Intel CPUs (12th gen and newer) are ideal. Intel has an edge here if you care about hardware transcoding because Quick Sync support in Jellyfin and Plex is excellent and dramatically reduces CPU load.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re running lots of containers or VMs, prioritize core count. Each VM you run will want 2-4 dedicated cores for good performance. Try not to over-provision. If you assign more vCPUs to VMs than you have physical cores, Proxmox will time-share and everything slows down.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This tier is perfect if you&amp;rsquo;re serious about a Proxmox homelab media setup that works reliably.&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D454DQSP&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ms-01.jpg&#34; alt=&#34;MINISFORUM MS-01 Mini Workstation: The MS-01 i5 is a tiny mini PC with plenty of cores, multiple NVMe slots, and real homelab networking (dual 10G SFP&amp;#43; plus 2.5 GbE), which makes it perfect for a Proxmox compute node. It has enough power for Jellyfin, the *arr stack, downloads, and a few VMs or LXCs, without being a space heater.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-01 Mini Workstation&lt;/strong&gt;&lt;br&gt;
The MS-01 i5 is a tiny mini PC with plenty of cores, multiple NVMe slots, and real homelab networking (dual 10G SFP+ plus 2.5 GbE), which makes it perfect for a Proxmox compute node. It has enough power for Jellyfin, the *arr stack, downloads, and a few VMs or LXCs, without being a space heater.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4p3HhTI&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458318191324330626506341&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fminisforum-barebone-systems-mini-pc-intel-core-i5-12600h%2fp%2f2SW-002G-000K9%3fitem%3d9SIBJ6VKBD4204&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;high-end-proxmox-compute-server-build&#34;&gt;High-End Proxmox Compute Server Build
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Specs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8+ cores with high clock speeds (Intel i7/i9)&lt;/li&gt;
&lt;li&gt;64-128 GB RAM&lt;/li&gt;
&lt;li&gt;Large NVMe (1-2 TB) for VMs and fast workloads&lt;/li&gt;
&lt;li&gt;Dedicated GPU for transcoding or compute tasks (optional)&lt;/li&gt;
&lt;li&gt;10 GbE NIC if your NAS can keep up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Heavy 4K HEVC transcoding workloads&lt;/li&gt;
&lt;li&gt;Multiple simultaneous remote transcode streams&lt;/li&gt;
&lt;li&gt;Running many VMs and test environments in Proxmox clusters&lt;/li&gt;
&lt;li&gt;Extra workloads like game servers, AI/LLM tools, or development environments&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;when-this-tier-makes-sense&#34;&gt;When this tier makes sense:
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;re running significantly more than just media services, if you&amp;rsquo;re sharing your Proxmox setup with people outside your house, or if you&amp;rsquo;re experimenting heavily with nested virtualization and want room to grow without limits.&lt;/p&gt;
&lt;p&gt;For a simple household Proxmox homelab? This is overkill. But if you have the use cases and the power budget, it&amp;rsquo;s very nice to have all that headroom.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DWS75TPQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/GMKtech-i9.jpg&#34; alt=&#34;GMKtec K10 Mini PC is powered by the 13th Gen Intel Core i9-13900HK CPU, with 14 cores and 20 threads. It features a 24MB Smart Cache and a TDP of 45W, delivering exceptional performance for demanding VMs and LXCs.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;GMKtec Mini PC Workstation&lt;/strong&gt;&lt;br&gt;
GMKtec K10 Mini PC is powered by the 13th Gen Intel Core i9-13900HK CPU, with 14 cores and 20 threads. It features a 24MB Smart Cache and a TDP of 45W, delivering exceptional performance for demanding VMs and LXCs.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o6tjPn&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;recommended-proxmox-layout-for-your-compute-node&#34;&gt;Recommended Proxmox Layout for Your Compute Node
&lt;/h2&gt;&lt;p&gt;You don&amp;rsquo;t need anything complicated to start with Proxmox VE.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a clean layout that works for most homelab setups:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure LXC:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nginx Proxy Manager or Traefik for reverse proxy&lt;/li&gt;
&lt;li&gt;Tailscale, WireGuard, or Cloudflare Tunnel for secure remote access&lt;/li&gt;
&lt;li&gt;This container stays up when everything else is being rebuilt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Primary Docker VM:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu or Debian VM running Docker and Docker Compose&lt;/li&gt;
&lt;li&gt;Your entire media stack: Arr suite, download clients, media automation&lt;/li&gt;
&lt;li&gt;Easy to snapshot before major changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Optional Secondary Docker VM:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Separate VM for experimental or unrelated Docker workloads&lt;/li&gt;
&lt;li&gt;Automation tools like n8n, Home Assistant if you want it containerized&lt;/li&gt;
&lt;li&gt;Keeps your core media stack isolated from other projects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Individual Service LXCs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jellyfin or Plex (LXC for GPU passthrough flexibility)&lt;/li&gt;
&lt;li&gt;Audiobookshelf, Immich, or other single-purpose services&lt;/li&gt;
&lt;li&gt;Utility containers for scripts, monitoring, or tools you&amp;rsquo;re testing&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Group related services together in VMs, but don&amp;rsquo;t cram everything into one container. Keep it modular enough that you can blow up your Docker VM and rebuild it from scratch without taking out your reverse proxy, remote access, or other critical infrastructure.
This gives you enough isolation to experiment safely in Proxmox without overcomplicating your setup.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;real-world-benefits-of-a-dedicated-proxmox-compute-server&#34;&gt;Real World Benefits of a Dedicated Proxmox Compute Server
&lt;/h2&gt;&lt;p&gt;Once you split compute away from routing and storage, a lot of things stop being crises.&lt;/p&gt;
&lt;h3 id=&#34;you-can-reboot-proxmox-without-taking-down-the-house&#34;&gt;You can reboot Proxmox without taking down the house.
&lt;/h3&gt;&lt;p&gt;Need to apply Proxmox kernel updates? Need to test a hardware change? Go ahead. Your router stays up. Your NAS stays accessible. Jellyfin goes down for a few minutes and comes back. No one freaks out.&lt;/p&gt;
&lt;h3 id=&#34;you-can-rebuild-services-without-fear&#34;&gt;You can rebuild services without fear.
&lt;/h3&gt;&lt;p&gt;Snapshot your Docker VM before making changes. Try a new Jellyfin major version. Completely rebuild your Arr stack with different Docker Compose configs. If it breaks, roll back the Proxmox snapshot in 30 seconds. If it works, keep it and delete the old snapshot. Your NAS and router don&amp;rsquo;t care either way.&lt;/p&gt;
&lt;h3 id=&#34;you-can-stress-test-during-off-hours-without-affecting-critical-services&#34;&gt;You can stress test during off hours without affecting critical services.
&lt;/h3&gt;&lt;p&gt;Want to run Tdarr overnight and transcode your entire 4K library? Go for it. Let the CPU pin at 100% all night. Your router isn&amp;rsquo;t competing for cycles. Your NAS isn&amp;rsquo;t getting hammered by transcode temp files.&lt;/p&gt;
&lt;h3 id=&#34;your-family-notices-the-differencein-a-good-way&#34;&gt;Your family notices the difference—in a good way.
&lt;/h3&gt;&lt;p&gt;I used to hear &amp;ldquo;the internet is down AGAIN&amp;rdquo; all the time. Now? Things just work. My wife doesn&amp;rsquo;t think about the server anymore. It&amp;rsquo;s invisible. That&amp;rsquo;s exactly the goal.&lt;/p&gt;
&lt;p&gt;And since splitting things up, I&amp;rsquo;ve even been able to share my Jellyfin server with one friend outside my house. Not because my upload speeds got better (they&amp;rsquo;re still trash) but because the system is stable enough that I trust it to work consistently without me babysitting it.&lt;/p&gt;
&lt;h2 id=&#34;the-real-risks-of-running-everything-on-one-proxmox-box&#34;&gt;The Real Risks of Running Everything on One Proxmox Box
&lt;/h2&gt;&lt;p&gt;If you keep routing, storage, and compute all on one Proxmox server, here&amp;rsquo;s what you&amp;rsquo;re signing up for:&lt;/p&gt;
&lt;h3 id=&#34;hardware-failures-cascade-completely&#34;&gt;Hardware failures cascade completely.
&lt;/h3&gt;&lt;p&gt;PSU dies like mine did? Motherboard failure? Bad RAM stick? Your entire digital life disappears. Internet, storage, every app, every VM. All gone until you fix or replace hardware.&lt;/p&gt;
&lt;h3 id=&#34;software-issues-spread-everywhere&#34;&gt;Software issues spread everywhere.
&lt;/h3&gt;&lt;p&gt;Kernel panic during a Proxmox upgrade? One VM consuming all available RAM? A filled root partition from runaway Docker logs? Now routing is broken, storage is inaccessible, and all your apps are down.&lt;/p&gt;
&lt;h3 id=&#34;maintenance-becomes-high-risk&#34;&gt;Maintenance becomes high-risk.
&lt;/h3&gt;&lt;p&gt;Want to add more RAM? Swap a drive? Update BIOS? Better hope it goes smoothly, because if something goes wrong during maintenance, everything is offline until you recover.&lt;/p&gt;
&lt;h3 id=&#34;boot-order-is-a-constant-gamble&#34;&gt;Boot order is a constant gamble.
&lt;/h3&gt;&lt;p&gt;Will the NAS VM start before other services try to mount shares? Will everything come up in the right sequence? Or will you spend 15 minutes manually restarting services until things work?&lt;/p&gt;
&lt;h3 id=&#34;no-room-for-safe-experimentation&#34;&gt;No room for safe experimentation.
&lt;/h3&gt;&lt;p&gt;Want to test a major Proxmox upgrade? Try a different hypervisor kernel? Experiment with GPU passthrough? Better be confident, because if it breaks, you&amp;rsquo;re taking down the router and storage too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This isn&amp;rsquo;t &amp;ldquo;maybe someday.&amp;rdquo; I lived it. The PSU failure was my wake-up call, but the constant virtualized NAS mount issues and boot order anxiety were already wearing me down.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;how-to-start-your-roadmap-to-separating-compute&#34;&gt;How to Start: Your Roadmap to Separating Compute
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re running everything on one box right now and this all sounds overwhelming, here&amp;rsquo;s the actual migration path:&lt;/p&gt;
&lt;h3 id=&#34;step-1-plan-and-budget-for-dedicated-nas-storage-first&#34;&gt;Step 1: Plan and budget for dedicated NAS storage first.
&lt;/h3&gt;&lt;p&gt;That&amp;rsquo;s what I moved first, and it was absolutely the right call. Storage was causing me the most pain with the virtualized NAS and mount issues. Getting that onto dedicated hardware immediately made everything more stable.&lt;/p&gt;
&lt;p&gt;Figure out your NAS platform (TrueNAS, Unraid, or bare metal Linux with ZFS/MergerFS). Budget for drives, an HBA if you need one, and a box to house it all. You don&amp;rsquo;t need to buy enterprise-grade equipment, consumer hardware works fine for homelab use.&lt;/p&gt;
&lt;h3 id=&#34;step-2-build-the-nas-and-migrate-storage&#34;&gt;Step 2: Build the NAS and migrate storage.
&lt;/h3&gt;&lt;p&gt;Set up your NAS with ZFS or your chosen filesystem. Configure NFS and SMB shares. Test everything thoroughly. Then move your drives over.&lt;/p&gt;
&lt;p&gt;Keep your current NAS VM off but available to restore if you need to. Once everything is migrated and verified, you can delete your old VM (I kept mine for a week or so).&lt;/p&gt;
&lt;h3 id=&#34;step-3-move-your-router-when-budget-allows&#34;&gt;Step 3: Move your router when budget allows.
&lt;/h3&gt;&lt;p&gt;This takes a bit more planning and usually some dedicated hardware budget. But once storage is separate, your next priority is getting routing off the all-in-one. A dedicated pfSense or OPNsense box, or even a good prosumer router if you don&amp;rsquo;t need advanced firewall features.&lt;/p&gt;
&lt;h3 id=&#34;step-4-whats-left-is-your-dedicated-compute-node&#34;&gt;Step 4: What&amp;rsquo;s left is your dedicated compute node.
&lt;/h3&gt;&lt;p&gt;Once routing and storage are separated, what remains is just your Proxmox compute server. You might want to add more RAM or upgrade storage for better VM performance, but the foundation is already there. You just keep running VMs and containers on dedicated compute hardware.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You don&amp;rsquo;t have to do this overnight. Each step makes the next one safer. Each separation reduces the blast radius when something goes wrong.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;what-i-wish-i-knew-before-starting&#34;&gt;What I Wish I Knew Before Starting
&lt;/h2&gt;&lt;p&gt;If I could go back and tell myself one thing before beginning this Proxmox homelab journey, it would be this:&lt;/p&gt;
&lt;h3 id=&#34;learn-how-proxmox-handles-storage-pools-and-zfs-arrays-before-you-provision-anything&#34;&gt;Learn how Proxmox handles storage pools and ZFS arrays before you provision anything.
&lt;/h3&gt;&lt;p&gt;I wasted hours trying to figure out Proxmox storage configuration, mount points, and how Proxmox integrates with external NFS shares because I didn&amp;rsquo;t understand the basics up front. Thirty minutes of reading the official Proxmox documentation would have saved me multiple evenings of trial and error.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re building local RAID-Z2 or hardware RAID storage in your compute box, understand how Proxmox will use it before you create storage pools and start deploying VMs.&lt;/p&gt;
&lt;h3 id=&#34;dont-cheap-out-on-cpu-and-ram-for-your-intended-workload&#34;&gt;Don&amp;rsquo;t cheap out on CPU and RAM for your intended workload.
&lt;/h3&gt;&lt;p&gt;Buy hardware appropriate for the workloads you plan to run. If you know you&amp;rsquo;ll be transcoding 4K, running multiple Docker stacks, and hosting several VMs, don&amp;rsquo;t try to save $100 by buying inadequate hardware. You&amp;rsquo;ll just end up buying better hardware later anyway, and you&amp;rsquo;ll have wasted time being frustrated by poor performance.&lt;/p&gt;
&lt;p&gt;Under-provisioning RAM is especially painful. If you don&amp;rsquo;t have enough RAM, Proxmox will swap to disk constantly and everything slows to a crawl. Same thing happens if you over-provision CPU cores across too many VMs. Time-sharing kills performance.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Build it right the first time.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;frequently-asked-questions-about-proxmox-compute-servers&#34;&gt;Frequently Asked Questions About Proxmox Compute Servers
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How much RAM do I need for a Proxmox compute server?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Minimum 8 GB for basic setups, but 16-32 GB is recommended for most homelab use cases. Proxmox itself needs about 2 GB. Each VM wants 2-8 GB depending on workload. If you&amp;rsquo;re using ZFS for local VM storage, ZFS will consume up to 50% of available RAM for caching. With 32 GB total, you have comfortable headroom for several VMs, LXCs, and ZFS caching without hitting swap.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I run Docker directly in Proxmox LXC containers?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Technically yes, but Proxmox and the community advise against it. Running Docker inside LXC containers creates nested containerization which leads to issues with namespaces, cgroups, and storage drivers. The recommended approach is running Docker inside a dedicated VM (Ubuntu or Debian), which gives you full kernel control and avoids compatibility headaches.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s the difference between LXC and VMs in Proxmox?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;LXC containers share the host kernel and are extremely lightweight—they boot in seconds and use minimal overhead. VMs run their own complete operating system with full isolation. Use LXCs for Linux services where you want efficiency (like Nginx Proxy Manager). Use VMs when you need complete isolation, want to run Windows, or need full kernel control for things like Docker.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I need a dedicated GPU for Jellyfin transcoding in Proxmox?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Not necessarily. Modern Intel CPUs (8th gen and newer) have excellent Quick Sync support built into the iGPU, which handles hardware transcoding very well. You can pass the iGPU through to a Jellyfin LXC or VM for hardware acceleration. A dedicated GPU only makes sense if you&amp;rsquo;re transcoding many simultaneous 4K streams or running other GPU workloads like AI inference.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I use consumer SSDs for Proxmox VM storage?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes, for homelab using consumer NVMe or SSDs is fine. Enterprise drives with Power-Loss Protection are better for production environments, but for home servers where the stakes are lower, good consumer SSDs like Samsung 970/980 EVO or Crucial P3/P5 will serve you well. Just make sure you have backups. Consumer SSDs can fail more often, and when they do, they fail catastrophically.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I run my router as a VM in Proxmox?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;For homelab experimentation, yes. For production use where your household depends on internet access, no. If your Proxmox host crashes or needs maintenance, a virtualized router means your entire house loses internet. A dedicated router or firewall appliance running pfSense/OPNsense gives you the isolation you need so compute and routing failures don&amp;rsquo;t cascade.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What&amp;#39;s better for Proxmox storage: hardware RAID or ZFS?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;For VM storage on the Proxmox compute node, ZFS is generally preferred. ZFS gives you built-in snapshots, compression, and data integrity checking. Hardware RAID can be faster in some cases but lacks ZFS features. Important: ZFS and hardware RAID controllers don&amp;rsquo;t mix. If you want ZFS, you need direct disk access (HBA mode or no RAID controller). For NAS storage, either approach works depending on your preference.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;whats-next-in-the-proxmox-homelab-series&#34;&gt;What&amp;rsquo;s Next in the Proxmox Homelab Series
&lt;/h2&gt;&lt;p&gt;You have the router running pfSense or OPNsense.
You have the NAS providing reliable storage.
Now you have the dedicated Proxmox compute server running your applications.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s one more critical piece to add: &lt;strong&gt;the Proxmox Backup Server.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Next up is Part 5, where we cover building a Proxmox Backup Server that can actually save you when things go sideways. Because they will. And when your compute node crashes or you accidentally delete the wrong VM, you&amp;rsquo;ll be very glad you have working backups.&lt;/p&gt;
&lt;p&gt;Until then: separate your compute. Your future self will thank you.&lt;/p&gt;
&lt;h2 id=&#34;series-navigation&#34;&gt;Series Navigation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post//media-server-hardware-guide-2025&#34; &gt;Part 1 - The 3 Boxes That Run Your Media Server (2025 Edition)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-router-2025&#34; &gt;Part 2 - Why Your ISP Router Is Killing Your Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-storage-2025&#34; &gt;Part 3 - Your Storage Deserves Its Own Box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-compute-2025&#34; &gt;Part 4 - Proxmox Is Your New Best Friend&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-backup-2025&#34; &gt;Part 5 - Backups That Actually Work (With PBS)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Best NAS for Media Servers (2025): Why Dedicated Storage Saves Your Sanity</title>
        <link>https://diymediaserver.com/post/media-server-storage-2025/</link>
        <pubDate>Mon, 10 Nov 2025 07:30:02 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/media-server-storage-2025/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/media-server-storage-2025/featured.jpg" alt="Featured image of post Best NAS for Media Servers (2025): Why Dedicated Storage Saves Your Sanity" /&gt;&lt;p&gt;6 AM. Power came back after an outage. My Proxmox host boots up. The VM that runs my NAS starts&amp;hellip; slowly. My Jellyfin container mounts &lt;code&gt;/mnt/media&lt;/code&gt; before the NFS share is ready. The mount succeeds but points to an empty directory. My library: &amp;ldquo;No items found.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I fixed it in 10 minutes. But I&amp;rsquo;d already done this dance multiple times every week for eight months and I hated having to manually mount the drives everytime the server boots.&lt;/p&gt;
&lt;p&gt;The problem wasn&amp;rsquo;t the hardware. It wasn&amp;rsquo;t the software. It was the architecture: I was running my storage as a VM on my compute host. Every reboot was a roll of the dice for timing and mount order.&lt;/p&gt;
&lt;p&gt;So, I pulled the HBA and drives out of my Proxmox host and moved them to a dedicated bare metal Debian box running MergerFS with 93TB of drives and SMB and NFS shares.&lt;/p&gt;
&lt;p&gt;That was six months ago. I&amp;rsquo;ve rebooted my compute host 30+ times since then. Zero mount failures, race conditions, or extended debugging sessions late at night. Just my media being served up when I need it.&lt;/p&gt;
&lt;p&gt;If your media library matters, give it its own box. I go over how I built mine and why, and why you should dedicate a box to it as well.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are trying to figure out the best NAS setup for a home media server, here is the short version: stop running your storage in a VM and give it its own bare metal box that exists only to keep your files safe and available when you want them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Running storage in a VM or LXC is like playing with fire. You think you&#39;re being efficient. You&#39;re actually creating race conditions, mount failures, and late night debugging sessions when you could be enjoying your media with friends and/or family. Separate storage to bare metal. It boots quickly, serves reliably, and stops holding your media hostage.

&lt;/div&gt;
&lt;h2 id=&#34;quick-picks-best-nas-options-for-media-servers-2025&#34;&gt;Quick picks: best NAS options for media servers (2025)
&lt;/h2&gt;&lt;p&gt;If you came here looking for the &amp;ldquo;just tell me what home NAS to buy&amp;rdquo; version, here is the short list.&lt;/p&gt;
&lt;h3 id=&#34;1-diy-bare-metal-nas-for-homelab-nerds&#34;&gt;1. DIY bare metal NAS for homelab nerds
&lt;/h3&gt;&lt;p&gt;You want control, flexibility, and better hardware for the money.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OS&lt;/strong&gt;: Debian or another solid Linux base, with &lt;strong&gt;MergerFS&lt;/strong&gt; for pooling and &lt;strong&gt;NFS&lt;/strong&gt; or &lt;strong&gt;SMB&lt;/strong&gt; exports&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use case&lt;/strong&gt;: Jellyfin or Plex library, backups, maybe a bit of general file storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why it is the best fit&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;You are not locked into a vendor GUI&lt;/li&gt;
&lt;li&gt;You can pick quiet, low power parts instead of whatever the NAS vendor felt like shipping&lt;/li&gt;
&lt;li&gt;Easy to grow storage with bigger drives later rather than buying a whole new box&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the setup I use and for me, it is the best NAS for a home media server. The Proxmox host talks to it over the network, and the NAS does one job and does it well.&lt;/p&gt;
&lt;h3 id=&#34;2-synology-nas-for-people-who-want-easy-mode&#34;&gt;2. Synology NAS for people who want easy mode
&lt;/h3&gt;&lt;p&gt;You want something that just works, and you do not want to learn MergerFS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Example&lt;/strong&gt;: 4 to 8 bay Synology DiskStation for media and backup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use case&lt;/strong&gt;: You want a simple web UI, snapshots, built in apps, and clean integration with Windows and macOS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why it is a good fit&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Synology handles RAID, drive health alerts, and shares for you&lt;/li&gt;
&lt;li&gt;Great if you want to spend more money on hardware and less time learning Linux&lt;/li&gt;
&lt;li&gt;Perfect for &amp;ldquo;I run Jellyfin on another box, this thing just holds the files&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You give up some flexibility and pay a premium compared to DIY, but you get a nice, polished experience.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0C8S7SF4B&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/synology-ds925.jpg&#34; alt=&#34;Synology 4-Bay DiskStation DS925&amp;#43; (Diskless): Is a 4-bay NAS running DSM with an easy setup, dual 2.5 GbE, expansion to 9 bays, and roughly 500&amp;#43; MB/s for multi-user streaming. Pick it over a DIY build if you want simple and reliable, since DSM gives you polished wizards, built-in backup and media apps, and hardware that just works.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Synology 4-Bay DiskStation DS925+ (Diskless)&lt;/strong&gt;&lt;br&gt;
Is a 4-bay NAS running DSM with an easy setup, dual 2.5 GbE, M.2 NVMe slots for cache, ECC-capable RAM up to 32 GB, expansion to 9 bays, and roughly 500+ MB/s for multi-user streaming. Pick it over a DIY build if you want simple and reliable, since DSM gives you polished wizards, built-in backup and media apps, and hardware that just works.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/44ahqAM&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458318238247784567937633&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fsynology-ds925-4-bay-4gb-ddr4-ecc-sodimm-intel-celeron-j4125-processor-diskless-system%2fp%2fN82E16822108847%3fitem%3dN82E16822108847&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;3-used-server-or-small-business-box-if-you-like-deals&#34;&gt;3. Used server or small business box if you like deals
&lt;/h3&gt;&lt;p&gt;You are comfortable with louder gear and you want lots of bays for cheap.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Used Dell, HP, or Lenovo small servers or business desktops with extra SATA added&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use case&lt;/strong&gt;: Big media libraries, lots of drives, budget conscious builds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why it can make sense&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Older enterprise gear is cheap and still very capable&lt;/li&gt;
&lt;li&gt;Easy to stuff with drives and treat it as a dedicated storage tank&lt;/li&gt;
&lt;li&gt;Run Debian or your favorite NAS OS and treat it like the DIY option above&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You just have to watch power draw and noise. Great for a basement rack, not great for a studio apartment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No matter which path you pick, the rule is the same:&lt;br&gt;
Your media server should talk to a dedicated NAS box over the network, not share a boot drive with Proxmox and six LXCs that all panic if a mount is late.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;storage-in-vms-just-because-you-can-doesnt-mean-you-should&#34;&gt;Storage In VMs: Just Because You &amp;ldquo;CAN&amp;rdquo;, Doesn&amp;rsquo;t Mean You Should
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s get this out of the way: running your NAS in a Proxmox VM is a bad idea. Running it in an LXC is an even worse idea.&lt;/p&gt;
&lt;p&gt;Reddit will tell you: &amp;ldquo;It&amp;rsquo;s more efficient!&amp;rdquo; or &amp;ldquo;One box does everything, and it is amazing!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m here to tell you they are wrong and what you&amp;rsquo;ve actually built is a house of cards where storage, the foundation of your entire media stack depends on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A hypervisor booting correctly&lt;/li&gt;
&lt;li&gt;VM startup order being predictable&lt;/li&gt;
&lt;li&gt;Mounts being added and mounted to the Proxmox host correctly (My biggest issue)&lt;/li&gt;
&lt;li&gt;Network initialization happening before mount attempts&lt;/li&gt;
&lt;li&gt;No Proxmox updates changing any of the above&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;re not being efficient. You&amp;rsquo;re optimizing for a $200 hardware savings while trading it for hours of maintenance, failed mounts, and streams that don&amp;rsquo;t work when you want them to.&lt;/p&gt;
&lt;p&gt;I know because I did this for six months. I spent roughly 3 hours every week debugging mount failures, tweaking systemd scripts, adjusting delays, and reading Proxmox forums at midnight. That&amp;rsquo;s 78 hours over six months (Almost two full work weeks fighting an architecture that was fundamentally wrong).&lt;/p&gt;
&lt;p&gt;The worst part? Each failure was only a 10-15 minute fix. But they happened constantly. Reboot the host? Roll the dice. Proxmox update? Hope your mounts still work. Add a new container? Maybe it boots before the NAS is ready, maybe it doesn&amp;rsquo;t.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    The root issue is that your media server runs in a VM on the same Proxmox host that&amp;rsquo;s trying to mount its shares. During boot, Proxmox processes &lt;code&gt;/etc/fstab&lt;/code&gt; and can&amp;rsquo;t mount the shares because the VM hasn&amp;rsquo;t even started. Mounting shares later isn&amp;rsquo;t as straightforward as it sounds. Any workarounds you apply afterward just treat the symptoms without addressing the root cause. I exhausted every solution I could find across Google, Reddit, and the Proxmox forums. Some provided marginal improvements, but none fully resolved the problem.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;the-real-cost&#34;&gt;The Real Cost
&lt;/h3&gt;&lt;p&gt;Let me break down what this &amp;ldquo;efficient&amp;rdquo; setup actually cost me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;78+ hours of debugging&lt;/strong&gt; over six months&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple service outages&lt;/strong&gt; where Jellyfin showed &amp;ldquo;Library Empty&amp;rdquo; because mounts succeeded but pointed to empty directories&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Constant user complaints&lt;/strong&gt; about streams dying or libraries disappearing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mental overhead&lt;/strong&gt; of &amp;ldquo;will this reboot break everything?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;What did I gain by running storage in a VM? Absolutely nothing. I saved a small amount of money on power, not enough to make up for my time. That&amp;rsquo;s it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;the-time-my-storage-failed-me-and-why-i-finally-fixed-it&#34;&gt;The Time My Storage Failed Me (And Why I Finally Fixed It)
&lt;/h2&gt;&lt;p&gt;Here is what finally convinced me to do this right.&lt;/p&gt;
&lt;h3 id=&#34;the-reboot-lottery&#34;&gt;The Reboot Lottery
&lt;/h3&gt;&lt;p&gt;Power outage, kernel update, Proxmox update, stuck containers can all cause the need to reboot the Proxmox host. When the host is rebooted&amp;hellip; Proxmox comes back up. NAS VM starts&amp;hellip; but something&amp;rsquo;s off. The VM boots, the drives mount inside the VM, but Proxmox&amp;rsquo;s automount fails to see the NFS share. Jellyfin LXC mounts &lt;code&gt;/mnt/media&lt;/code&gt; to an empty local directory. Users see &amp;ldquo;Library Empty.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I SSH in, manually remount, restart containers. Fixed in 10 minutes.&lt;/p&gt;
&lt;p&gt;But this wasn&amp;rsquo;t a one-time thing. This happened a few times a week with different variations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sometimes the VM booted too slowly&lt;/li&gt;
&lt;li&gt;Sometimes Proxmox tried to mount before the NFS server was actually serving&lt;/li&gt;
&lt;li&gt;Sometimes it worked perfectly&lt;/li&gt;
&lt;li&gt;Sometimes my custom delay scripts helped, sometimes they didn&amp;rsquo;t&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tried:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Systemd mount delays (worked sometimes)&lt;/li&gt;
&lt;li&gt;Custom scripts that pinged the NAS before mounting (race conditions remained)&lt;/li&gt;
&lt;li&gt;Automount with longer timeouts (helped but didn&amp;rsquo;t fix it)&lt;/li&gt;
&lt;li&gt;Tweaking VM boot order and priority (marginal improvement)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing worked reliably. Because the problem wasn&amp;rsquo;t the configuration, it was the architecture.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s when I realized: this is insane. I&amp;rsquo;m spending hours maintaining mount orchestration on a system that should &amp;ldquo;just work.&amp;rdquo; The storage shouldn&amp;rsquo;t be a VM. It shouldn&amp;rsquo;t depend on a hypervisor. It should boot first and serve files. Period.&lt;/p&gt;
&lt;h2 id=&#34;the-vm-race-condition-from-hell-whats-actually-happening&#34;&gt;The VM Race Condition From Hell (What&amp;rsquo;s Actually Happening)
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s what was happening in my Proxmox host every reboot:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Proxmox boots&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VMs start launching&lt;/strong&gt; - based on boot order/priority settings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;My NAS VM begins booting&lt;/strong&gt; - this takes time: OS boot, network init, NFS server start&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LXC containers start&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containers try to mount &lt;code&gt;/mnt/media&lt;/code&gt; via NFS&lt;/strong&gt; from the Proxmox host (Bind mounts)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Three possible outcomes:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;✅ NAS is ready → mount succeeds → everything works&lt;/li&gt;
&lt;li&gt;❌ NAS isn&amp;rsquo;t ready → mount fails → services break&lt;/li&gt;
&lt;li&gt;⚠️ Mount succeeds but NFS isn&amp;rsquo;t serving yet → mount points to empty directory → &amp;ldquo;Library Empty&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That third one is the nastiest because everything LOOKS like it worked. The mount command succeeded. The directory exists. But there&amp;rsquo;s no data because the NFS server inside the VM hasn&amp;rsquo;t finished starting yet.&lt;/p&gt;
&lt;h3 id=&#34;why-this-is-fundamentally-broken&#34;&gt;Why This Is Fundamentally Broken
&lt;/h3&gt;&lt;p&gt;The hypervisor doesn&amp;rsquo;t know or care about your application dependencies. Proxmox sees:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAS VM (priority: normal)&lt;/li&gt;
&lt;li&gt;App containers (priority: normal)&lt;/li&gt;
&lt;li&gt;Network is up&lt;/li&gt;
&lt;li&gt;Start everything&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It doesn&amp;rsquo;t understand that your Jellyfin container NEEDS the NAS to be fully operational before it can function. You can try to encode this with systemd dependencies, boot delays, ping scripts, and health checks but, you&amp;rsquo;re still fighting the architecture.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The solution isn&amp;rsquo;t better orchestration. It&amp;rsquo;s removing the orchestration entirely.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;lxcs-are-even-worse-seriously-dont&#34;&gt;LXCs Are Even Worse (Seriously, Don&amp;rsquo;t)
&lt;/h2&gt;&lt;p&gt;I never tried running my NAS in an LXC. But I&amp;rsquo;ve seen people attempt it on Reddit and Proxmox forums, and it&amp;rsquo;s a nightmare every single time.&lt;/p&gt;
&lt;p&gt;Why people try it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;LXCs are lighter than VMs!&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;I don&amp;rsquo;t need full VM overhead for a file server!&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;I can bind-mount drives directly!&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why it fails spectacularly:&lt;/p&gt;
&lt;h3 id=&#34;no-real-hardware-access&#34;&gt;No Real Hardware Access
&lt;/h3&gt;&lt;p&gt;LXCs share the host kernel. You can pass through devices, but you&amp;rsquo;re not getting true hardware access like bare metal. Running ZFS in an LXC? You&amp;rsquo;re trusting the container layer to not screw up your file systems. Running SMART monitoring? Good luck with device passthrough being consistent.&lt;/p&gt;
&lt;h3 id=&#34;the-same-mount-race-conditions-but-worse&#34;&gt;The Same Mount Race Conditions, But Worse
&lt;/h3&gt;&lt;p&gt;The LXC has to start, the storage daemon has to initialize, the NFS/SMB server has to start, and THEN other containers can mount. You&amp;rsquo;ve just recreated the VM problem with less isolation and more ways for it to break.&lt;/p&gt;
&lt;h3 id=&#34;what-actually-happens&#34;&gt;What Actually Happens
&lt;/h3&gt;&lt;p&gt;Search r/Proxmox for &amp;ldquo;LXC NFS&amp;rdquo; or &amp;ldquo;LXC storage&amp;rdquo; and you&amp;rsquo;ll find a number of posts like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;My LXC can&amp;rsquo;t see the drives after reboot&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Permissions are broken after Proxmox update&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;SMART data isn&amp;rsquo;t available in the container&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The pattern is always the same:&lt;/strong&gt; someone tries to be clever, runs storage in an LXC to &amp;ldquo;save resources,&amp;rdquo; and ends up with a fragile, unreliable mess.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t do it.&lt;/p&gt;
&lt;h2 id=&#34;why-dedicated-bare-metal-is-the-only-sane-option&#34;&gt;Why Dedicated Bare Metal Is The Only Sane Option
&lt;/h2&gt;&lt;p&gt;When I moved my storage to bare metal Debian, here&amp;rsquo;s what changed:&lt;/p&gt;
&lt;h3 id=&#34;predictable-boot-order-finally&#34;&gt;Predictable Boot Order (Finally)
&lt;/h3&gt;&lt;p&gt;It boots, drives spin up, XFS filesystems mount, MergerFS pools them, NFS server starts. All of this happens BEFORE my Proxmox host even starts booting.&lt;/p&gt;
&lt;p&gt;By the time Proxmox comes online and containers try to mount &lt;code&gt;/mnt/media&lt;/code&gt;, the NAS has already been serving files and waiting. Zero race conditions, timing dependencies, or failed mounts.&lt;/p&gt;
&lt;h3 id=&#34;no-more-orchestration-hell&#34;&gt;No More Orchestration Hell
&lt;/h3&gt;&lt;p&gt;I deleted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom systemd mount units with delays&lt;/li&gt;
&lt;li&gt;Ping-before-mount scripts&lt;/li&gt;
&lt;li&gt;VM boot order priorities&lt;/li&gt;
&lt;li&gt;Health check containers&lt;/li&gt;
&lt;li&gt;All the &amp;ldquo;clever&amp;rdquo; solutions I built to work around a broken architecture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The NAS boots. It serves files. Proxmox mounts them. That&amp;rsquo;s it. No orchestration needed.&lt;/p&gt;
&lt;h3 id=&#34;fault-isolation&#34;&gt;Fault Isolation
&lt;/h3&gt;&lt;p&gt;When I need to rebuild my Proxmox host or test new versions, my storage stays online. It keeps serving files to the containers that are still running. When I need to add drives or run maintenance on the NAS, I take it offline briefly but, my compute layer isn&amp;rsquo;t impacted. I do however, reboot the compute node after NAS maintenance just to ensure everything is working.&lt;/p&gt;
&lt;p&gt;Before, everything was tangled together. Proxmox down = storage down. Storage issues = compute issues. It was all one fragile system. I made it even worse because at the time my router was also in a VM on the same Proxmox host. So, every reboot also took down my internet too. Don&amp;rsquo;t be like me.&lt;/p&gt;
&lt;h3 id=&#34;zero-maintenance&#34;&gt;Zero Maintenance
&lt;/h3&gt;&lt;p&gt;In eight months since the migration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proxmox reboots:&lt;/strong&gt; 30+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NAS mount failures:&lt;/strong&gt; 0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hours spent debugging storage:&lt;/strong&gt; 0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streams interrupted by storage issues:&lt;/strong&gt; 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The NAS just works. I literally forget it exists until I need to add more drives.&lt;/p&gt;
&lt;h3 id=&#34;what-i-gave-up&#34;&gt;What I Gave Up
&lt;/h3&gt;&lt;p&gt;Nothing. Absolutely nothing.&lt;/p&gt;
&lt;p&gt;I added one more box to my rack (an old desktop PC I already owned). That&amp;rsquo;s it. No performance penalty. No feature loss. No additional complexity. Actually, LESS complexity because I removed all the mount orchestration.&lt;/p&gt;
&lt;p&gt;Adding a low power CPU to run the NAS had a minimal impact to the power bill (About 40-60W).&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B075WYBQXJ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate-8tb.jpg&#34; alt=&#34;Seagate BarraCuda Internal Hard Drive 8TB Right now one of the best price per GB you can find. Also has a 2-year warranty. &#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate BarraCuda Internal Hard Drive 8TB&lt;/strong&gt;&lt;br&gt;
Right now one of the best price per GB you can find. Also has a 2-year warranty.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/47Joeb4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458310628236000921814966&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2f1Z4-002P-02KV1%3fitem%3d9SIA8N2KNP7346&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;but-my-nas-vm-works-fine-for-now&#34;&gt;&amp;ldquo;But My NAS VM Works Fine&amp;rdquo; (For Now)
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re reading this thinking &amp;ldquo;my NAS VM is stable, this doesn&amp;rsquo;t apply to me,&amp;rdquo; let me ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Have you rebooted your Proxmox host this month? Did everything come back up cleanly?&lt;/li&gt;
&lt;li&gt;Have you updated Proxmox recently? Did your mounts still work after?&lt;/li&gt;
&lt;li&gt;Do you have multiple containers depending on storage? Do they all mount reliably?&lt;/li&gt;
&lt;li&gt;Have you tested what happens during a power failure and cold boot?&lt;/li&gt;
&lt;li&gt;Can you reboot your compute layer without taking storage offline?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you answered &amp;ldquo;yes&amp;rdquo; to all of these, congratulations! You&amp;rsquo;ve either gotten extremely lucky or you&amp;rsquo;ve spent dozens of hours building complex orchestration to paper over the architectural problems.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the thing: it works until it doesn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re not running a reliable system. You&amp;rsquo;re running a system that hasn&amp;rsquo;t failed YET. And when it does fail during a family movie night, you&amp;rsquo;ll wish you&amp;rsquo;d built it right from the start.&lt;/p&gt;
&lt;h3 id=&#34;the-real-question&#34;&gt;The Real Question
&lt;/h3&gt;&lt;p&gt;What are you actually gaining by running storage in a VM?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Saving one hardware box? (An old desktop PC costs $50-200 used)&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Efficiency&amp;rdquo;? (You&amp;rsquo;re trading hardware efficiency for operational chaos)&lt;/li&gt;
&lt;li&gt;Easier management? (Is debugging mount failures &amp;ldquo;easier&amp;rdquo; than running a separate box you never touch?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Be honest: you&amp;rsquo;re not optimizing for reliability or simplicity. You&amp;rsquo;re optimizing for&amp;hellip; what, exactly?&lt;/p&gt;
&lt;h2 id=&#34;the-architecture-comparison&#34;&gt;The Architecture Comparison
&lt;/h2&gt;&lt;p&gt;Let me show you what I ran vs what I run now.&lt;/p&gt;
&lt;h3 id=&#34;wrong-what-i-built-first&#34;&gt;WRONG: What I Built First
&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Proxmox Host (one physical box)
├── NAS VM (OMV)
│   ├── Boots at ??? (depends on VM priority)
│   ├── Needs: OS boot → network init → storage mount → NFS/SMB start
│   └── Serves: NFS/SMB shares back to Proxmox host
│
├── Jellyfin LXC
│   ├── Boots at ??? (fast, because LXC)
│   ├── Tries to mount: /mnt/media (from Proxmox host bind mount)
│   └── Result: ⚠️ Maybe works, maybe empty directory, maybe fails
│
├── Sonarr LXC
│   ├── Boots at ??? 
│   ├── Tries to mount: /mnt/media (from Proxmox host bind mount)
│   └── Result: ⚠️ Maybe works, maybe empty directory, maybe fails
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Problems:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boot order is non-deterministic (depends on VM/LXC startup speed)&lt;/li&gt;
&lt;li&gt;NAS VM has multiple initialization steps before it&amp;rsquo;s ready to serve&lt;/li&gt;
&lt;li&gt;Containers mount before checking if NFS is actually serving&lt;/li&gt;
&lt;li&gt;Reboots are a lottery&lt;/li&gt;
&lt;li&gt;Proxmox updates can change everything (rare, but still a thing)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;right-what-i-run-now&#34;&gt;RIGHT: What I Run Now
&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NAS Box (dedicated bare metal Debian)
├── Hardware: Intel G3220, 16GB RAM, LSI HBA, 10GbE NIC
├── Software: Debian Trixie, XFS per drive, MergerFS pooling
├── Boot: Second. After the dedicated Router
└── Serves: NFS shares to network (always available)

                    ↓ (2.5GbE Network)

Proxmox Host (separate physical box)
├── Boot: Thrid (after NAS is already serving)
├── Mounts: /mnt/media via NFS from NAS box (always succeeds)
│
├── Jellyfin LXC → bind mounts /mnt/media → ✅ always works
└── Sonarr LXC → bind mounts /mnt/media → ✅ always works
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boot order is deterministic (NAS second, always)&lt;/li&gt;
&lt;li&gt;No dependencies between storage and compute layers&lt;/li&gt;
&lt;li&gt;Reboots are predictable&lt;/li&gt;
&lt;li&gt;Proxmox updates don&amp;rsquo;t affect storage&lt;/li&gt;
&lt;li&gt;Fault isolation (one system failing doesn&amp;rsquo;t take down the other)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;network-details&#34;&gt;Network Details
&lt;/h3&gt;&lt;p&gt;Connected via SODOLA 8-Port 2.5Gb managed switch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAS: 10GbE NIC (downlinks at 2.5Gb to switch)&lt;/li&gt;
&lt;li&gt;Proxmox: 2.5GbE NIC&lt;/li&gt;
&lt;li&gt;Throughput: ~280 MB/s sustained (vs ~110 MB/s on 1GbE)&lt;/li&gt;
&lt;li&gt;Multiple simultaneous 4K streams + NZB downloads + backups = no congestion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-i-migrated&#34;&gt;How I Migrated
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s exactly how I moved from &amp;ldquo;NAS VM on Proxmox&amp;rdquo; to &amp;ldquo;NAS on bare metal.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;what-i-started-with&#34;&gt;What I Started With
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Proxmox host with LSI HBA in IT mode&lt;/li&gt;
&lt;li&gt;8x drives passed through to OMV VM&lt;/li&gt;
&lt;li&gt;Containers mounting via NFS from Proxmox host (bind mounts)&lt;/li&gt;
&lt;li&gt;Constant race condition issues&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;what-i-did&#34;&gt;What I Did
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. Built the new NAS box first&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Old desktop: Intel G3220, Gigabyte GA-Z87X-D3H motherboard, 16GB DDR3&lt;/li&gt;
&lt;li&gt;Installed Debian Trixie&lt;/li&gt;
&lt;li&gt;Added 10GbE NIC (Intel X520-DA1, $30 used on eBay)&lt;/li&gt;
&lt;li&gt;Configured it on the network with a static IP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Tested NFS serving (before moving drives)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set up NFS exports on the new Debian box&lt;/li&gt;
&lt;li&gt;Verified Proxmox could mount from it&lt;/li&gt;
&lt;li&gt;Made sure permissions and paths matched my existing setup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Scheduled downtime (Friday night)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shut down all containers/VMs on Proxmox&lt;/li&gt;
&lt;li&gt;Shut down the NAS VM&lt;/li&gt;
&lt;li&gt;Shut down the Proxmox host&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. Moved the hardware&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pulled the LSI HBA from Proxmox host&lt;/li&gt;
&lt;li&gt;Moved all 8 drives&lt;/li&gt;
&lt;li&gt;Installed HBA and drives in the new NAS box&lt;/li&gt;
&lt;li&gt;Connected power, network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5. Brought up storage&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Booted the NAS box&lt;/li&gt;
&lt;li&gt;Drives appeared as &lt;code&gt;/dev/sda&lt;/code&gt; through &lt;code&gt;/dev/sdh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mounted each drive: &lt;code&gt;mount /dev/sdX /mnt/diskX&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Configured MergerFS to pool them: &lt;code&gt;/mnt/disk* /mnt/media&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set up NFS exports pointing to &lt;code&gt;/mnt/media&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;/etc/fstab&lt;/code&gt; so everything mounts on boot&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6. Brought Proxmox back online&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Booted Proxmox&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;/etc/fstab&lt;/code&gt; to point to the new NAS IP instead of VM mount&lt;/li&gt;
&lt;li&gt;Verified NFS mounts succeeded&lt;/li&gt;
&lt;li&gt;Started containers one by one&lt;/li&gt;
&lt;li&gt;Checked Jellyfin library, verified all media was accessible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Total downtime: ~2 hours&lt;/strong&gt; (most of it was physical drive transplant and cable management)&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/lsi-9300-8i.jpg&#34; alt=&#34;LSI 9300-8i HBA Controller HBA Controller is a high-performance disk controller suitable for media server data storage needs. With a transfer rate of up to 12Gbps, this unit provides reliable and fast data storage solutions.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;LSI 9300-8i HBA Controller&lt;/strong&gt;&lt;br&gt;
LSI SAS3008 9300-8i HBA Controller is a high-performance disk controller suitable for media server data storage needs. With a transfer rate of up to 12Gbps, this unit provides reliable and fast data storage solutions.
&lt;strong&gt;Price&lt;/strong&gt;: $30 - $40
    &lt;/div&gt;

  
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
    
    
      &lt;a href=&#34;https://www.ebay.com/itm/297495442991?mkcid=1&amp;amp;mkrid=711-53200-19255-0&amp;amp;siteid=0&amp;amp;campid=5339130028&amp;amp;toolid=80006&amp;amp;mkevt=1&amp;amp;amdata=enc%3AAQAKAAAAoFkggFvd1GGDu0w3yXCmi1cTVHapz9ICIAah6cSqU2T1JVzUwv4HTObyzW7QIR%2BpwAvi3SrOMmd%2FCeWZdg%2BhnEBHG4TweGE%2BImBQAugAF2gY7SD%2BiVlrgV%2BkaEk1RPjHQq5UO7NSdA3FMAKAgypyvSGtGNVVQEMGqmiV9QQ4O%2FAiaFelpZQcPD5SSkA9wM%2Bc%2FgrhJLUZ2oyhnLzM54fLWFs%3D&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Ebay&lt;/a&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;what-i-learned&#34;&gt;What I Learned
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test the new setup before you commit.&lt;/strong&gt; I verified NFS serving worked before I moved drives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expect the first boot to take longer.&lt;/strong&gt; XFS file system checks took a few minutes per drive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan for worst case.&lt;/strong&gt; I kept the Proxmox host ready to take the HBA back if something went catastrophically wrong (it didn&amp;rsquo;t).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-your-nas-actually-needs-to-do&#34;&gt;What Your NAS Actually Needs To Do
&lt;/h2&gt;&lt;h3 id=&#34;redundancy&#34;&gt;Redundancy
&lt;/h3&gt;&lt;p&gt;At minimum: ability to survive drive failure without data loss.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be honest: I ran without parity for two years. Why? Because 95% of my data was movies and TV shows I could redownload. Then I started adding family videos and photos - stuff I can&amp;rsquo;t get back. That&amp;rsquo;s when I decided to add SnapRAID for parity (I&amp;rsquo;m adding this next month if HDD prices come down).&lt;/p&gt;
&lt;p&gt;Use any scheme you&amp;rsquo;re comfortable with: parity, mirrors, or just redundancy for critical bits. Just know what you&amp;rsquo;re protecting and what you&amp;rsquo;re willing to lose.&lt;/p&gt;
&lt;h3 id=&#34;protocols-that-work&#34;&gt;Protocols That Work
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NFS&lt;/strong&gt; for your virtualization or Linux services&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMB/CIFS&lt;/strong&gt; for Windows/macOS clients&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SFTP&lt;/strong&gt; for remote access or backup jobs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your NAS must seamlessly integrate with your compute and network layers. My setup serves NFS to Proxmox hosts and SMB to Windows machines for manual file management. It just works.&lt;/p&gt;
&lt;h3 id=&#34;smart-mounting-strategy&#34;&gt;Smart Mounting Strategy
&lt;/h3&gt;&lt;p&gt;This is where most people screw up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stick to consistent paths&lt;/strong&gt;: &lt;code&gt;/mnt/media/movies&lt;/code&gt;, &lt;code&gt;/mnt/media/shows&lt;/code&gt; not &lt;code&gt;/media1&lt;/code&gt;, &lt;code&gt;/media2&lt;/code&gt;, &lt;code&gt;/random-drive-name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable automount&lt;/strong&gt; so on reboot everything comes up in order (systemd handles this well on Debian)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep temp, transcode, and download directories separate&lt;/strong&gt; from your main pool to avoid runaway writes destroying your media drives&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use SMART monitoring&lt;/strong&gt; and actually test restore workflows. You&amp;rsquo;ll thank yourself later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I run &lt;code&gt;smartctl -a /dev/sdX&lt;/code&gt; monthly on each drive. One drive showed reallocated sectors climbing. Replaced it before it died.&lt;/p&gt;
&lt;h2 id=&#34;software-choiceswhat-ive-used-and-what-actually-works&#34;&gt;Software Choices—What I&amp;rsquo;ve Used and What Actually Works
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;ve tested and what I actually run.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;NAS OS&lt;/th&gt;
          &lt;th&gt;Strengths&lt;/th&gt;
          &lt;th&gt;Weaknesses&lt;/th&gt;
          &lt;th&gt;My Take&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;TrueNAS&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Strong ZFS support, snapshot capabilities, enterprise features&lt;/td&gt;
          &lt;td&gt;Needs more RAM/hardware, steeper learning curve, overkill for media&lt;/td&gt;
          &lt;td&gt;Great if you need ZFS. I don&amp;rsquo;t.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Unraid&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Flexible drives, less hardware-intensive, nice GUI&lt;/td&gt;
          &lt;td&gt;License cost ($59-$129), lower performance on some tasks&lt;/td&gt;
          &lt;td&gt;Popular for good reason, but I&amp;rsquo;m cheap and wanted full control&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;OpenMediaVault&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Lightweight, easy to set up, web GUI&lt;/td&gt;
          &lt;td&gt;May lack advanced features, felt restrictive to me&lt;/td&gt;
          &lt;td&gt;Where I started in a VM, outgrew it fast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Debian + MergerFS&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Lightweight, total control, exactly what you need&lt;/td&gt;
          &lt;td&gt;No GUI (you use SSH and config files), learning curve&lt;/td&gt;
          &lt;td&gt;This is what I run. Took a weekend to learn, now it&amp;rsquo;s bulletproof.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;I originally tried OpenMediaVault in a VM. It worked, but every time I wanted to do something slightly custom, I fought with the GUI or the update system. Moved to straight Debian with MergerFS and NFS/SMB servers. No GUI, just config files and systemd. Steeper learning curve? Yes. But now I understand exactly how everything works and nothing is hidden behind abstraction layers. When something breaks (rare), I know exactly where to look.&lt;/p&gt;&lt;/blockquote&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Whatever you choose, run it on bare metal. Avoid running it in a VM or LXC. You will thank yourself later.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;zfs-vs-mergerfs---whats-best-for-a-media-server&#34;&gt;ZFS vs MergerFS - What&amp;rsquo;s Best For a Media Server?
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s cut the fluff: you don&amp;rsquo;t always need ZFS for a media-server-only setup.&lt;/p&gt;
&lt;h3 id=&#34;zfs-enterprise-grade-redundancy&#34;&gt;ZFS: Enterprise Grade Redundancy
&lt;/h3&gt;&lt;p&gt;RAID-Z/RAID-Z2, checksums, snapshots, send/receive. Requires serious RAM (1GB per TB is the common recommendation) and prefers ECC memory.&lt;/p&gt;
&lt;p&gt;I almost started with ZFS because that&amp;rsquo;s what the internet said to use. Researched ECC RAM, planned my vdev layout, read the entire FreeBSD handbook section on ZFS. Felt very enterprise. It also had an enterprise price tag.&lt;/p&gt;
&lt;p&gt;Then I realized: if a drive dies, I can just re-download everything in a weekend. Why am I treating Bob&amp;rsquo;s Burgers S04 like a production database?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When ZFS is worth it:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re running VMs, databases, things that can&amp;rsquo;t be redownloaded&lt;/li&gt;
&lt;li&gt;You can afford to buy 6 or more identical drives in one purchase (I couldn&amp;rsquo;t justify this).&lt;/li&gt;
&lt;li&gt;You have irreplaceable data (family photos, business files)&lt;/li&gt;
&lt;li&gt;You want snapshots and send/receive for backups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For me?&lt;/strong&gt; 80% of my data was re-downloadable movies and shows. ZFS was overkill. I make backups of the irreplaceable files and keep them in three locations (Local, External HDD, and Cloud).&lt;/p&gt;
&lt;h3 id=&#34;mergerfs-flexible-media-friendly&#34;&gt;MergerFS: Flexible, Media Friendly
&lt;/h3&gt;&lt;p&gt;MergerFS pools drives into &lt;code&gt;/mnt/media&lt;/code&gt; regardless of size.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it works for media:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add drives without rebuilding (I started with 3 drives, now at 8)&lt;/li&gt;
&lt;li&gt;Any size, any speed, different brands, no &amp;ldquo;matched set&amp;rdquo; needed&lt;/li&gt;
&lt;li&gt;If a drive dies, you lose only what was on that drive, not the whole pool&lt;/li&gt;
&lt;li&gt;Reads are fast, writes go to whichever drive has space (configurable policies)&lt;/li&gt;
&lt;li&gt;Works on bare metal Debian with zero virtualization overhead&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; No real-time parity. If a drive dies, that data is gone unless you have backups or add parity separately (see SnapRAID below).&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;ZFS&lt;/th&gt;
          &lt;th&gt;MergerFS&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Real-time parity&lt;/td&gt;
          &lt;td&gt;✅ Yes&lt;/td&gt;
          &lt;td&gt;❌ Not built-in&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Flexible drive sizes&lt;/td&gt;
          &lt;td&gt;❌ No (same-size vdevs)&lt;/td&gt;
          &lt;td&gt;✅ Yes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;File-level recovery&lt;/td&gt;
          &lt;td&gt;❌ Generally no&lt;/td&gt;
          &lt;td&gt;✅ Straightforward&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Hardware overhead&lt;/td&gt;
          &lt;td&gt;High (RAM, ECC preferred)&lt;/td&gt;
          &lt;td&gt;Low (runs on anything)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;VM-friendly&lt;/td&gt;
          &lt;td&gt;⚠️ Possible but problematic&lt;/td&gt;
          &lt;td&gt;✅ But run it on bare metal anyway&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Ideal for media&lt;/td&gt;
          &lt;td&gt;Overkill&lt;/td&gt;
          &lt;td&gt;Perfect fit&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your NAS is mostly media you can re-download - go MergerFS&lt;/li&gt;
&lt;li&gt;If your NAS hosts business-critical or irreplaceable data - go ZFS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;mergerfs--snapraid-the-best-of-both-worlds&#34;&gt;MergerFS + SnapRAID: The Best of Both Worlds
&lt;/h3&gt;&lt;p&gt;MergerFS gives me flexible pooling. But what about redundancy?&lt;/p&gt;
&lt;p&gt;Enter SnapRAID: parity for files that don&amp;rsquo;t change often (perfect for media).&lt;/p&gt;
&lt;p&gt;How it works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I dedicate 1 drive as a parity drive (the largest drive)&lt;/li&gt;
&lt;li&gt;SnapRAID calculates parity across the pool on-demand (I&amp;rsquo;ll run it nightly via cron)&lt;/li&gt;
&lt;li&gt;If a drive dies, I can rebuild from parity&lt;/li&gt;
&lt;li&gt;Unlike RAID, parity is calculated when YOU tell it to, not in real-time&lt;/li&gt;
&lt;li&gt;If TWO drives die before I sync parity&amp;hellip; yeah, I lose some files. But that&amp;rsquo;s the trade-off for flexibility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m adding this to my setup next month because I finally have data I can&amp;rsquo;t easily redownload (family videos, photos). For movies and TV? I didn&amp;rsquo;t bother for two years. The cost/benefit wasn&amp;rsquo;t there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why this works on bare metal:&lt;/strong&gt; SnapRAID needs direct drive access for parity calculation. Running it in a VM means the hypervisor is between your file system and the drives - adding latency, complexity, and potential corruption. On bare metal? It just works.&lt;/p&gt;
&lt;h2 id=&#34;hardware-recommendations&#34;&gt;Hardware Recommendations
&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s gear time. Because yes, you can buy this now. And yes, you can target budget or beast mode depending on how deep your wallet is.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Tier&lt;/th&gt;
          &lt;th&gt;Specs&lt;/th&gt;
          &lt;th&gt;Use Case&lt;/th&gt;
          &lt;th&gt;What I&amp;rsquo;d Buy Today&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Budget&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;2-4 bays, low-power CPU, basic RAM&lt;/td&gt;
          &lt;td&gt;Cold storage, archives&lt;/td&gt;
          &lt;td&gt;Old desktop with 2-4 SATA ports. Intel Pentium or i3, 8GB RAM. Purpose: hold files, serve NFS. Cost: $50-100 used.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Balanced&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;4-8 bays, decent CPU, 16GB RAM&lt;/td&gt;
          &lt;td&gt;Streaming + moderate load&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;This is basically my setup.&lt;/strong&gt; Rosewill Helium NAS case ($90), Intel G3220 or newer i3 ($50 used), 16GB RAM, LSI HBA in IT mode ($50 used), 8x drives. Quiet, expandable, fits under a desk. Total: ~$300 + drives.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Beast&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;8+ bays, modern i5/i7, 10GbE NICs&lt;/td&gt;
          &lt;td&gt;Multi-user, 4K/8K, heavy lift&lt;/td&gt;
          &lt;td&gt;Rosewill Helium NAS or bigger case, i5-12400 or better, 32GB RAM, 10GbE NIC, quality PSU. Overkill for most, perfect if you&amp;rsquo;re streaming to 5+ users simultaneously. Cost: $600-800 + drives.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Simple&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Synology 4-8 bay NAS&lt;/td&gt;
          &lt;td&gt;Just want it to work, don&amp;rsquo;t want to DIY&lt;/td&gt;
          &lt;td&gt;DS920+, DS1522+, or whatever&amp;rsquo;s current. You pay more, but it works out of the box. No shame in this. Cost: $400-800 + drives.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DP3PQFKW&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/rosewill-helium.jpg&#34; alt=&#34;The Rosewill Helium NAS ATX mid-tower is a budget-friendly case built with storage in mind. It fits a standard ATX motherboard, has space for 10 hard drives as well as room for HBAs or SATA expanders. For a DIY NAS this case lots of room for growth without paying server-chassis prices.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Rosewill Helium NAS ATX Mid-Tower Case&lt;/strong&gt;&lt;br&gt;
The Rosewill Helium NAS ATX mid-tower is a budget-friendly case built with storage in mind. It fits a standard ATX motherboard, has space for 10 3.5&amp;quot; hard drives as well as room for HBAs or SATA expanders. For a DIY NAS this case lots of room for growth without paying server-chassis prices.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4ilu8CZ&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458314556912023741307719&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2frosewill-atx-mid-tower-steel-plastic-computer-case-black-helium-nas%2fp%2fN82E16811147365R%3fitem%3dN82E16811147365R&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Critical hardware note:&lt;/strong&gt; Whatever you buy, it needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Direct SATA connections (no USB)&lt;/li&gt;
&lt;li&gt;Enough RAM for your OS + file system cache (8GB minimum, 16GB better)&lt;/li&gt;
&lt;li&gt;Quality power supply (drives are expensive, don&amp;rsquo;t cheap out on PSU)&lt;/li&gt;
&lt;li&gt;Network connectivity that matches your needs (2.5GbE or 10GbE if you have heavy traffic)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;network-the-bottleneck-nobody-talks-about&#34;&gt;Network: The Bottleneck Nobody Talks About
&lt;/h2&gt;&lt;p&gt;1GbE = 125 MB/s theoretical, ~110 MB/s real-world.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s fine for one 4K stream (40 Mbps) or even 20 simultaneous 1080p streams. Sounds like plenty, right?&lt;/p&gt;
&lt;p&gt;Except you&amp;rsquo;re also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Downloading a new TV Series&lt;/li&gt;
&lt;li&gt;Running backups to your PBS box (Part 5 of this series)&lt;/li&gt;
&lt;li&gt;Scanning new media into Jellyfin&lt;/li&gt;
&lt;li&gt;Maybe transcoding if someone&amp;rsquo;s on a slow client&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now you&amp;rsquo;re maxing out that 1GbE link. Streams buffer. Your spouse asks if the internet is broken. You check your bandwidth graphs and realize: it&amp;rsquo;s not the ISP, it&amp;rsquo;s your internal network.&lt;/p&gt;
&lt;h3 id=&#34;what-i-did-1&#34;&gt;What I Did
&lt;/h3&gt;&lt;p&gt;Added a $30 Intel X520-DA1 10GbE NIC to my NAS box (used on eBay) and a $60 SODOLA 8-Port 2.5Gb managed switch.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DTKGCWNL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/sodola-8port.jpg&#34; alt=&#34;SODOLA 8-Port 2.5Gb Web Managed Switch: Provides eight 2.5GbE ports, a quiet fanless metal chassis, and a simple web UI with essentials like 802.1Q VLANs, QoS, and link aggregation. It fits a mid-tier router build by unlocking multi-gig LAN speeds for NAS and desktops while keeping segmentation clean and power draw low.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;SODOLA 8-Port 2.5Gb Web Managed Switch&lt;/strong&gt;&lt;br&gt;
Provides eight 2.5GbE ports, a quiet fanless metal chassis, and a simple web UI with essentials like 802.1Q VLANs, QoS, and link aggregation. It unlocks multi-gig LAN speeds for NAS and desktops while keeping segmentation clean and power draw low.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3LkQoQX&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAS has 10GbE NIC (downlinks at 2.5Gb to the switch)&lt;/li&gt;
&lt;li&gt;Proxmox has 2.5GbE NIC&lt;/li&gt;
&lt;li&gt;Sustained throughput: ~280 MB/s (vs ~110 MB/s on 1GbE)&lt;/li&gt;
&lt;li&gt;Multiple 4K streams + torrents + backups = no congestion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Streams never buffer. Backups run 2.5x faster. Torrents don&amp;rsquo;t fight with Jellyfin for bandwidth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you&amp;rsquo;re building from scratch:&lt;/strong&gt; Just buy a motherboard with 2.5GbE built in. The Intel i226-V chipset is solid and adds $0 to motherboard cost these days. Many boards in the $100-150 range include it standard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When to consider 10GbE:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5+ simultaneous users streaming 4K&lt;/li&gt;
&lt;li&gt;Heavy backup workloads (multiple TB per day)&lt;/li&gt;
&lt;li&gt;You transcode on a separate box and move large files constantly&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re a data hoarder moving TBs between systems regularly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most home setups? 2.5GbE is the sweet spot. Cheap, no special cables needed (works on Cat5e), massive improvement over 1GbE.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel-x520-da1.jpg&#34; alt=&#34;Intel X520-DA1 10GbE NIC: This 10Gtek network card is designed for use with Intel X520-DA1 routers and features a maximum data rate of 10 Gbps. With one SFP&amp;#43; port and PCIe x8 interface, this card provides high-speed connectivity for your network.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Intel X520-DA1 10GbE NIC&lt;/strong&gt;&lt;br&gt;
This 10Gtek network card is designed for use with Intel X520-DA1 routers and features a maximum data rate of 10 Gbps. With one SFP+ port and PCIe x8 interface, this card provides high-speed connectivity for your network.
&lt;strong&gt;Price&lt;/strong&gt;: $30 - $40
    &lt;/div&gt;

  
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
    
    
      &lt;a href=&#34;https://www.ebay.com/itm/405498886462?mkcid=1&amp;amp;mkrid=711-53200-19255-0&amp;amp;siteid=0&amp;amp;campid=5339130028&amp;amp;toolid=80006&amp;amp;mkevt=1&amp;amp;amdata=enc%3AAQAKAAAAoFkggFvd1GGDu0w3yXCmi1cM%2FcCvIfMy8GPEcrjTSfgyzkPGr8Dzi4gxESKnBZ4N9tztv3jOkJMG093scPRP0WjuxkxXpT3cq%2BCVi0r2wuwGZW4iwCv4WVNIpf8BWsy%2FgRqzWXfD3BWFvnFquYMs8A%2Fn%2BvXvKkfcz6eSMc8S8%2Fbrm%2BxBaZrTQNDzKYt0mm3sZv4L91aVe8vmg6%2FiMih4IxQ%3D&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Ebay&lt;/a&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;My network setup:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAS: Intel X520-DA1 10GbE NIC with DAC cable to switch&lt;/li&gt;
&lt;li&gt;Switch: SODOLA 8-Port 2.5Gb managed switch&lt;/li&gt;
&lt;li&gt;Proxmox: Onboard 2.5GbE&lt;/li&gt;
&lt;li&gt;Clients: Mix of 1GbE and 2.5GbE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Total cost: ~$90 for the upgrade. Best $90 I&amp;rsquo;ve spent on this build.&lt;/p&gt;
&lt;h2 id=&#34;storage-layouts-that-make-sense&#34;&gt;Storage Layouts That Make Sense
&lt;/h2&gt;&lt;p&gt;Turning hardware into a predictable, reliable stack.&lt;/p&gt;
&lt;h3 id=&#34;directory-structure&#34;&gt;Directory Structure
&lt;/h3&gt;&lt;p&gt;Use clear, consistent paths:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/mnt/media/
├── movies/
├── shows/
├── music/
└── books/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Not &lt;code&gt;/media1/stuff&lt;/code&gt;, &lt;code&gt;/driveB/movies&lt;/code&gt;, &lt;code&gt;/bob-likes-anime/&lt;/code&gt;. Keep it simple. Keep it consistent.&lt;/p&gt;
&lt;p&gt;Why this matters: when you&amp;rsquo;re debugging at 3 AM (you won&amp;rsquo;t be, because bare metal doesn&amp;rsquo;t have race conditions, but hypothetically), you want obvious paths. When you&amp;rsquo;re setting up a new container, you want to know exactly where &lt;code&gt;/mnt/media/movies&lt;/code&gt; lives.&lt;/p&gt;
&lt;h3 id=&#34;separate-temp-and-archive&#34;&gt;Separate Temp and Archive
&lt;/h3&gt;&lt;p&gt;This is critical and most people get it wrong.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transcode, temp, and download directories&lt;/strong&gt;: Put these on SSDs or a separate spindle pool that you don&amp;rsquo;t care about. You do NOT want qBittorrent hammering your archive drives with random writes while incomplete downloads get moved around.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finished media&lt;/strong&gt;: Goes to the archive pool (the big slow drives via MergerFS). This is read-mostly workload. Movies get added once, read many times, rarely deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My setup:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NAS Box:
├── 500GB SSD: Debian 13, NFS, SMB, MergerFS and Snapraid (that&amp;#39;s it don&amp;#39;t over complicate it).
└── 93TB MergerFS pool (Mix of 3, 6, 14, and 24TB Drives): Static Storage only.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Any Docker containers, downloads, or Jellyfin transcodes are on the compute node with fast redundant data storage.&lt;/p&gt;
&lt;p&gt;SABnzbd downloads to compute node&amp;rsquo;s fast storage. When a download completes, Sonarr/Radarr move it to &lt;code&gt;/mnt/media/tv&lt;/code&gt; or &lt;code&gt;/mnt/media/movies&lt;/code&gt; on the MergerFS pool. The compute node&amp;rsquo;s storage absorbs all the random write punishment. The spinning drives just handle sequential writes when media is added and sequential reads when streaming.&lt;/p&gt;
&lt;h3 id=&#34;mount-strategy&#34;&gt;Mount Strategy
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mount read-only where possible&lt;/strong&gt; for older content (reduces risk of accidental deletion). My Jellyfin server can only read the media files on the NAS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set up rsync or backups&lt;/strong&gt; to your backup box (Part 5 of this series) so you&amp;rsquo;re not relying on storage redundancy for your important files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run SMART monitoring&lt;/strong&gt;: &lt;code&gt;smartctl -a /dev/sdX&lt;/code&gt; monthly, check for reallocated sectors, pending sectors, or UDMA CRC errors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule pool scrubs&lt;/strong&gt; if using SnapRAID (I&amp;rsquo;ll run &lt;code&gt;snapraid sync&lt;/code&gt; nightly, &lt;code&gt;snapraid scrub&lt;/code&gt; weekly once I set it up)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test restores&lt;/strong&gt;: Seriously. Shut down, pull a drive, boot, verify you know how to identify which drive failed and how MergerFS handles it. Learn how recovery works BEFORE you need it at 3 AM.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;When your storage setup is done well - you forget it&amp;rsquo;s there. When it fails - you will be ready.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;my-actual-mergerfs-config&#34;&gt;My Actual MergerFS Config
&lt;/h3&gt;&lt;p&gt;For reference, here&amp;rsquo;s what I run on bare metal Debian:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drive mounts in &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/dev/disk/by-id/wwn-0x5000c500b531bbcc-part1    /mnt/Pool/Disk1        xfs     defaults        0       0
/dev/disk/by-id/wwn-0x5000c500e4505355-part1    /mnt/Pool/Disk2        xfs     defaults        0       0
/dev/disk/by-id/wwn-0x5000c500e50b9986-part1    /mnt/Pool/Disk3        xfs     defaults        0       0
/dev/disk/by-id/wwn-0x5000c500e82476d9-part1    /mnt/Pool/Disk4        xfs     defaults        0       0
/dev/disk/by-id/wwn-0x5000cca295caac7a-part1    /mnt/Pool/Disk5        xfs     defaults        0       0
/dev/disk/by-id/wwn-0x5000cca2a1dcb6af-part1    /mnt/Pool/Disk6        xfs     defaults        0       0
/dev/disk/by-id/wwn-0x50014ee20d104997-part1    /mnt/Pool/Disk7        xfs     defaults        0       0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;MergerFS pool:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/mnt/Pool/Disk*        /media/Storage  fuse.mergerfs   direct_io,defaults,allow_other,dropcacheonclose=true,inodecalc=path-hash,category.create=mfs,minfreespace=50G,fsname=storage      0       0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;NFS exports in &lt;code&gt;/etc/exports&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/media/Storage/ 172.27.0.0/24(all_squash,anongid=1001,anonuid=1000,insecure,rw,subtree_check,fsid=0)
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;That&amp;rsquo;s it. No GUI. No abstraction layers. Just Linux doing what Linux does best: serving files reliably.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;common-mistakes-that-i-made-so-you-dont-have-to&#34;&gt;Common Mistakes (That I Made So You Don&amp;rsquo;t Have To)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Running storage as a VM on your compute host&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Race conditions, mount order chaos, reboots that break everything. This was my life for six months. Don&amp;rsquo;t do it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running storage in an LXC&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Even worse than a VM. Filesystem passthrough nightmares, permission issues, SMART monitoring doesn&amp;rsquo;t work right. Just don&amp;rsquo;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using USB externals without redundancy&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;One disconnect = data loss. If the data matters, it needs to be on real SATA connected to a real motherboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mixing different drive sizes in a ZFS pool&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Kills performance, wastes capacity. ZFS wants matched vdevs. (MergerFS doesn&amp;rsquo;t care. One of many reasons I prefer it for media.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ignoring ECC RAM when building ZFS&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Silent bit flips can corrupt your &amp;ldquo;perfect&amp;rdquo; checksummed pool. If you go ZFS, get ECC. Or just use MergerFS and skip the RAM requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never testing restores&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;You don&amp;rsquo;t have a backup until you&amp;rsquo;ve tested the restore. Same goes for RAID/parity rebuilds. Pull a drive while the system is OFF (don&amp;rsquo;t hot-swap unless you know what you&amp;rsquo;re doing) and verify you can identify and recover from the failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trusting your setup without monitoring&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Run SMART checks monthly. Watch your logs. Drives give warnings before they die—if you&amp;rsquo;re paying attention.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thinking &amp;ldquo;I&amp;rsquo;ll add redundancy later&amp;rdquo;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Later never comes. If the data matters NOW, protect it NOW. I&amp;rsquo;m guilty of this (took me 2 years to decide on SnapRAID), but at least I knew what I was risking.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-only-time-storage-in-a-vm-makes-sense&#34;&gt;The Only Time Storage In A VM Makes Sense
&lt;/h2&gt;&lt;p&gt;Let me be fair: is there ANY scenario where running storage in a VM is acceptable?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maybe - MAYBE - if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re running TrueNAS as a VM with direct PCI passthrough of an HBA&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s THE ONLY VM on a dedicated Proxmox host (no competing VMs/LXCs)&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ve pinned the VM to specific CPU cores, so it always has resources&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ve configured Proxmox to boot the storage VM first with significant delays before anything else starts&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ve tested cold boot scenarios extensively&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;But even then:&lt;/strong&gt; what are you gaining? You&amp;rsquo;ve added a hypervisor layer between your storage and your compute. You&amp;rsquo;ve introduced complexity, potential for race conditions, and dependency on Proxmox functioning correctly.&lt;/p&gt;
&lt;p&gt;The question isn&amp;rsquo;t &amp;ldquo;can you make it work?&amp;rdquo; The question is &amp;ldquo;why bother?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My answer:&lt;/strong&gt; There is no good reason. The &amp;ldquo;one box does everything&amp;rdquo; dream is just that a dream. You&amp;rsquo;re trading $50-100 of old hardware for hours of maintenance and fragility you don&amp;rsquo;t need.&lt;/p&gt;
&lt;p&gt;If you want to run TrueNAS or OpenMediaVault, run them on bare metal. If you want Debian + MergerFS, run it on bare metal. Give storage its own box and let it do its job without interference.&lt;/p&gt;
&lt;h2 id=&#34;what-you-should-do-right-now&#34;&gt;What You Should Do Right Now
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re currently running storage in a VM or LXC:&lt;/p&gt;
&lt;h3 id=&#34;option-1-build-a-new-nas-box-recommended&#34;&gt;Option 1: Build A New NAS Box (Recommended)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get cheap hardware&lt;/strong&gt;: Old desktop, $50-100 on Craigslist/eBay, needs 4+ SATA ports&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install Debian&lt;/strong&gt; (or your preferred NAS OS—on bare metal)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set up NFS/SMB shares&lt;/strong&gt; while your VM is still running&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy data&lt;/strong&gt; from VM to new box (rsync, verify with diff/checksums)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test thoroughly&lt;/strong&gt; (mount from Proxmox, verify Jellyfin sees everything)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cut over&lt;/strong&gt;: Update Proxmox mounts to point to new NAS IP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shut down the VM forever&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Downtime: ~2 hours for final cutover. Peace of mind: priceless.&lt;/p&gt;
&lt;h3 id=&#34;option-2-repurpose-your-proxmox-host&#34;&gt;Option 2: Repurpose Your Proxmox Host
&lt;/h3&gt;&lt;p&gt;If you only have one box:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Back up your containers/VMs&lt;/strong&gt; (you should be doing this anyway)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wipe Proxmox&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install Debian as NAS&lt;/strong&gt; on the bare metal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buy a second box&lt;/strong&gt; for Proxmox (can be cheaper since it&amp;rsquo;s just compute)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rebuild your compute stack&lt;/strong&gt; on the new Proxmox host&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mount from the NAS&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yes, this requires buying hardware. But you&amp;rsquo;re separating concerns the right way. Storage on one box, compute on another. This is how it should be.&lt;/p&gt;
&lt;h3 id=&#34;option-3-stay-in-vm-hell&#34;&gt;Option 3: Stay In VM Hell
&lt;/h3&gt;&lt;p&gt;Continue debugging mount failures, systemd dependencies, and race conditions. Spend 3 hours every few weeks troubleshooting why reboots break everything. Wonder why your spouse hates your &amp;ldquo;hobby.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t recommend this option.&lt;/p&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;I run 93TB of media on bare metal Debian with MergerFS. Eight drives of different sizes, XFS file systems, pooled with MergerFS. No parity yet (adding SnapRAID next month). 2.5GbE network via 10GbE NIC to SODOLA switch. NFS shares to Proxmox. SMB shares to Windows clients.&lt;/p&gt;
&lt;p&gt;Hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel G3220 (old, low-power, sufficient)&lt;/li&gt;
&lt;li&gt;Gigabyte GA-Z87X-D3H motherboard&lt;/li&gt;
&lt;li&gt;16GB DDR3 RAM&lt;/li&gt;
&lt;li&gt;LSI HBA in IT mode (direct drive access, no RAID controller nonsense)&lt;/li&gt;
&lt;li&gt;Intel X520-DA1 10GbE NIC&lt;/li&gt;
&lt;li&gt;Rosewill Helium NAS case (holds 10 drives, quiet, fits under a desk)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The box boots in 90 seconds. Serves files to two Proxmox hosts and a dozen containers. I haven&amp;rsquo;t touched it in months except to check SMART data.&lt;/p&gt;
&lt;p&gt;Total cost: ~$2,000 over three years (includes drives, case, and network gear).&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t had a mount failure in six months. I reboot my compute nodes whenever I want. Proxmox updates don&amp;rsquo;t scare me. Power outages resolve themselves. My storage just&amp;hellip; works.&lt;/p&gt;
&lt;p&gt;If your media library matters, and if you&amp;rsquo;re reading this, it does - give it its own box. Separate storage from compute. Pick an OS (I chose Debian + MergerFS, you might prefer OpenMediaVault or Unraid). Learn it. Build it right. Run it on bare metal.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll thank yourself at 3 AM when the power comes back and everything just comes back online in the right order. Or better yet - you&amp;rsquo;ll sleep through it because there&amp;rsquo;s nothing to debug.&lt;/p&gt;
&lt;p&gt;Stop running storage in VMs. Stop fighting race conditions. Stop spending weekends debugging mount failures.&lt;/p&gt;
&lt;p&gt;Build it right. Run it on bare metal. Forget it exists.&lt;/p&gt;
&lt;h2 id=&#34;series-navigation&#34;&gt;Series Navigation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-hardware-guide-2025&#34; &gt;Part 1 - The 3 Boxes That Run Your Media Server (2025 Edition)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-router-2025&#34; &gt;Part 2 - Why Your ISP Router Is Killing Your Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-storage-2025&#34; &gt;Part 3 - Your Storage Deserves Its Own Box&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-compute-2025&#34; &gt;Part 4 - Proxmox Is Your New Best Friend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-backup-2025&#34; &gt;Part 5 - Backups That Actually Work (With PBS)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Best Homelab Router Setup (2025): Stop Letting Your ISP Kill Your Stack</title>
        <link>https://diymediaserver.com/post/media-server-router-2025/</link>
        <pubDate>Thu, 30 Oct 2025 07:25:02 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/media-server-router-2025/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/media-server-router-2025/featured.jpg" alt="Featured image of post Best Homelab Router Setup (2025): Stop Letting Your ISP Kill Your Stack" /&gt;&lt;p&gt;Consumer routers try to be everything: modem, router, switch, Wi-Fi, DNS, sometimes even a media server. When any piece fails, everything fails. The Wi-Fi radios cook themselves. Firmware updates brick the UI. NAT tables fill and kill your connections. Meanwhile, vulnerabilities sit unpatched for months.&lt;/p&gt;
&lt;p&gt;I learned this the hard way..&lt;/p&gt;
&lt;p&gt;My journey to a proper router started with a failed consumer device.&lt;br&gt;
Then evolved into &amp;ldquo;I can just add a dual port NIC to the server and run my router in a VM&amp;rdquo;.&lt;br&gt;
It started brilliantly but, it quickly turned into a twice-weekly nightmare.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Your ISP router can&#39;t do VLANs, logging, or real security. A proper router box ($150-$800) running OPNsense gives you network segmentation, intrusion detection, full traffic visibility, and actual control. I&#39;ve run this setup for 8+ years across multiple hardware generations. Setup time: one weekend to get working, 2-3 weekends to get truly secure.

&lt;/div&gt;
&lt;h2 id=&#34;the-all-in-one-trap&#34;&gt;The All-in-One Trap
&lt;/h2&gt;&lt;p&gt;I was running my entire homelab on a single Proxmox server: NAS, media server, download clients, home automation, everything. And because I was already virtualizing everything else, why not the router too?&lt;/p&gt;
&lt;p&gt;It seemed elegant. One box, total control, efficient resource usage.&lt;/p&gt;
&lt;p&gt;Then reality hit.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Why is the internet out again?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It was a Tuesday night. My wife was trying to stream something. I was in my office, staring at an LXC container that refused to stop, forcing me to reboot the entire Proxmox host. Again.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Sorry, it should be back on in a few minutes. I had to reboot the server again.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This happened once or twice a week. Sometimes it was NFS issues that wouldn&amp;rsquo;t resolve without a full reboot. Sometimes hardware failures. Sometimes it was just me testing something and broke it in unexpected ways. Each time, the entire house lost internet.&lt;/p&gt;
&lt;p&gt;Five minutes of downtime doesn&amp;rsquo;t sound like much. But when it happens regularly, it stops being &amp;ldquo;a brief inconvenience&amp;rdquo; and starts being &amp;ldquo;why do we have internet problems all the time?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The breaking point came when a power supply died at 9 AM on a Friday. The internet was down for four hours while I left work to drive to Best Buy for a replacement part. Not ideal when your wife works from home and needs reliable connectivity.&lt;/p&gt;
&lt;h2 id=&#34;before-that-the-consumer-router-carousel&#34;&gt;Before That: The Consumer Router Carousel
&lt;/h2&gt;&lt;p&gt;But let&amp;rsquo;s back up. Before I virtualized my router, I was doing what everyone does: buying consumer all-in-one routers and hoping they&amp;rsquo;d last.&lt;/p&gt;
&lt;p&gt;For about 15 years, I cycled through them. Linksys. Netgear Nighthawks. ASUS routers. It didn&amp;rsquo;t matter which brand—they all developed issues after 2-3 years. Random reboots. WAN ports that just stopped working. WiFi that became progressively more unreliable until it wasn&amp;rsquo;t reliable at all.&lt;/p&gt;
&lt;p&gt;Toward the end of each router&amp;rsquo;s life, I&amp;rsquo;d be rebooting it daily just to keep things working.&lt;/p&gt;
&lt;p&gt;The pattern was always the same:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buy new router ($120-300)&lt;/li&gt;
&lt;li&gt;Works great for 18 months&lt;/li&gt;
&lt;li&gt;Starts having &amp;ldquo;quirks&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Quirks become daily problems&lt;/li&gt;
&lt;li&gt;Replace and repeat&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Over 15 years, I probably spent $1,500+ on routers that became e-waste. And that&amp;rsquo;s not counting the time spent troubleshooting, rebooting, and dealing with random failures.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;the-solution-separation&#34;&gt;The Solution: Separation
&lt;/h2&gt;&lt;p&gt;The answer was obvious in hindsight: stop trying to make one device do everything.&lt;/p&gt;
&lt;p&gt;I started with an old computer running OPNsense. It wasn&amp;rsquo;t pretty, it wasn&amp;rsquo;t efficient, but it worked. More importantly, it &lt;strong&gt;kept working&lt;/strong&gt; when I rebooted my Proxmox host.&lt;/p&gt;
&lt;p&gt;I ran that setup for about six years. The old computer hummed along, doing its one job well, all while I learned what a proper router could actually do.&lt;/p&gt;
&lt;p&gt;About two years ago, I upgraded to a Protectli Vault Pro VP2420 for better power efficiency and added a &amp;ldquo;managed&amp;rdquo; switch (SODOLA 8-Port 2.5Gb). The principle remained the same, just more refined.&lt;/p&gt;
&lt;p&gt;Give each job a proper box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Router:&lt;/strong&gt; Dedicated hardware running OPNsense&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; Separate NAS that stays up 24/7&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compute:&lt;/strong&gt; Proxmox host for everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ll never forget the first time I rebooted my compute node after the separation. I hit the command, waited for the host to go down, and then&amp;hellip; nothing happened. The internet stayed up. My wife kept streaming. Nobody called my name.&lt;/p&gt;
&lt;p&gt;It was amazing.&lt;/p&gt;
&lt;h2 id=&#34;what-actually-changed-when-i-switched&#34;&gt;What Actually Changed When I Switched
&lt;/h2&gt;&lt;h3 id=&#34;before-consumervirtualized-router&#34;&gt;Before (Consumer/Virtualized Router):
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Visibility:&lt;/strong&gt; I could see connected devices and some basic stats. That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; A checkbox labeled &amp;ldquo;firewall enabled.&amp;rdquo; No logs, no alerts, no real control. When I checked my Jellyfin logs one day, I discovered someone in Romania had been hammering my server, trying to brute force the default username. My old router never told me this was happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; 4K streaming while SABnzbd maxed out my download connection meant random buffering and frustrated family members.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Segmentation:&lt;/strong&gt; Everything on one network. My Jellyfin server could see my IoT lightbulbs. My download containers could access my NAS directly. Zero isolation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uptime:&lt;/strong&gt; Hostage to whatever I was doing on my Proxmox host. Every experiment, every update, every hardware issue meant the whole house went offline.&lt;/p&gt;
&lt;h3 id=&#34;after-dedicated-opnsense-box&#34;&gt;After (Dedicated OPNsense Box):
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Visibility:&lt;/strong&gt; Every connection, every blocked attempt, every DNS query. I see exactly what my network is doing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Five VLANs with explicit allow rules. IDS/IPS running Suricata with Emerging Threats rules. I see attempted port scans and exploit attempts weekly that my old setup never noticed. That Romanian brute force attempt? Now I&amp;rsquo;d see it in real-time and could block the entire country if needed. (All other countries are now blocked from everything I&amp;rsquo;m running)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; QoS rules mean Jellyfin never stutters, even when SABnzbd maxes out the connection. Downloads automatically throttle when someone starts streaming. No manual intervention needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Segmentation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10.0.1.x: Trusted devices (laptop, phone)&lt;/li&gt;
&lt;li&gt;10.0.2.x: Media stack (Jellyfin, Sonarr, Radarr)&lt;/li&gt;
&lt;li&gt;10.0.3.x: IoT devices (cameras, lights)&lt;/li&gt;
&lt;li&gt;10.0.4.x: Guest WiFi (isolated)&lt;/li&gt;
&lt;li&gt;10.0.5.x: Management interfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My IoT devices literally cannot see my NAS. The firewall says &amp;ldquo;Hell no&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uptime:&lt;/strong&gt; Router runs independently. I can reboot, upgrade, or completely rebuild my compute node without anyone noticing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The difference is night and day. I went from hoping my network was secure to &lt;em&gt;knowing&lt;/em&gt; it is. I went from apologizing for internet outages to working on my servers whenever I need to.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;why-your-current-router-is-failing-you&#34;&gt;Why Your Current Router is Failing You
&lt;/h2&gt;&lt;h3 id=&#34;what-advanced-security-actually-means&#34;&gt;What &amp;ldquo;Advanced Security&amp;rdquo; Actually Means
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Consumer router claims:&lt;/strong&gt; &amp;ldquo;Advanced Security Features!&amp;rdquo;&lt;br&gt;
&lt;strong&gt;Reality:&lt;/strong&gt; Scanning for obvious malware from 2015. Maybe.&lt;/p&gt;
&lt;p&gt;Real security means IDS/IPS with updated rulesets, traffic analysis, and actual logging. Your $120 router isn&amp;rsquo;t doing that.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t realize how blind I was until I enabled Suricata on OPNsense. Every week I see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Port scans from random IPs&lt;/li&gt;
&lt;li&gt;Exploit attempts targeting common vulnerabilities&lt;/li&gt;
&lt;li&gt;IoT devices calling home to suspicious destinations&lt;/li&gt;
&lt;li&gt;Brute force attempts on exposed services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My consumer router saw none of this. It was all happening, every day, and I had no idea.&lt;/p&gt;
&lt;h3 id=&#34;the-single-point-of-failure-problem&#34;&gt;The Single Point of Failure Problem
&lt;/h3&gt;&lt;p&gt;Your consumer router tries to be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Router + Firewall + WiFi + Switch + DHCP + DNS + VPN + USB file server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When any piece fails, everything fails. When you need to reboot, everything goes down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A proper network has separate components:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Router box&lt;/strong&gt;: Routing, firewall, DHCP, DNS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch&lt;/strong&gt;: Distributes connections, handles VLANs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access points&lt;/strong&gt;: Just WiFi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the AP reboots, your wired devices keep working. When you&amp;rsquo;re tinkering with your Proxmox host, your family doesn&amp;rsquo;t notice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This isn&amp;rsquo;t theoretical. After eight years of running separated infrastructure, I&amp;rsquo;ve had zero network-wide outages that weren&amp;rsquo;t ISP-related. With consumer routers, I had them weekly.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;what-youre-actually-exposing&#34;&gt;What You&amp;rsquo;re Actually Exposing
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Without proper segmentation:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IoT device gets compromised&lt;/strong&gt; → Attacker accesses your entire network&lt;br&gt;
&lt;strong&gt;With VLANs:&lt;/strong&gt; They&amp;rsquo;re trapped in the IoT sandbox&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download client compromised&lt;/strong&gt; → Direct path to all your files&lt;br&gt;
&lt;strong&gt;With VLANs:&lt;/strong&gt; Container can only talk to specific services&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Smart device has vulnerability&lt;/strong&gt; → Entry point to everything&lt;br&gt;
&lt;strong&gt;With VLANs:&lt;/strong&gt; Isolated and contained&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Real example: I tried to tighten security rules on my IoT VLAN once. Made them too restrictive and all my devices lost internet access. No problem. I restored my OPNsense backup from 15 minutes earlier and everything was fine. Try doing that with a consumer router.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;the-features-that-actually-matter&#34;&gt;The Features That Actually Matter
&lt;/h2&gt;&lt;h3 id=&#34;1-vlan-support-network-segmentation&#34;&gt;1. VLAN Support (Network Segmentation)
&lt;/h3&gt;&lt;p&gt;Create multiple isolated networks on the same hardware. If one thing gets compromised, it can&amp;rsquo;t spread.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real example:&lt;/strong&gt; My media stack runs in VLAN 2 (10.0.2.x). Firewall rules allow internet access for downloading and trusted device access for streaming. Everything else is denied. If a container gets compromised, the damage is contained to that VLAN.&lt;/p&gt;
&lt;p&gt;I thought about my VLAN structure for a long time before implementing it. Two years later, I wouldn&amp;rsquo;t change anything about how it&amp;rsquo;s set up.&lt;/p&gt;
&lt;h3 id=&#34;2-intrusion-detectionprevention-idsips&#34;&gt;2. Intrusion Detection/Prevention (IDS/IPS)
&lt;/h3&gt;&lt;p&gt;Your router inspects every packet for known attacks, malware, and suspicious behavior.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t enable Suricata from day one. I added it after getting comfortable with the basics. The learning curve was real. Lots of forum posts and Reddit threads to understand what I was seeing. But it wasn&amp;rsquo;t too bad, and now it runs automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I see every week:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Blocked port scans from random IPs&lt;/li&gt;
&lt;li&gt;Exploit attempts targeting known vulnerabilities&lt;/li&gt;
&lt;li&gt;Malware callbacks from IoT devices&lt;/li&gt;
&lt;li&gt;Geographic attacks I can block at the firewall level&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My old consumer router saw none of this. It was all happening, I just didn&amp;rsquo;t know about it.&lt;/p&gt;
&lt;h3 id=&#34;3-real-firewall-rules--full-logging&#34;&gt;3. Real Firewall Rules + Full Logging
&lt;/h3&gt;&lt;p&gt;Define exactly what&amp;rsquo;s allowed. See every decision the firewall makes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My media VLAN rules:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Allow: Internet access (ports 80, 443)&lt;/li&gt;
&lt;li&gt;Allow: Internal service communication&lt;/li&gt;
&lt;li&gt;Allow: Trusted devices → media services&lt;/li&gt;
&lt;li&gt;Allow: NAS access (NFS)&lt;/li&gt;
&lt;li&gt;Deny: Everything else (log it)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When something breaks, I check the logs and see exactly what&amp;rsquo;s being denied. No guessing. No mystery reboots. Just clear information about what happened and why.&lt;/p&gt;
&lt;h3 id=&#34;4-local-dns--dhcp-control&#34;&gt;4. Local DNS + DHCP Control
&lt;/h3&gt;&lt;p&gt;Static IPs for all services. Custom DNS entries. Full control.&lt;/p&gt;
&lt;p&gt;Instead of remembering 10.0.2.15:8096, I just go to &lt;code&gt;jellyfin.home&lt;/code&gt;. All my services have friendly names. Static DHCP means each device always gets the same IP every time. This is critical for firewall rules that actually work.&lt;/p&gt;
&lt;h3 id=&#34;5-traffic-shaping--qos&#34;&gt;5. Traffic Shaping + QoS
&lt;/h3&gt;&lt;p&gt;Prioritize certain traffic. Set bandwidth limits per device.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t set this up immediately. I added QoS after SABnzbd kept maxing out my 150Mbps download connection and causing buffering on Jellyfin streams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My current setup (tailored to my needs):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Priority 1: Streaming (Jellyfin, Plex)&lt;/li&gt;
&lt;li&gt;Priority 2: YouTube and video&lt;/li&gt;
&lt;li&gt;Priority 3: Gaming&lt;/li&gt;
&lt;li&gt;Priority 4: Web browsing&lt;/li&gt;
&lt;li&gt;Priority 5: Bulk downloads (capped at 80% of available bandwidth)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now downloads automatically throttle when someone starts streaming. No buffering, no complaints, no manual intervention. It just works.&lt;/p&gt;
&lt;h2 id=&#34;router-hardware-options&#34;&gt;Router Hardware Options
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Note on recommendations:&lt;/strong&gt; I&amp;rsquo;ve personally used all the hardware in the Budget and Balanced builds over the years. The Beast build represents what I&amp;rsquo;d upgrade to if I had the time and budget. It is based on research and community feedback, not hands-on experience.&lt;/p&gt;
&lt;h3 id=&#34;budget-build-200-total&#34;&gt;Budget Build (~$200 Total)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Router Box: $80-170&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used off-lease SFF computers are the best value for starting out. I ran OPNsense on an old desktop computer for six years before upgrading.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/dell_wyse_5070.jpg&#34; alt=&#34;Dell Wyse 5070 Extended (J5005): This is the budget-friendly, low-power OPNsense box that just works. Add an Intel i350-T2, give it 8–16 GB of RAM, and you&amp;#39;ve got a quiet, reliable home router with room for VLANs, WireGuard, and moderate IDS.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Dell Wyse 5070 Extended (J5005)&lt;/strong&gt;&lt;br&gt;
This is the budget-friendly, low-power OPNsense box that &amp;ldquo;just works&amp;rdquo;. Add an Intel i350-T2, give it 8–16 GB of RAM, and you&amp;rsquo;ve got a quiet, reliable home router with room for VLANs, WireGuard, and moderate IDS.&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: $80 - $170&lt;br&gt;
&lt;strong&gt;Personal note&lt;/strong&gt;: This is comparable to what I started with. Old hardware running OPNsense for years without issues.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
    
    
      &lt;a href=&#34;https://www.ebay.com/itm/157393940934?mkcid=1&amp;amp;mkrid=711-53200-19255-0&amp;amp;siteid=0&amp;amp;campid=5339130028&amp;amp;toolid=80006&amp;amp;mkevt=1&amp;amp;amdata=enc%3AAQAKAAAAoFkggFvd1GGDu0w3yXCmi1fic7T%2B6D5Zd0PLV8PNlt38Y9l1p0xMu1%2B1tjZH3GqPt8q8hohUgihu8SQRL4evhOP2jNgffaQ%2FMiZuPH%2Fyw9%2FW8DV5iKk5OXwOVk98DWTZ3urZaZjXrYY7R9gQq%2BbH3vDEZdTHhyGJd%2Bc8al65pQ6xlf0px%2F8Y1SUhKJKtgfROX39VphrP3ifM%2F2SIEIawHzs%3D&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Ebay&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Network Card: $30-50&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used Intel NICs are reliable and well-supported in OPNsense and PFsense.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_i350-T2.jpg&#34; alt=&#34;Intel i350-T2: The low-profile Intel i350-T2 drops right into the Wyse 5070 Extended&amp;#39;s PCIe slot and gives you two rock-solid 1 GbE ports with mature FreeBSD drivers, perfect for OPNsense.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Intel i350-T2&lt;/strong&gt;&lt;br&gt;
The low-profile Intel i350-T2 drops right into the Wyse 5070 Extended&amp;rsquo;s PCIe slot and gives you two rock-solid 1 GbE ports with mature FreeBSD drivers, perfect for OPNsense.&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: $30 - $50&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
    
    
      &lt;a href=&#34;https://www.ebay.com/itm/376462087101?mkcid=1&amp;amp;mkrid=711-53200-19255-0&amp;amp;siteid=0&amp;amp;campid=5339130028&amp;amp;toolid=80006&amp;amp;mkevt=1&amp;amp;amdata=enc%3AAQAKAAAAoFkggFvd1GGDu0w3yXCmi1eqCmDkAvls6t65%2FaeslMX06VRrYc%2BxsGhj0y7MIkNUVJZwtSH67gEKulkHJhhmBtSvHDYUbheEel%2BxszGirkIwyEfHWg66NZSxQB4mJSDsmG68ee4f7uvRgvfWuZskMVffKY347ME9KNWJQzbRrXS1mZQtt5Nay97H5JkxazM8vEc8s6yWY39X2YNITWc2cKQ%3D&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Ebay&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Alternative: New Budget Device&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t want to deal with used gear? Here&amp;rsquo;s an affordable new option:&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F387XH21&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/Aoostar.jpg&#34; alt=&#34;AOOSTAR N1 PRO Intel N150: This affordable, energy-efficient single-board computer is perfect as a low budget router with its dual 2.5Gb network ports and enough processing power to support an IDS.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;AOOSTAR N1 PRO Intel N150&lt;/strong&gt;&lt;br&gt;
This affordable, energy-efficient single-board computer is perfect as a low budget router with its dual 2.5Gb network ports and enough processing power to support an IDS.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4ooUVQW&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Switch: $60-90&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You need a managed switch to handle VLANs properly.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07GRG63P6&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/tp-link-16port.jpg&#34; alt=&#34;TP-Link TL-SG116E: Is a 16-port, fanless Gigabit Easy Smart switch with a metal shell, web GUI, and essentials like 802.1Q VLANs, trunks, QoS, and IGMP snooping. It&amp;#39;s a great budget match for an OPNsense router build: quiet, low-power, cheap, and gives you the VLAN segmentation and uplink tagging you need without paying managed-switch tax.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;TP-Link TL-SG116E&lt;/strong&gt;&lt;br&gt;
Is a 16-port, fanless Gigabit &amp;ldquo;Easy Smart&amp;rdquo; switch with a metal shell, web GUI, and essentials like 802.1Q VLANs, trunks, and QoS. It&amp;rsquo;s a great budget match for an OPNsense router build: quiet, low-power, cheap, and gives you the VLAN segmentation and uplink tagging you need without paying managed-switch tax.&lt;br&gt;
&lt;strong&gt;Personal note&lt;/strong&gt;: I used this class of switch for years before upgrading to 2.5GbE.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3JKmBR4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445831385976949721370311&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2ftp-link-tl-sg116e-16-x-rj45%2fp%2f1VH-019J-00003%3fitem%3d9SIA6ZPK9X4752&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dedicated Wireless Access Point (WAP): $60-80&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Having a dedicated WAP can really improve the Wi-Fi signal in your house. You can place it in the optimal location with just an ethernet cable.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0781YXFBT&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/tp-link-eap225.jpg&#34; alt=&#34;TP-Link EAP225: is a ceiling-mount, PoE-powered, dual-band 802.11ac with a Gigabit uplink, and simple Omada controller management. It honors 802.1Q VLANs for clean SSID-to-network mapping (Main/IoT/Guest), and delivers fast, reliable Wi-Fi.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;TP-Link EAP225&lt;/strong&gt;&lt;br&gt;
Is a ceiling-mount, PoE-powered, dual-band 802.11ac with a Gigabit uplink, and simple Omada controller management. It honors 802.1Q VLANs for clean SSID-to-network mapping (Main/IoT/Guest), and delivers fast, reliable Wi-Fi.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/47pN6Ey&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What this setup can handle:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gigabit routing with IDS/IPS&lt;/li&gt;
&lt;li&gt;5-6 VLANs&lt;/li&gt;
&lt;li&gt;Up to 50 devices&lt;/li&gt;
&lt;li&gt;Basic VPN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Who this is for:&lt;/strong&gt; 95% of home users with gigabit internet or slower.&lt;/p&gt;
&lt;h3 id=&#34;balanced-build-500-total&#34;&gt;Balanced Build (~$500 Total)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;This is what I currently run.&lt;/strong&gt; After six years on budget hardware, I upgraded to this configuration two years ago for better power efficiency and multi-gig speeds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Router Box: $320-500&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BQ1K182Y&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/protectli-vault-pro.jpg&#34; alt=&#34;Protectli Vault Pro VP2420-4 Port: is a fanless mini-appliance with a 4-core Intel J6412, 4× 2.5GbE Intel i225 ports, AES-NI. It&amp;#39;s a strong mid-tier OPNsense base that stays quiet and sips power while handling gigabit-plus routing, as well as fast VPN access.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Protectli Vault Pro VP2420-4 Port&lt;/strong&gt;&lt;br&gt;
A fanless mini-appliance with a 4-core Intel J6412, 4× 2.5GbE Intel i225 ports, AES-NI. It&amp;rsquo;s a strong mid-tier OPNsense base that stays quiet and sips power while handling gigabit-plus routing, as well as fast VPN access.&lt;br&gt;
&lt;strong&gt;Personal note&lt;/strong&gt;: This is exactly what I&amp;rsquo;m running. Two years in, zero hardware issues. It&amp;rsquo;s silent, efficient, and handles everything I throw at it.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/43ZduTo&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Switch: $90&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DTKGCWNL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/sodola-8port.jpg&#34; alt=&#34;SODOLA 8-Port 2.5Gb Web Managed Switch: Provides eight 2.5GbE ports, a quiet fanless metal chassis, and a simple web UI with essentials like 802.1Q VLANs, QoS, and link aggregation. It fits a mid-tier router build by unlocking multi-gig LAN speeds for NAS and desktops while keeping segmentation clean and power draw low.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;SODOLA 8-Port 2.5Gb Web Managed Switch&lt;/strong&gt;&lt;br&gt;
Provides eight 2.5GbE ports, a quiet fanless metal chassis, and a simple web UI with essentials like 802.1Q VLANs, QoS, and link aggregation. It fits a mid-tier router build by unlocking multi-gig LAN speeds for NAS and desktops while keeping segmentation clean and power draw low.&lt;br&gt;
&lt;strong&gt;Personal note&lt;/strong&gt;: I installed this when I upgraded to the Protectli. VLANs were straightforward to set up, and the 2.5GbE speeds make a real difference for NAS transfers.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3LkQoQX&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Wireless Access Points&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I run four TP-Link Deco units in a mesh configuration. Mostly I use them as dumb APs, but the controller software is useful for one thing: forcing specific devices to specific APs. Some devices are too aggressive about switching APs, which caused buffering during video playback. Pinning them to one AP solved it.&lt;/p&gt;
&lt;p&gt;For new buyers, I&amp;rsquo;d recommend proper ceiling-mount APs instead:&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0FKRF82DX&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/omada-dual-band-7.jpg&#34; alt=&#34;TP-Link Omada WiFi 7: A PoE ceiling-mount WiFi 7 access point with a 2.5 GbE uplink, Omada controller support, and VLAN-aware SSIDs for clean network segmentation. It fits a mid-tier router build by delivering fast, reliable wireless, simple central management, and a clear upgrade path without blowing the budget.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;TP-Link Omada WiFi 7 - Dual Band&lt;/strong&gt;&lt;br&gt;
A PoE ceiling-mount WiFi 7 access point with a 2.5 GbE uplink, Omada controller support, and VLAN-aware SSIDs for clean network segmentation. It fits a mid-tier router build by delivering fast, reliable wireless, simple central management, and a clear upgrade path without blowing the budget.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/47x7SCk&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458310695937600549550250&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2f0ED-000J-00126%3fitem%3d9SIA6K2KKE7711&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What this setup can handle:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-gig speeds (2.5GbE)&lt;/li&gt;
&lt;li&gt;Heavy IDS/IPS&lt;/li&gt;
&lt;li&gt;VPN at line speed&lt;/li&gt;
&lt;li&gt;50+ devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Who this is for:&lt;/strong&gt; People who want room to grow and don&amp;rsquo;t want to upgrade again in 2-3 years.&lt;/p&gt;
&lt;h3 id=&#34;beast-build-1200-total&#34;&gt;Beast Build (~$1,200 Total)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I haven&amp;rsquo;t personally used this hardware. This represents what I&amp;rsquo;d upgrade to if I had the budget and needed more performance. Based on community feedback and research, not hands-on experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Router Box: $600-700&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DXNFP13J&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ms-01.jpg&#34; alt=&#34;MINISFORUM MS-01 Mini Workstation: A compact workstation with a high-core-count Intel CPU, dual 10 GbE SFP&amp;#43; ports, dual 2.5 GbE, NVMe storage, and room to scale. It is ideal for a top-tier OPNsense build because it can push multi-gig routing, run IDS/IPS and high-speed VPN without breaking a sweat and still leave room for future upgrades.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-01 Mini Workstation&lt;/strong&gt;&lt;br&gt;
A compact workstation with a high-core-count Intel CPU, dual 10 GbE SFP+ ports, dual 2.5 GbE, NVMe storage, and room to scale. It is ideal for a top-tier OPNsense build because it can push multi-gig routing, run IDS/IPS and high-speed VPN without breaking a sweat and still leave room for future upgrades.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/493Htx3&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Switch: $360&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DLGTC15B&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/sodola-24-port-poe.jpg&#34; alt=&#34;SODOLA 24 Port 2.5Gb PoE Switch: This switch packs dense multi-gig PoE for APs, cameras, and IoT while keeping management simple with VLANs, and QoS. It&amp;#39;s a strong top-tier fit because your OPNsense box can push multi-gig uplinks and this switch distributes that speed across the whole network without noisy rack gear.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;SODOLA 24 Port 2.5Gb PoE Switch&lt;/strong&gt;&lt;br&gt;
This switch packs dense multi-gig PoE for APs, cameras, and IoT while keeping management simple with VLANs, and QoS. It&amp;rsquo;s a strong top-tier fit because your OPNsense box can push multi-gig uplinks and this switch distributes that speed across the whole network without noisy rack gear.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3XdIKdE&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Access Point: $200&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0FJQL2T2V&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/omada-dual-band-7.jpg&#34; alt=&#34;TP-Link Omada WiFi 7: Brings 2.4/5/6 GHz and Multi-Link Operation for large capacity, and low latency. It fits a top-tier OPNsense build with a multi-gig PoE uplink, clean SSID-to-VLAN mapping, Omada controller features like fast roaming and band steering, and headroom for dense homes or busy offices.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;TP-Link Omada WiFi 7 - Tri-Band&lt;/strong&gt;&lt;br&gt;
Brings 2.4/5/6 GHz and Multi-Link Operation for large capacity, and low latency. It fits a top-tier OPNsense build with a multi-gig PoE uplink, clean SSID-to-VLAN mapping, Omada controller features like fast roaming and band steering, and headroom for dense homes or busy offices.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/47x7vHW&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458310207475880021192005&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2ftp-link-eap773%2fp%2fN82E16833704729%3fitem%3dN82E16833704729&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What this setup can handle:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10GbE at line speed&lt;/li&gt;
&lt;li&gt;Extremely complex rules&lt;/li&gt;
&lt;li&gt;Multiple simultaneous VPN connections&lt;/li&gt;
&lt;li&gt;100+ devices&lt;/li&gt;
&lt;li&gt;Future-proof for years&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;opnsense-vs-pfsense-which-should-you-choose&#34;&gt;OPNsense vs pfSense: Which Should You Choose?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Choose OPNsense if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re new and want a cleaner interface&lt;/li&gt;
&lt;li&gt;You want built-in IDS/IPS&lt;/li&gt;
&lt;li&gt;You prefer frequent updates&lt;/li&gt;
&lt;li&gt;All features are included without licensing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Choose pfSense if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want the most mature platform&lt;/li&gt;
&lt;li&gt;You prioritize stability over features&lt;/li&gt;
&lt;li&gt;You need the largest community&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t mind a more corporate feel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My recommendation:&lt;/strong&gt; Start with OPNsense. The interface is friendlier while being just as powerful. I&amp;rsquo;ve run it for eight years across multiple hardware generations without major issues.&lt;/p&gt;
&lt;p&gt;Either choice is infinitely better than a consumer router.&lt;/p&gt;
&lt;h2 id=&#34;your-first-weekend-with-opnsense&#34;&gt;Your First Weekend with OPNsense
&lt;/h2&gt;&lt;p&gt;Let me be honest about timelines. My original draft said &amp;ldquo;48 hours&amp;rdquo; but that&amp;rsquo;s optimistic. Here&amp;rsquo;s what actually happened when I set mine up.&lt;/p&gt;
&lt;h3 id=&#34;hour-1-2-basic-installation&#34;&gt;Hour 1-2: Basic Installation
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download OPNsense ISO, flash to USB&lt;/li&gt;
&lt;li&gt;Boot router box, install to internal drive&lt;/li&gt;
&lt;li&gt;Reboot, remove USB&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This part is straightforward. If you&amp;rsquo;ve installed Linux before, this will feel familiar.&lt;/p&gt;
&lt;h3 id=&#34;hour-2-4-initial-configuration&#34;&gt;Hour 2-4: Initial Configuration
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Getting Internet Working:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect WAN to modem, LAN to computer&lt;/li&gt;
&lt;li&gt;Access web interface at 192.168.1.1&lt;/li&gt;
&lt;li&gt;Run setup wizard: Set password, configure WAN/LAN, set timezone&lt;/li&gt;
&lt;li&gt;Update to latest version&lt;/li&gt;
&lt;li&gt;Configure DNS and test internet&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Expect this to take longer than you think. My first attempt, I had to reboot the modem twice before the WAN interface pulled an IP. Normal stuff, but it eats time.&lt;/p&gt;
&lt;h3 id=&#34;weekend-2-3-vlans&#34;&gt;Weekend 2-3: VLANs
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Creating Your First VLAN:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VLANs are where it gets tricky. I spent time wrapping my head around the concept before implementation paid off.&lt;/p&gt;
&lt;p&gt;Start with IoT if you have IoT devices (and at this point most of us do). It&amp;rsquo;s the easiest to isolate and test:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create VLAN on your switch (VLAN ID: 3)&lt;/li&gt;
&lt;li&gt;Create VLAN interface in OPNsense (Interfaces → VLAN)&lt;/li&gt;
&lt;li&gt;Assign and configure the interface (10.0.3.1/24)&lt;/li&gt;
&lt;li&gt;Enable DHCP for the VLAN&lt;/li&gt;
&lt;li&gt;Create firewall rules:
&lt;ul&gt;
&lt;li&gt;Allow: IoT → Internet (ports 80, 443, 53)&lt;/li&gt;
&lt;li&gt;Allow: IoT → DNS Access to your DNS server&lt;/li&gt;
&lt;li&gt;Block: IoT → All other RFC1918 private networks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Test: Connect device, verify it works but can&amp;rsquo;t reach other VLANs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first VLAN took me several hours. The second took one hour. By the fifth, it was fifteen minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common VLAN Mistakes I Made:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Forgetting to tag the trunk port on the switch&lt;/strong&gt; - Spent 30 minutes troubleshooting why devices couldn&amp;rsquo;t get IPs before realizing the switch wasn&amp;rsquo;t passing VLAN tags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Creating rules on the wrong interface&lt;/strong&gt; - Made perfect firewall rules on the WAN interface instead of the VLAN interface. They did nothing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blocking DNS accidentally&lt;/strong&gt; - Blocked RFC1918 addresses but forgot that my router (which provides DNS) is on 10.0.1.1. IoT devices couldn&amp;rsquo;t resolve anything.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;week-3-4-idsips&#34;&gt;Week 3-4: IDS/IPS
&lt;/h3&gt;&lt;p&gt;I didn&amp;rsquo;t enable Suricata immediately. Get comfortable with basic routing and VLANs first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When I added IDS/IPS:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Services → Intrusion Detection → Administration&lt;/li&gt;
&lt;li&gt;Enable IDS&lt;/li&gt;
&lt;li&gt;Download Emerging Threats ruleset&lt;/li&gt;
&lt;li&gt;Start in IDS mode (alerts only, no blocking)&lt;/li&gt;
&lt;li&gt;Watch alerts for a week&lt;/li&gt;
&lt;li&gt;Tune rules to reduce false positives&lt;/li&gt;
&lt;li&gt;Switch to IPS mode (active blocking)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The learning curve was real. Lots of alerts I didn&amp;rsquo;t understand. Lots of forum threads explaining what &amp;ldquo;ET POLICY&amp;rdquo; rules meant. But after a few weeks, it clicked.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Start with IDS mode only. Don&amp;rsquo;t enable blocking until you understand what you&amp;rsquo;re seeing. I almost blocked my entire media VLAN because I didn&amp;rsquo;t understand a legitimate traffic pattern Suricata flagged.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;week-4-6-qos-and-polish&#34;&gt;Week 4-6: QoS and Polish
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;I added QoS when SABnzbd kept ruining movie night.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Downloads would max out my 150Mbps connection, and Jellyfin streams would buffer. Annoying for me, unacceptable for my wife.&lt;/p&gt;
&lt;p&gt;Setting up traffic shaping:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Firewall → Shaper → Settings&lt;/li&gt;
&lt;li&gt;Create pipes for download/upload&lt;/li&gt;
&lt;li&gt;Create queues for different traffic types&lt;/li&gt;
&lt;li&gt;Assign priorities&lt;/li&gt;
&lt;li&gt;Test with actual usage&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My current priorities (tailored to 150/30 Mbps connection):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Queue 1 (Highest):&lt;/strong&gt; Jellyfin streaming, Plex&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queue 2:&lt;/strong&gt; YouTube, video platforms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queue 3:&lt;/strong&gt; Gaming traffic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queue 4:&lt;/strong&gt; Web browsing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queue 5 (Lowest):&lt;/strong&gt; SABnzbd, torrents (capped at 120Mbps / 80%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now downloads run in the background without impacting anything else. No manual throttling needed.&lt;/p&gt;
&lt;h3 id=&#34;current-state-set-and-forget&#34;&gt;Current State: Set and Forget
&lt;/h3&gt;&lt;p&gt;After the initial setup period, I barely touch OPNsense.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weekly routine:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check for updates (takes 2 minutes)&lt;/li&gt;
&lt;li&gt;Review IDS/IPS alerts (5 minutes)&lt;/li&gt;
&lt;li&gt;Check logs if something seems weird (rarely needed)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Monthly:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review firewall rules to see if anything needs adjustment (usually doesn&amp;rsquo;t)&lt;/li&gt;
&lt;li&gt;Download config backup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s it. The router just works. No daily reboots. No random failures. No &amp;ldquo;why is the internet down?&amp;rdquo; conversations.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In two years with the Protectli, I&amp;rsquo;ve had zero hardware failures. Compare that to 15 years of consumer routers dying every 2-3 years.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;common-problems-and-fixes&#34;&gt;Common Problems and Fixes
&lt;/h2&gt;&lt;h3 id=&#34;cant-access-internet-after-setup&#34;&gt;Can&amp;rsquo;t Access Internet After Setup
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; OPNsense installed, but no internet access&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;WAN interface has IP address (Interfaces → Overview)&lt;/li&gt;
&lt;li&gt;Gateway shows as online (System → Gateways → Single)&lt;/li&gt;
&lt;li&gt;DNS servers configured (System → Settings → General)&lt;/li&gt;
&lt;li&gt;Try pinging 8.8.8.8 from Diagnostics → Ping&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Usually the modem needs a reboot. Power cycle it, wait 2 minutes, check again.&lt;/p&gt;
&lt;h3 id=&#34;vlans-not-working&#34;&gt;VLANs Not Working
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Device on VLAN can&amp;rsquo;t get IP or access internet&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VLAN created on switch with correct ID&lt;/li&gt;
&lt;li&gt;Trunk port configured between router and switch&lt;/li&gt;
&lt;li&gt;VLAN interface assigned in OPNsense&lt;/li&gt;
&lt;li&gt;DHCP enabled for VLAN&lt;/li&gt;
&lt;li&gt;Firewall rules allow traffic&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; 90% of the time it&amp;rsquo;s switch configuration. Verify VLAN tagging is correct.&lt;/p&gt;
&lt;h3 id=&#34;locked-yourself-out&#34;&gt;Locked Yourself Out
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Changed firewall rules, now can&amp;rsquo;t access web interface&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect directly to LAN port&lt;/li&gt;
&lt;li&gt;Access 192.168.1.1 (default LAN IP)&lt;/li&gt;
&lt;li&gt;If that doesn&amp;rsquo;t work: Boot to recovery mode, reset to last config&lt;/li&gt;
&lt;li&gt;Last resort: Reinstall and restore from backup (you made backups, right?)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is why you download config backups regularly.&lt;/p&gt;
&lt;h3 id=&#34;specific-mistake-i-made-iot-security-lockdown&#34;&gt;Specific Mistake I Made: IoT Security Lockdown
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;What I tried:&lt;/strong&gt; Tightened security rules on IoT VLAN to block more traffic&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What broke:&lt;/strong&gt; All IoT devices lost internet access completely&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; I was too aggressive blocking outbound traffic. Smart devices need to call home for updates and cloud features. You can restrict them, but not completely isolate them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How I recovered:&lt;/strong&gt; Restored OPNsense backup from 15 minutes earlier. Back to working state in 2 minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Always download a config backup before making major changes. Test changes incrementally. Have a rollback plan.&lt;/p&gt;
&lt;h2 id=&#34;common-mistakes-to-avoid&#34;&gt;Common Mistakes to Avoid
&lt;/h2&gt;&lt;h3 id=&#34;over-complicating-day-one&#34;&gt;Over-Complicating Day One
&lt;/h3&gt;&lt;p&gt;Start simple. Get basic routing working before adding anything else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My recommended progression:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weekend 1: Install OPNsense, get internet working&lt;/li&gt;
&lt;li&gt;Weekend 2-3: Add one VLAN, test thoroughly&lt;/li&gt;
&lt;li&gt;Weekend 4: Add remaining VLANs&lt;/li&gt;
&lt;li&gt;Week 3-4: Enable IDS/IPS in monitoring mode&lt;/li&gt;
&lt;li&gt;Week 5-6: Add QoS if needed&lt;/li&gt;
&lt;li&gt;Ongoing: Tune and optimize&lt;/li&gt;
&lt;/ol&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Don&amp;rsquo;t try to do everything at once. I thought about my VLAN structure for weeks before implementing it. That planning paid off, I haven&amp;rsquo;t changed anything about how VLANs are organized in two years.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;not-documenting&#34;&gt;Not Documenting
&lt;/h3&gt;&lt;p&gt;Keep notes on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What each VLAN is for&lt;/li&gt;
&lt;li&gt;Why specific firewall rules exist&lt;/li&gt;
&lt;li&gt;What each static IP is assigned to&lt;/li&gt;
&lt;li&gt;Changes you make and why&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Future you will thank you. I have a simple Obsidian note:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;VLAN 2 (10.0.2.x) - Media Stack
  - Jellyfin, Sonarr, Radarr, SABnzbd
  - Allows: Internet (80, 443), NAS access, Trusted devices
  - Blocks: IoT VLAN, Guest VLAN

Rule: Allow trusted → Media (8096)
  Why: Access Jellyfin from phones/laptops
  Created: 2023-02-15
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simple, but invaluable when troubleshooting at 11 PM.&lt;/p&gt;
&lt;h3 id=&#34;not-testing-firewall-rules&#34;&gt;Not Testing Firewall Rules
&lt;/h3&gt;&lt;p&gt;After creating block rules, actually test them. Don&amp;rsquo;t assume they work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How I test:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create rule to block IoT → NAS&lt;/li&gt;
&lt;li&gt;From IoT device, try to ping NAS IP&lt;/li&gt;
&lt;li&gt;Check firewall logs to confirm block&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the rule doesn&amp;rsquo;t show up in logs, it&amp;rsquo;s not working. Figure it out and fix it now, not when you have a security incident.&lt;/p&gt;
&lt;h3 id=&#34;no-config-backups&#34;&gt;No Config Backups
&lt;/h3&gt;&lt;p&gt;Download your config regularly. Hardware can fail. Updates can go wrong. Accidents happen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My backup routine:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After any major change: Download config immediately&lt;/li&gt;
&lt;li&gt;Weekly: Download fresh backup (takes 30 seconds)&lt;/li&gt;
&lt;li&gt;Store backups in three places: NAS, cloud, USB drive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve restored from backup twice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When I locked myself out with aggressive firewall rules&lt;/li&gt;
&lt;li&gt;When I tried an OPNsense update that didn&amp;rsquo;t play nice with my hardware (rolled back, waited for next version)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both times, I was back up in minutes instead of hours of reconfiguration.&lt;/p&gt;
&lt;h3 id=&#34;ignoring-idsips-alerts&#34;&gt;Ignoring IDS/IPS Alerts
&lt;/h3&gt;&lt;p&gt;Review alerts weekly. This is your early warning system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I check every week:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New alert types I haven&amp;rsquo;t seen before&lt;/li&gt;
&lt;li&gt;Repeated alerts from same source (might need blocking)&lt;/li&gt;
&lt;li&gt;Internal devices generating alerts (compromised?)&lt;/li&gt;
&lt;li&gt;Geographic patterns (lots of traffic from one country?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Takes 5 minutes.&lt;/p&gt;
&lt;h2 id=&#34;integration-with-your-four-box-stack&#34;&gt;Integration with Your Four-Box Stack
&lt;/h2&gt;&lt;p&gt;This is why we separate the router from everything else.&lt;/p&gt;
&lt;h3 id=&#34;network-topology&#34;&gt;Network Topology
&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Modem] → [Router/Firewall] → [Managed Switch]
                                 ├→ [NAS] (VLAN 2)
                                 ├→ [Compute Box] (VLAN 2)
                                 ├→ [Access Points] (Multiple VLANs)
                                 └→ [Other Devices] (Various VLANs)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;boot-order-matters&#34;&gt;Boot Order Matters
&lt;/h3&gt;&lt;p&gt;Router → Storage → Compute&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why this order:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Router boots first: Network is available for everything else&lt;/li&gt;
&lt;li&gt;Storage boots second: NAS is ready when compute needs it&lt;/li&gt;
&lt;li&gt;Compute boots last: Services start when dependencies are ready&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;How to set delays:&lt;/strong&gt;
You might be able to set delays in BIOS/UEFI for each box depending on your hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Router: Auto-start immediately (0 second delay)&lt;/li&gt;
&lt;li&gt;Storage: 30-second delay after power on&lt;/li&gt;
&lt;li&gt;Compute: 60-second delay after power on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Real-world benefit:&lt;/strong&gt; Power outage happens. Everything comes back automatically in the right order. No manual intervention needed.&lt;/p&gt;
&lt;h3 id=&#34;why-separation-matters-again&#34;&gt;Why Separation Matters (Again)
&lt;/h3&gt;&lt;p&gt;I&amp;rsquo;ve lived both sides of this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With virtualized router (2 years):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rebooting compute = entire house offline&lt;/li&gt;
&lt;li&gt;Hardware failure = no internet until fixed&lt;/li&gt;
&lt;li&gt;Testing new containers = risk to network stability&lt;/li&gt;
&lt;li&gt;Update that goes wrong = everything down&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;With separated router (4 years total, 2 with current hardware):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reboot compute whenever needed = nobody notices&lt;/li&gt;
&lt;li&gt;NAS drive failure = internet stays up while I fix it&lt;/li&gt;
&lt;li&gt;Container experiment goes wrong = network unaffected&lt;/li&gt;
&lt;li&gt;Proxmox update goes sideways = restore snapshot, internet never dropped&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The peace of mind is worth every penny.&lt;/p&gt;
&lt;h2 id=&#34;when-to-ask-for-help&#34;&gt;When to Ask for Help
&lt;/h2&gt;&lt;p&gt;You will get stuck. Everyone does. Here&amp;rsquo;s where to go.&lt;/p&gt;
&lt;h3 id=&#34;official-resources&#34;&gt;Official Resources
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;OPNsense Documentation:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://docs.opnsense.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.opnsense.org/&lt;/a&gt;&lt;br&gt;
Start here. Covers installation, basic config, features, and troubleshooting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OPNsense Forum:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://forum.opnsense.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://forum.opnsense.org/&lt;/a&gt;&lt;br&gt;
Active community. Search before posting—someone has probably had your exact problem.&lt;/p&gt;
&lt;h3 id=&#34;community-resources&#34;&gt;Community Resources
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Reddit:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;r/OPNsenseFirewall - Dedicated to OPNsense specifically&lt;/li&gt;
&lt;li&gt;r/homelab - Broader homelab topics, lots of OPNsense users&lt;/li&gt;
&lt;li&gt;r/selfhosted - Media server and self-hosting focus&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://corelab.tech/content/images/size/w1140/2025/11/OPNsensept1.png&#34; alt=&#34;The OPNsense Foundation: Building a Bulletproof Homelab Firewall&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;The OPNsense Foundation: Building a Bulletproof Homelab Firewall (Part 1)&lt;/strong&gt;&lt;br&gt;
Looking for a comprehensive OPNsense setup? Check out this detailed installation and configuration guide from corelab.tech. This two-part series covers everything from initial setup to advanced configuration, providing a complete walkthrough for getting OPNsense running properly.&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://corelab.tech/opnsensept1/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_self&#34;
      &gt;
      View Article
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;how-to-ask-for-help-effectively&#34;&gt;How to Ask for Help Effectively
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;When posting for help, include:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What you&amp;rsquo;re trying to do:&lt;/strong&gt; &amp;ldquo;Setting up VLAN for IoT devices&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What you&amp;rsquo;ve tried:&lt;/strong&gt; &amp;ldquo;Created VLAN 3 on switch and OPNsense, enabled DHCP&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What&amp;rsquo;s happening:&lt;/strong&gt; &amp;ldquo;Devices get IP but can&amp;rsquo;t access internet&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Relevant logs:&lt;/strong&gt; Screenshots or text of firewall logs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firewall rules:&lt;/strong&gt; Screenshots of rules for that interface&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Bad post:&lt;/strong&gt; &amp;ldquo;My VLANs don&amp;rsquo;t work, help!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good post:&lt;/strong&gt; &amp;ldquo;IoT VLAN devices get DHCP but can&amp;rsquo;t reach internet. Created VLAN 3, enabled DHCP on 10.0.3.1/24, firewall rules allow ports 80/443 outbound. Logs show blocked packets to 8.8.8.8. Screenshots attached.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The good post gets answered quickly. The bad post gets ignored or gets &amp;ldquo;need more information&amp;rdquo; responses.&lt;/p&gt;
&lt;h2 id=&#34;the-bottom-line&#34;&gt;The Bottom Line
&lt;/h2&gt;&lt;p&gt;After 15 years of consumer routers and 6 years running OPNsense, I&amp;rsquo;ll never go back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you give up:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One-box convenience&lt;/li&gt;
&lt;li&gt;&amp;ldquo;It just works&amp;rdquo; (initially)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Network segmentation that contains breaches&lt;/li&gt;
&lt;li&gt;Real intrusion detection that shows you threats&lt;/li&gt;
&lt;li&gt;Full traffic visibility, you know what&amp;rsquo;s happening&lt;/li&gt;
&lt;li&gt;Actual control over your network&lt;/li&gt;
&lt;li&gt;Reliability that doesn&amp;rsquo;t degrade over time&lt;/li&gt;
&lt;li&gt;Independence from your compute infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Is it more work?&lt;/strong&gt; Yes, initially. The first few weekends require learning and configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is it worth it?&lt;/strong&gt; Absolutely.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re building infrastructure worth thousands of dollars. Protecting it with a $120 consumer router that randomly reboots is like putting a $20 padlock on a bank vault.&lt;/p&gt;
&lt;p&gt;The peace of mind alone is worth it. No more &amp;ldquo;why is the internet down?&amp;rdquo; conversations. No more daily reboots. No more wondering if your network is secure.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll know it&amp;rsquo;s secure because you built it that way.&lt;/p&gt;
&lt;h2 id=&#34;real-numbers-cost-over-time&#34;&gt;Real Numbers: Cost Over Time
&lt;/h2&gt;&lt;p&gt;Let me show you the actual economics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consumer router approach (what I did for 15 years):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New router every 2.5 years: $150 average&lt;/li&gt;
&lt;li&gt;15 years = 6 routers = $900&lt;/li&gt;
&lt;li&gt;Plus time troubleshooting, rebooting, replacing&lt;/li&gt;
&lt;li&gt;Security: Hope and prayer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Dedicated router approach (what I&amp;rsquo;m doing now):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Budget build: $200 initial investment&lt;/li&gt;
&lt;li&gt;Expected lifespan: 5+ years (I&amp;rsquo;m at 8+ years across two hardware generations)&lt;/li&gt;
&lt;li&gt;Electricity: ~15W vs 30-50W consumer router (actually saves money)&lt;/li&gt;
&lt;li&gt;Security: Real, verifiable, logged&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even if you replaced the budget build every 5 years, you&amp;rsquo;d spend $200 every 5 years ($40/year) versus $150 every 2.5 years ($60/year).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You save money while getting massively better security and reliability.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My current Protectli cost $400. Over 5 years, that&amp;rsquo;s $80/year. Still cheaper than consumer routers, and I expect it to last longer than 5 years based on how the previous hardware held up.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s Next
&lt;/h2&gt;&lt;p&gt;You&amp;rsquo;ve got your router sorted. Your network is segmented and secure. You can work on your compute infrastructure without taking down the internet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In Part 3, we build the vault:&lt;/strong&gt; A proper NAS that won&amp;rsquo;t lose your data when drives fail. We&amp;rsquo;ll talk about storage options like MergerFS + SnapRaid, ZFS, and off the shelf options, proper backup strategies, and why your data deserves more respect than a single external hard drive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-storage-2025&#34; &gt;Read Part 3: Your Storage Deserves Its Own Box&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;quick-reference-opnsense-commands&#34;&gt;Quick Reference: OPNsense Commands
&lt;/h2&gt;&lt;p&gt;Keep this handy for common tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reboot:&lt;/strong&gt; System → Power → Reboot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply firewall changes:&lt;/strong&gt; Firewall → Rules → Apply Changes (the orange banner)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check blocked traffic:&lt;/strong&gt; Firewall → Log Files → Live View&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;See active connections:&lt;/strong&gt; Firewall → Diagnostics → States Dump&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check DHCP leases:&lt;/strong&gt; Services → DHCPv4 → Leases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDS/IPS alerts:&lt;/strong&gt; Services → Intrusion Detection → Alerts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup config:&lt;/strong&gt; System → Configuration → Backups → Download configuration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test connectivity:&lt;/strong&gt; Diagnostics → Ping (or Diagnostics → Traceroute)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check interface status:&lt;/strong&gt; Interfaces → Overview&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View system logs:&lt;/strong&gt; System → Log Files → General&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;series-navigation&#34;&gt;Series Navigation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-hardware-guide-2025&#34; &gt;Part 1 - The 3 Boxes That Run Your Media Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-router-2025&#34; &gt;Part 2 - Why Your ISP Router Is Killing Your Stack&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-storage-2025&#34; &gt;Part 3 - Your Storage Deserves Its Own Box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-compute-2025&#34; &gt;Part 4 - Proxmox Is Your New Best Friend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-backup-2025&#34; &gt;Part 5 - Backups That Actually Work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Media Server Hardware Guide (2025): The 4-Box Setup That Just Works</title>
        <link>https://diymediaserver.com/post/media-server-hardware-guide-2025/</link>
        <pubDate>Wed, 29 Oct 2025 07:25:02 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/media-server-hardware-guide-2025/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/media-server-hardware-guide-2025/featured.jpg" alt="Featured image of post Media Server Hardware Guide (2025): The 4-Box Setup That Just Works" /&gt;&lt;p&gt;Everyone starts with the dream: one box to rule them all. Media apps, storage, downloads, and yes, even routing if you&amp;rsquo;re feeling extra ambitious.&lt;/p&gt;
&lt;p&gt;Then reality hits. Reboot time becomes a nightmare. LXCs start before storage mounts. Apps can&amp;rsquo;t find their configs. Nothing works unless you babysit the boot order like it&amp;rsquo;s a toddler who just discovered scissors.&lt;/p&gt;
&lt;p&gt;The fix?&lt;br&gt;
Four boxes.&lt;br&gt;
Clear roles.&lt;br&gt;
Real uptime.&lt;/p&gt;
&lt;p&gt;Ask me how I know.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Spoiler&lt;/strong&gt;: It involves a VM NFS Server, Jellyfin LXC, and a very angry Sunday afternoon where I almost threw my server out the window.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/why_i_ditched_my_vm_nas_and_went_bare-metal/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Why I Ditched My VM NAS and Went Bare-Metal&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
A stable home media server needs four dedicated machines: one for routing ($150-$500), one for storage ($400-$1900), one to run your apps ($200-$1400), and one for backups (150-400). Total investment: $900-$4200. Expected build time: 2-4 weekends. The payoff: 99% uptime instead of the 80% you&#39;re getting now from your all-in-one box that needs constant nurturing.

&lt;/div&gt;
&lt;h2 id=&#34;who-this-guide-is-for&#34;&gt;Who This Guide Is For
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;You&amp;rsquo;re the right person for this if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re running everything on a single machine, and it&amp;rsquo;s becoming a headache&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ve experienced the &amp;ldquo;nothing works after a reboot&amp;rdquo; phenomenon&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re ready to invest $900-$4,200 and a few weekends for a reliable setup&lt;/li&gt;
&lt;li&gt;You want to learn Proxmox, networking, and proper homelab architecture&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re tired of your family asking why the streaming server is down again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;You might want something else if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You just want to watch a few movies and don&amp;rsquo;t care about uptime (get a Synology and call it done)&lt;/li&gt;
&lt;li&gt;You have zero interest in learning Linux or networking basics&lt;/li&gt;
&lt;li&gt;Your budget is under $900 total (stick with a single good machine for now)&lt;/li&gt;
&lt;li&gt;You need this working by next weekend (this is a learning journey, not a race)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Skills you&amp;rsquo;ll need (or learn along the way):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basic Linux command line comfort (you can navigate directories and edit files)&lt;/li&gt;
&lt;li&gt;Willingness to read documentation when things break (and they will)&lt;/li&gt;
&lt;li&gt;Basic networking concepts (what&amp;rsquo;s an IP address, what&amp;rsquo;s a subnet)&lt;/li&gt;
&lt;li&gt;Patience for the learning curve (expect some frustration, especially around Proxmox LXCs)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&amp;rsquo;t worry if you&amp;rsquo;re not an expert. I wasn&amp;rsquo;t either. You&amp;rsquo;ll learn by doing, and I&amp;rsquo;ll point you to resources when you need them.&lt;/p&gt;
&lt;h2 id=&#34;the-real-roi-what-this-actually-costs-you&#34;&gt;The Real ROI: What This Actually Costs You
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s talk money. Because yes, you&amp;rsquo;re about to spend $900-$4,200 on hardware. That sounds like a lot until you do the math on what you&amp;rsquo;re already spending.&lt;/p&gt;
&lt;h3 id=&#34;the-streaming-service-tax&#34;&gt;The Streaming Service Tax
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s what you&amp;rsquo;re probably paying right now:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Service&lt;/th&gt;
          &lt;th&gt;Monthly Cost&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Netflix (Standard)&lt;/td&gt;
          &lt;td&gt;$17.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Disney+ &amp;amp; Hulu&lt;/td&gt;
          &lt;td&gt;$19.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Max (HBO)&lt;/td&gt;
          &lt;td&gt;$18.49&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Prime Video&lt;/td&gt;
          &lt;td&gt;$8.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Apple TV+&lt;/td&gt;
          &lt;td&gt;$12.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Peacock&lt;/td&gt;
          &lt;td&gt;$10.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Paramount+&lt;/td&gt;
          &lt;td&gt;$13.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Starz&lt;/td&gt;
          &lt;td&gt;$4.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Crunchyroll&lt;/td&gt;
          &lt;td&gt;$7.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;TOTAL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;$116.41/month&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That&amp;rsquo;s &lt;strong&gt;$1,396.92 per year&lt;/strong&gt;. Every year. &lt;strong&gt;For-ev-er&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And it&amp;rsquo;s getting worse. Remember when Netflix was $7.99? Yeah, so do I.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t have streaming services? Cable on average is about $100.00/month too.&lt;/p&gt;
&lt;p&gt;Have streaming services and cable? Wow.. This guide can help you the most.&lt;/p&gt;
&lt;h3 id=&#34;the-break-even-math&#34;&gt;The Break-Even Math
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Budget build ($900):&lt;/strong&gt;&lt;br&gt;
You break even in 8 months. After that, you&amp;rsquo;re saving over $1,400/year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mid-range build ($1,900):&lt;/strong&gt;&lt;br&gt;
Break even in 16 months. Then it&amp;rsquo;s pure savings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dream build ($4,200):&lt;/strong&gt;&lt;br&gt;
Break even in 36 months, but you&amp;rsquo;ve built something that&amp;rsquo;ll last 5-9 years.&lt;/p&gt;
&lt;h3 id=&#34;but-wait-theres-more&#34;&gt;But Wait, There&amp;rsquo;s More
&lt;/h3&gt;&lt;p&gt;The math above assumes you cancel &lt;em&gt;everything&lt;/em&gt;. But realistically, you&amp;rsquo;ll probably keep 1-2 services (I keep Prime Video because I like to have something available if in the rare event my Jellyfin server goes down).&lt;br&gt;
Even if you only cancel 6 out of 9 services, you&amp;rsquo;re saving $80+/month. That&amp;rsquo;s $960/year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plus you get:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Content you actually want to watch (not algorithmic slop)&lt;/li&gt;
&lt;li&gt;No more &amp;ldquo;sorry, that&amp;rsquo;s leaving the platform in 3 days&amp;rdquo;&lt;/li&gt;
&lt;li&gt;No more &amp;ldquo;this show is on Peacock now, not Netflix&amp;rdquo;&lt;/li&gt;
&lt;li&gt;No more paying for multiple services just to watch one show&lt;/li&gt;
&lt;li&gt;Complete control over quality (no streaming compression)&lt;/li&gt;
&lt;li&gt;Offline access (because internet outages happen)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-hidden-costs-they-dont-tell-you&#34;&gt;The Hidden Costs They Don&amp;rsquo;t Tell You
&lt;/h3&gt;&lt;p&gt;Streaming services love to fragment. That show you&amp;rsquo;re watching? Season 1-3 are on Netflix. Season 4 moved to Paramount+. The spinoff is Max-exclusive. The movie that inspired it all is on Disney+.&lt;/p&gt;
&lt;p&gt;You end up subscribing to four services just to watch one franchise. Or you play subscription roulette, canceling and re-subscribing monthly (and praying you remember to cancel before they charge you again).&lt;/p&gt;
&lt;p&gt;With your own server? You watch what you want, when you want, without playing platform musical chairs.&lt;/p&gt;
&lt;h3 id=&#34;the-power-bill-reality-check&#34;&gt;The Power Bill Reality Check
&lt;/h3&gt;&lt;p&gt;&amp;ldquo;But what about electricity?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Fair. Let&amp;rsquo;s do that math too:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Average 4-box stack: ~130W idle, ~220W under load&lt;/li&gt;
&lt;li&gt;Running 24/7 at $0.12/kWh: ~$12-16/month&lt;/li&gt;
&lt;li&gt;So your actual monthly cost: $12-16 in power&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;re still saving $80-90/month vs. streaming services. That&amp;rsquo;s $960-$1,080/year in your pocket.&lt;/p&gt;
&lt;h3 id=&#34;what-about-content-acquisition&#34;&gt;What About Content Acquisition?
&lt;/h3&gt;&lt;p&gt;Look, I&amp;rsquo;m not going to tell you how to get your &amp;ldquo;Linux ISOs&amp;rdquo;. But let&amp;rsquo;s just say that if you&amp;rsquo;re already paying for content through other means (totally legal Blu-ray ripping, of course), you&amp;rsquo;re not adding costs. You&amp;rsquo;re just organizing what you already own.&lt;/p&gt;
&lt;p&gt;And if you&amp;rsquo;ve got a library card? Many libraries offer free streaming through Hoopla, Kanopy, or similar services. Rip, organize, and keep forever. All legal, all free.&lt;/p&gt;
&lt;p&gt;I have several guides on all of this here are a few:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/torrent-vs-usenet/&#34; &gt;Torrent vs Usenet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to_install-sabnzbd-in-docker/&#34; &gt;How to Install SABnzbd in Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/building-your-own-legal-media-collection/&#34; &gt;Building Your Own Legal Media Collection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-intangible-benefits&#34;&gt;The Intangible Benefits
&lt;/h3&gt;&lt;p&gt;This isn&amp;rsquo;t just about money. It&amp;rsquo;s about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Not having shows you&amp;rsquo;re watching get canceled mid-season&lt;/li&gt;
&lt;li&gt;Not dealing with ads (even on &amp;ldquo;ad-free&amp;rdquo; tiers that still show promos)&lt;/li&gt;
&lt;li&gt;Not having your smart TV spy on your viewing habits&lt;/li&gt;
&lt;li&gt;Not being at the mercy of licensing deals and regional restrictions&lt;/li&gt;
&lt;li&gt;Actually owning your media instead of renting it monthly&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; Even the dream build pays for itself in 3 years. After that, you&amp;rsquo;re saving $1,400/year while having a better experience, more control, and media that&amp;rsquo;s actually yours.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That&amp;rsquo;s not a cost. That&amp;rsquo;s an investment that keeps paying dividends.&lt;/p&gt;
&lt;h2 id=&#34;section-1-why-one-box-isnt-enough&#34;&gt;SECTION 1: Why One Box Isn’t Enough
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s start with the classic mistake: cramming everything (Jellyfin, Sonarr, Radarr, qBittorrent, SABnzbd, storage, Docker, and maybe even OPNsense if you&amp;rsquo;re really ambitious) onto that old desktop collecting dust in your closet.&lt;/p&gt;
&lt;p&gt;It works.&lt;br&gt;
Until it doesn&amp;rsquo;t.&lt;/p&gt;
&lt;h3 id=&#34;heres-what-goes-wrong&#34;&gt;Here&amp;rsquo;s what goes wrong:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;One reboot = full outage.&lt;/strong&gt;&lt;br&gt;
Your apps don&amp;rsquo;t just go offline. They could come back in the wrong order. Jellyfin can&amp;rsquo;t see your media because NFS hasn&amp;rsquo;t mounted yet. Sonarr can&amp;rsquo;t write downloads because the share isn&amp;rsquo;t ready. That boot-time race between your LXC containers and your storage mounts? Nobody wins. Especially not you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance becomes a bottleneck.&lt;/strong&gt;&lt;br&gt;
You&amp;rsquo;re trying to transcode a 4K stream while ZFS is scrubbing, torrents/nzbs are verifying, and your CPU is melting down. Everything competes for the same I/O, RAM, and CPU cores. There&amp;rsquo;s no isolation. Just a noisy soup of services fighting for resources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security is non-existent.&lt;/strong&gt;&lt;br&gt;
Mixing your media stack with your router or storage means one compromised container could break your entire network or corrupt your storage. Ever had Jellyfin accidentally nuke a mounted drive path? I have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Troubleshooting becomes impossible.&lt;/strong&gt;&lt;br&gt;
Is it Jellyfin&amp;rsquo;s fault? A bad NFS mount? A network issue? You don&amp;rsquo;t know, because everything&amp;rsquo;s tangled together. Diagnosing one problem means taking down everything else to test it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can&amp;rsquo;t upgrade or experiment safely.&lt;/strong&gt;&lt;br&gt;
Want to try that new transcoding setup? Too bad. You&amp;rsquo;re scared to touch anything because a mistake means your entire network goes down. You&amp;rsquo;re paralyzed, stuck with a setup you hate because changing it is too risky.&lt;/p&gt;
&lt;h3 id=&#34;my-breaking-point&#34;&gt;My Breaking Point
&lt;/h3&gt;&lt;p&gt;I ran everything on one computer for years. It worked. Mostly. Until the power supply died.&lt;/p&gt;
&lt;p&gt;The server went silent. And because I ran OPNsense, Jellyfin, and my NAS all on the same computer I had no internet and no access to my media.&lt;/p&gt;
&lt;p&gt;While my partner asked increasingly pointed questions about when the internet will be back up.&lt;/p&gt;
&lt;p&gt;Four hours and a trip to BestBuy later, I got it back up and running.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That&amp;rsquo;s when I have learned: building a modular homelab media server isn&amp;rsquo;t just for fun. It&amp;rsquo;s the only way to achieve real uptime, better performance, and the ability to fix one thing without breaking everything else.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;section-2-the-four-box-philosophy&#34;&gt;SECTION 2: The Four-Box Philosophy
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the core idea: separate traffic, storage, compute, and backup into four dedicated machines.&lt;/p&gt;
&lt;p&gt;Each machine does one job. Does it well. Stays stable. And doesn&amp;rsquo;t bring down the others when it needs maintenance.&lt;/p&gt;
&lt;h3 id=&#34;the-stack&#34;&gt;The Stack:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Box 1: Router&lt;/strong&gt; ($150-$500)&lt;br&gt;
Controls all traffic, handles DNS, manages VLANs, runs your firewall. This is the gatekeeper.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Box 2: Storage&lt;/strong&gt; ($400-$1900)&lt;br&gt;
Holds all your media, provides redundancy, serves files to everything else. This is your vault.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Box 3: Compute&lt;/strong&gt; ($200-$1400)&lt;br&gt;
Runs all your apps: Jellyfin, Sonarr, Radarr, and any new software you want to try. This is the chaos layer where Virtual Machines and containers change, break, and get rebuilt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Box 4: Backup&lt;/strong&gt; ($150-$400)&lt;br&gt;
Backup your compute node&amp;rsquo;s LXCs and VMs. Something breaks after a change just roll-back to the last working backup. This is your insurance policy.&lt;/p&gt;
&lt;h3 id=&#34;why-this-works&#34;&gt;Why This Works:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Modularity = Sanity.&lt;/strong&gt;&lt;br&gt;
Reboot compute without touching storage. Upgrade your NAS without breaking Jellyfin. Swap routers without tearing down your entire stack. When one piece fails, the others keep running.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clear Failure Domains.&lt;/strong&gt;&lt;br&gt;
Something breaks? You know exactly where to look. Service down? Check compute. Files missing? Check storage. Network problems? Check the router. No more digging through monolithic logs trying to find which piece is the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Easy Scaling.&lt;/strong&gt;&lt;br&gt;
Need more storage? Add drives to the NAS. Need more CPU power? Upgrade the compute box. Want faster networking? Upgrade the router. You&amp;rsquo;re not locked into some Frankenstein all-in-one that requires replacing everything to improve one thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Safe Experimentation.&lt;/strong&gt;&lt;br&gt;
Want to try Tdarr? Spin up an LXC. Want to test a new Jellyfin build? Clone your container. Breaking something on the compute box doesn&amp;rsquo;t take down your network or risk your data.&lt;/p&gt;
&lt;h2 id=&#34;section-3-box-1--the-router-your-gatekeeper&#34;&gt;SECTION 3: Box 1 – The Router (Your Gatekeeper)
&lt;/h2&gt;&lt;p&gt;Your router is the traffic cop of your entire media stack. If it sucks, everything downstream suffers.&lt;/p&gt;
&lt;p&gt;And yes, your ISP&amp;rsquo;s all-in-one Wi-Fi &amp;ldquo;router&amp;rdquo; absolutely sucks.&lt;/p&gt;
&lt;h3 id=&#34;why-a-dedicated-router-matters&#34;&gt;Why a Dedicated Router Matters:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;You need control, not guesswork.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Static IPs for all your services so they don&amp;rsquo;t randomly change&lt;/li&gt;
&lt;li&gt;VLANs to isolate your download clients from the rest of your network&lt;/li&gt;
&lt;li&gt;Firewall rules to keep risky devices in their own sandbox&lt;/li&gt;
&lt;li&gt;DNS that resolves &lt;code&gt;jellyfin.home&lt;/code&gt; instead of forcing you to remember IPs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You might get some of that from a consumer &amp;ldquo;gaming&amp;rdquo; router with racing stripes. You will get it all from a real box running OPNsense or pfSense.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security starts here.&lt;/strong&gt;&lt;br&gt;
A proper firewall lets you isolate containers, restrict traffic by IP, and run reverse proxies safely. You can actually see what&amp;rsquo;s happening through logs and alerts. You&amp;rsquo;re not flying blind hoping nothing bad gets through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your media traffic stays fast.&lt;/strong&gt;&lt;br&gt;
4K Jellyfin streams shouldn&amp;rsquo;t fight with torrent downloads and game updates for bandwidth. Smart routing and QoS means your streams stay smooth even when everything else is maxed out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network isolation becomes possible.&lt;/strong&gt;&lt;br&gt;
Keep your kids&amp;rsquo; devices off the same subnet as your torrent client. Put Home Assistant on a separate VLAN with no access to your NAS. Isolate your IoT lightbulbs from anything that matters. This is how you build defense in depth.&lt;/p&gt;
&lt;h3 id=&#34;what-youll-actually-do-with-it&#34;&gt;What You&amp;rsquo;ll Actually Do With It:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Set up static DHCP reservations for every device in your stack&lt;/li&gt;
&lt;li&gt;Create VLANs for different trust levels (trusted, media, IoT, guest)&lt;/li&gt;
&lt;li&gt;Configure firewall rules to control what can talk to what&lt;/li&gt;
&lt;li&gt;Set up a reverse proxy (Nginx Proxy Manager or Traefik) for clean URLs&lt;/li&gt;
&lt;li&gt;Monitor traffic to see what&amp;rsquo;s hogging bandwidth&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;A proper router for your home server setup isn&amp;rsquo;t just about speed. It&amp;rsquo;s about control. And it&amp;rsquo;s the first box that makes the rest of your stack possible.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Coming in Part 2:&lt;/strong&gt; I&amp;rsquo;ll show you exactly which routers to buy, from the $150 AOOSTAR N1 PRO that punches above its weight to the $500+ &amp;ldquo;final boss&amp;rdquo; build that handles 10Gbps like it&amp;rsquo;s nothing.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F387XH21&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/Aoostar.jpg&#34; alt=&#34;AOOSTAR N1 PRO Intel N150: This affordable, energy-efficient single-board computer is perfect as a low budget router with its dual 2.5Gb network ports and enough processing power to support an IDS.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;AOOSTAR N1 PRO Intel N150&lt;/strong&gt;&lt;br&gt;
This affordable, energy-efficient single-board computer is perfect as a low budget router with its dual 2.5Gb network ports and enough processing power to support an IDS.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4ooUVQW&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;section-4-box-2--storage-your-vault&#34;&gt;SECTION 4: Box 2 – Storage (Your Vault)
&lt;/h2&gt;&lt;p&gt;Your media has to live somewhere. And no, your download&amp;rsquo;s folder on a single SSD isn&amp;rsquo;t going to cut it when you&amp;rsquo;re storing terabytes of movies and TV shows.&lt;/p&gt;
&lt;p&gt;This is where the NAS comes in. It holds everything, keeps it safe, and makes sure it&amp;rsquo;s still there tomorrow when you wake up.&lt;/p&gt;
&lt;h3 id=&#34;why-storage-deserves-its-own-box&#34;&gt;Why Storage Deserves Its Own Box:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;You need redundancy.&lt;/strong&gt;&lt;br&gt;
Hard drives fail. It&amp;rsquo;s not &lt;em&gt;if&lt;/em&gt;, it&amp;rsquo;s &lt;em&gt;when&lt;/em&gt;. (Ask me about my dead 14TB drive that took 9TB of unwatched shows with it.) A proper NAS setup whether its ZFS, SnapRAID, Unraid, or mirrored drives, gives you fault tolerance. You lose a drive without losing your media. Your compute server shouldn&amp;rsquo;t be the one keeping data alive. That&amp;rsquo;s not its job.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You need speed and consistency.&lt;/strong&gt;&lt;br&gt;
Streaming 4K, transcoding, downloading, and seeding all at once? You need fast sequential reads and smart caching. A NAS optimized for this workload handles it better than random drives thrown into your compute box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Everything needs to find files reliably.&lt;/strong&gt;&lt;br&gt;
When storage is its own box, it boots first, mounts clean, and stays available. Your LXCs don&amp;rsquo;t wonder if &lt;code&gt;/mnt/media&lt;/code&gt; is ready. They just connect via NFS or SMB and work. No more boot-order mysteries or race conditions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You need upgrade flexibility.&lt;/strong&gt;&lt;br&gt;
Rebuilding your Jellyfin container? The NAS doesn&amp;rsquo;t care. Upgrading your compute box? Your media stays untouched. Separating storage from compute means you can break, upgrade, or rebuild services without risking your files.&lt;/p&gt;
&lt;h3 id=&#34;what-youll-actually-do-with-it-1&#34;&gt;What You&amp;rsquo;ll Actually Do With It:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Set up RAID or ZFS pools for redundancy&lt;/li&gt;
&lt;li&gt;Configure NFS or SMB shares for your media libraries&lt;/li&gt;
&lt;li&gt;Set up automated scrubs to catch bit rot early&lt;/li&gt;
&lt;li&gt;Monitor drive health with SMART data&lt;/li&gt;
&lt;li&gt;Plan your backup strategy (yes, RAID is not a backup)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-boot-order-secret&#34;&gt;The Boot Order Secret:
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s the key: &lt;strong&gt;Router boots first. Storage boots second. Compute boots third.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This order matters. When storage is ready before compute starts, your LXCs never race against mount points. Everything just works. This alone eliminates 90% of the &amp;ldquo;why isn&amp;rsquo;t Jellyfin seeing my files&amp;rdquo; problems.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A dedicated NAS for your media server turns chaos into reliability. It&amp;rsquo;s not just extra drives—it&amp;rsquo;s peace of mind that your data will be there tomorrow.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Coming in Part 3:&lt;/strong&gt; The actual NAS builds, from budget SnapRAID setups using old hardware to dream ZFS rigs that&amp;rsquo;ll make you feel like you work at a data center.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0B94PNF7P&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ironwolf-16tb.jpg&#34; alt=&#34;Seagate IronWolf Pro 16 TB: Seagate&amp;#39;s IronWolf HDDs are perfect for a NAS. They are engineered to run 24/7 for years. They also include a 5-year warranty.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate IronWolf Pro 16 TB&lt;/strong&gt;&lt;br&gt;
Seagate&amp;rsquo;s IronWolf HDDs are perfect for a NAS. They are engineered to run 24/7 for years. They also include a 5-year warranty.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4ooUVQW&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458314003118807670927019&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-ironwolf-pro-st16000nt001-16tb-enterprise-nas-hard-drives-7200-rpm%2fp%2fN82E16822185073%3fitem%3dN82E16822185073&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;section-5-box-3--compute-your-workhorse&#34;&gt;SECTION 5: Box 3 – Compute (Your Workhorse)
&lt;/h2&gt;&lt;p&gt;This is the fun box. The one that runs everything: Jellyfin, Sonarr, Radarr, Tdarr, Bazarr, Lidarr, and whatever new &lt;code&gt;-arr&lt;/code&gt; appears next week.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s where things happen. But it only works &lt;em&gt;because&lt;/em&gt; the other boxes are doing their jobs.&lt;/p&gt;
&lt;h3 id=&#34;why-compute-needs-its-own-home&#34;&gt;Why Compute Needs Its Own Home:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s where the mess lives.&lt;/strong&gt;&lt;br&gt;
App updates. LXC templates. Docker networks. Transcoding jobs. This is the chaotic, ever-changing layer of your stack. You want it isolated so you can blow things up, reboot, or rebuild without touching storage or breaking your network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You get proper service isolation.&lt;/strong&gt;&lt;br&gt;
Run Jellyfin in one LXC and qBittorrent in another. Experiment with Bazarr or Prowlarr without wrecking your stable setup. Proxmox makes this easy whether you&amp;rsquo;re using full VMs or lean LXCs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You have actual resource control.&lt;/strong&gt;&lt;br&gt;
Assign specific RAM, CPU cores, and disk I/O to each container. Want Tdarr to use every core you&amp;rsquo;ve got overnight but stay quiet during the day? Done. Want to make sure qBittorrent can&amp;rsquo;t steal resources from Jellyfin during movie night? Easy. Good luck getting that kind of control on a janky all-in-one setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s built to change.&lt;/strong&gt;&lt;br&gt;
Want GPU passthrough for transcoding? Add it. Need more RAM? Upgrade just this box. This is the only part of your stack that &lt;em&gt;should&lt;/em&gt; change regularly, so build it to take hits and keep going.&lt;/p&gt;
&lt;h3 id=&#34;pets-vs-cattle-why-this-changes-everything&#34;&gt;Pets vs Cattle: Why This Changes Everything
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s a concept from DevOps that&amp;rsquo;ll change how you think about your services:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pets&lt;/strong&gt; are servers you name, nurture, and baby. When they get sick, you stay up all night nursing them back to health. You&amp;rsquo;re terrified to reboot them because something might not come back right. You&amp;rsquo;ve spent hours configuring them just so, and the thought of rebuilding makes you break out in a cold sweat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cattle&lt;/strong&gt; are servers you number, not name. If one gets sick, you cull it and spin up a replacement. They&amp;rsquo;re built from templates, configured automatically, and completely disposable. Lose one? Who cares. You&amp;rsquo;ve got backups and can rebuild it in minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your all-in-one box? That&amp;rsquo;s a pet.&lt;/strong&gt; You&amp;rsquo;re scared to touch it. Every update is a gamble. You&amp;rsquo;ve probably got configs and tweaks you can&amp;rsquo;t even remember making. If it dies, you&amp;rsquo;re spending days rebuilding from memory and hoping you didn&amp;rsquo;t forget anything critical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This four-box setup? It lets you treat services as cattle.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Storage is separate = data is safe.&lt;/strong&gt;&lt;br&gt;
Your media, configs, and databases live on the NAS. When you rebuild a container, all your important data is still there. You&amp;rsquo;re not risking your files every time you experiment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proxmox makes containers disposable.&lt;/strong&gt;&lt;br&gt;
Spin up an LXC in 2 minutes. Test something. Hate it? Delete it. No drama. Want to try a different Jellyfin version? Clone your container, test it, keep what works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backups make everything replaceable.&lt;/strong&gt;&lt;br&gt;
With Proxmox Backup Server (coming in Part 5), you can restore any container to any point in time with one click. Accidentally nuke your Sonarr config? Restore yesterday&amp;rsquo;s backup. Takes 3 minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-world example from my stack:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I wanted to test Jellyfin 10.11.0 (Major changes in this update), but I was running 10.10.7 in production. Old me (one-box setup) would&amp;rsquo;ve been too scared to upgrade. What if it breaks? What if I can&amp;rsquo;t roll back?&lt;/p&gt;
&lt;p&gt;New me (three-box setup):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Snapshot my Jellyfin LXC (30 seconds)&lt;/li&gt;
&lt;li&gt;Clone it to a test container (2 minutes)&lt;/li&gt;
&lt;li&gt;Upgrade the test version, break things, learn stuff&lt;/li&gt;
&lt;li&gt;Decide the new version wasn&amp;rsquo;t ready for Ubuntu yet&lt;/li&gt;
&lt;li&gt;Delete the test container, keep running production&lt;/li&gt;
&lt;li&gt;Total risk to my family&amp;rsquo;s movie night: zero&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;This is the mentality shift that makes homelabbing fun instead of terrifying.&lt;/strong&gt; You stop being afraid to experiment because nothing you do can truly break things. Your data is safe on the NAS. Your configs are backed up. Your containers are cattle.&lt;/p&gt;
&lt;p&gt;When your Nginx Proxy Manager container gets weird? Nuke it. Restore from last night&amp;rsquo;s backup. Six minutes later you&amp;rsquo;re back online, and you didn&amp;rsquo;t even break a sweat.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the power of separation. Your compute box becomes a playground instead of a house of cards.&lt;/p&gt;
&lt;h3 id=&#34;what-youll-actually-do-with-it-2&#34;&gt;What You&amp;rsquo;ll Actually Do With It:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Install Proxmox VE as your hypervisor&lt;/li&gt;
&lt;li&gt;Create LXC containers for each service (Jellyfin, AudioBookshelf, PiHole, etc.)&lt;/li&gt;
&lt;li&gt;Create VMs for specific Docker stacks (Arr Suite, Immich, etc.)&lt;/li&gt;
&lt;li&gt;Mount your NFS shares from the storage box&lt;/li&gt;
&lt;li&gt;Set up GPU passthrough for hardware transcoding&lt;/li&gt;
&lt;li&gt;Configure automated container backups&lt;/li&gt;
&lt;li&gt;Learn to love (and occasionally hate) Proxmox&amp;rsquo;s web interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-learning-curve&#34;&gt;The Learning Curve:
&lt;/h3&gt;&lt;p&gt;Proxmox has a reputation. It&amp;rsquo;s powerful but not exactly hand-holdy. You will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Screw up your first few LXCs (everyone does)&lt;/li&gt;
&lt;li&gt;Accidentally delete something important (keep backups)&lt;/li&gt;
&lt;li&gt;Spend an hour Googling why NFS mounts aren&amp;rsquo;t working (permissions, always permissions)&lt;/li&gt;
&lt;li&gt;Eventually figure it out and feel like a genius&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is normal. This is the path. Embrace it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A proper Proxmox media server isn&amp;rsquo;t just powerful. It&amp;rsquo;s resilient. And with the right storage and network behind it, you can finally stop fixing things and start watching stuff.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Coming in Part 4:&lt;/strong&gt; The actual Proxmox builds, from repurposed office PCs to custom rigs, plus the LXC templates and configurations that actually work.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B09MDDBYXZ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_i5_12th.jpg&#34; alt=&#34;Intel® Core™ i5-12500 12th Generation Desktop Processor: This CPU is ideal for Proxmox homelabs, providing strong single-thread performance and efficient virtualization—perfect for experimenting with LXC containers.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Intel® Core™ i5-12500 12th Generation Desktop Processor&lt;/strong&gt;
This CPU is ideal for Proxmox homelabs, providing strong single-thread performance and efficient virtualization—perfect for experimenting with LXC containers.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4lGjveC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445833438084862958009096&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fintel-core-i5-12th-gen-core-i5-12500-alder-lake-lga-1700-desktop-cpu-processor%2fp%2fN82E16819118374&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;section-6-how-they-all-work-together&#34;&gt;SECTION 6: How They All Work Together
&lt;/h2&gt;&lt;p&gt;This isn&amp;rsquo;t just three random boxes sitting on a shelf. It&amp;rsquo;s a system where each component has a clear job and makes the others better.&lt;/p&gt;
&lt;h3 id=&#34;the-flow&#34;&gt;The Flow:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Router boots first.&lt;/strong&gt;&lt;br&gt;
It brings up the network, handles DHCP, starts DNS. Everything else depends on this foundation. It&amp;rsquo;s the traffic cop and bouncer rolled into one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Storage boots second.&lt;/strong&gt;&lt;br&gt;
With the network ready, your NAS comes online, mounts its drives, starts serving files via NFS/SMB. Now the vault is open and ready.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compute boots third.&lt;/strong&gt;&lt;br&gt;
With networking and storage available, Proxmox fires up, LXCs start in order, apps connect to their storage mounts, and everything just works. No race conditions. No mysteries. Just reliable boots.&lt;/p&gt;
&lt;h3 id=&#34;when-something-breaks&#34;&gt;When Something Breaks:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Router problem?&lt;/strong&gt; Network is down, but storage and compute are fine. Swap in a backup router (or fix the issue), restore config, back online.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Storage problem?&lt;/strong&gt; Media streaming stops, but your network still works. You can troubleshoot, check drives, restore from backup. Apps keep running (even if they can&amp;rsquo;t access files).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compute problem?&lt;/strong&gt; Services go down, but your network and data are safe. Reboot it. Restore a container from backup. Rebuild from scratch if needed. Your files and network never blinked.&lt;/p&gt;
&lt;p&gt;This is the magic of separation. Problems stay contained. Fixes don&amp;rsquo;t cascade. You&amp;rsquo;re not gambling with your entire setup every time something hiccups.&lt;/p&gt;
&lt;h2 id=&#34;section-7-the-fourth-box---backups&#34;&gt;SECTION 7: The Fourth Box - Backups
&lt;/h2&gt;&lt;p&gt;You&amp;rsquo;ve got your router. Your storage. Your compute. Feels solid, right?&lt;/p&gt;
&lt;p&gt;Until something breaks. Then it&amp;rsquo;s panic mode, unless you have Box 4: Backup Server.&lt;/p&gt;
&lt;h3 id=&#34;proxmox-backup-server--the-box-that-saves-you&#34;&gt;Proxmox Backup Server – The Box That Saves You
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;re running VMs or LXCs, you need backups that actually work. Not rsync scripts you never test. Not drive clones you made once in 2023. Real, restorable, tested backups.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What PBS does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automated daily backups of all your containers and VMs&lt;/li&gt;
&lt;li&gt;Deduplication so you can keep weeks of snapshots without filling drives&lt;/li&gt;
&lt;li&gt;Versioned backups you can browse by date&lt;/li&gt;
&lt;li&gt;One-click restores directly from Proxmox&amp;rsquo;s interface&lt;/li&gt;
&lt;li&gt;Verification to make sure backups actually work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Real-world save:&lt;/strong&gt;&lt;br&gt;
I once destroyed the wrong LXC in Proxmox (RIP Nginx Proxy Manager). PBS had me back online in 7 minutes. Without it? I&amp;rsquo;d have spent hours rebuilding configs from memory and old screenshots.&lt;/p&gt;
&lt;h3 id=&#34;is-this-required&#34;&gt;Is This Required?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Technically?&lt;/strong&gt; No. You can run without it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practically?&lt;/strong&gt; If your Jellyfin container died tomorrow, could you restore it in under 10 minutes? If not, you need this.&lt;/p&gt;
&lt;h3 id=&#34;the-budget-reality&#34;&gt;The Budget Reality:
&lt;/h3&gt;&lt;p&gt;You can run PBS on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A $150 used mini PC with a 2TB drive&lt;/li&gt;
&lt;li&gt;Your NAS if it has extra resources (though I prefer separation)&lt;/li&gt;
&lt;li&gt;Even a Raspberry Pi for smaller setups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is cheap insurance. Way cheaper than rebuilding your entire stack from scratch at 2AM on a work night.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming in Part 5:&lt;/strong&gt; Setting up Proxmox Backup Server, automating backups, and actually testing your restores, so you&amp;rsquo;re not learning how backups work during a crisis.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BYSKXGJV&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/teamgroup-2tb.jpg&#34; alt=&#34;TEAMGROUP T-Force Vulcan Z 2TB: This is the SSD I use for my Proxmox Backup Server storage. I backup 6 VMs and 12 LXCs, and I&amp;#39;m only at 11% capacity. At this rate I&amp;#39;ll fill it in 3 years. PBS&amp;#39; deduplication is amazing.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;TEAMGROUP T-Force Vulcan Z 2TB&lt;/strong&gt;
This is the SSD I use for my Proxmox Backup Server storage. I backup 6 VMs and 12 LXCs, and I&amp;rsquo;m only at 11% capacity. At this rate I&amp;rsquo;ll fill it in 3 years. PBS&amp;rsquo; deduplication is amazing.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/47lmO6j&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;common-questions&#34;&gt;Common Questions
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I start with just 2 boxes?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. Start with compute + storage, use your existing router. Or start with router + compute, use attached storage temporarily. The point is separation, not perfection. You can grow into the full stack.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What if I already have a Synology?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Perfect. That&amp;rsquo;s your storage box. You&amp;rsquo;re already halfway there. Focus on getting a dedicated router and compute box, connect them to your Synology, and you&amp;rsquo;ve got the stack.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I really need to learn Proxmox?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Not technically. You could run Docker on bare metal. But Proxmox gives you isolation, snapshots, easy backups, and the ability to run multiple services without them stepping on each other. The learning curve pays off.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What about power consumption?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Fair question. Three boxes use more power than one. My stack pulls about 100-150W total idle. That&amp;rsquo;s $10-15/month. The uptime and sanity are worth it, but if you&amp;rsquo;re power-sensitive, choose efficient hardware (upcoming in the build guides).&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I use old hardware for this?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Absolutely. Some of the best home servers are built from old office PCs. The next posts will cover budget builds using used hardware alongside new builds for those who want to buy fresh.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;what-about-the-easy-button&#34;&gt;What About the Easy Button?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&amp;ldquo;Can&amp;rsquo;t I just buy a Synology and run everything there?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can. And for some people, that&amp;rsquo;s the right answer. If you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t want to learn Linux or networking&lt;/li&gt;
&lt;li&gt;Just want it to work out of the box&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t mind being locked into Synology&amp;rsquo;s ecosystem&lt;/li&gt;
&lt;li&gt;Are okay with limited customization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then yes, get a Synology DS925+ or similar, install Jellyfin/Plex, and call it done.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0C8S7SF4B&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/synology-ds925.jpg&#34; alt=&#34;Synology 4-Bay DiskStation DS925&amp;#43; (Diskless): Want an easy button? Here you go. The Synology DS925&amp;#43; can be an OK all in one box. It has enough storage and processing power to run your media services. It will however lack the power to go beyond basic needs.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Synology 4-Bay DiskStation DS925+ (Diskless)&lt;/strong&gt;&lt;br&gt;
Want an easy button? Here you go. The Synology DS925+ can be an OK all in one box. It has enough storage and processing power to run your media services. It will however lack the power to go beyond basic needs.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4805Mdd&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313977909788038590453&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fsynology-ds925-4-bay-4gb-ddr4-ecc-sodimm-diskless-system%2fp%2fN82E16822108847R%3fitem%3dN82E16822108847R&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;But you lose flexibility.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can&amp;rsquo;t easily run multiple isolated services.&lt;/li&gt;
&lt;li&gt;You can&amp;rsquo;t experiment without risk.&lt;/li&gt;
&lt;li&gt;You can&amp;rsquo;t scale components independently.&lt;/li&gt;
&lt;li&gt;And when it breaks, you&amp;rsquo;re at Synology&amp;rsquo;s mercy for support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This guide is for people who want more control, are willing to learn, and understand that power comes with responsibility (and occasional Googling at 11PM).&lt;/p&gt;
&lt;h2 id=&#34;your-growth-path&#34;&gt;Your Growth Path
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Phase 1: Get it working&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build all three boxes&lt;/li&gt;
&lt;li&gt;Get basic services running (Jellyfin, Sonarr, Radarr)&lt;/li&gt;
&lt;li&gt;Verify everything boots reliably&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Phase 2: Stabilize and monitor&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add Proxmox Backup Server&lt;/li&gt;
&lt;li&gt;Set up proper monitoring (Uptime Kuma, Grafana)&lt;/li&gt;
&lt;li&gt;Document your setup (seriously, do this)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Phase 3: Optimize and expand&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add GPU for hardware transcoding&lt;/li&gt;
&lt;li&gt;Upgrade to 10GbE networking between boxes&lt;/li&gt;
&lt;li&gt;Add more storage as your library grows&lt;/li&gt;
&lt;li&gt;Experiment with new services in isolated LXCs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Phase 4: Advanced features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPN for remote access&lt;/li&gt;
&lt;li&gt;Automated media management (Recyclarr, Tdarr)&lt;/li&gt;
&lt;li&gt;Advanced monitoring and alerting&lt;/li&gt;
&lt;li&gt;Offsite backup replication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don&amp;rsquo;t need to do all of this at once. Build the foundation, then grow into it.&lt;/p&gt;
&lt;p&gt;The next four posts break down each box in detail: what to buy, what to avoid, and budget vs. dream builds.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Role&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
          &lt;th&gt;💰 Budget Range&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Router&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Traffic control, DNS, VLANs, firewall&lt;/td&gt;
          &lt;td&gt;$150-$500&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Reliable media storage with redundancy&lt;/td&gt;
          &lt;td&gt;$400-$1900&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Compute&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Runs all your apps and services&lt;/td&gt;
          &lt;td&gt;$200-$1400&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Backup&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Saves you from disaster&lt;/td&gt;
          &lt;td&gt;$150-$400&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each box has different needs, different trade-offs, and yes, different price tags. But here&amp;rsquo;s the thing: you don&amp;rsquo;t need the dream build to get started. A $900 budget stack works. A $4,200 dream stack works better. Both work way better than cramming everything onto one box and hoping for the best.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 2 drops next week: The Router.&lt;/strong&gt; I&amp;rsquo;ll show you exactly which hardware to buy, from the $150 AOOSTAR N1 PRO that punches above its weight to the $500+ &amp;ldquo;final boss&amp;rdquo; build that handles 10Gbps like it&amp;rsquo;s nothing. Plus: OPNsense installation, VLAN setup, and the firewall rules that actually matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Want to be ready?&lt;/strong&gt; Start thinking about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your budget for each component&lt;/li&gt;
&lt;li&gt;What old hardware you might already have&lt;/li&gt;
&lt;li&gt;Whether you want to buy used or new&lt;/li&gt;
&lt;li&gt;How much redundancy you actually need&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And most importantly: what you want to stop babysitting, so you can finally just watch your media in peace.&lt;/p&gt;
&lt;h2 id=&#34;series-navigation&#34;&gt;Series Navigation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post//media-server-hardware-guide-2025&#34; &gt;Part 1 - The 3 Boxes That Run Your Media Server (2025 Edition)&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-router-2025&#34; &gt;Part 2 - Why Your ISP Router Is Killing Your Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post//media-server-storage-2025&#34; &gt;Part 3 - Your Storage Deserves Its Own Box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-compute-2025&#34; &gt;Part 4 - Proxmox Is Your New Best Friend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/media-server-backup-2025&#34; &gt;Part 5 - Backups That Actually Work (With PBS)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Mastering UID/GID Mapping in Proxmox LXC Containers</title>
        <link>https://diymediaserver.com/post/mastering-uid-gid-mapping-proxmox-lxc/</link>
        <pubDate>Mon, 20 Oct 2025 07:03:02 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/mastering-uid-gid-mapping-proxmox-lxc/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/mastering-uid-gid-mapping-proxmox-lxc/featured.jpg" alt="Featured image of post Mastering UID/GID Mapping in Proxmox LXC Containers" /&gt;&lt;h1 id=&#34;mastering-uidgid-mapping-in-proxmox-lxc-containers&#34;&gt;Mastering UID/GID Mapping in Proxmox LXC Containers
&lt;/h1&gt;&lt;p&gt;If you&amp;rsquo;ve ever shared files between your Proxmox host and an LXC container and wondered why permissions look &amp;ldquo;off&amp;rdquo; or why bind mounts throw permission errors, you&amp;rsquo;ve already bumped into UID/GID mapping. It&amp;rsquo;s one of those behind-the-scenes mechanisms that keeps your containers safe and sane, but it can also be the source of confusing file ownership problems.&lt;/p&gt;
&lt;p&gt;Understanding UID (User ID) and GID (Group ID) mapping is crucial for anyone running unprivileged containers on Proxmox. It&amp;rsquo;s what prevents a container&amp;rsquo;s root from being &lt;em&gt;actual&lt;/em&gt; root on the host. It&amp;rsquo;s also the key to properly mapping shared directories and keeping your security in place.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing: UID/GID mapping sounds intimidating, but once you understand the basic concept, it becomes a powerful tool rather than a mysterious source of frustration. We&amp;rsquo;ll walk through how it works in Proxmox LXCs, how to customize it when needed, and how to fix the common headaches it causes, especially for media server setups like Jellyfin.&lt;/p&gt;
&lt;p&gt;Understanding this mapping helps you avoid the common trap of switching to privileged containers, which sacrifices security for convenience.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Proxmox isolates unprivileged LXC containers by mapping their user and group IDs to high-numbered counterparts on the host, starting at 100000. This security feature prevents container root users from escalating to host root. You can customize these mappings by editing `/etc/pve/lxc/&lt;ID&gt;.conf` and adjusting `/etc/subuid` and `/etc/subgid`. Doing so allows seamless file sharing and predictable permissions when bind mounting directories inside containers.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B09MDDBYXZ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_i5_12th.jpg&#34; alt=&#34;Intel® Core™ i5-12500 12th Generation Desktop Processor: This CPU is ideal for Proxmox homelabs, providing strong single-thread performance and efficient virtualization—perfect for experimenting with LXC containers.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Intel® Core™ i5-12500 12th Generation Desktop Processor&lt;/strong&gt;
This CPU is ideal for Proxmox homelabs, providing strong single-thread performance and efficient virtualization—perfect for experimenting with LXC containers.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4lGjveC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445833438084862958009096&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fintel-core-i5-12th-gen-core-i5-12500-alder-lake-lga-1700-desktop-cpu-processor%2fp%2fN82E16819118374&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-uidgid-mapping-matters&#34;&gt;Why UID/GID Mapping Matters
&lt;/h2&gt;&lt;p&gt;User and group IDs in Linux define ownership and permissions. UID 0 is root, UID 1000 might be your first host user, and so on. Normally, these IDs are global across a single OS instance, but containers complicate that picture. Without remapping, the &amp;ldquo;root&amp;rdquo; user inside a container would also be UID 0 on the host. If someone managed to escape that container, they&amp;rsquo;d have full system privileges.&lt;/p&gt;
&lt;p&gt;To solve this, Proxmox defaults to unprivileged containers, where the container&amp;rsquo;s UID/GID space is &lt;em&gt;remapped&lt;/em&gt; to a non-privileged range on the host. Think of it as giving each container its own private numbering system that translates to harmless IDs on the host side.&lt;/p&gt;
&lt;h3 id=&#34;visualizing-the-mapping&#34;&gt;Visualizing the Mapping
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s what happens with default mapping:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Container Namespace          Host System
┌────────────────────┐      ┌──────────────────┐
│ UID 0 (root)       │ ───&amp;gt; │ UID 100000       │
│ UID 1 (daemon)     │ ───&amp;gt; │ UID 100001       │
│ UID 1000 (user)    │ ───&amp;gt; │ UID 101000       │
│ UID 65535 (nobody) │ ───&amp;gt; │ UID 165535       │
└────────────────────┘      └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With custom mapping for media server access:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Container Namespace          Host System
┌────────────────────┐      ┌──────────────────┐
│ UID 0 (root)       │ ───&amp;gt; │ UID 100000       │
│ UID 999            │ ───&amp;gt; │ UID 100999       │
│ UID 1000 (user)    │ ───&amp;gt; │ UID 1000         │ ← Direct map!
│ UID 1001           │ ───&amp;gt; │ UID 101001       │
└────────────────────┘      └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;why-100000-as-the-starting-point&#34;&gt;Why 100000 as the Starting Point?
&lt;/h3&gt;&lt;p&gt;Proxmox chose 100000 as the default offset for good reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System UIDs (0-999):&lt;/strong&gt; Reserved for system services and the root user&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User UIDs (1000-60000):&lt;/strong&gt; Normal user accounts on most Linux systems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container offset (100000+):&lt;/strong&gt; Far enough from everything else to avoid conflicts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This ensures that even if you have 99 regular users on your host (UID 1000-1099), their IDs will never collide with container-mapped IDs.&lt;/p&gt;
&lt;h3 id=&#34;privileged-vs-unprivileged-what-you-need-to-know&#34;&gt;Privileged vs Unprivileged: What You Need to Know
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Unprivileged Containers&lt;/strong&gt; (&lt;code&gt;unprivileged: 1&lt;/code&gt; - Default):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UID/GID mapping is enforced by the kernel&lt;/li&gt;
&lt;li&gt;Container root = UID 100000 on host (harmless)&lt;/li&gt;
&lt;li&gt;Recommended for 99% of use cases including media servers&lt;/li&gt;
&lt;li&gt;Security isolation is maintained even if container is compromised&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Privileged Containers&lt;/strong&gt; (&lt;code&gt;unprivileged: 0&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NO UID/GID mapping&lt;/li&gt;
&lt;li&gt;Container root = actual root on host&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Major security risk:&lt;/strong&gt; Container escape = full host compromise&lt;/li&gt;
&lt;li&gt;Rarely needed for media servers, avoid unless absolutely necessary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For Jellyfin, Plex, and similar media servers, you should always use unprivileged containers with proper UID mapping. The performance is identical and security is much better.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-default-mapping&#34;&gt;Understanding the Default Mapping
&lt;/h2&gt;&lt;p&gt;When you create a new unprivileged LXC container in Proxmox, it automatically sets up UID/GID mappings to keep your container isolated from the host system.&lt;/p&gt;
&lt;p&gt;Check your container&amp;rsquo;s configuration file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/pve/lxc/101.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll see something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;arch: amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cores: &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hostname: jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;memory: &lt;span class=&#34;m&#34;&gt;2048&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rootfs: local-lvm:vm-101-disk-0,size&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;8G
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unprivileged: &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That &lt;code&gt;unprivileged: 1&lt;/code&gt; line triggers automatic UID/GID offset mapping defined in &lt;code&gt;/etc/subuid&lt;/code&gt; and &lt;code&gt;/etc/subgid&lt;/code&gt; on the host.&lt;/p&gt;
&lt;h3 id=&#34;the-default-mapping-files&#34;&gt;The Default Mapping Files
&lt;/h3&gt;&lt;p&gt;Check your host&amp;rsquo;s subordinate ID files:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/subuid
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/subgid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll see:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:100000:65536
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container UID 0 → Host UID 100000&lt;/li&gt;
&lt;li&gt;Container UID 1 → Host UID 100001&lt;/li&gt;
&lt;li&gt;Container UID 1000 → Host UID 101000&lt;/li&gt;
&lt;li&gt;Container UID 65535 → Host UID 165535&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why your media files show weird ownership! When your Jellyfin container (running as a user inside) creates or accesses files, they appear on the host owned by UIDs in the 100000+ range instead of your normal user account.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F8JG2SHN&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: With serious I/O and flexible storage, this mini-workstation is an excellent homelab node for advanced LXC container setups, allowing you to experiment with lxc.idmap and /etc/subgid in a high-performance, space-saving package.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
With serious I/O and flexible storage, this mini-workstation is an excellent homelab node for advanced LXC container setups, allowing you to experiment with lxc.idmap and /etc/subgid in a high-performance, space-saving package.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites
&lt;/h2&gt;&lt;p&gt;Before configuring UID/GID mapping, ensure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re running Proxmox VE 7.0 or later&lt;/li&gt;
&lt;li&gt;Container is stopped (or not yet created)&lt;/li&gt;
&lt;li&gt;You know your host user&amp;rsquo;s UID (run &lt;code&gt;id&lt;/code&gt; on host)&lt;/li&gt;
&lt;li&gt;You have root access to Proxmox host&lt;/li&gt;
&lt;li&gt;Media files exist on host with known ownership&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-by-step-setting-up-uidgid-mapping-for-media-servers&#34;&gt;Step-by-Step: Setting Up UID/GID Mapping for Media Servers
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the practical guide for getting Jellyfin (or Plex, Emby, etc.) working with your media library.&lt;/p&gt;
&lt;h3 id=&#34;step-1-identify-your-host-media-directory-ownership&#34;&gt;Step 1: Identify Your Host Media Directory Ownership
&lt;/h3&gt;&lt;p&gt;First, check who owns your media files on the host:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -ln /media/movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -ln /media/tv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll see output like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Oct &lt;span class=&#34;m&#34;&gt;20&lt;/span&gt; 10:30 /media/movies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;1000 1000&lt;/code&gt; shows UID and GID. This is typically your primary user account. Remember this number, you&amp;rsquo;ll need it later.&lt;/p&gt;
&lt;h3 id=&#34;step-2-stop-your-container&#34;&gt;Step 2: Stop Your Container
&lt;/h3&gt;&lt;p&gt;If container is already running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct stop &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Skip this step if you&amp;rsquo;re configuring a new container that hasn&amp;rsquo;t started yet&lt;/p&gt;
&lt;h3 id=&#34;step-3-edit-the-container-configuration&#34;&gt;Step 3: Edit the Container Configuration
&lt;/h3&gt;&lt;p&gt;Open the container&amp;rsquo;s config file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/pve/lxc/101.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add these lines at the end:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Our mapping covers exactly 65,536 IDs (0-65535):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Line 1: 1000 IDs (container 0-999)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Line 2: 1 ID (container 1000)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Line 3: 64535 IDs (container 1001-65535)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Total: 1000 + 1 + 64535 = 65,536 ✓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maps container UIDs 0-999 to host UIDs 100000-100999 (keeps container root isolated)&lt;/li&gt;
&lt;li&gt;Maps container UID 1000 directly to host UID 1000 (your user)&lt;/li&gt;
&lt;li&gt;Maps container GID 1000 directly to host GID 1000 (your user&amp;rsquo;s group)&lt;/li&gt;
&lt;li&gt;Resumes offset mapping at UID 1001 → host UID 101001 (100000 base + 1001 offset), maintaining security isolation for all remaining users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Save and exit (Ctrl+X, Y, Enter).&lt;/p&gt;
&lt;h3 id=&#34;step-4-add-bind-mounts-for-your-media&#34;&gt;Step 4: Add Bind Mounts for Your Media
&lt;/h3&gt;&lt;p&gt;Add your media directories to the config file (if not already open from Step 3, use &lt;code&gt;nano /etc/pve/lxc/101.conf&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp0: /media/movies,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp1: /media/tv,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/tv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp2: /media/music,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/music
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or use the command line:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -mp0 /media/movies,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -mp1 /media/tv,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/tv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-5-verify-subordinate-uid-files&#34;&gt;Step 5: Verify Subordinate UID Files
&lt;/h3&gt;&lt;p&gt;Check that your host has the necessary UID range:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/subuid
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/subgid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see at least:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:100000:65536
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now edit both files and add this line at the top:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# In /etc/subuid:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:1000:1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# In /etc/subgid:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:1000:1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allows the root user (who runs LXC) to map a single ID (1000) directly through to the container&lt;/li&gt;
&lt;li&gt;Change 1000 to match your host user&amp;rsquo;s UID/GID (find it with &lt;code&gt;id&lt;/code&gt; command)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;step-6-start-and-configure-container&#34;&gt;Step 6: Start and Configure Container
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct start &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enter the container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct enter &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create or modify the user to match your host UID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check if jellyfin user already exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id jellyfin 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If user doesn&amp;#39;t exist yet, create it:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;useradd -u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; -m jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If user already exists with wrong UID, modify it:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usermod -u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usermod -g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; jellyfin  &lt;span class=&#34;c1&#34;&gt;# Also update primary group&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-7-verify-permissions&#34;&gt;Step 7: Verify Permissions
&lt;/h3&gt;&lt;p&gt;Test that Jellyfin can access your media:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;su - jellyfin -s /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -la /media/movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch /media/movies/test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If these commands work without &amp;ldquo;Permission denied&amp;rdquo; errors, you&amp;rsquo;re good!&lt;/p&gt;
&lt;p&gt;On the host, verify:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -ln /media/movies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remove the test file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm /media/movies/test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Files created by Jellyfin should show UID 1000, matching your host user.&lt;/p&gt;
&lt;h3 id=&#34;step-8-configure-jellyfin-libraries&#34;&gt;Step 8: Configure Jellyfin Libraries
&lt;/h3&gt;&lt;p&gt;Access Jellyfin&amp;rsquo;s web interface (usually &lt;code&gt;http://container-ip:8096&lt;/code&gt;) and add your media libraries pointing to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/media/movies&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/media/tv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/media/music&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jellyfin should now scan and access everything without permission issues.&lt;/p&gt;
&lt;h2 id=&#34;common-media-server-patterns&#34;&gt;Common Media Server Patterns
&lt;/h2&gt;&lt;h3 id=&#34;pattern-1-single-user-media-library-most-common&#34;&gt;Pattern 1: Single User Media Library (Most Common)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; All media owned by one user (UID 1000)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp0: /media,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;pattern-2-multiple-media-users&#34;&gt;Pattern 2: Multiple Media Users
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Media owned by different users (UID 1000, 1001, 1002)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64533&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64533&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp0: /media,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;troubleshooting-media-server-permission-issues&#34;&gt;Troubleshooting Media Server Permission Issues
&lt;/h2&gt;&lt;h3 id=&#34;-problem-jellyfin-cant-see-media-files&#34;&gt;➤ Problem: Jellyfin Can&amp;rsquo;t See Media Files
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Library scan shows no files or &amp;ldquo;Permission denied&amp;rdquo; in logs&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check mapping is active&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -- cat /proc/self/uid_map
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Verify file ownership&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -- ls -ln /media/movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check Jellyfin user UID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -- id jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Ensure they match your mapping&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;-problem-cant-write-subtitles-or-metadata&#34;&gt;➤ Problem: Can&amp;rsquo;t Write Subtitles or Metadata
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Jellyfin complains about read-only filesystem&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Verify mount isn&amp;#39;t read-only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/pve/lxc/101.conf &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep mp0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Should NOT have &amp;#39;ro&amp;#39; option&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Correct: mp0: /media,mp=/media&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Wrong: mp0: /media,mp=/media,ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Verify write permissions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -- su - jellyfin -s /bin/bash -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;touch /media/test.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;-problem-transcoding-fails-with-permission-errors&#34;&gt;➤ Problem: Transcoding Fails with Permission Errors
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Playback works but transcoding fails&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check transcode directory permissions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -- ls -ln /var/lib/jellyfin/transcodes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Should be owned by jellyfin user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -- chown -R jellyfin:jellyfin /var/lib/jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If using host directory for transcoding&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pct &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101&lt;/span&gt; -mp1 /fast-storage/transcodes,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/transcodes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;-problem-files-show-as-uid-100000-on-host&#34;&gt;➤ Problem: Files Show as UID 100000 on Host
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Host can&amp;rsquo;t manage files created by Jellyfin&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Your mapping isn&amp;rsquo;t working. Go back to Step 3 and verify your &lt;code&gt;lxc.idmap&lt;/code&gt; configuration, then restart the container.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0DWS75TPQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/minidesktop.png&#34; alt=&#34;GMKtec Mini PC Workstation: A compact, powerful barebone system that&amp;#39;s perfect for running Proxmox and multiple LXC containers, making it easy for beginners and enthusiasts to test UID/GID mapping configurations in a real-world homelab environment.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;GMKtec Mini PC Workstation&lt;/strong&gt;
A compact, powerful barebone system that&amp;rsquo;s perfect for running Proxmox and multiple LXC containers, making it easy for beginners and enthusiasts to test UID/GID mapping configurations in a real-world homelab environment.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4kVe2jP&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;advanced-running-multiple-media-servers&#34;&gt;Advanced: Running Multiple Media Servers
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re running both Jellyfin and Plex, or want separate containers for different media types:&lt;/p&gt;
&lt;h3 id=&#34;strategy-shared-mapping-separate-containers&#34;&gt;Strategy: Shared Mapping, Separate Containers
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Container 101 (Jellyfin):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp0: /media,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media,ro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Container 102 (Plex):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp0: /media,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media,ro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both containers can read the same media library. Use &lt;code&gt;ro&lt;/code&gt; (read-only) flag to prevent accidental modifications.&lt;/p&gt;
&lt;h2 id=&#34;understanding-lxcidmap-syntax&#34;&gt;Understanding lxc.idmap Syntax
&lt;/h2&gt;&lt;p&gt;For those who want to customize beyond these common patterns:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;u&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;g&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;first_id_in_container&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;first_id_on_host&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;number_of_ids&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Example breakdown:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;u&lt;/code&gt; = UID mapping (use &lt;code&gt;g&lt;/code&gt; for GID)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt; = Start at container UID 0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;100000&lt;/code&gt; = Map to host UID 100000&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1000&lt;/code&gt; = Map 1000 consecutive IDs (0-999)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Critical rules:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You must map all 65536 IDs (0-65535)&lt;/li&gt;
&lt;li&gt;No gaps allowed&lt;/li&gt;
&lt;li&gt;No overlaps within same container&lt;/li&gt;
&lt;li&gt;Order matters. Later lines override earlier ones&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Will UID mapping slow down my media server?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No. UID mapping happens in the kernel with negligible overhead. Your Jellyfin performance will be identical to a privileged container, but much more secure.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I use the same mapping for multiple containers?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. All your media-related containers (Jellyfin, Sonarr, Radarr, etc.) can use the same UID mapping pattern. This makes file sharing between them seamless.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What if my media is owned by a different UID?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;p&gt;Adjust the mapping. If your media is owned by UID 1500 instead of 1000, change:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lxc.idmap: u 1500 1500 1&lt;/code&gt;&lt;br&gt;
&lt;code&gt;lxc.idmap: g 1500 1500 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And adjust the other ranges accordingly to ensure you still map all 65536 IDs.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I need to map GID separately from UID?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes, if your files rely on group permissions. Most media setups work fine mapping both UID and GID the same way (as shown in the examples).&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I change mapping on an existing Jellyfin container?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;p&gt;Yes, but be prepared to fix file ownership:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stop container&lt;/li&gt;
&lt;li&gt;Modify mapping in config&lt;/li&gt;
&lt;li&gt;Start container&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;chown -R jellyfin:jellyfin /var/lib/jellyfin&lt;/code&gt; inside container&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your media files on the host should maintain correct ownership since they&amp;rsquo;re already owned by your user.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I ever use a privileged container for Jellyfin?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;No. There&amp;rsquo;s no legitimate performance or functionality reason to run Jellyfin in a privileged container. Proper UID mapping gives you the same capabilities with vastly better security.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion-media-servers-and-uid-mapping&#34;&gt;Conclusion: Media Servers and UID Mapping
&lt;/h2&gt;&lt;p&gt;UID/GID mapping is the key to running secure, functional media servers in Proxmox LXC containers. The default isolation protects your host system, while custom mapping gives you seamless access to media libraries.&lt;/p&gt;
&lt;h3 id=&#34;your-media-server-checklist&#34;&gt;Your Media Server Checklist
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Identify media directory ownership on host (usually UID 1000)&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;lxc.idmap&lt;/code&gt; to map that UID directly&lt;/li&gt;
&lt;li&gt;Add bind mounts for media directories&lt;/li&gt;
&lt;li&gt;Create or modify media server user to match mapped UID&lt;/li&gt;
&lt;li&gt;Test file access from inside container&lt;/li&gt;
&lt;li&gt;Verify host sees correct ownership&lt;/li&gt;
&lt;li&gt;Configure media server libraries&lt;/li&gt;
&lt;li&gt;Run a scan and test playback&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;key-takeaways-for-media-servers&#34;&gt;Key Takeaways for Media Servers
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Use unprivileged containers always.&lt;/strong&gt; The security benefit is enormous, and the setup is straightforward once you understand UID mapping.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Map your user UID directly.&lt;/strong&gt; The single-user passthrough pattern (mapping UID 1000 to 1000) handles 90% of media server scenarios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Document your setup.&lt;/strong&gt; Write down which UIDs you mapped and why. You&amp;rsquo;ll thank yourself during troubleshooting or migration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test before going live.&lt;/strong&gt; Verify file access, transcoding, and metadata writing all work before importing your entire library.&lt;/p&gt;
&lt;p&gt;The small investment in understanding UID/GID mapping pays off with a secure, maintainable media server setup that just works.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07V5JTMV9&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB: This affordable, energy-efficient single-board computer is perfect for beginners wanting to learn about Proxmox LXC containers and UID/GID mappings in a low-risk, hands-on way.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;RaspberryPi 4GB&lt;/strong&gt;
This affordable, energy-efficient single-board computer is perfect for beginners wanting to learn about Proxmox LXC containers and UID/GID mappings in a low-risk, hands-on way.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;sources&#34;&gt;Sources
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://pve.proxmox.com/wiki/Unprivileged_LXC_containers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Proxmox LXC and Unprivileged Containers Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://man7.org/linux/man-pages/man7/namespaces.7.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Linux Kernel User Namespace Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/jellyfin-archive/jellyfin-docs/blob/master/general/administration/hardware-acceleration.md#va-api-and-qsv-hardware-acceleration-on-lxc-or-lxd-container&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jellyfin Documentation: Hardware Acceleration and Permissions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>How to Install and Configure Tdarr for Media Library Optimization</title>
        <link>https://diymediaserver.com/post/setup-tdarr-automated-media-library-optimization/</link>
        <pubDate>Sun, 12 Oct 2025 05:44:47 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/setup-tdarr-automated-media-library-optimization/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/setup-tdarr-automated-media-library-optimization/featured.jpg" alt="Featured image of post How to Install and Configure Tdarr for Media Library Optimization" /&gt;&lt;p&gt;If you&amp;rsquo;ve ever looked at your media collection and wondered why a 4K movie is eating up 50GB of storage while looking identical to a 10GB version, you&amp;rsquo;re ready for Tdarr. This powerful automation tool handles the tedious work of transcoding your video files, converting them to more efficient formats without sacrificing quality you&amp;rsquo;ll actually notice.&lt;/p&gt;
&lt;p&gt;Tdarr isn&amp;rsquo;t just another media converter. It&amp;rsquo;s a complete workflow system that watches your library, analyzes your files, and automatically optimizes them based on rules you set. Think of it as having a dedicated assistant who never sleeps, constantly working to make your media collection smaller, more compatible, and easier to stream.&lt;/p&gt;
&lt;p&gt;In this guide, I&amp;rsquo;ll walk through setting up Tdarr from scratch. You&amp;rsquo;ll learn how to install it and configure your first Intel QuickSync transcoding workflow. By the end, you&amp;rsquo;ll have a basic understanding on how to keep your media library optimized without any ongoing effort from you.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_i5_12th.jpg&#34; alt=&#34;Intel® Core™ i5-12500 12th Generation Desktop Processor: The Intel® Core™ i5-12500 offers strong single-thread performance and built-in Quick Sync hardware t…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Intel® Core™ i5-12500 12th Generation Desktop Processor&lt;/strong&gt;
The Intel® Core™ i5-12500 offers strong single-thread performance and built-in Quick Sync hardware transcoding, making it an excellent CPU for running Tdarr and handling multiple concurrent transcodes. It&amp;rsquo;s ideal for DIY homelab builders who want efficient, reliable media processing without needing a discrete GPU. This processor is a great foundation for a Tdarr server.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4lGjveC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445833438084862958009096&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fintel-core-i5-12th-gen-core-i5-12500-alder-lake-lga-1700-desktop-cpu-processor%2fp%2fN82E16819118374&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If you manage a large media library, you know the drill: storage fills up fast, and manually transcoding files is about as fun as watching paint dry. This is where Tdarr comes in.&lt;/p&gt;
&lt;p&gt;Tdarr is a transcoding and media management tool that handles the grunt work for you. Instead of babysitting HandBrake for hours, you set up rules once and let Tdarr automatically process your entire video collection in the background. It can remove unwanted audio tracks, compress, re-encode, and standardize files based on whatever criteria you define. All in the name of saving space. Hard drives have only gotten more expensive so now is the time to try and save space before adding another expensive hard dirve to your server.&lt;/p&gt;
&lt;p&gt;The real game-changer? &lt;strong&gt;Distributed transcoding&lt;/strong&gt;. You can spread the workload across multiple machines, turning that old laptop gathering dust into a transcoding workhorse. Set it up once, let it run, and watch terabytes of space magically reappear without sacrificing playable quality. It&amp;rsquo;s exactly what Plex, Jellyfin, and Emby users have been waiting for.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    You will need to either have a shared cache folder that the server and ALL of the nodes can access or pay for their pro subscription to setup multiple nodes. This is not covered in this post.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This guide covers will only cover installing, configuring, and troubleshooting Tdarr in an unprivileged LXC container. Whether you&amp;rsquo;re new to transcoding or haven&amp;rsquo;t touched it since the early HandBrake days, you&amp;rsquo;ll walk away with a practical setup that saves both time and storage without the usual headaches.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Tdarr automates the tedious job of transcoding and optimizing your media library using flexible, customizable rules. Install it, set up your transcoding preferences through a clean web interface, and optionally scale it across multiple machines for distributed processing. It&#39;s particularly valuable for Jellyfin or Plex server owners and anyone looking to reclaim storage space by converting files (like moving from H.264 to H.265) while maintaining quality.

&lt;/div&gt;
&lt;h2 id=&#34;why-lxc-instead-of-docker&#34;&gt;Why LXC Instead of Docker?
&lt;/h2&gt;&lt;p&gt;You might be wondering why this guide uses LXC containers instead of Docker, especially since most Tdarr tutorials out there are Docker-based. Here&amp;rsquo;s the reasoning behind this approach:&lt;/p&gt;
&lt;h3 id=&#34;direct-hardware-access&#34;&gt;Direct Hardware Access
&lt;/h3&gt;&lt;p&gt;LXC containers run closer to the host system than Docker containers. When you&amp;rsquo;re sharing an iGPU between multiple services (like Jellyfin and Tdarr), LXC makes hardware passthrough significantly more straightforward. You get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simpler GPU sharing:&lt;/strong&gt; The iGPU can be accessed by multiple LXC containers simultaneously without complex device mapping or privileged modes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native performance:&lt;/strong&gt; LXC containers have almost zero overhead compared to bare metal, making them ideal for transcoding workloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistent hardware access:&lt;/strong&gt; The GPU stays available even after container restarts without additional Docker flags or volume mounts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;resource-isolation-without-the-overhead&#34;&gt;Resource Isolation Without the Overhead
&lt;/h3&gt;&lt;p&gt;Docker adds multiple layers of abstraction that aren&amp;rsquo;t necessary for long-running services like Tdarr. LXC gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lower memory footprint:&lt;/strong&gt; No Docker daemon consuming resources in the background&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct systemd integration:&lt;/strong&gt; Services start and stop like native system services&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filesystem efficiency:&lt;/strong&gt; No overlay filesystems slowing down video file I/O operations&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;better-integration-with-proxmox&#34;&gt;Better Integration with Proxmox
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;re running Proxmox (which most homelabbers are), LXC is first-class:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Native Proxmox management:&lt;/strong&gt; Create, clone, and backup containers through the web UI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Snapshot support:&lt;/strong&gt; Take instant snapshots before major configuration changes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in monitoring:&lt;/strong&gt; Resource usage graphs and stats without installing additional tools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No nested virtualization issues:&lt;/strong&gt; Docker-in-VM can be problematic; LXC just works&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;when-docker-makes-more-sense&#34;&gt;When Docker Makes More Sense
&lt;/h3&gt;&lt;p&gt;Docker isn&amp;rsquo;t wrong—it&amp;rsquo;s just optimized for different use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Portability:&lt;/strong&gt; If you need to move Tdarr between different hosts frequently, Docker&amp;rsquo;s image format makes this trivial&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick testing:&lt;/strong&gt; Spinning up and destroying Docker containers is faster for experimentation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Proxmox:&lt;/strong&gt; If you&amp;rsquo;re running on bare Ubuntu/Debian without Proxmox, Docker is simpler to set up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a dedicated media server running on Proxmox where you want maximum transcoding performance and are already sharing GPU resources with other services, LXC is the better architectural choice. You get native performance, simpler hardware access, and better integration with your virtualization platform—all while using fewer system resources.&lt;/p&gt;
&lt;h2 id=&#34;understanding-tdarr-and-why-it-matters&#34;&gt;Understanding Tdarr and Why It Matters
&lt;/h2&gt;&lt;p&gt;Before we start spinning up containers and tweaking codec settings, let&amp;rsquo;s get clear on what Tdarr actually does. And more importantly, what it doesn&amp;rsquo;t do.&lt;/p&gt;
&lt;h3 id=&#34;what-is-tdarr&#34;&gt;What Is Tdarr?
&lt;/h3&gt;&lt;p&gt;Tdarr is a conditional transcoding application. It looks at each video file in your library, runs it through a set of rules you define (like &amp;ldquo;Is this still using H.264?&amp;rdquo; or &amp;ldquo;Is the bitrate ridiculously high?&amp;rdquo;), and then decides whether to transcode it, leave it alone, or skip it entirely.&lt;/p&gt;
&lt;p&gt;Picture Tdarr as a quality control inspector on an assembly line. Each file gets examined, processed if needed, and passed along based on the standards you&amp;rsquo;ve set. Behind the scenes, it leverages proven tools like &lt;strong&gt;FFmpeg&lt;/strong&gt; and &lt;strong&gt;HandBrake&lt;/strong&gt; to do the heavy lifting, so you get reliable performance and industry-standard compression without having to become a command-line wizard.&lt;/p&gt;
&lt;h3 id=&#34;why-use-tdarr&#34;&gt;Why Use Tdarr?
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s why I swear by Tdarr:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Storage Efficiency:&lt;/strong&gt; Convert those space-hogging H.264 or MPEG-2 files to modern H.265 (HEVC) and watch your storage usage drop by up to 50% without sacrificing watchable quality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uniform Playability:&lt;/strong&gt; Standardize your codecs and container formats so everything plays smoothly across Plex, Jellyfin, smart TVs, and mobile apps. No more &amp;ldquo;this format is not supported&amp;rdquo; messages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set-and-Forget Automation:&lt;/strong&gt; Configure your preferences once, and Tdarr handles the monitoring, processing, and updating automatically. Your media library maintains itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; Add multiple worker nodes for distributed transcoding when you need to process hundreds or thousands of files without waiting weeks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;ve ever watched Jellyfin refuse to play an unsupported codec, or wondered why your server storage is maxed out despite regular cleanup, Tdarr solves both problems for the long haul.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive: A large-capacity hard drive like the Seagate Barracuda 24TB is crucial for storing your growing media library and…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;
A large-capacity hard drive like the Seagate Barracuda 24TB is crucial for storing your growing media library and transcoded files managed by Tdarr. Its reliability and size make it perfect for bulk storage in a homelab or media server environment. This drive ensures you have plenty of space for all your media needs.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-1-installing-tdarr-via-unprivileged-lxc&#34;&gt;Step 1: Installing Tdarr via Unprivileged LXC
&lt;/h2&gt;&lt;p&gt;Why an LXC? Because I&amp;rsquo;m sharing my iGPU with Jellyfin who is also installed in an LXC.&lt;/p&gt;
&lt;p&gt;My Jellyfin guide:&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/jellyfin_intel_quicksync_unprivileged_lxc/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jellyfin + Intel QuickSync in Unprivileged LXC - The Complete Guide&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;prerequisites-checklist&#34;&gt;Prerequisites Checklist
&lt;/h3&gt;&lt;p&gt;Before starting, ensure you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxmox VE with an unprivileged LXC running Debian 13&lt;/li&gt;
&lt;li&gt;Intel CPU with QuickSync (12th gen or newer recommended)&lt;/li&gt;
&lt;li&gt;Basic command-line familiarity&lt;/li&gt;
&lt;li&gt;Network access to your LXC container&lt;/li&gt;
&lt;li&gt;Media files stored on your Proxmox host with known paths&lt;/li&gt;
&lt;li&gt;At least 8GB RAM allocated to the LXC&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;add-the-debian-non-free-component&#34;&gt;Add the Debian Non-Free Component
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/apt/sources.list.d/debian.sources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On the components line add &lt;code&gt;non-free&lt;/code&gt; to the end.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Types: deb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;URIs: http://deb.debian.org/debian
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Suites: trixie trixie-updates
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Components: contrib main non-free
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Signed-By: /usr/share/keyrings/debian-archive-keyring.gp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;add-a-new-source-for-mkvtoolnix&#34;&gt;Add a new source for MKVToolNix
&lt;/h3&gt;&lt;p&gt;Pull the gpg key:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget -O /etc/apt/keyrings/gpg-pub-moritzbunkus.gpg https://mkvtoolnix.download/gpg-pub-moritzbunkus.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a new source File:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/apt/sources.list.d/mkvtoolnix.sources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Types: deb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;URIs: https://mkvtoolnix.download/debian/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Suites: trixie
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Components: main
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Signed-By: /etc/apt/keyrings/gpg-pub-moritzbunkus.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;install-handbrake-ffmpeg-mkvtoolnix-and-other-required-tools&#34;&gt;Install HandBrake, ffmpeg, MKVtoolNix and other required tools
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install -y sudo curl unzip ca-certificates gnupg wget vainfo libva2 intel-media-va-driver-non-free libva-drm2 libva2 pciutils handbrake-cli ffmpeg mkvtoolnix
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    I install ffmpeg and handbrake outside of Tdarr because I find it is easier to maintain.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;add-users-and-groups&#34;&gt;Add Users and Groups
&lt;/h3&gt;&lt;p&gt;Create your &lt;code&gt;media&lt;/code&gt; group that has read and write access to your media files. I use &lt;code&gt;media&lt;/code&gt; with a gid of &lt;code&gt;1001&lt;/code&gt; for mine make sure to use yours if it is different.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo addgroup --gid &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the Tdarr User:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo useradd -r -m -d /opt/tdarr -s /usr/sbin/nologin tdarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the video, render and media groups to the Tdarr user:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -aG render,video,media tdarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reset the group membership without logging out:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo loginctl enable-linger tdarr 2&amp;gt;/dev/null &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-2-lxc-config-changes&#34;&gt;Step 2: LXC Config Changes
&lt;/h2&gt;&lt;p&gt;Stop the container.
Add these lines to your &lt;code&gt;/etc/pve/lxc/CT#.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Bind mounts your media to the LXC&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mp0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/media/Storage/Movies,mp=/media/Movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mp1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/media/Storage/Shows,mp=/media/Shows&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Maps permissions to the host&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;u 0 100000 65536&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 0 100000 992&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 992 104 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 992 is the LXC&amp;#39;s Render GID and 104 is the Host&amp;#39;s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 993 100994 7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 1001 1001 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 1001 is both the LXC&amp;#39;s and Host&amp;#39;s GID for my media group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.idmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;g 1002 101002 64534&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Passthrough the iGPU&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.mount.entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/dev/dri/ dev/dri/ none bind,optional,create=dir&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lxc.cgroup2.devices.allow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;c 226:* rwm&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is my Host&amp;rsquo;s &lt;code&gt;/etc/subgid&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:1000:1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:1001:1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:100000:65536
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Render Group&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:104:1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Media Group&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root:1001:1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These lines need to be in here to properly map the GIDs for permissions to work properly.
Restart the container.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Understanding ID Mapping - These &lt;code&gt;lxc.idmap&lt;/code&gt; lines map user and group IDs between your LXC container and the Proxmox host. This allows the &lt;code&gt;tdarr&lt;/code&gt; user inside the container to access your media files and the GPU on the host. The numbers (992, 1001, etc.) must match your specific system. If you&amp;rsquo;re unfamiliar with LXC ID mapping, check out &lt;a class=&#34;link&#34; href=&#34;https://pve.proxmox.com/wiki/Unprivileged_LXC_containers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Unprivileged LXC containers&lt;/a&gt; first.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-3-install-tdarr&#34;&gt;Step 3: Install Tdarr
&lt;/h2&gt;&lt;p&gt;Now we are ready to install Tdarr&lt;/p&gt;
&lt;p&gt;Navigate to &lt;code&gt;/opt/tdarr&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /opt/tdarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pull the Tdarr install script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://storage.tdarr.io/versions/2.17.01/linux_x64/Tdarr_Updater.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unzip the install package:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unzip Tdarr_Updater.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create two additional directories for Tdarr&amp;rsquo;s temporary files and cache:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir temp cache
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make the script executable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod +x Tdarr_Updater
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run the installer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ./Tdarr_Updater
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Run &lt;code&gt;groups tdarr&lt;/code&gt; and verify you see: &lt;code&gt;tdarr video render media&lt;/code&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;inital-tdarr-run&#34;&gt;Inital Tdarr Run
&lt;/h3&gt;&lt;p&gt;Initial Run of Tdarr_Server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/opt/tdarr/Tdarr_Server/Tdarr_Server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let this run for a minute or so. Errors are fine for now. We are just creating the JSON config file.&lt;/p&gt;
&lt;p&gt;Initial run of Tdarr_Node:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/opt/tdarr/Tdarr_Node/Tdarr_Node
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Again errors are fine.&lt;/p&gt;
&lt;p&gt;Now set the owner for the Tdarr folders:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R tdarr:tdarr /opt/tdarr/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tdarr-server-json-config&#34;&gt;Tdarr Server JSON Config
&lt;/h3&gt;&lt;p&gt;You now have a basic config file for the server. We need to set the &lt;code&gt;serverIP&lt;/code&gt;, &lt;code&gt;handbrakePath&lt;/code&gt;, and &lt;code&gt;ffmpegPath&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /opt/tdarr/configs/Tdarr_Server_Config.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After modifying, it should look something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-JSON&#34; data-lang=&#34;JSON&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;serverPort&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;8266&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;webUIPort&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;8265&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;serverIP&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;172.27.0.14&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;serverBindIP&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;serverDualStack&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;handbrakePath&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/bin/HandBrakeCLI&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;ffmpegPath&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/bin/ffmpeg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;logLevel&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;INFO&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;mkvpropeditPath&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;ccextractorPath&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;openBrowser&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;cronPluginUpdate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;auth&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;authSecretKey&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tsec_NotARealKey&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;maxLogSizeMB&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;seededApiKey&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tdarr-node-json-config&#34;&gt;Tdarr Node JSON Config
&lt;/h3&gt;&lt;p&gt;open the basic config file. We need to set &lt;code&gt;serverURL&lt;/code&gt;, &lt;code&gt;ServerIP&lt;/code&gt;, &lt;code&gt;handbrakePath&lt;/code&gt;, &lt;code&gt;ffmpegPath&lt;/code&gt;, and &lt;code&gt;mkvpropeditPath&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /opt/tdarr/configs/Tdarr_Node_Config.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After modifying, it should look something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-JSON&#34; data-lang=&#34;JSON&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;nodeName&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;jaded-joey&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;serverURL&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://172.27.0.14:8266&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;serverIP&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;172.27.0.14&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;serverPort&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;8266&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;handbrakePath&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/bin/HandBrakeCLI&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;ffmpegPath&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/bin/ffmpeg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;mkvpropeditPath&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/bin/mkvpropedit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;pathTranslators&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;nodeType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;mapped&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;unmappedNodeCache&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/tdarr/unmappedNodeCache&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;logLevel&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;INFO&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;-1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;cronPluginUpdate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;apiKey&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;maxLogSizeMB&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;pollInterval&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;startPaused&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;create-tdarr-services&#34;&gt;Create Tdarr Services
&lt;/h3&gt;&lt;p&gt;To make sure it starts automatically we need to create two services. One for the server and one for the node.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/systemd/system/tdarr-server.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Tdarr Server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Wants&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;simple
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tdarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Group&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tdarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WorkingDirectory&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/Tdarr_Server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_DATA&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/configs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_LOGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/logs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/Tdarr_Server/Tdarr_Server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Restart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;on-failure
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Resource limits (tune as desired)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CPUAccounting&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MemoryAccounting&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CPUQuota&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;100%
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MemoryMax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2G
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Node&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/systemd/system/tdarr-node.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste this (Make sure to change the &lt;code&gt;TDARR_SERVER_HOST&lt;/code&gt; to your IP):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Tdarr Node
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tdarr-server.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Wants&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tdarr-server.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;simple
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tdarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Group&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tdarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WorkingDirectory&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/Tdarr_Node
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_NODE_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tdarr-node-01
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_SERVER_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;172.27.0.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_FFMPEG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/bin/ffmpeg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_LOGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/logs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_TEMP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/temp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TDARR_CACHE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/opt/tdarr/Tdarr_Node/Tdarr_Node
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Restart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;on-failure
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Resource limits (tune as desired)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CPUAccounting&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MemoryAccounting&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CPUQuota&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;150%
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MemoryMax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;6G
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;IOSchedulingClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;best-effort
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;IOSchedulingPriority&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;enable-and-start-the-new-services&#34;&gt;Enable and Start the new Services
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Bash&#34; data-lang=&#34;Bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; tdarr-server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start tdarr-server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; tdarr-node
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start tdarr-node
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check the status of the services to make sure they are running:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status tdarr-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* tdarr-server.service - Tdarr Server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Loaded: loaded &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/etc/systemd/system/tdarr-server.service&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; enabled&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; preset: enabled&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Active: active &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;running&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; since Wed 2025-10-15 11:15:48 MDT&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; day 20h ago
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Invocation: 5adc45d529564e898b9e51e29917de75
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Main PID: &lt;span class=&#34;m&#34;&gt;7535&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Tdarr_Server&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      Tasks: &lt;span class=&#34;m&#34;&gt;21&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;limit: 76615&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Memory: 281.5M &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;max: 2G, available: 1.7G, peak: 2G, swap: 31.6M, swap peak: 38.3M&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        CPU: 42min 13.105s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     CGroup: /system.slice/tdarr-server.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-7535 /opt/tdarr/Tdarr_Server/Tdarr_Server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;-7541 Tdarr_Server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Node&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status tdarr-node
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* tdarr-node.service - Tdarr Node
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Loaded: loaded &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/etc/systemd/system/tdarr-node.service&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; enabled&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; preset: enabled&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Active: active &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;running&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; since Wed 2025-10-15 11:44:19 MDT&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; day 20h ago
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Invocation: 40a1033a1c984181a6f4c4c399398d4b
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Main PID: &lt;span class=&#34;m&#34;&gt;8673&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Tdarr_Node&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      Tasks: &lt;span class=&#34;m&#34;&gt;187&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;limit: 76615&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Memory: 2.7G &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;max: 6G, available: 3.2G, peak: 6G, swap: 11.3M, swap peak: 184.3M&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        CPU: 5h 37min 41.929s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     CGroup: /system.slice/tdarr-node.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-4-testing-quicksync&#34;&gt;Step 4: Testing QuickSync
&lt;/h2&gt;&lt;p&gt;Before we go any further we need to make sure QuickSync is working.&lt;/p&gt;
&lt;h3 id=&#34;run-this-quick-test&#34;&gt;Run this quick test
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -u tdarr env &lt;span class=&#34;nv&#34;&gt;LIBVA_DRIVER_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;iHD &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  vainfo --display drm --device /dev/dri/renderD128 &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n &lt;span class=&#34;m&#34;&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details class=&#34;collapse code&#34; &gt;
  &lt;summary&gt;➤ Expected Results&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
libva info: VA-API version 1.22.0
libva info: User environment variable requested driver &amp;#39;iHD&amp;#39;
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
Trying display: drm
vainfo: VA-API version: 1.22 (libva 2.22.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 25.2.3 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileNone                   : VAEntrypointStats
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointFEI
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointFEI
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointFEI
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointFEI
      VAProfileHEVCMain               : VAEntrypointEncSliceLP
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointEncSliceLP
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSliceLP
      VAProfileVP9Profile1            : VAEntrypointVLD
      VAProfileVP9Profile1            : VAEntrypointEncSliceLP
      VAProfileVP9Profile2            : VAEntrypointVLD
      VAProfileVP9Profile2            : VAEntrypointEncSliceLP
      VAProfileVP9Profile3            : VAEntrypointVLD
      VAProfileVP9Profile3            : VAEntrypointEncSliceLP
      VAProfileHEVCMain12             : VAEntrypointVLD
      VAProfileHEVCMain12             : VAEntrypointEncSlice
      VAProfileHEVCMain422_10         : VAEntrypointVLD
      VAProfileHEVCMain422_10         : VAEntrypointEncSlice
      VAProfileHEVCMain422_12         : VAEntrypointVLD
      VAProfileHEVCMain422_12         : VAEntrypointEncSlice
      VAProfileHEVCMain444            : VAEntrypointVLD
      VAProfileHEVCMain444            : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_10         : VAEntrypointVLD
      VAProfileHEVCMain444_10         : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_12         : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain10          : VAEntrypointVLD
      VAProfileHEVCSccMain10          : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain444         : VAEntrypointVLD
      VAProfileHEVCSccMain444         : VAEntrypointEncSliceLP
      VAProfileAV1Profile0            : VAEntrypointVLD&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;If you see &lt;code&gt;Driver version: Intel iHD driver for Intel(R) Gen Graphics - 25.2.3&lt;/code&gt; it is working and we can move on to installing Tdarr.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-default&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;ℹ️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Info:&lt;/strong&gt;
    Performance Expectations - With Intel QuickSync enabled, a typical 2-hour 1080p movie (H.264 to H.265) transcodes in 15-30 minutes depending on your CPU generation. Without hardware acceleration, the same file could take 2-4 hours. If transcodes are taking longer than expected, verify QuickSync is actually being used by checking GPU utilization: &lt;code&gt;intel_gpu_top&lt;/code&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-5-access-the-web-interface--initial-configuration-walkthrough&#34;&gt;Step 5: Access the web interface &amp;amp; Initial Configuration Walkthrough
&lt;/h2&gt;&lt;p&gt;Open your browser and navigate to: &lt;a class=&#34;link&#34; href=&#34;http://YourServerIP:8265&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://YourServerIP:8265&lt;/a&gt;.&lt;br&gt;
The Tdarr dashboard should greet you, ready for configuration.&lt;/p&gt;
&lt;p&gt;If it opens CONGRATULATIONS! you have Tdarr up and running.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Security Consideration - Tdarr&amp;rsquo;s web interface (port 8265) has no authentication enabled by default in this configuration. If your server is exposed to the internet, either enable authentication in &lt;code&gt;/opt/tdarr/configs/Tdarr_Server_Config.json&lt;/code&gt; by setting &lt;code&gt;&amp;quot;auth&amp;quot;: true&lt;/code&gt; and configuring credentials, or restrict access using your firewall. For local network-only use, this isn&amp;rsquo;t a concern.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;When you first access Tdarr, you&amp;rsquo;ll see the main dashboard with several tabs across the top. Here&amp;rsquo;s what to do first:&lt;/p&gt;
&lt;h3 id=&#34;verify-your-node-is-connected&#34;&gt;Verify Your Node is Connected
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Look for the &lt;strong&gt;Nodes&lt;/strong&gt; section on the main page&lt;/li&gt;
&lt;li&gt;You should see your node listed (named something like &amp;ldquo;jaded-joey&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Click on the node name to see detailed stats&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If your node isn&amp;rsquo;t showing up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Double-check the node service is running: &lt;code&gt;sudo systemctl status tdarr-node&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Verify the &lt;code&gt;serverIP&lt;/code&gt; matches in both JSON configs&lt;/li&gt;
&lt;li&gt;Check the logs: &lt;code&gt;sudo journalctl -u tdarr-node -f&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is what it should look like:
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/setup-tdarr-automated-media-library-optimization/tdarr-nodes.jpg&#34;
    alt=&#34;Tdarr Node Example&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&#34;configure-hardware-acceleration&#34;&gt;Configure Hardware Acceleration
&lt;/h3&gt;&lt;p&gt;Before adding libraries, make sure Tdarr knows to use QuickSync:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click on your node in the &lt;strong&gt;Nodes&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Scroll down to &lt;strong&gt;Transcode Options&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Hardware Encoding&lt;/strong&gt;, select &amp;ldquo;Any (nvenc,qsv,vaapi)&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Save the changes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This ensures Tdarr uses your iGPU instead of hammering your CPU.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc.jpg&#34; alt=&#34;ASRock Intel ARC A380 Challenger: The ASRock Intel ARC A380 Challenger provides modern hardware transcoding support (AV1/HEVC/H.264), which is essential for …&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;ASRock Intel ARC A380 Challenger&lt;/strong&gt;
The ASRock Intel ARC A380 Challenger provides modern hardware transcoding support (AV1/HEVC/H.264), which is essential for efficient and fast media processing in Tdarr. Offloading transcoding tasks from your CPU, it ensures smooth operation and maximizes your server&amp;rsquo;s performance. It&amp;rsquo;s a cost-effective way to boost your Tdarr setup for self-hosted media servers.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45n6UHq&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-6-getting-comfortable-with-tdarr&#34;&gt;Step 6: Getting Comfortable With Tdarr
&lt;/h2&gt;&lt;p&gt;Now for the fun part: Tdarr&amp;rsquo;s web dashboard is your command center for everything media transcoding. The interface is refreshingly straightforward, organized into four main sections that actually make sense:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Libraries:&lt;/strong&gt; Tell Tdarr which folders to watch and process&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transcode Settings:&lt;/strong&gt; Set up your conversion rules and choose plugins&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nodes:&lt;/strong&gt; Monitor your transcoding workers (yes, you can run multiple)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs:&lt;/strong&gt; Watch the real-time activity feed and catch any hiccups&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;setting-up-your-first-library&#34;&gt;Setting Up Your First Library
&lt;/h3&gt;&lt;p&gt;Time to point Tdarr at your media collection. This is where those bind mount mappings from earlier pay off:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the sidebar, click &lt;strong&gt;Libraries → Add Library&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Give it a descriptive name like &amp;ldquo;Movies&amp;rdquo; or &amp;ldquo;TV Shows&amp;rdquo; (you&amp;rsquo;ll thank yourself later).&lt;/li&gt;
&lt;li&gt;Set the folder path to match what you mapped in your LXC (like &lt;code&gt;/media/Movies&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Set the library type to &amp;ldquo;Video.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tdarr immediately starts scanning that directory, cataloging every video file it finds. Depending on your collection size, this initial scan might take a few minutes, but you&amp;rsquo;ll see the progress in real time through the logs.&lt;/p&gt;
&lt;h2 id=&#34;step-7-defining-transcoding-rules&#34;&gt;Step 7: Defining Transcoding Rules
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s where Tdarr gets interesting. Rules are the brain of your operation: they decide which files get processed and how. Think of them as your personal media assistant that never sleeps.&lt;/p&gt;
&lt;h3 id=&#34;creating-conditional-rules&#34;&gt;Creating Conditional Rules
&lt;/h3&gt;&lt;p&gt;Every rule follows a simple IF → THEN logic. If a file meets certain conditions, Tdarr takes a specific action. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Condition:&lt;/strong&gt; File codec is H.264&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; Transcode to H.265&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setting this up is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Plugins &amp;amp; Settings&lt;/strong&gt; menu.&lt;/li&gt;
&lt;li&gt;Add a new plugin chain for your library.&lt;/li&gt;
&lt;li&gt;Select relevant plugins (e.g., &amp;ldquo;Transcode using FFmpeg to H.265&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Adjust plugin parameters like bitrate or CRF (Constant Rate Factor) for quality control.&lt;/li&gt;
&lt;li&gt;Add pre-check plugins like &amp;ldquo;Skip file if already H.265&amp;rdquo; to avoid unnecessary work.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once configured, Tdarr automatically queues any file that doesn&amp;rsquo;t meet your requirements for conversion. No more manual checking or guesswork.&lt;/p&gt;
&lt;h3 id=&#34;choosing-the-right-codec-and-container&#34;&gt;Choosing the Right Codec and Container
&lt;/h3&gt;&lt;p&gt;Your codec and container choices should match where you actually watch your content. There&amp;rsquo;s no point optimizing for mobile if you&amp;rsquo;re streaming to a 65-inch TV.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Playback Environment&lt;/th&gt;
          &lt;th&gt;Recommended Codec&lt;/th&gt;
          &lt;th&gt;Container&lt;/th&gt;
          &lt;th&gt;Notes&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Plex / Jellyfin&lt;/td&gt;
          &lt;td&gt;H.265 (HEVC)&lt;/td&gt;
          &lt;td&gt;MKV or MP4&lt;/td&gt;
          &lt;td&gt;Widely supported, efficient&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Direct-to-TV&lt;/td&gt;
          &lt;td&gt;H.264 (AVC)&lt;/td&gt;
          &lt;td&gt;MP4&lt;/td&gt;
          &lt;td&gt;Safest, but larger size&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Mobile&lt;/td&gt;
          &lt;td&gt;H.265&lt;/td&gt;
          &lt;td&gt;MP4&lt;/td&gt;
          &lt;td&gt;Excellent compression&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Archival Storage&lt;/td&gt;
          &lt;td&gt;H.265 + 10-bit&lt;/td&gt;
          &lt;td&gt;MKV&lt;/td&gt;
          &lt;td&gt;High quality, smaller storage&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For most home server setups, &lt;strong&gt;H.265 MKV&lt;/strong&gt; hits the sweet spot: great compression, broad compatibility, and future-proof enough that you won&amp;rsquo;t be doing this again next year.&lt;/p&gt;
&lt;h3 id=&#34;a-practical-example-h264-to-h265-conversion&#34;&gt;A Practical Example: H.264 to H.265 Conversion
&lt;/h3&gt;&lt;p&gt;Let&amp;rsquo;s walk through setting up a real transcoding rule. This example converts H.264 files to H.265 while maintaining quality:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Libraries&lt;/strong&gt; and select your library&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Transcode Options&lt;/strong&gt; → &lt;strong&gt;Plugin Stack&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Pre-Processing&lt;/strong&gt; section, add:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Check if file is H264&lt;/strong&gt; (this filters which files to process)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Transcode&lt;/strong&gt; section, add:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transcode using FFmpeg - H265 QuickSync&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configure the plugin settings:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CRF&lt;/strong&gt;: Set to 23 (good balance of quality/size)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preset&lt;/strong&gt;: Use &amp;ldquo;medium&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware Acceleration&lt;/strong&gt;: Enabled&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Post-Processing&lt;/strong&gt;, add:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Check file health&lt;/strong&gt; (validates the transcode worked)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save Plugin Stack&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now Tdarr will automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scan your library for H.264 files&lt;/li&gt;
&lt;li&gt;Transcode them to H.265 using your iGPU&lt;/li&gt;
&lt;li&gt;Verify the output is valid&lt;/li&gt;
&lt;li&gt;Replace the original file (or keep both, depending on your settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is what I&amp;rsquo;m currently using:
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/setup-tdarr-automated-media-library-optimization/tdarr-flow.jpg&#34;
    alt=&#34;My current flow&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Start with one folder to test before applying this to your entire library.&lt;/p&gt;
&lt;h3 id=&#34;monitoring-your-transcodes&#34;&gt;Monitoring Your Transcodes
&lt;/h3&gt;&lt;p&gt;Once you&amp;rsquo;ve set up your rules, here&amp;rsquo;s how to track what&amp;rsquo;s happening:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check the Queue:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Transcode&lt;/strong&gt; → &lt;strong&gt;Queue&lt;/strong&gt; to see pending files&lt;/li&gt;
&lt;li&gt;The queue shows how many files are waiting and their estimated completion time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Watch Active Transcodes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Staging&lt;/strong&gt; tab to see files currently being processed&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll see real-time stats: current FPS, progress percentage, and time remaining&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Review Completed Files:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Transcode&lt;/strong&gt; → &lt;strong&gt;History&lt;/strong&gt; tab shows finished jobs&lt;/li&gt;
&lt;li&gt;Look for the &amp;ldquo;Healthy&amp;rdquo; status to confirm successful transcodes&lt;/li&gt;
&lt;li&gt;Check the space savings column to see how much storage you&amp;rsquo;ve reclaimed&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Keep the logs open in a second browser tab (&lt;code&gt;sudo journalctl -u tdarr-node -f&lt;/code&gt; in terminal) to catch any errors early.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-8-verifying-output-quality&#34;&gt;Step 8: Verifying Output Quality
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the thing about Tdarr: it&amp;rsquo;ll happily transcode your entire library without questioning whether the results actually look good. Quality control is entirely on you, which means you need to define what &amp;ldquo;acceptable&amp;rdquo; means for your setup.&lt;/p&gt;
&lt;h3 id=&#34;options-for-quality-verification&#34;&gt;Options for Quality Verification
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Visual spot-checking:&lt;/strong&gt; Grab a few random transcoded videos and watch them side-by-side with the originals. Your eyes are still the best quality detector.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bitrate inspection:&lt;/strong&gt; Fire up MediaInfo or similar tools to verify the output bitrate and codec specs match what you configured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin-based checks:&lt;/strong&gt; Some community plugins can automate verification by comparing resolution, color depth, or other metrics before marking a transcode as complete.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If your output quality isn&amp;rsquo;t hitting the mark, start by tweaking your &lt;strong&gt;CRF value&lt;/strong&gt;. Remember: lower CRF means higher quality but larger file sizes. You can also adjust bitrate ceilings if you&amp;rsquo;re using constant bitrate encoding instead.&lt;/p&gt;
&lt;p&gt;The key is finding that sweet spot between file size savings and visual quality that works for your library and viewing habits.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc_b580.jpg&#34; alt=&#34;A midrange Battlemage card with 12GB GDDR6 and a tri-fan TORN 2.0 cooler that punches hard at 1080p–1440p, plus full-stack media engines (AV1/HEVC/H.264 encode/decode) that make it great for gaming rigs or Plex/Jellyfin transcoding. Outputs include HDMI 2.1 and DP 2.1 with support for up to four displays.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Sparkle Intel Arc B580 Titan&lt;/strong&gt;
A midrange Battlemage card with 12GB GDDR6 and a tri-fan TORN 2.0 cooler that punches hard at 1080p–1440p, plus full-stack media engines (AV1/HEVC/H.264 encode/decode) that make it great for gaming rigs or Plex/Jellyfin transcoding. Outputs include HDMI 2.1 and DP 2.1 with support for up to four displays.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45n6UHq&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458311555717803982804097&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fsparkle-computer-co-ltd-intel-arc-b580-titan-oc-12gb-graphics-card-air-cooler%2fp%2fN82E16814993013%3fitem%3dN82E16814993013&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-9-common-pitfalls--how-to-avoid-them&#34;&gt;Step 9: Common Pitfalls &amp;amp; How to Avoid Them
&lt;/h2&gt;&lt;p&gt;Even with the best setup, Tdarr can throw you some curveballs. Here are the mistakes that trip up most people and how to dodge them:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Pitfall&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
          &lt;th&gt;Solution&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Missing codecs&lt;/td&gt;
          &lt;td&gt;FFmpeg plugins fail due to missing libraries&lt;/td&gt;
          &lt;td&gt;Use official FFmpeg installations&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Slow transcoding&lt;/td&gt;
          &lt;td&gt;Low CPU or using software encoding&lt;/td&gt;
          &lt;td&gt;Enable hardware acceleration if supported (e.g., Intel Quick Sync, NVIDIA NVENC)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Files not being processed&lt;/td&gt;
          &lt;td&gt;Rule misconfiguration&lt;/td&gt;
          &lt;td&gt;Double-check rule logic (&amp;ldquo;if already H.265&amp;rdquo; can skip intended files)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Node not connecting&lt;/td&gt;
          &lt;td&gt;Firewall or wrong IP&lt;/td&gt;
          &lt;td&gt;Verify &lt;code&gt;Tdarr_ServerIP&lt;/code&gt; and matching port (8266)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;No storage gain&lt;/td&gt;
          &lt;td&gt;Using generous bitrate&lt;/td&gt;
          &lt;td&gt;Lower CRF or target bitrate levels in transcoding profile&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &amp;ldquo;files not being processed&amp;rdquo; issue deserves special attention. I&amp;rsquo;ve seen people scratch their heads for hours because they set up a rule that says &amp;ldquo;skip if already H.265&amp;rdquo; but then wonder why their H.265 files aren&amp;rsquo;t getting processed. The rule is doing exactly what you told it to do.&lt;/p&gt;
&lt;p&gt;







  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Test incrementally. Always run Tdarr on a small library first (like your &amp;ldquo;Short Clips&amp;rdquo; folder) before letting it loose on terabytes of data.
  &lt;/div&gt;
&lt;/div&gt;

This isn&amp;rsquo;t just good advice, it&amp;rsquo;s essential. Nothing quite compares to watching Tdarr churn through your entire movie collection only to discover you misconfigured something fundamental. Start small, verify everything works, then scale up.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-tdarr&#34;&gt;Troubleshooting Tdarr
&lt;/h2&gt;&lt;p&gt;Even the best Tdarr setup will occasionally throw you a curveball. Here are the most common issues you&amp;rsquo;ll encounter and how to fix them without losing your sanity:&lt;/p&gt;
&lt;h3 id=&#34;problem-1-plugin-failed-messages&#34;&gt;Problem 1: &amp;ldquo;Plugin failed&amp;rdquo; messages
&lt;/h3&gt;&lt;p&gt;When plugins refuse to cooperate, it&amp;rsquo;s usually one of these culprits:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Possible causes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Syntax errors in parameters&lt;/li&gt;
&lt;li&gt;Missing dependency&lt;/li&gt;
&lt;li&gt;FFmpeg unable to read specific container types&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update to the latest Tdarr first. Half the time, someone already fixed your problem.&lt;/li&gt;
&lt;li&gt;Double-check plugin settings against the FFmpeg syntax.&lt;/li&gt;
&lt;li&gt;Try another plugin (e.g., HandBrake-based instead of FFmpeg).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;problem-2-transcodes-crawling-along-at-glacial-speed&#34;&gt;Problem 2: Transcodes crawling along at glacial speed
&lt;/h3&gt;&lt;p&gt;Nothing kills enthusiasm like watching a 2-hour movie take 8 hours to transcode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Possible causes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Software-only encoding (your CPU is doing all the heavy lifting)&lt;/li&gt;
&lt;li&gt;High CRF (quality) or filters causing slowdowns&lt;/li&gt;
&lt;li&gt;Storage bottleneck from slow I/O&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure your hardware acceleration for your iGPU is working.&lt;/li&gt;
&lt;li&gt;Test with a higher CRF number or skip extra filters temporarily.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;problem-3-quality-looks-terrible&#34;&gt;Problem 3: Quality looks terrible
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lower your CRF value (e.g., from 28 to 23). Lower numbers mean better quality.&lt;/li&gt;
&lt;li&gt;Use two-pass encoding for higher fidelity when quality matters most.&lt;/li&gt;
&lt;li&gt;Make sure you&amp;rsquo;re not transcoding already compressed H.265 files again unnecessarily. That&amp;rsquo;s like photocopying a photocopy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;faqs-about-tdarr&#34;&gt;FAQs About Tdarr
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What is the primary purpose of Tdarr?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Tdarr automates the tedious work of media management by transcoding your files according to rules you set up once and forget about. Think of it as your personal media librarian that standardizes formats, shrinks file sizes, and makes sure everything plays nicely across all your devices [Tdarr Docs].&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How does Tdarr handle distributed transcoding?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Tdarr supports &lt;strong&gt;multi-node distributed transcoding&lt;/strong&gt;, which is a fancy way of saying it can use multiple computers at once. Each node connects to your main Tdarr server and grabs jobs from the queue, processing them in parallel. This lets you throw more hardware at big libraries and actually see the transcoding finish before you retire.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can Tdarr be used with Jellyfin or Plex?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Absolutely. Tdarr and Plex work together like peanut butter and jelly. Use Tdarr to preprocess your entire library, ensuring every video file meets Plex&amp;rsquo;s supported codec and container requirements. When Plex streams your content, it can serve files directly without burning CPU cycles on real-time transcoding. Your server stays cool, your electricity bill stays reasonable, and your family stops complaining about buffering.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I verify the quality of transcoded files?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Here&amp;rsquo;s the thing: Tdarr doesn&amp;rsquo;t judge quality for you. It just follows orders. You&amp;rsquo;ll need to use community verification plugins or do some manual spot-checking by playing back sample files and comparing metadata. A good practice is to transcode a few test files first and make sure you&amp;rsquo;re happy with the results before unleashing Tdarr on your entire collection.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What are common transcoding options?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;The most popular move is converting &lt;strong&gt;H.264 to H.265&lt;/strong&gt; (also called HEVC). This typically cuts file sizes by 30-50% while keeping the visual quality nearly identical. Other useful rules include converting audio tracks from DTS to AAC for better device compatibility, especially if you have mobile devices or streaming sticks that get picky about audio formats.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Tdarr is one of those rare tools that, once set up, silently makes your digital life better. By combining &lt;strong&gt;automation, compression efficiency, and extensibility&lt;/strong&gt;, it turns the painful, time-consuming process of media re-encoding into a set-it-and-forget-it workflow.&lt;/p&gt;
&lt;p&gt;For media server owners, especially those running &lt;strong&gt;Plex&lt;/strong&gt; or &lt;strong&gt;Jellyfin&lt;/strong&gt;, Tdarr doesn&amp;rsquo;t just save time: it saves &lt;em&gt;terabytes&lt;/em&gt;. Whether you want to reclaim disk space, reduce network stress, or enjoy smoother playback across all devices, Tdarr&amp;rsquo;s rules-based automation and distributed transcoding give you a scalable, future-proof solution.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve been putting off optimizing your library because transcoding sounds like a weekend-killing chore, try Tdarr through an LXC this weekend. You&amp;rsquo;ll be amazed how much cleaner and lighter your media setup feels by Monday.&lt;/p&gt;
&lt;h3 id=&#34;next-steps&#34;&gt;Next Steps
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Explore Tdarr&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://docs.tdarr.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;official documentation&lt;/a&gt; for advanced plugin scripting.&lt;/li&gt;
&lt;li&gt;Consider integrating hardware acceleration for maximum speed.&lt;/li&gt;
&lt;li&gt;Dive into creating complex workflows to manage your media.&lt;/li&gt;
&lt;li&gt;Join the Tdarr community forum to exchange plugin recipes and troubleshooting tips.&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>The Complete Guide to Securing SSH on Your Server</title>
        <link>https://diymediaserver.com/post/complete-guide-securing-ssh-server/</link>
        <pubDate>Wed, 17 Sep 2025 11:15:50 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/complete-guide-securing-ssh-server/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/complete-guide-securing-ssh-server/featured.jpg" alt="Featured image of post The Complete Guide to Securing SSH on Your Server" /&gt;&lt;p&gt;If you manage a Linux server, chances are you use SSH to connect. Attackers are aware of this as well. As soon as port 22 is open to the internet, bots will start trying to break in with brute-force login attempts. I have seen servers get thousands of these attempts just hours after going online.&lt;/p&gt;
&lt;p&gt;Weak passwords, outdated cryptography, or careless configurations can transform these attempts from a nuisance to a nightmare. Data breaches, ransomware, or your server becoming a launching pad for other attacks are all real possibilities when your SSH security falls short.&lt;/p&gt;
&lt;p&gt;This is why securing SSH should be a top priority, not something you put off. It is one of the most important first steps in making any server safer. The best part is that with just a few configuration changes, you can greatly reduce your risk and make it very hard for attackers to get in.&lt;/p&gt;
&lt;p&gt;By the end of this guide, you will be ready to apply these steps and secure your SSH setup right away. Take action on each recommendation as you read to strengthen your server&amp;rsquo;s defenses.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Ditch password authentication for SSH keys, lock down root access, tighten your SSH configuration, set proper file permissions, deploy tools like Fail2ban for brute-force protection, and keep an eye on your logs. If SSH must be internet-facing, layer on additional protection with VPNs.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/fw6c.jpg&#34; alt=&#34;Protectli FW6C/FW6D: This fanless firewall appliance is purpose-built for pfSense/OPNsense, making it ideal for securing and hardening SSH access to your hom…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Protectli FW6C/FW6D&lt;/strong&gt;
This fanless firewall appliance is designed for pfSense and OPNsense, providing strong SSH security for homelabs or media servers exposed to the internet. With Intel NICs and hardware AES-NI, it delivers fast, secure routing and supports robust firewall rules, meeting SSH security best practices. It is recommended for anyone looking to secure remote access.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4fKndSm&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-1-generate-a-secure-ssh-key-pair&#34;&gt;Step 1: Generate a Secure SSH Key Pair
&lt;/h2&gt;&lt;p&gt;Password authentication over SSH is like leaving your house key under the doormat. Sure, it works, but every bot on the internet is happy to spend all day guessing your password. Key-based authentication, on the other hand, is practically unbreakable when you use modern algorithms.&lt;/p&gt;
&lt;p&gt;To setup key-based authentication, you will need to create the keys. This works on Linux and Windows.&lt;/p&gt;
&lt;p&gt;Run this on your client machine to create the key pair:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t ed25519
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;ed25519&lt;/code&gt; algorithm generates keys that are both smaller and more secure than the older RSA standard. If you&amp;rsquo;re stuck on an older system that doesn&amp;rsquo;t support ed25519, fall back to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t rsa -b &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command creates two files: a private key (which you guard with your life) and a public key (which you can share freely). By default, both keys land in your repesctive &lt;code&gt;.ssh&lt;/code&gt; folder (&lt;code&gt;~/.ssh/&lt;/code&gt; on Linux and &lt;code&gt;C:\Users\UserName\.ssh&lt;/code&gt; on windows).&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Always set a passphrase on your private key. It&amp;rsquo;s your last line of defense if someone gets physical access to your laptop or workstation.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-2-deploy-your-public-key-to-the-server&#34;&gt;Step 2: Deploy Your Public Key to the Server
&lt;/h2&gt;&lt;p&gt;Now you need to tell the server to trust your public key.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatic method (the easy way):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-copy-id user@server_address
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command does all the heavy lifting for you. It copies your public key and adds it to the right place on the server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Manual method (when you want control):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy the contents of your &lt;code&gt;~/.ssh/id_ed25519.pub&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Append it to the server&amp;rsquo;s &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here&amp;rsquo;s the thing: your first login will still need your password because the server hasn&amp;rsquo;t seen your key yet. But once this setup is complete, you can disable password authentication entirely. After this, your server will be more secure, and you&amp;rsquo;ll never have to remember another password for SSH access.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: With powerful networking (dual 10GbE SFP&amp;#43; and dual 2.5GbE), this mini-workstation is perfect for running secure SSH servers and experimenti…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
With powerful networking (dual 10GbE SFP+ and dual 2.5GbE), this mini-workstation is perfect for running secure SSH servers and experimenting with advanced SSH configurations in a homelab environment. Its flexible storage and high performance make it a great platform for learning and implementing SSH key authentication and best practices. Ideal for both beginners and advanced users looking to build powerful servers in a compact unit.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-3-secure-the-ssh-configuration&#34;&gt;Step 3: Secure the SSH Configuration
&lt;/h2&gt;&lt;p&gt;The real power of SSH security lies in its configuration file at &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;. This is where you harden your SSH entry point, raising the bar high enough that attackers will abandon their efforts and seek softer targets instead.&lt;/p&gt;
&lt;p&gt;Open it with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here are the most important changes that harden your SSH setup:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disable password authentication&lt;/strong&gt;&lt;br&gt;
This kills brute force attacks dead in their tracks.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PasswordAuthentication no
&lt;/code&gt;&lt;/pre&gt;







  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Test your key-based login in a separate terminal session before making this change. Getting locked out of your own server is embarrassing and fixable, but requires console access.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Disable root login&lt;/strong&gt;&lt;br&gt;
Never let root log in directly through SSH. Log in as your regular user and escalate with &lt;code&gt;sudo&lt;/code&gt; when needed.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PermitRootLogin no
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Change the SSH port (optional)&lt;/strong&gt;&lt;br&gt;
Moving off port 22 cuts down on automated bot noise, though it won&amp;rsquo;t stop a determined attacker.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Port 2222
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you change this, remember to update your firewall rules accordingly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enforce modern encryption&lt;/strong&gt;&lt;br&gt;
Force SSH to use strong ciphers and message authentication codes, preventing fallback to weaker algorithms.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Ciphers aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-256,hmac-sha2-512
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Restrict user access&lt;/strong&gt;&lt;br&gt;
Limit SSH access to specific users or groups instead of allowing everyone:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AllowUsers youruser
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After making these changes, restart the SSH service to apply them:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Your SSH configuration is now significantly more secure than the defaults. These settings create multiple layers of protection that work together to prevent unauthorized access.&lt;/p&gt;
&lt;h2 id=&#34;step-4-set-correct-file-permissions&#34;&gt;Step 4: Set Correct File Permissions
&lt;/h2&gt;&lt;p&gt;SSH has strong opinions about file permissions, and it&amp;rsquo;s not shy about letting you know when they are wrong. If your &lt;code&gt;.ssh&lt;/code&gt; directory or files are too permissive, SSH will flat-out refuse to use them. Think of it as SSH&amp;rsquo;s way of protecting you from yourself.&lt;/p&gt;
&lt;p&gt;Here are the correct permissions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;700&lt;/span&gt; ~/.ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; ~/.ssh/id_ed25519
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;644&lt;/span&gt; ~/.ssh/id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; ~/.ssh/authorized_keys
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Breaking this down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;700&lt;/code&gt; on the &lt;code&gt;.ssh&lt;/code&gt; directory means only you can read, write, or enter it&lt;/li&gt;
&lt;li&gt;&lt;code&gt;600&lt;/code&gt; on private keys means only you can read or write them&lt;/li&gt;
&lt;li&gt;&lt;code&gt;644&lt;/code&gt; on the public key allows others to read it (which is fine, it&amp;rsquo;s public after all)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;600&lt;/code&gt; on &lt;code&gt;authorized_keys&lt;/code&gt; keeps it private to your account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re getting &amp;ldquo;bad owner or permissions on .ssh/config&amp;rdquo; errors, these permission settings will almost certainly fix the problem. SSH is particular about security, but once you get the permissions right, it&amp;rsquo;ll work reliably.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB: The Raspberry Pi 4GB is an affordable, low-power option for learning and practicing SSH hardening techniques in a real-world environment. It…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;RaspberryPi 4GB&lt;/strong&gt;
The Raspberry Pi 4GB is an affordable, low-power option for learning and practicing SSH hardening techniques in a real-world environment. It&amp;rsquo;s perfect for beginners who want to set up secure remote access, experiment with public/private key authentication, and test firewall rules before deploying them on larger servers. Its versatility makes it a staple for any homelab enthusiast focused on security.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-5-harden-network-access&#34;&gt;Step 5: Harden Network Access
&lt;/h2&gt;&lt;p&gt;Congratulations! Your SSH service is now using keys and more secure settings. But if attackers can reach it from anywhere on the internet, you still need more barriers. Think of it like having a great lock on your front door but leaving avalible for anyone to knock on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Firewalls&lt;/strong&gt;&lt;br&gt;
Limit SSH access to specific IPs where possible. This is your first line of defense. Example using UFW (Uncomplicated Firewall):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw allow from 203.0.113.10 to any port &lt;span class=&#34;m&#34;&gt;2222&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;VPN or Bastion Host&lt;/strong&gt;&lt;br&gt;
Place SSH behind a VPN. This will prevent the whole internet from probing all your machines. Only machines that are on the VPN can see the host.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fail2ban&lt;/strong&gt;&lt;br&gt;
This tool scans logs and automatically bans IPs showing malicious behavior, like repeated failed login attempts. On Debian/Ubuntu:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then configure &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt; for &lt;code&gt;sshd&lt;/code&gt;. Even if you&amp;rsquo;ve disabled passwords, Fail2ban still helps block port scanning noise and keeps your logs cleaner. It&amp;rsquo;s like having a bouncer who remembers troublemakers and won&amp;rsquo;t let them back in.
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ A good Fail2Ban Starting Config for SSHD&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;DEFAULT&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Whitelist: your trusted networks and admin IPs that should never be banned.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Replace the placeholders with your real IPs/subnets.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ignoreip&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/24
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# How long to ban an offender (and enable incremental bans).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;bantime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 1h
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bantime.increment &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bantime.factor &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bantime.maxtime &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 1w
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# How far back to count failures, and how many failures trigger a ban.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;findtime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 10m
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;maxretry&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Use the systemd journal for log parsing.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;backend&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; systemd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Use nftables if your distro uses it. Fall back to iptables if needed.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;banaction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; nftables-multiport
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# -----------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SSH JAIL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# -----------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;sshd&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;enabled&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;filter&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; sshd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If you changed the SSH port, reflect it here (e.g., port = 2222).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;port&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Mode “aggressive” catches more patterns (invalid users, many auth noise cases).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Requires fail2ban 0.11+ with newer sshd filter.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;mode&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; aggressive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Config Breakdown&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[DEFAULT]&lt;/code&gt; block: Sets global behavior all jails inherit.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ignoreip&lt;/code&gt; keeps your admin workstation/VPN/LAN from getting locked out during fat-finger moments.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bantime&lt;/code&gt;, &lt;code&gt;findtime&lt;/code&gt;, and &lt;code&gt;maxretry&lt;/code&gt; control the ban policy. Here: 5 bad tries within 10 minutes → ban. A 1-hour ban is long enough to stop bots but short enough to forgive honest mistakes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bantime.increment = true&lt;/code&gt; (+ factor, maxtime) makes repeat offenders stay banned longer (1h → 2h → 4h &amp;hellip; up to 1 week). This crushes persistent botnets without you micromanaging lists.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backend = systemd&lt;/code&gt; reads from the journal instead of plain log files. It’s resilient to log rotation, works well on Debian/Ubuntu, and behaves nicely in containers/VMs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;banaction = nftables-multiport&lt;/code&gt; uses nftables rules to block offenders. If your host still uses iptables, switch to iptables-multiport.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[sshd]&lt;/code&gt; jail: The actual protection for SSH.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enabled = true&lt;/code&gt; turns it on.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filter = sshd&lt;/code&gt; tells Fail2ban which regex set to use. It recognizes failed logins, invalid users, etc.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;port = ssh&lt;/code&gt; binds bans to your SSH port. If you run SSH on a non-standard port, change it (e.g., 2222).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mode = aggressive&lt;/code&gt; expands matches to catch more brute-force patterns and “invalid user” noise attackers use to enumerate accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;/p&gt;
&lt;h2 id=&#34;step-6-test-and-verify&#34;&gt;Step 6: Test and Verify
&lt;/h2&gt;&lt;p&gt;Now comes the moment of truth. Before you close that original SSH session (your safety net), let&amp;rsquo;s make sure everything actually works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open a &lt;em&gt;new&lt;/em&gt; terminal window and test logging in with your key.&lt;/li&gt;
&lt;li&gt;Confirm you can&amp;rsquo;t log in as root.&lt;/li&gt;
&lt;li&gt;Confirm password login is refused.&lt;/li&gt;
&lt;li&gt;Check logs with:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tail -f /var/log/auth.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is where patience pays off. Only after confirming everything works should you close your original session. If something breaks, you&amp;rsquo;ll still have that old session open to fix it. Trust me, there&amp;rsquo;s nothing quite like the sinking feeling of being locked out of your own server because you skipped this step.&lt;/p&gt;
&lt;h2 id=&#34;step-7-ongoing-monitoring-and-auditing&#34;&gt;Step 7: Ongoing Monitoring and Auditing
&lt;/h2&gt;&lt;p&gt;SSH hardening isn&amp;rsquo;t a one-and-done deal. Think of it like home security: you don&amp;rsquo;t install locks and never check them again. Attackers adapt their methods, which means your defenses need regular attention too.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what to keep an eye on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Review logs regularly&lt;/strong&gt; (&lt;code&gt;/var/log/auth.log&lt;/code&gt; or &lt;code&gt;journalctl -u ssh&lt;/code&gt;). Look for failed login attempts, especially repeated ones from the same IP addresses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit authorized keys&lt;/strong&gt; at least monthly. Remove old keys, particularly when team members leave or change roles. Stale keys are like forgotten spare house keys under the doormat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for anomalies&lt;/strong&gt; like new user accounts you didn&amp;rsquo;t create or SSH configuration changes you didn&amp;rsquo;t make. These could signal that someone&amp;rsquo;s already gotten in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System Updates&lt;/strong&gt; keep the server patch and updated. SSH is patch frequently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Set a calendar reminder to do this monthly. It takes maybe 10 minutes, but catching problems early beats dealing with a breach later.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-common-ssh-problems&#34;&gt;Troubleshooting Common SSH Problems
&lt;/h2&gt;&lt;p&gt;Even experienced admins lock themselves out occasionally. Here are the most common ways things go sideways and how to fix them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Locked out after disabling passwords&lt;/strong&gt;&lt;br&gt;
This classic mistake happens when your SSH key wasn&amp;rsquo;t copied correctly before you disabled password authentication. You&amp;rsquo;ll need to access your server through your hosting provider&amp;rsquo;s web console or rescue environment, then re-enable &lt;code&gt;PasswordAuthentication yes&lt;/code&gt; in your SSH config until you get your keys working properly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wrong file permissions&lt;/strong&gt;&lt;br&gt;
If you see errors like &lt;em&gt;&amp;ldquo;bad owner or permissions on .ssh/config&amp;rdquo;&lt;/em&gt;, your SSH files are readable by other users, which SSH considers a security risk. Reset the permissions as shown in Step 4 above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Forgot to update firewall when changing port&lt;/strong&gt;&lt;br&gt;
Changed your SSH port to &lt;code&gt;Port 2222&lt;/code&gt; but forgot to open that port in your firewall? Your connection will just hang there, looking like a network issue. Always update your firewall rules before changing SSH ports, not after.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trying to allow root login with keys&lt;/strong&gt;&lt;br&gt;
Even with &amp;ldquo;key-only&amp;rdquo; authentication, allowing direct root login creates unnecessary risk. If someone compromises your key, they have immediate root access. Stick with &lt;code&gt;PermitRootLogin no&lt;/code&gt; and use &lt;code&gt;sudo&lt;/code&gt; instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;VPN misconfiguration&lt;/strong&gt;&lt;br&gt;
If you&amp;rsquo;re routing SSH through a VPN, test your access thoroughly in a non-production environment first. This setup adds complexity that can leave you stranded if misconfigured.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/minidesktop.png&#34; alt=&#34;ASROCK Mini-Desktop Computer: This compact barebone system is ideal for running lightweight VMs or containers, allowing you to isolate and secure SSH service…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;ASROCK Mini-Desktop Computer&lt;/strong&gt;
This compact barebone system is ideal for running lightweight VMs or containers, allowing you to isolate and secure SSH services as recommended in the guide. Its support for modern Intel CPUs and flexible storage options make it a practical choice for building a secure, dedicated SSH gateway or jump box. Perfect for DIYers who want a tidy, efficient, and secure homelab setup.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4kVe2jP&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445836990415726193859040&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fasrock-deskmini-b760-series-barebone-system-supports-14th-13th-12th-gen-intel-core-processors-max-tdp-65w-deskmini-b760w%2fp%2fN82E16856158095&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;faqs-secure-ssh-in-practice&#34;&gt;FAQs: Secure SSH in Practice
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I generate a secure SSH key pair?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Use &lt;code&gt;ssh-keygen -t ed25519&lt;/code&gt; for modern systems. If you&amp;rsquo;re stuck with older infrastructure, fall back to &lt;code&gt;ssh-keygen -t rsa -b 4096&lt;/code&gt;. The Ed25519 algorithm is faster, more secure, and generates smaller keys, but RSA with 4096 bits still does the job when needed.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Why does SSH complain about bad owner or permissions?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;SSH is picky about file permissions because it has to be. Your &lt;code&gt;.ssh&lt;/code&gt; directory needs &lt;code&gt;700&lt;/code&gt; permissions (owner read/write/execute only), private keys need &lt;code&gt;600&lt;/code&gt; (owner read/write only), and public keys need &lt;code&gt;644&lt;/code&gt; (owner read/write, others read). SSH refuses to work with loose permissions because anyone who can read your private key can impersonate you.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I change the SSH port safely?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Edit &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; and set &lt;code&gt;Port 2222&lt;/code&gt; (or whatever port you prefer). Here&amp;rsquo;s the critical part: update your firewall rules to allow the new port &lt;em&gt;before&lt;/em&gt; restarting SSH. Otherwise, you&amp;rsquo;ll lock yourself out and need console access to fix it. Test the new port works before closing your current session.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What are the most important `sshd_config` settings?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Start with these four: &lt;code&gt;PasswordAuthentication no&lt;/code&gt; (forces key-based auth), &lt;code&gt;PermitRootLogin no&lt;/code&gt; (eliminates the highest-value target), strong &lt;code&gt;Ciphers&lt;/code&gt; and &lt;code&gt;MACs&lt;/code&gt; (modern crypto only), and &lt;code&gt;AllowUsers&lt;/code&gt; or &lt;code&gt;AllowGroups&lt;/code&gt; (whitelist who can even attempt to connect). These settings alone will block most automated attacks.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is it safe to allow root login with SSH keys?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Best practice is &lt;strong&gt;no&lt;/strong&gt;, even with keys. Root access means game over if compromised, so why make it a direct target? Create a regular user account, give it sudo privileges, and SSH in as that user instead. It&amp;rsquo;s one extra step that eliminates the most obvious attack vector.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I still use RSA keys?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Use Ed25519 when possible since it&amp;rsquo;s more secure and performs better. RSA with 4096 bits is still acceptable for systems that don&amp;rsquo;t support Ed25519, but avoid anything smaller than 2048 bits. If you&amp;rsquo;re generating new keys today, go with Ed25519 unless you have a specific reason not to.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What extra steps if SSH must face the internet?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Layer your defenses: restrict access by IP address when possible, install Fail2ban to block brute force attempts, consider putting SSH behind a VPN or bastion host, and monitor your logs religiously. The internet is full of bots scanning for SSH servers, so assume you&amp;rsquo;re being probed constantly.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I set up Fail2ban for SSH?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Install Fail2ban through your package manager, then enable the &lt;code&gt;sshd&lt;/code&gt; jail in &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt;. The default settings work well for most setups: they&amp;rsquo;ll ban IPs after a few failed attempts and gradually increase ban times for repeat offenders. Just make sure you whitelist your own IP addresses first.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What ciphers and MACs should I use?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Stick with modern algorithms like &lt;code&gt;aes256-ctr&lt;/code&gt; for encryption and &lt;code&gt;hmac-sha2-256&lt;/code&gt; for message authentication. Avoid anything with &amp;ldquo;md5&amp;rdquo; or &amp;ldquo;sha1&amp;rdquo; in the name, and definitely skip older ciphers like 3DES or Blowfish. When in doubt, let SSH negotiate the strongest common algorithm between client and server.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I recover access if I&amp;#39;m locked out?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Use your hosting provider&amp;rsquo;s console access or rescue system to get back in. Fix whatever broke in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;, restart the SSH service, and test from another session before logging out. This is why you always test configuration changes before closing your current SSH session.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;If you take one thing from this guide, it&amp;rsquo;s this: SSH security depends less on any one trick and more on layers of defense. Keys instead of passwords, no root logins, careful configuration, restrictive firewalls, monitoring, and automation all stack together to drastically lower your risk.&lt;/p&gt;
&lt;p&gt;Set aside a little time to secure SSH right after deploying any new server. It will save you headaches down the line, whether you&amp;rsquo;re running a personal project or a company&amp;rsquo;s production infrastructure. Trust me, dealing with a compromised server is far worse than spending 30 minutes hardening SSH upfront.&lt;/p&gt;
&lt;p&gt;Next steps you can explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automating SSH hardening with configuration management tools like Ansible.&lt;/li&gt;
&lt;li&gt;Adding multi-factor authentication for SSH.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your SSH server should no longer feel like a liability. It should feel like a fortress that you actually trust to keep the bad guys out.&lt;/p&gt;
&lt;h2 id=&#34;other-sources&#34;&gt;Other Sources
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.openssh.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenSSH man pages and docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.ubuntu.com/community/SSH/OpenSSH/Configuring&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ubuntu Community Security Guide on SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/security_hardening/using-secure-shell_security-hardening&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Red Hat Security Hardening for SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.fail2ban.org/wiki/index.php/Main_Page&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Fail2ban Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DigitalOcean SSH Key Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://serverfault.com/questions/253313/ssh-permissions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Server Fault: SSH File Permission Pitfalls&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>How to Upgrade Debian 12 to 13 in Proxmox LXC Without CREDENTIALS Errors</title>
        <link>https://diymediaserver.com/post/upgrade-debian-12-to-13-proxmox-lxc-243-credentials-fix/</link>
        <pubDate>Sun, 14 Sep 2025 07:41:22 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/upgrade-debian-12-to-13-proxmox-lxc-243-credentials-fix/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/upgrade-debian-12-to-13-proxmox-lxc-243-credentials-fix/featured.jpg" alt="Featured image of post How to Upgrade Debian 12 to 13 in Proxmox LXC Without CREDENTIALS Errors" /&gt;&lt;p&gt;Are you running Debian 12 (Bookworm) in an LXC container on Proxmox and want to upgrade to 13 (Trixie)? This should be straightforward, right? Well, if you&amp;rsquo;ve landed here, you&amp;rsquo;ve probably discovered that systemd has other plans.&lt;/p&gt;
&lt;p&gt;The issue is that systemd 256+ introduces stricter credential handling that doesn&amp;rsquo;t play nicely with unprivileged LXC containers. When you try to upgrade, you&amp;rsquo;ll hit the dreaded &lt;code&gt;243/CREDENTIALS&lt;/code&gt; error that stops the upgrade dead in its tracks.  &lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how to work around it and upgrade your Debian LXC to Trixie without pulling your hair out.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Debian 13&#39;s systemd 256+ enables credential plumbing by default, which sounds fancy until you realize it breaks unprivileged LXC containers with cryptic `243/CREDENTIALS` errors. The workaround is straightforward: install Debian&#39;s `lxc.generator` before upgrading to Trixie, let systemd reload its configuration, complete the upgrade, then remove the generator. It&#39;s a temporary bridge that keeps your services running while systemd figures out it&#39;s living in a container.

&lt;/div&gt;
&lt;p&gt;Upgrading Debian containers inside Proxmox VE should be boring. Boring is why you are running Debian. Change your apt sources, run the upgrade, reboot, and get on with your life. At least, that&amp;rsquo;s what the Reddit threads kept telling me when Debian 13 &amp;ldquo;Trixie&amp;rdquo; dropped. But if you&amp;rsquo;re running &lt;strong&gt;unprivileged and unnested LXCs on Proxmox 9&lt;/strong&gt;, you already know that&amp;rsquo;s not how it goes. The result instead? A blinking cursor, &lt;code&gt;status=243/CREDENTIALS&lt;/code&gt; failures, and crawling through logs that don&amp;rsquo;t want to work.&lt;/p&gt;
&lt;p&gt;This post is for anyone who cares about security, runs their LXCs unprivileged, and doesn&amp;rsquo;t want to flip on &amp;ldquo;nesting&amp;rdquo; just to upgrade to Trixie. I&amp;rsquo;ll explain why the 243/CREDENTIALS error happens, what breaks when you don&amp;rsquo;t fix it, and the Proxmox-tested method to survive the upgrade strictly within safe, unprivileged boundaries.  &lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been elbow-deep in these breakages myself, and this guide distills hours of trial and error into a path that works. Whether you&amp;rsquo;re upgrading Debian 12 to 13 or troubleshooting existing &lt;strong&gt;lxc templates Proxmox&lt;/strong&gt; setups, you&amp;rsquo;ll walk away with a container that boots cleanly and stays secure.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: The MINISFORUM MS-A2 is a powerhouse mini-workstation ideal for running Proxmox 9 and multiple LXC containers, making it perfect for testin…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
A premium mini-workstation engineered for demanding homelab environments. The MS-A2 excels at running Proxmox 9 with multiple concurrent LXC containers, making it perfect for advanced Debian testing and migration workflows. Robust networking capabilities and extensive storage options provide the foundation needed for complex systemd troubleshooting and enterprise-grade container management.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-upgrading-debian-12-to-13-breaks-on-proxmox-9&#34;&gt;Why Upgrading Debian 12 to 13 Breaks on Proxmox 9
&lt;/h2&gt;&lt;p&gt;When you upgrade Debian 12 to 13 (Bookworm to Trixie), the culprit hiding in the shadows is &lt;strong&gt;systemd 256+&lt;/strong&gt;. This release enabled &lt;strong&gt;unit credentials&lt;/strong&gt; (&lt;code&gt;LoadCredential&lt;/code&gt; and &lt;code&gt;ImportCredential&lt;/code&gt;) by default, which sounds harmless enough.&lt;/p&gt;
&lt;p&gt;On bare metal or regular VMs, it works perfectly. But inside Proxmox LXCs, especially &lt;strong&gt;unprivileged containers&lt;/strong&gt;, this feature crashes headfirst into the container&amp;rsquo;s limited namespace access. Here&amp;rsquo;s the breakdown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;systemd-sysctl&lt;/strong&gt; (the service that applies kernel parameters) tries to load credentials&lt;/li&gt;
&lt;li&gt;LXC blocks the namespace operation because the container doesn&amp;rsquo;t have permission&lt;/li&gt;
&lt;li&gt;systemd throws a &lt;code&gt;status=243/CREDENTIALS&lt;/code&gt; error and gives up&lt;/li&gt;
&lt;li&gt;Other core services cascade into failure, from udev triggers to login shells&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most likely upgrade error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Job &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; systemd-sysctl.service failed because the control process exited with error code.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;See &lt;span class=&#34;s2&#34;&gt;&amp;#34;systemctl status systemd-sysctl.service&amp;#34;&lt;/span&gt; and &lt;span class=&#34;s2&#34;&gt;&amp;#34;journalctl -xeu systemd-sysctl.service&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; details.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Processing trigger
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;systemctl status systemd-sysctl.service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;x systemd-sysctl.service - Apply Kernel Variables
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Loaded: loaded &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/usr/lib/systemd/system/systemd-sysctl.service&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; static&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     Active: failed &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Result: exit-code&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; since Sun 2025-09-14 05:59:21 MDT&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 48s ago
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Duration: 2h 59min 12.451s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Invocation: 63213f2f7514402f8cedd10155c7d065
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Docs: man:systemd-sysctl.service&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             man:sysctl.d&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Process: &lt;span class=&#34;m&#34;&gt;17806&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/lib/systemd/systemd-sysctl &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;exited, &lt;span class=&#34;nv&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;243/CREDENTIALS&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Main PID: &lt;span class=&#34;m&#34;&gt;17806&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;exited, &lt;span class=&#34;nv&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;243/CREDENTIALS&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Mem peak: 1.7M
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        CPU: 5ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;what-that-error-actually-means&#34;&gt;What that error actually means
&lt;/h3&gt;&lt;p&gt;Essentially, systemd is trying to pass secrets inside a container that has no infrastructure for handling them. Your services never start, the container hangs during boot, and debugging becomes a headache since half the logging system is broken too.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;243/CREDENTIALS&lt;/code&gt; = “failed to set up the unit’s credentials”.&lt;/p&gt;
&lt;h3 id=&#34;why-not-nesting-or-privileged&#34;&gt;Why Not Nesting or Privileged?
&lt;/h3&gt;&lt;p&gt;You could enable &lt;strong&gt;nesting&lt;/strong&gt; or switch the container to &lt;strong&gt;privileged&lt;/strong&gt; mode. Both approaches sidestep the 243/CREDENTIALS error, and Reddit is packed with people who took this route. But here&amp;rsquo;s why that&amp;rsquo;s not ideal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nesting&lt;/strong&gt; weakens container boundaries by giving writable access to &lt;code&gt;/proc&lt;/code&gt; and &lt;code&gt;/sys&lt;/code&gt; that containers shouldn&amp;rsquo;t touch. If you care about minimizing attack surface, this defeats the purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Privileged LXCs&lt;/strong&gt; strip away the UID mapping isolation that protects your host from container escape attempts. You&amp;rsquo;re trading security for convenience.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to keep your containers properly isolated and secure, the correct approach is &lt;strong&gt;fixing systemd&amp;rsquo;s behavior&lt;/strong&gt;, not compromising your security model.&lt;/p&gt;
&lt;h2 id=&#34;what-breaks-if-you-dont-fix-it&#34;&gt;What breaks if you don’t fix it
&lt;/h2&gt;&lt;p&gt;If you try to upgrade to Debian 13 (Trixie) without handling the systemd changes first, your LXC container becomes just a flashing cursor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The container won&amp;rsquo;t boot at all. It just hangs there, mocking your weekend plans.&lt;/li&gt;
&lt;li&gt;Critical systemd units like &lt;code&gt;systemd-sysctl&lt;/code&gt;, &lt;code&gt;udev-trigger&lt;/code&gt;, and terminal login will fail consistently.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;journald&lt;/code&gt; may crash, which means you lose the diagnostic logs you desperately need to figure out what went wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/minidesktop.png&#34; alt=&#34;ASROCK Mini-Desktop Computer: The DeskMini B760 offers a compact yet powerful platform for running Proxmox and experimenting with LXC upgrades, providing the…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;ASROCK Mini-Desktop Computer&lt;/strong&gt;
The DeskMini B760 delivers full-scale performance in a remarkably compact form factor. Built for serious virtualization workloads, it handles Proxmox deployments and LXC container orchestration with ease. Fast storage support and modern Intel CPU compatibility ensure reliable performance for complex homelab projects and containerization experiments.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4kVe2jP&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445836990415726193859040&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fasrock-deskmini-b760-series-barebone-system-supports-14th-13th-12th-gen-intel-core-processors-max-tdp-65w-deskmini-b760w%2fp%2fN82E16856158095&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;the-fix-lxcgenerator-for-proxmox-lxc-templates&#34;&gt;The Fix: lxc.generator for Proxmox LXC Templates
&lt;/h2&gt;&lt;p&gt;Debian includes a small but clever utility called &lt;strong&gt;lxc.generator&lt;/strong&gt; (part of the distrobuilder package) that solves this problem. It runs early in the systemd boot sequence and automatically patches unit files to make them container-friendly &lt;a class=&#34;link&#34; href=&#34;https://sources.debian.org/src/distrobuilder/3.2-2/distrobuilder/lxc.generator/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Debian Sources&lt;/a&gt;. Here&amp;rsquo;s what it does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Detects when the system is running inside an LXC container or an unprivileged environment&lt;/li&gt;
&lt;li&gt;Strips problematic flags like &lt;code&gt;LoadCredential=&lt;/code&gt; and &lt;code&gt;ImportCredential=&lt;/code&gt; that cause the 243/CREDENTIALS errors&lt;/li&gt;
&lt;li&gt;Relaxes security hardening settings that don&amp;rsquo;t work properly in containers&lt;/li&gt;
&lt;li&gt;Masks services that would otherwise crash during container startup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The beauty of lxc.generator is that it creates temporary drop-in files in &lt;code&gt;/run/systemd/...&lt;/code&gt; rather than permanently modifying anything on disk. This means your system stays clean, and once you complete a proper upgrade and reboot, you can safely remove the generator without leaving any traces behind&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Tested on &lt;strong&gt;Proxmox VE 9.x&lt;/strong&gt; with &lt;strong&gt;unprivileged, unnested&lt;/strong&gt; Debian LXCs. It should also help in LXD or Incus, but I have not tested there.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;1-patch-each-debian-12-container-before-upgrading&#34;&gt;1) Patch each Debian 12 container &lt;em&gt;before&lt;/em&gt; upgrading
&lt;/h3&gt;&lt;p&gt;Before we upgrade Debian 12 to 13, we need to install a small fix that prevents systemd from breaking during the transition. Enter your Debian 12 (Bookworm) LXC container and run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /etc/systemd/system-generators
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://sources.debian.org/data/main/d/distrobuilder/3.2-2/distrobuilder/lxc.generator &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/systemd/system-generators/lxc &amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod &lt;span class=&#34;m&#34;&gt;0755&lt;/span&gt; /etc/systemd/system-generators/lxc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    The generator tells systemd to disable the credential features that cause the 243/CREDENTIALS error. Think of it as a temporary patch that keeps things running smoothly during and after the upgrade.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;2-upgrade-to-debian-13-trixie&#34;&gt;2) Upgrade to Debian 13 (Trixie)
&lt;/h3&gt;&lt;p&gt;Still inside your LXC container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Make sure Bookworm up to date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Update sources to Trixie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/bookworm/trixie/g&amp;#39;&lt;/span&gt; /etc/apt/sources.list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Upgrade across versions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt dist-upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Clean up junk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt autoremove -y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt autoclean -y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Modernize apt format (optional but recommended)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt modernize-sources &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Reload systemd configs and reboot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-verify&#34;&gt;3) Verify
&lt;/h3&gt;&lt;p&gt;The upgrade process will take a few minutes depending on your container&amp;rsquo;s size and network speed. When the container comes back online, verify the upgrade worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/os-release
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PRETTY_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Debian GNU/Linux 13 (trixie)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;VERSION_ID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;13&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;VERSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;13 (trixie)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;VERSION_CODENAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;trixie
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DEBIAN_VERSION_FULL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;13.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see &amp;ldquo;trixie&amp;rdquo; in the output, congratulations! Your upgrade to Debian 13 was successful.&lt;/p&gt;
&lt;h3 id=&#34;4-optional-clean-up&#34;&gt;4) Optional Clean-up
&lt;/h3&gt;&lt;p&gt;Once you&amp;rsquo;ve confirmed everything runs smoothly on Trixie, you can remove the distrobuilder file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rm -f /etc/systemd/system-generators/lxc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_i5_12th.jpg&#34; alt=&#34;Intel® Core™ i5-12500 12th Generation Desktop Processor: This 12th Gen Intel CPU delivers the performance and efficiency required for running Proxmox, handli…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Intel® Core™ i5-12500 12th Generation Desktop Processor&lt;/strong&gt;
This 12th Gen Intel CPU combines exceptional performance with energy efficiency, making it ideal for Proxmox virtualization and LXC container management. Whether you&amp;rsquo;re orchestrating complex Debian migrations or building a responsive homelab environment, the i5-12500 delivers the processing power needed for seamless Linux operations and system upgrades.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4lGjveC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445833438084862958009096&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fintel-core-i5-12th-gen-core-i5-12500-alder-lake-lga-1700-desktop-cpu-processor%2fp%2fN82E16819118374&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;alternative-options-pick-your-poison&#34;&gt;Alternative Options: Pick Your Poison
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Option&lt;/th&gt;
          &lt;th&gt;Security&lt;/th&gt;
          &lt;th&gt;Effort&lt;/th&gt;
          &lt;th&gt;Side effects&lt;/th&gt;
          &lt;th&gt;Use when…&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Use &lt;code&gt;lxc.generator&lt;/code&gt; (this post)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
          &lt;td&gt;Low&lt;/td&gt;
          &lt;td&gt;Temporary file you remove post-upgrade&lt;/td&gt;
          &lt;td&gt;You want unprivileged + unnested to stay that way&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Enable nesting&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Lower&lt;/td&gt;
          &lt;td&gt;Low&lt;/td&gt;
          &lt;td&gt;Wider write access into &lt;code&gt;/proc&lt;/code&gt; and &lt;code&gt;/sys&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;You must run workloads that need it and accept risk&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Flip to privileged LXC&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Lowest&lt;/td&gt;
          &lt;td&gt;Medium&lt;/td&gt;
          &lt;td&gt;UID mapping changes, more blast radius&lt;/td&gt;
          &lt;td&gt;You need kernel options that won’t work unprivileged&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Migrate to VM&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
          &lt;td&gt;Overhead and resource cost&lt;/td&gt;
          &lt;td&gt;You want zero container weirdness&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The lxc.generator approach gives you the cleanest path forward. It sidesteps the 243/CREDENTIALS error without compromising your container&amp;rsquo;s security model or requiring you to rethink your entire setup.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What does `status=243/CREDENTIALS` mean, exactly?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;It&amp;rsquo;s a systemd error code that translates to &amp;ldquo;failed to setup credentials.&amp;rdquo; Starting with systemd 256, the system expects to mount sensitive files like API tokens into service units through tmpfs-backed namespaces. The problem? Unprivileged LXC containers don&amp;rsquo;t have the kernel options to support this feature, so services that rely on it fail to start.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Could I just enable nesting and forget about it?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;You could, but you&amp;rsquo;d be trading security for convenience. Nesting weakens your LXC sandbox by exposing more of the host&amp;rsquo;s &lt;code&gt;/proc&lt;/code&gt; and &lt;code&gt;/sys&lt;/code&gt; filesystems to the container. Unless you specifically need Docker-in-LXC or other heavy containerized workloads, keep nesting disabled and use the generator approach instead.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is `lxc.generator` safe to leave on long-term?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Absolutely. The generator only creates ephemeral systemd drop-in files and won&amp;rsquo;t interfere with your system&amp;rsquo;s normal operation. That said, since its main purpose is helping with the transition to newer systemd versions, many administrators remove it once they&amp;rsquo;ve verified everything works properly after the upgrade.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I use this on LXD instead of Proxmox?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;In theory, yes. The &lt;code&gt;lxc.generator&lt;/code&gt; is designed to work with LXC containers, not just Proxmox. However, the specific steps in this guide have only been tested on Proxmox VE 9 with unprivileged containers. If you&amp;rsquo;re running a different platform, the concepts should apply, but proceed carefully and test thoroughly.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I need to replace my `sources.list` with deb822 format?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Not required. Your existing old-style sources will continue working just fine. However, Debian is encouraging the switch to the newer deb822 format, and if you want to modernize, you can run &lt;code&gt;apt modernize-sources&lt;/code&gt; to handle the conversion automatically.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Upgrading an unprivileged Debian container on Proxmox shouldn&amp;rsquo;t require a vocabulary lesson in creative profanity. The culprit here is systemd&amp;rsquo;s new credential defaults in version 256+, and the surgical fix is &lt;strong&gt;lxc.generator&lt;/strong&gt;. Install it, reload your container config, upgrade Debian 12 to 13 (Trixie), reboot, then remove the generator. That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;You keep your security posture intact: no container nesting, no privileged LXCs, no compromises. You get your shiny new Debian 13 system, and the 243/CREDENTIALS error becomes a distant memory.&lt;/p&gt;
&lt;p&gt;The takeaway from this particular adventure: LXC template upgrades only &lt;em&gt;look&lt;/em&gt; straightforward until systemd decides to change the rules mid-game. Understanding why the upgrade breaks and applying a targeted fix beats both the security risks of privileged containers and the headache of rebuilding from scratch.&lt;/p&gt;
&lt;p&gt;Now go enjoy whatever you&amp;rsquo;re running on that freshly upgraded server. You&amp;rsquo;ve earned it.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB: The RaspberryPi 4GB is a budget-friendly, low-power option for experimenting with LXC containers and Debian upgrades in a homelab setting. I…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;RaspberryPi 4GB&lt;/strong&gt;
An affordable, energy-efficient platform perfect for homelab experimentation and learning. The Pi 4GB excels at running lightweight LXC containers and testing Debian upgrades in a safe environment. Its low power consumption and compact design make it an ideal sandbox for exploring systemd configurations and container deployments before implementing changes on production systems.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;sources&#34;&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://sources.debian.org/src/distrobuilder/3.2-2/distrobuilder/lxc.generator/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Debian Sources: lxc.generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bugs.launchpad.net/bugs/2046486&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Launchpad bug report discussing credential errors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/lxc/distrobuilder/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LXC Distrobuilder Releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>NFS vs SMB for Media Servers: Which Protocol Should You Use?</title>
        <link>https://diymediaserver.com/post/nfs-smb/</link>
        <pubDate>Thu, 11 Sep 2025 06:54:35 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/nfs-smb/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/nfs-smb/featured.jpg" alt="Featured image of post NFS vs SMB for Media Servers: Which Protocol Should You Use?" /&gt;&lt;p&gt;I used to think choosing between NFS and SMB was like picking between Coke and Pepsi: a purely personal preference with no real consequences. I was wrong. If you&amp;rsquo;re running a Linux media server and care about performance, compatibility, and sane file permissions, the protocol you choose will define your entire experience. Pick wrong, and you&amp;rsquo;ll spend weekends debugging permission errors instead of watching movies or shows.&lt;/p&gt;
&lt;p&gt;This guide cuts through the mythology and gives you a practical decision framework for NFS vs SMB. I&amp;rsquo;ll show you where each protocol shines, how to set them up on a Linux server, what settings actually matter, and how to avoid the gotchas that regularly bite folks. Whether you&amp;rsquo;re running a mixed-OS environment or just trying to access your Unraid shares from Windows, this one&amp;rsquo;s for you.&lt;/p&gt;
&lt;h2 id=&#34;nfs-vs-smb-what-each-protocol-does&#34;&gt;NFS vs SMB: What Each Protocol Does
&lt;/h2&gt;&lt;p&gt;Network File System (NFS) is the native file-sharing protocol for Unix and Linux systems. It makes remote folders appear as local directories, with tight integration into the Linux kernel. It&amp;rsquo;s how Linux prefers to share files across a network.&lt;/p&gt;
&lt;p&gt;Server Message Block (SMB) is Windows&amp;rsquo; native file-sharing protocol. Linux systems access SMB shares through Samba, while macOS speaks SMB natively. SMB packs more features and integrates deeply with Windows authentication and permissions.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;NFS&lt;/th&gt;
          &lt;th&gt;SMB&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Best for&lt;/td&gt;
          &lt;td&gt;Linux-to-Linux&lt;/td&gt;
          &lt;td&gt;Mixed OS / Windows&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Default on&lt;/td&gt;
          &lt;td&gt;Linux/Unix&lt;/td&gt;
          &lt;td&gt;Windows&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Encryption&lt;/td&gt;
          &lt;td&gt;NFSv4 + Kerberos&lt;/td&gt;
          &lt;td&gt;SMB3 built-in&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Performance (small files, Linux)&lt;/td&gt;
          &lt;td&gt;Faster&lt;/td&gt;
          &lt;td&gt;Slower&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Performance (large files)&lt;/td&gt;
          &lt;td&gt;Similar&lt;/td&gt;
          &lt;td&gt;Similar&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows support&lt;/td&gt;
          &lt;td&gt;Poor&lt;/td&gt;
          &lt;td&gt;Native&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Docker/container use&lt;/td&gt;
          &lt;td&gt;Common&lt;/td&gt;
          &lt;td&gt;Less common&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Setup complexity&lt;/td&gt;
          &lt;td&gt;Simple (Linux)&lt;/td&gt;
          &lt;td&gt;Moderate&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Why this matters for your media server:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Your media server constantly reads metadata, generates thumbnails, and streams video files. The protocol you choose directly impacts how fast library scans complete, how quickly your media player interface loads, and whether file permissions stay manageable or slowly drive you insane.&lt;/p&gt;
&lt;p&gt;Your clients&amp;rsquo; operating systems drive the decision. Running a Linux media server accessed only by other Linux machines? NFS typically performs better. Mixed environments with Windows, macOS, and Linux clients? SMB is the sane choice.&lt;/p&gt;
&lt;p&gt;Both protocols can be properly secured on a trusted LAN, but their default configurations and hardening approaches vary significantly. Poor defaults have real consequences. SMBv1 vulnerabilities enabled major malware outbreaks. Misconfigured NFS exports can expose your data to anyone on the network. Neither protocol forgives carelessness.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0D22JRHZB&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ugreen-NAS.jpg&#34; alt=&#34;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS: A 4-bay NAS with an Intel N100 CPU and 2.5GbE networking, solid for running both NFS and SMB shares side by side in a homelab.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS&lt;/strong&gt;&lt;br&gt;
Four bays, an Intel N100, and a 2.5GbE port. Supports both NFS and SMB out of the box, so you can actually test what you&amp;rsquo;re reading about here instead of just theorizing. A solid entry point if you don&amp;rsquo;t already have a NAS to experiment with.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3TZdbTa&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445834073258455140506374&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fugreen-dxp4800-4-bay-quad-core-2-0-ghz-cpu-processor-diskless-system%2fp%2fN82E16822995002&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;nfs-or-smb-which-protocol-should-you-use&#34;&gt;NFS or SMB: Which Protocol Should You Use?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;All clients are Linux, Unix, or Android TV?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pick NFS. It&amp;rsquo;s fast, mature, and simple for Linux-to-Linux communication. You&amp;rsquo;ll avoid the worst of the permission headaches, provided you manage your UIDs and GIDs correctly. (More on that later.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Windows or macOS clients in the mix?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pick SMB. It&amp;rsquo;s native on Windows, works smoothly on macOS, and Samba on Linux is robust. If specific Linux-only apps benefit from NFS, you can add it alongside SMB, but let SMB be the default.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Security and centralized authentication matter?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMB3 with modern authentication and encryption is the more straightforward path, especially in Windows and Samba environments. NFSv4 with Kerberos can be equally secure, but the setup complexity is significantly higher. If you&amp;rsquo;re not doing Kerberos, restrict NFS to trusted subnets and use strong firewall rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Running Unraid or another NAS?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unraid and most NAS platforms support both protocols. Use SMB for Windows clients, NFS for Linux clients or Docker containers. Don&amp;rsquo;t expose either protocol to the internet. Ever.&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Both protocols are fast enough for streaming large media files. The performance gap shows up when your media manager scans thousands of tiny images and NFO files. Linux clients usually chew through those faster over NFS, while Windows clients do better with SMB thanks to client stack optimizations.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;nfs-vs-smb-pros-and-cons&#34;&gt;NFS vs SMB Pros and Cons
&lt;/h2&gt;&lt;h3 id=&#34;nfs-strengths-and-weaknesses&#34;&gt;NFS: Strengths and Weaknesses
&lt;/h3&gt;&lt;h4 id=&#34;pros&#34;&gt;Pros:
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Fast on Linux.&lt;/strong&gt; Lower protocol overhead and native kernel modules give NFS an edge when dealing with many small file operations in Linux-only environments. For a Linux media server streaming content to other Linux clients and managing large collections, this matters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simple integration.&lt;/strong&gt; NFS is part of the Linux ecosystem. Mounts, fstab, systemd units, and permissions all make sense if you track your UIDs and GIDs. No wrestling with foreign concepts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stateless heritage.&lt;/strong&gt; Classic NFSv3 is largely stateless, which can simplify some failure recoveries.&lt;/p&gt;
&lt;h4 id=&#34;cons&#34;&gt;Cons:
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Security by default is weaker.&lt;/strong&gt; Older NFS versions lack encryption and rely on client-side UID/GID trust. NFSv4 improves this and supports Kerberos, but few home labs set that up correctly. Most people live with the risk and lock things down with firewall rules. Know that you&amp;rsquo;re making that trade-off.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows support is painful.&lt;/strong&gt; Windows can mount NFS, but the built-in client is inconsistent across editions and awkward to configure. If you need to access shares from Windows regularly, save yourself the grief and use SMB.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Focused feature set.&lt;/strong&gt; NFS does file and directory sharing well. That&amp;rsquo;s it. Don&amp;rsquo;t come looking for the broader Windows ecosystem features that SMB provides.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best fit:&lt;/strong&gt;
Linux media servers and clients, Docker workloads, Kubernetes, and Linux-only NAS access.&lt;/p&gt;
&lt;h3 id=&#34;smb-strengths-and-weaknesses&#34;&gt;SMB: Strengths and Weaknesses
&lt;/h3&gt;&lt;h4 id=&#34;pros-1&#34;&gt;Pros:
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cross-platform.&lt;/strong&gt; Native on Windows, solid on macOS and Linux via Samba. For mixed-OS homes and offices, SMB just works. That&amp;rsquo;s not praise you hand out lightly in this industry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modern security.&lt;/strong&gt; SMB3 supports strong authentication and optional encryption, integrates with Active Directory, and includes features like signing and multichannel. When configured properly, it&amp;rsquo;s solid.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feature-rich.&lt;/strong&gt; Beyond files, SMB supports printers and deep Access Control List (ACL) capabilities that align with Windows permission models. If you have a Windows background, the permissions will feel familiar.&lt;/p&gt;
&lt;h4 id=&#34;cons-1&#34;&gt;Cons:
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;More overhead.&lt;/strong&gt; Often slower than NFS in Linux-to-Linux scenarios with many small files, though SMB3 performance can be excellent with Windows clients. The extra features come at a cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More knobs to misconfigure.&lt;/strong&gt; Samba has a lot of options, and it&amp;rsquo;s easy to botch permissions or lose performance with certain security defaults. The flexibility is both a blessing and a trap.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-danger&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;❌&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Danger:&lt;/strong&gt;
    SMBv1 is insecure and was exploited in major malware outbreaks like WannaCry. Disable it everywhere. No exceptions, no excuses, no &amp;ldquo;but my old printer needs it.&amp;rdquo; If a device only speaks SMBv1, that device has a retirement date, and it&amp;rsquo;s today.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best fit:&lt;/strong&gt;
Mixed OS environments, Windows clients, or macOS systems.&lt;/p&gt;
&lt;h2 id=&#34;preparing-your-linux-server-or-nas&#34;&gt;Preparing Your Linux Server or NAS
&lt;/h2&gt;&lt;p&gt;Whether you&amp;rsquo;re running a bare Linux server, Unraid, Synology, TrueNAS, or another NAS platform, the setup approach stays consistent. Sort this out before you touch a config file:&lt;/p&gt;
&lt;p&gt;Figure out which shares will be accessed by which clients. Use SMB for Windows and macOS connections. Use NFS for Linux apps and clients. Avoid exporting the same path through both protocols unless you understand the consequences for permissions and extended attributes (and you probably don&amp;rsquo;t yet, which is fine). Keep both protocols scoped to your trusted LAN. Never port-forward 445 or 2049 from your router to the internet.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    That last point is worth repeating: exposing file share ports to the internet is begging for trouble. Your media server doesn&amp;rsquo;t need to be the next cautionary tale in network security forums. People will screenshot your misconfiguration and post it for laughs.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;On Unraid specifically:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SMB comes enabled by default, making Windows access straightforward. You can enable NFS per share for Linux clients and containers. Mapping Windows drives to SMB shares is point-and-click simple. Accessing NFS shares from Windows, on the other hand, requires client-side tools and sometimes Windows Enterprise features. For most home setups, SMB handles Windows clients just fine. Don&amp;rsquo;t add an unnecessary headache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On Synology DSM:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Synology supports both NFS and SMB through its Control Panel. SMB is enabled by default. To enable NFS, go to Control Panel &amp;gt; File Services &amp;gt; NFS and check &amp;ldquo;Enable NFS service.&amp;rdquo; You can then set NFS permissions per shared folder under the folder&amp;rsquo;s edit settings. Synology makes this relatively painless, but pay attention to the squash settings and allowed IP ranges. The defaults are conservative, which is the right instinct, but they&amp;rsquo;ll block access if you don&amp;rsquo;t explicitly allow your client subnets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On TrueNAS (SCALE and CORE):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;TrueNAS supports both protocols through its web UI. Create a dataset first, then configure SMB or NFS sharing on top of it. For Jellyfin or Plex running in a TrueNAS container or jail, NFS is the common choice for mounting media storage. Be aware that TrueNAS SCALE uses Linux under the hood while TrueNAS CORE uses FreeBSD, which can affect how NFS permissions behave. If you&amp;rsquo;re running apps on TrueNAS SCALE, pointing them at an NFS share from a separate dataset avoids the host path permission headaches that catch a lot of people.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-smb-on-a-linux-server-samba&#34;&gt;Setting Up SMB on a Linux Server (Samba)
&lt;/h2&gt;&lt;p&gt;Getting SMB running on Linux is straightforward once you know the steps. Here&amp;rsquo;s how to set up a proper media share that Windows, macOS, and other Linux machines can all access without drama.&lt;/p&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/post/smb-guide/featured.jpg&#34; alt=&#34;Follow my SMB installation and Configuration Guide&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Follow my SMB installation and Configuration Guide&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://diymediaserver.com/post/smb-guide/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Read
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Security Notes:&lt;/strong&gt;
Use SMBv3 or higher wherever possible. Disable SMBv1 entirely. If you&amp;rsquo;ve read this far, and it&amp;rsquo;s still enabled on your network, go fix that now. I&amp;rsquo;ll wait.&lt;/p&gt;
&lt;p&gt;The linked configuration guide creates a secure, authenticated share that works reliably across different operating systems. Your Linux media server will play nicely with Windows clients without the permission headaches that sometimes plague mixed environments.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F8JG2SHN&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: Mini PC with dual 2.5GbE, optional 10GbE, Ryzen CPU, and triple NVMe slots. A capable Proxmox host for NFS/SMB testing in VMs or containers.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
Dual 2.5GbE with a 10GbE option, a Ryzen CPU, and triple NVMe slots in a box smaller than most routers. If you want a Proxmox host that can run NFS and SMB servers in VMs or containers without breaking a sweat, this is the kind of hardware that makes it trivial.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;setting-up-nfs-on-a-linux-server&#34;&gt;Setting Up NFS on a Linux Server
&lt;/h2&gt;&lt;p&gt;Getting NFS running on your Linux media server is straightforward once you know the steps. Here&amp;rsquo;s how to get it configured properly:&lt;/p&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/post/nfs-guide/featured.jpg&#34; alt=&#34;Follow my NFS installation and Configuration Guide&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Follow my NFS installation and Configuration Guide&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://diymediaserver.com/post/nfs-guide/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Read
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For those who want the quick version, here&amp;rsquo;s what mounting an NFS share from a Linux client looks like in practice:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# One-time manual mount to test the connection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -t nfs4 192.168.1.100:/mnt/media /mnt/nfs/media
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Persistent mount via /etc/fstab (survives reboots)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Add this line:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.1.100:/mnt/media  /mnt/nfs/media  nfs4  rw,noatime,rsize&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1048576,wsize&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1048576&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace the IP and paths with your own. Test the manual mount first. If that works, add the &lt;code&gt;fstab&lt;/code&gt; entry. If the manual mount fails, don&amp;rsquo;t bother with &lt;code&gt;fstab&lt;/code&gt; until you&amp;rsquo;ve sorted out the underlying issue. Debugging a boot hang caused by a bad NFS mount in &lt;code&gt;fstab&lt;/code&gt; is a miserable experience. Ask me how I know. If you&amp;rsquo;re worried about boot hangs, add the &lt;code&gt;nofail&lt;/code&gt; option, so the system boots even if the NFS server is unreachable.&lt;/p&gt;
&lt;h2 id=&#34;nfs-and-smb-security-best-practices&#34;&gt;NFS and SMB Security Best Practices
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the thing about network file sharing: convenience and security pull in opposite directions. But a few smart choices upfront will save you from becoming internet famous for all the wrong reasons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep it local.&lt;/strong&gt; SMB and NFS belong on your trusted LAN only. Never expose ports 445 (SMB) or 2049 (NFS) to the internet. Block them at your router and firewall. This isn&amp;rsquo;t paranoia. This is basic hygiene.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SMB security essentials:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Disable SMBv1 entirely. It&amp;rsquo;s ancient, vulnerable, and has no place in modern networks. Use SMBv2 or SMBv3. Enable strong authentication and SMB encryption where your data sensitivity justifies the CPU overhead. Yes, encryption costs performance, but that&amp;rsquo;s a trade-off worth making for sensitive content. If you need centralized user management, integrate with existing directory services rather than managing local accounts one by one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NFS security essentials:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Stick with NFSv4 over older versions. Restrict exports by IP or subnet. Use &lt;code&gt;root_squash&lt;/code&gt; to prevent compromised clients from running wild with root privileges. Deploy host-based firewalls to allow only known clients. Defense in depth matters because single points of failure are single points of regret.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The backup reality check:&lt;/strong&gt;
Neither SMB nor NFS will save you from accidental deletion or ransomware. Keep offline or versioned backups of your important data. This is not optional. Your future self will thank you, or your current self will learn the hard way.&lt;/p&gt;
&lt;h2 id=&#34;nfs-and-smb-performance-tuning&#34;&gt;NFS and SMB Performance Tuning
&lt;/h2&gt;&lt;p&gt;Getting good performance from network shares isn&amp;rsquo;t rocket science, but a few targeted tweaks can make a noticeable difference. Here&amp;rsquo;s what actually moves the needle:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NFS:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For large sequential reads (streaming movies), the default settings are usually fine. For many small files, look at &lt;code&gt;actimeo&lt;/code&gt; (attribute cache timing) and consider &lt;code&gt;noatime&lt;/code&gt; to reduce metadata writes. Use NFSv4.2 when available. It cuts down on port sprawl and handles flaky network connections better. You can bump up &lt;code&gt;rsize/wsize&lt;/code&gt; (try &lt;code&gt;rsize=1048576,wsize=1048576&lt;/code&gt; as a starting point), but test with your specific NIC and switch setup. Bigger buffers aren&amp;rsquo;t always better buffers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SMB:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enable SMB multichannel on capable clients and servers. It bonds multiple NICs or network paths for better throughput and fault tolerance. Stick with SMB version 3.x or higher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Both protocols:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jumbo frames (MTU 9000) can help, but only if every single network hop supports the same MTU. Miss one switch or router, and you&amp;rsquo;ll actually make things worse. Always test with tools like &lt;code&gt;robocopy&lt;/code&gt; (Windows), &lt;code&gt;fio&lt;/code&gt;, or &lt;code&gt;dd&lt;/code&gt; to measure before and after. A simple sequential read test with &lt;code&gt;fio&lt;/code&gt; looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fio --name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;seqread --rw&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; --bs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1M --size&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1G --numjobs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; --filename&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/mnt/yourshare/testfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change one variable at a time. Otherwise you&amp;rsquo;ll never know what helped and what hurt.&lt;/p&gt;
&lt;h3 id=&#34;nfs-vs-smb-speed-what-the-benchmarks-actually-show&#34;&gt;NFS vs SMB Speed: What the Benchmarks Actually Show
&lt;/h3&gt;&lt;p&gt;People love to argue about NFS vs SMB performance in the abstract. Here&amp;rsquo;s what the numbers actually look like in real homelab conditions.&lt;/p&gt;
&lt;p&gt;For sequential reads and writes (streaming a movie, copying a large file), NFS and SMB perform within a few percent of each other on a modern gigabit or 2.5GbE link. Both protocols will saturate a 1GbE connection without breaking a sweat. You&amp;rsquo;re not going to notice a difference when playing a 30GB Blu-ray remux over either protocol.&lt;/p&gt;
&lt;p&gt;The gap opens up with small files. When your media manager scans a library of thousands of NFO files, poster images, and subtitle files, NFS on Linux clients can be 25-30% faster than SMB for random read operations. This is where NFS&amp;rsquo;s lower protocol overhead and kernel-level integration actually matter. If your Jellyfin library scan takes 20 minutes over SMB, it might take 14 over NFS. That adds up when you&amp;rsquo;re managing a large collection.&lt;/p&gt;
&lt;p&gt;SMB claws back some ground on random writes, where it&amp;rsquo;s sometimes faster depending on the server and client configuration. And on Windows clients, SMB&amp;rsquo;s native stack optimizations mean it frequently outperforms NFS, which is running through a clunkier client implementation on that platform.&lt;/p&gt;
&lt;p&gt;The takeaway: don&amp;rsquo;t pick a protocol based on speed alone. Pick based on your client OS, then tune for speed within that choice.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CM293XCL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive: High-capacity storage for media servers. Enough space to stress-test your NFS or SMB setup with a real library.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;br&gt;
Protocol benchmarks don&amp;rsquo;t mean much against a handful of test files. You need a real media library to see the difference. 24TB gives you enough room to fill a NAS and actually stress-test your NFS or SMB configuration with thousands of files, not a synthetic toy workload.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;common-nfs-and-smb-pitfalls&#34;&gt;Common NFS and SMB Pitfalls
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Mixing NFS and SMB on the same share:&lt;/strong&gt;&lt;br&gt;
This is a deep topic, but the short version: Windows ACLs and POSIX permissions are like oil and water. Samba stores NT ACLs as extended attributes, but NFS clients may not preserve them. If you must mix protocols on the same data, separate your write paths or designate one protocol for writes and keep the other read-only.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UID/GID mismatches on NFS:&lt;/strong&gt;&lt;br&gt;
Keep your user and group IDs consistent across all Linux clients. Use centralized identity management (LDAP/SSSD) or carefully align your &lt;code&gt;/etc/passwd&lt;/code&gt; entries. For a quick check, run &lt;code&gt;id username&lt;/code&gt; on both client and server and make sure the numbers match. Debugging permission issues caused by mismatched IDs is not how you want to spend your weekend.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assuming &amp;ldquo;NFS is insecure&amp;rdquo; or &amp;ldquo;SMB is slow&amp;rdquo;:&lt;/strong&gt;&lt;br&gt;
These are lazy generalizations. NFSv4 with Kerberos is robust. SMB3 on modern stacks is both fast and secure. The real performance and security outcomes depend on your configuration and client mix, not the protocol name on the tin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Turning on async writes blindly on NFS:&lt;/strong&gt;&lt;br&gt;
Async writes (&lt;code&gt;async&lt;/code&gt; in &lt;code&gt;/etc/exports&lt;/code&gt;) can boost speed, but at the cost of data safety during crashes. If the server goes down mid-write, you can lose data. Understand the trade-off before flipping that switch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exposing shares directly to the internet:&lt;/strong&gt;&lt;br&gt;
This is how you get pwned. Use VPNs for remote access. Never use direct port forwards for file shares. Not &amp;ldquo;probably don&amp;rsquo;t.&amp;rdquo; Don&amp;rsquo;t.&lt;/p&gt;
&lt;h2 id=&#34;example-scenarios-what-to-choose&#34;&gt;Example Scenarios: What To Choose
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s how to pick the right protocol based on your actual setup:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;All Linux home:&lt;/strong&gt;&lt;br&gt;
Export media via NFSv4, mount on Jellyfin/Plex and your Linux desktop. Keep UIDs aligned across systems. Optionally offer SMB read-only for occasional Windows use. This gives you the performance benefits of NFS where it matters most while keeping a door open for Windows guests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows family PCs, macOS laptop, Linux server NAS:&lt;/strong&gt;&lt;br&gt;
Use SMB for everyone. Enable NFS only for Linux containers or hosts that specifically benefit from it. Keep permissions in one place through Samba. Fighting permission mismatches across protocols isn&amp;rsquo;t worth the headache when SMB works fine for the whole house.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unraid backing multiple Docker apps and a Windows gaming PC:&lt;/strong&gt;&lt;br&gt;
Give containers NFS or bind mounts for speed. Export the same content over SMB to Windows, but consider separate paths or read-only mounts to avoid permission drift. This hybrid approach lets your containers stay fast while keeping Windows happy. Watch for permission conflicts if both protocols write to the same files. When in doubt, pick one writer.&lt;/p&gt;
&lt;h3 id=&#34;nfs-vs-smb-for-docker-containers&#34;&gt;NFS vs SMB for Docker Containers
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;re running Plex, Jellyfin, Sonarr, Radarr, or any other media app in Docker, you have three main options for accessing remote storage: NFS mounts, SMB/CIFS mounts, or bind mounts from a path already mounted on the host.&lt;/p&gt;
&lt;p&gt;The cleanest approach for most homelabs is to mount the NFS share on the Docker host, then bind-mount that path into your containers. This keeps the NFS configuration in one place (the host&amp;rsquo;s &lt;code&gt;/etc/fstab&lt;/code&gt;) and lets every container access the same media library without each one needing its own network mount logic. Here&amp;rsquo;s what that looks like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# On the Docker host, mount the NFS share&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.1.100:/mnt/media  /mnt/nfs/media  nfs4  rw,noatime,nofail  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# In docker-compose.yml, bind-mount it into the container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - /mnt/nfs/media:/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; mount SMB/CIFS shares into Docker containers using a CIFS volume driver or by mounting on the host first, but NFS is generally the better fit here. It avoids the SMB authentication layer, has less overhead for the constant small-file reads that media apps love to do, and plays nicer with Linux permissions inside containers. If your NAS is a Synology, TrueNAS, or Unraid box, enable NFS for these container workloads even if the rest of your house uses SMB.&lt;/p&gt;
&lt;p&gt;One warning: make sure the NFS share is mounted before Docker starts your containers. If the mount isn&amp;rsquo;t ready and your container writes to what it thinks is the media directory, those writes land on the host&amp;rsquo;s local filesystem instead. You&amp;rsquo;ll spend an hour wondering why your files disappeared. Use &lt;code&gt;nofail&lt;/code&gt; and &lt;code&gt;x-systemd.automount&lt;/code&gt; in your fstab, or set up a systemd dependency so Docker waits for the mount.&lt;/p&gt;
&lt;h3 id=&#34;nfs-vs-smb-for-proxmox&#34;&gt;NFS vs SMB for Proxmox
&lt;/h3&gt;&lt;p&gt;Proxmox users face this question constantly, especially when adding NAS storage as a datastore for VMs, containers, or ISO images. Proxmox supports both NFS and SMB/CIFS as storage backends, configurable directly from the Datacenter &amp;gt; Storage menu in the web UI.&lt;/p&gt;
&lt;p&gt;For most Proxmox homelabs, NFS is the better default. Proxmox runs Linux under the hood, NFS is a first-class citizen, and the integration is straightforward. Add your NAS as an NFS datastore, point it at the export path, and Proxmox handles the rest. VM disk images, container templates, backups, and ISOs can all live on NFS storage without issue.&lt;/p&gt;
&lt;p&gt;SMB/CIFS storage is also supported in Proxmox, but it&amp;rsquo;s more commonly used when the storage backend is a Windows server or when NFS isn&amp;rsquo;t available. If your NAS supports both, pick NFS for Proxmox and save SMB for your Windows and macOS clients.&lt;/p&gt;
&lt;p&gt;One Proxmox-specific gotcha: if you&amp;rsquo;re passing NFS-mounted storage into an LXC container (not a VM), pay attention to UID/GID mapping. Unprivileged containers remap UIDs by default, which means UID 1000 inside the container becomes UID 101000 on the host and on the NFS share. Either use privileged containers for media workloads, manually map the UIDs in the container config, or accept that permissions will fight you until you sort it out.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-nfs-and-smb-connections&#34;&gt;Troubleshooting NFS and SMB Connections
&lt;/h2&gt;&lt;p&gt;When things go sideways (and they will), here&amp;rsquo;s how to get back on track.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Connection refused or cannot mount:&lt;/strong&gt;&lt;br&gt;
Check if your services are actually running: &lt;code&gt;systemctl status smbd nmbd&lt;/code&gt; for SMB, or &lt;code&gt;systemctl status nfs-server&lt;/code&gt; for NFS. Verify firewall rules. SMB needs TCP 445, NFSv4 needs TCP 2049. If you&amp;rsquo;re stuck with NFSv3, &lt;code&gt;rpcbind&lt;/code&gt; and &lt;code&gt;mountd&lt;/code&gt; may need additional ports opened. Double-check your server IP and share names. Yes, typos happen to all of us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Permission denied:&lt;/strong&gt;&lt;br&gt;
For SMB, verify the user exists in both Linux and Samba (&lt;code&gt;pdbedit -L&lt;/code&gt; lists Samba users), check &lt;code&gt;smbpasswd&lt;/code&gt;, and validate share-level access controls. For NFS, UID/GID mismatches are the usual suspect. Align user IDs between systems or configure &lt;code&gt;idmapd&lt;/code&gt; for NFSv4. Also make sure your export options aren&amp;rsquo;t accidentally set to &lt;code&gt;ro&lt;/code&gt; (read-only) when you meant &lt;code&gt;rw&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Slow file transfers:&lt;/strong&gt;&lt;br&gt;
Check what protocol version you&amp;rsquo;re actually using. Force &lt;code&gt;vers=3.0&lt;/code&gt; for SMB or &lt;code&gt;vers=4.2&lt;/code&gt; for NFS and test again. Disable Wi-Fi power saving on clients and test over wired connections. For SMB, experiment with multichannel, signing, or encryption settings to understand the performance trade-offs. Don&amp;rsquo;t disable security features on untrusted networks. For NFS, try different &lt;code&gt;rsize/wsize&lt;/code&gt; values and check for duplicate mounts or DNS slowness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows cannot access NFS:&lt;/strong&gt;&lt;br&gt;
The Client for NFS feature might be missing or unsupported in your Windows edition (Home edition doesn&amp;rsquo;t have it). Stick with SMB for Windows clients and save NFS for Linux systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Media server doesn&amp;rsquo;t see new files immediately:&lt;/strong&gt;&lt;br&gt;
For SMB, Samba uses change notifications, but some applications still cache directory listings. Try a manual library refresh or verify your app is watching the correct path. For NFS, attribute caching can delay file visibility. Adjust &lt;code&gt;actimeo=0&lt;/code&gt; for immediate visibility, but expect a performance hit. Find the balance that works for your scan frequency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Library scans crawl along:&lt;/strong&gt;&lt;br&gt;
For many small files, NFS on Linux clients often outperforms SMB. Consider running your media scanner on a Linux machine over NFS, even if end users stream via SMB.&lt;/p&gt;
&lt;h2 id=&#34;faqs&#34;&gt;FAQs:
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What is the difference between NFS and SMB for a home media server?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;NFS is Linux&amp;rsquo;s native file sharing protocol and excels at Linux-to-Linux performance with minimal overhead. SMB is Windows&amp;rsquo; native protocol and works best in mixed OS environments, offering strong security features and broad client support. If your media server runs Linux but you have Windows clients, SMB is usually the safer bet.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Does Unraid support NFS and SMB shares?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes, Unraid supports both protocols out of the box. SMB is enabled by default for Windows compatibility, while NFS is commonly used for Linux clients and Docker containers. You can enable either or both, depending on your needs.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I access an NAS or Unraid share from Windows?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Use SMB. In Windows Explorer, type &lt;code&gt;\\unraid-hostname\sharename&lt;/code&gt; in the address bar or map it as a network drive. While Windows 10 Pro and Enterprise can mount NFS shares, SMB is the path of least resistance for most home users.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Which is faster for Plex or Jellyfin: NFS or SMB?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;For Linux media servers scanning thousands of small files (like movie thumbnails), NFS typically wins due to lower protocol overhead. Windows clients often see better performance with SMB3. When streaming large video files, both protocols are plenty fast. Compatibility matters more than raw speed at that point.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Is NFS secure enough for my home network?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;NFS can be secure on a trusted home network when properly configured with export restrictions and firewall rules. For enhanced security, consider upgrading to NFSv4 with Kerberos authentication, though this significantly increases setup complexity. Most importantly, never expose NFS directly to the internet. Always use a VPN for remote access.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I set up NFS shares on Unraid?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Enable NFS in Unraid&amp;rsquo;s settings, configure per-share export rules, and specify allowed client IPs or subnets. Mount from Linux clients using &lt;code&gt;mount -t nfs server:/export /mnt&lt;/code&gt;. The key is getting the export permissions right the first time.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can I use both NFS and SMB on the same Unraid share?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Technically yes. But you&amp;rsquo;re asking for trouble. Permission conflicts and extended attribute mismatches can cause real headaches. If you must use both, consider making one protocol read-only or carefully separating write operations between protocols.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Why am I getting permission denied when mounting an NFS share?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Usually, it&amp;rsquo;s UID/GID mismatches between your client and server, or restrictive export rules. Ensure user IDs align across your Linux systems and double-check &lt;code&gt;/etc/exports&lt;/code&gt; for correct options and allowed subnets. This is the most common NFS stumbling block.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I enable SMB3 encryption on my server?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;In your Samba configuration, set &lt;code&gt;smb encrypt = required&lt;/code&gt; or &lt;code&gt;desired&lt;/code&gt; globally or per-share. Keep in mind that encryption adds CPU overhead. Test performance impacts on your hardware before committing.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What are the risks of exposing SMB or NFS to the internet?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;High risk. Don&amp;rsquo;t do it. SMBv1 was exploited in major ransomware outbreaks like WannaCry. Even modern SMB and NFS implementations are frequent attack targets. Use a VPN for remote access and never port-forward 445 or 2049 from your router.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I fix slow file transfers over SMB or NFS?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Start with the basics: verify you&amp;rsquo;re using modern protocol versions, test with wired connections, and benchmark one change at a time. For NFS, tune &lt;code&gt;rsize&lt;/code&gt; and &lt;code&gt;wsize&lt;/code&gt; parameters. For SMB, enable multichannel if your hardware supports it.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I use NFSv3 or NFSv4 for my media server?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Go with NFSv4 unless you have a specific reason not to. It simplifies port management, provides better file locking, and supports Kerberos security. Only stick with NFSv3 if you&amp;rsquo;re dealing with legacy systems that genuinely can&amp;rsquo;t handle v4.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ How do I map Linux users to Windows users for file access?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;With SMB, configure Samba&amp;rsquo;s &lt;code&gt;idmap&lt;/code&gt; backends and maintain consistent POSIX ACLs for cross-platform access. The Samba docs on idmap are dense but worth reading. Getting this right once saves you from ongoing permission fights.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I use NFS or SMB for Docker containers?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;NFS is generally the better choice for Docker containers on Linux. Mount the NFS share on the Docker host, then bind-mount the path into your containers. This avoids SMB&amp;rsquo;s authentication overhead and plays nicer with Linux permissions inside containers. Make sure the NFS mount is ready before Docker starts your containers, or you&amp;rsquo;ll write to the local filesystem by mistake.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Should I use NFS or SMB with Proxmox?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;NFS is the more natural fit for Proxmox since it runs Linux. Add your NAS as an NFS datastore through the Proxmox web UI under Datacenter &amp;gt; Storage. It works well for VM disk images, container templates, backups, and ISOs. Use SMB/CIFS in Proxmox only if your storage backend is a Windows server or NFS isn&amp;rsquo;t available.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Does Synology support NFS and SMB?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. Synology DSM supports both protocols. SMB is enabled by default. Enable NFS through Control Panel &amp;gt; File Services &amp;gt; NFS, then set NFS permissions per shared folder. Most Synology users run SMB for desktop clients and NFS for Linux servers, Docker hosts, or Proxmox datastores.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ NFS or SMB for TrueNAS media storage?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;TrueNAS supports both. For media apps like Plex or Jellyfin running in TrueNAS containers or jails, NFS is the common choice. Create a dataset, configure NFS sharing on it, and point your media app at the NFS mount. Be aware that TrueNAS SCALE (Linux-based) and TrueNAS CORE (FreeBSD-based) handle NFS permissions slightly differently.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion-make-the-choice-that-fits-your-clients-and-your-risk&#34;&gt;Conclusion: Make the Choice That Fits Your Clients and Your Risk
&lt;/h2&gt;&lt;p&gt;The decision comes down to matching your protocol to your environment and accepting the trade-offs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If your world is Linux,&lt;/strong&gt; NFS is the pragmatic, fast, and simple default. It speaks the same language as your filesystem and won&amp;rsquo;t fight you on permissions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you have Windows or macOS clients,&lt;/strong&gt; SMB is the native choice that works. SMB3 brings solid security without requiring a PhD in Kerberos configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can run both protocols,&lt;/strong&gt; but don&amp;rsquo;t blindly export the same writeable path over both unless you understand how permissions and metadata will clash. That way lies madness and mysterious &amp;ldquo;permission denied&amp;rdquo; errors at 2 AM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lock it down.&lt;/strong&gt; Keep shares on your LAN, disable SMBv1 (seriously, it&amp;rsquo;s 2025), prefer NFSv4, and consider Kerberos or SMB encryption where your threat model demands it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next steps:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pick one protocol per client type and start simple. Don&amp;rsquo;t overcomplicate your first setup. Benchmark your scans and streams to establish a baseline. Layer on security and performance tuning only after you have a stable foundation.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re running a Linux media server or trying to access an Unraid share from Windows, the protocol choice matters less than understanding what you&amp;rsquo;re choosing and why. Your media server will feel faster, safer, and more predictable when you stop treating network protocols like a coin flip and start matching them to your actual needs.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BG685PKM&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/TX201.jpg&#34; alt=&#34;TP-Link 2.5GB PCIe Network Card (TX201): Affordable 2.5GbE NIC for upgrading server or client throughput. Plug-and-play on most Linux distros and Windows.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;TP-Link 2.5GB PCIe Network Card (TX201)&lt;/strong&gt;&lt;br&gt;
Hard to compare NFS and SMB performance when your NIC is the bottleneck. This 2.5GbE PCIe card is cheap, works out of the box on most Linux distros and Windows, and gets your gigabit ceiling out of the way, so you can see what the protocols are actually doing.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4mafK0R&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>How to Install Docker on Debian for GPU Passthrough and Transcoding</title>
        <link>https://diymediaserver.com/post/install-docker-debian-gpu-passthrough-transcoding/</link>
        <pubDate>Wed, 27 Aug 2025 10:03:58 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/install-docker-debian-gpu-passthrough-transcoding/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/install-docker-debian-gpu-passthrough-transcoding/featured.jpg" alt="Featured image of post How to Install Docker on Debian for GPU Passthrough and Transcoding" /&gt;&lt;p&gt;You want buttery-smooth 4K → 1080p hardware transcoding, and the quiet satisfaction of watching your CPU lounge around at 10% while your GPU does the heavy lifting. So you &amp;ldquo;quickly&amp;rdquo; pass your GPU into a Docker container… and Jellyfin stares back at you with the enthusiasm of a DMV clerk. The CPU is maxed out. Jellyfin logs throwing a tantrum about &amp;ldquo;no such device /dev/dri/renderD128.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Welcome to the club. Population: everyone who has ever tried this.&lt;/p&gt;
&lt;p&gt;I once burned a perfectly good Friday night (116 minutes, to be precise) wrestling with what Docker&amp;rsquo;s documentation cheerfully calls &amp;ldquo;simple&amp;rdquo; GPU passthrough. Drivers? Rock solid. Docker daemon? Restarted three times (because why stop at two?). YAML file? Formatted with the precision of a Swiss watchmaker. The actual problem? Linux permissions had decided my container wasn&amp;rsquo;t &amp;lsquo;special&amp;rsquo; enough for the render group&amp;rsquo;s exclusive party.&lt;/p&gt;
&lt;p&gt;After a scenic tour through udev rules, cgroup mysteries, and two spectacularly wrong Reddit threads that shall remain nameless, the GPU finally woke up. Frame times plummeted from &amp;ldquo;slideshow&amp;rdquo; to &amp;ldquo;silk.&amp;rdquo; My CPU went back to its regularly scheduled napping. And I made myself a solemn promise to document this mess before my brain forgot all the crucial details.&lt;/p&gt;
&lt;p&gt;This is that documentation, the step-by-step guide I desperately needed that night. You&amp;rsquo;ll get the exact Docker Compose configuration, the permissions that actually matter, and a heads-up about the gotchas that love to bite newcomers. Whether you&amp;rsquo;re running NVIDIA, Intel integrated graphics, or AMD, by the end of this, you&amp;rsquo;ll have hardware-accelerated transcoding humming along in Docker containers, without the 1 AM debugging session.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Think Docker will magically use your GPU? Cute.  NVIDIA needs --gpus, Intel/AMD need /dev/dri, and you need to join the right groups. Otherwise, enjoy watching your CPU sweat bullets.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc.jpg&#34; alt=&#34;ASRock Intel ARC A380 Challenger: The Arc A380 isn&amp;#39;t for gaming—it’s for obliterating video streams. With support for H.264, HEVC, and full AV1 hardware enco…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;ASRock Intel ARC A380 Challenger&lt;/strong&gt;
The Arc A380 isn&amp;rsquo;t for gaming—it’s for obliterating video streams. With support for H.264, HEVC, and full AV1 hardware encode/decode, it crushes 20+ 1080p streams or 6–8 HDR tone-mapped 4Ks without breaking a sweat. Drop it in your media server, give Jellyfin direct VA-API access, and watch your CPU finally cool off for a bit.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45n6UHq&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-gpu-passthrough-matters&#34;&gt;Why GPU Passthrough Matters
&lt;/h2&gt;&lt;p&gt;High-quality video transcoding taxes CPUs heavily. Hardware acceleration using GPU features (NVIDIA NVENC, Intel VAAPI/QSV, AMD VCE) speeds this up dramatically, lowering CPU load and noise.&lt;/p&gt;
&lt;p&gt;With Docker, you can isolate applications like Jellyfin or Plex in containers while granting them secure, controlled access to the host GPU. This results in smoother streaming, more simultaneous users, quieter fans, and efficient resource use.&lt;/p&gt;
&lt;p&gt;Remember, GPU passthrough in Docker differs from VM passthrough. Docker handles device permissions and cgroups, giving containers controlled access to GPUs, and is less complicated than full hardware virtualization.&lt;/p&gt;
&lt;h2 id=&#34;why-gpu-passthrough-in-docker-on-debian-often-fails-and-how-to-fix-it&#34;&gt;Why GPU Passthrough in Docker on Debian Often Fails (And How to Fix It)
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the thing about GPU passthrough with Docker on Debian or any other Linux distro: it&amp;rsquo;s conceptually simple but practically finicky. Your GPU lives on the host system, happily managed by kernel drivers. Your Docker container exists in its own isolated environment with its own filesystem and permissions. Making Docker and your GPU talk requires more than just mounting a device file; you need the right permissions, correct device nodes, and sometimes a few udev rules to harmonize everything.&lt;/p&gt;
&lt;p&gt;Think of it like lending your car to a friend. Giving keys (mounting the device) isn&amp;rsquo;t enough; they need insurance coverage (permissions), know where it&amp;rsquo;s parked (device paths), and understand the quirks (Linux-specific device behaviors).&lt;/p&gt;
&lt;p&gt;Common failures include your container seeing the GPU but lacking permission, missing device nodes causing invisibility, or everything working temporarily, then breaking after a reboot due to unstable device paths.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s fix these and get Docker GPU passthrough working reliably.&lt;/p&gt;
&lt;p&gt;Need a Linux permissions refresher?&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Understanding Linux Permissions&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;proper-docker-compose-configuration-for-gpu-passthrough-on-debian&#34;&gt;Proper Docker Compose Configuration for GPU Passthrough on Debian
&lt;/h2&gt;&lt;p&gt;Forget juggling &lt;code&gt;docker run -it&lt;/code&gt; commands with complicated flags. Here’s a straightforward Docker Compose setup for GPU passthrough that persists across Debian reboots:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin/jellyfin:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin-hw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/dev/dri/renderD128:/dev/dri/renderD128 &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# GPU device access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group_add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;render&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;           &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Add container user to render group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Add container user to video group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;JELLYFIN_PublishedServerUrl=http://your-server-ip:8096&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;./config:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;./cache:/cache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/path/to/media:/media:ro&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8096:8096&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devices: /dev/dri:/dev/dri&lt;/code&gt; exposes all GPU device nodes, essential for hardware transcoding.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;group_add&lt;/code&gt; adds your container user to &lt;code&gt;render&lt;/code&gt; and &lt;code&gt;video&lt;/code&gt; groups, granting necessary permissions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;restart: unless-stopped&lt;/code&gt; ensures resilience on Debian system reboots.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;nvidia-vs-intelamd-gpu-passthrough-on-docker&#34;&gt;NVIDIA vs Intel/AMD GPU Passthrough on Docker
&lt;/h2&gt;&lt;h3 id=&#34;nvidia-simplified-gpu-passthrough&#34;&gt;NVIDIA: Simplified GPU Passthrough
&lt;/h3&gt;&lt;p&gt;Install the proprietary NVIDIA driver and NVIDIA Container Toolkit on Debian. Use &lt;code&gt;docker run -it --gpus all&lt;/code&gt; or Docker Compose &lt;code&gt;device_requests&lt;/code&gt; for straightforward passthrough. The NVIDIA Toolkit handles driver mapping and permissions automatically.&lt;/p&gt;
&lt;p&gt;This is suitable for Transcoding, AI, or other CUDA workloads&lt;/p&gt;
&lt;h3 id=&#34;intelamd-manual-device-mapping&#34;&gt;Intel/AMD: Manual Device Mapping
&lt;/h3&gt;&lt;p&gt;For Intel and AMD on Debian, manually expose &lt;code&gt;/dev/dri&lt;/code&gt; into containers, manage permissions carefully, and ensure correct drivers (&lt;code&gt;intel-media-driver&lt;/code&gt;, &lt;code&gt;mesa-va-drivers&lt;/code&gt;) are installed.&lt;/p&gt;
&lt;p&gt;Add container users to &lt;code&gt;render&lt;/code&gt; and &lt;code&gt;video&lt;/code&gt; groups to avoid permission denied errors. This approach is rock-solid for media transcoding workloads.&lt;/p&gt;
&lt;h2 id=&#34;preparing-your-debian-host-for-docker-gpu-passthrough&#34;&gt;Preparing Your Debian Host for Docker GPU Passthrough
&lt;/h2&gt;&lt;p&gt;Before installing Docker and configuring containers, confirm your GPU works on Debian host:&lt;/p&gt;
&lt;h3 id=&#34;nvidia-setup-on-debian&#34;&gt;NVIDIA Setup on Debian
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Install NVIDIA proprietary drivers. Verify with &lt;code&gt;nvidia-smi&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Install NVIDIA Container Toolkit:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install -y nvidia-container-toolkit
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nvidia-ctk runtime configure --runtime&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Verify with:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm --gpus&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;intel-igpu-setup&#34;&gt;Intel iGPU Setup
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Confirm &lt;code&gt;i915&lt;/code&gt; kernel driver loaded:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsmod &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep i915
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Check &lt;code&gt;/dev/dri&lt;/code&gt; device nodes exist.&lt;/li&gt;
&lt;li&gt;Install VA-API drivers:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install intel-media-va-driver vainfo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Verify working with &lt;code&gt;vainfo&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;docker-and-docker-compose-requirements-for-gpu-passthrough-on-debian&#34;&gt;Docker and Docker Compose Requirements for GPU Passthrough on Debian
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker version 20.10+ (check with &lt;code&gt;docker --version&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Docker Compose V2 (&lt;code&gt;docker compose&lt;/code&gt; command, not the legacy &lt;code&gt;docker-compose&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Linux kernel with cgroup v2 enabled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NVIDIA users require proper runtime configuration via &lt;code&gt;nvidia-container-toolkit&lt;/code&gt;. Intel/AMD users need only proper device mapping and permissions.&lt;/p&gt;
&lt;h2 id=&#34;correct-gpu-passthrough-configuration-with-docker-compose-on-debian&#34;&gt;Correct GPU Passthrough Configuration with Docker Compose on Debian
&lt;/h2&gt;







  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    I do not use NVIDIA or AMD hardware in my lab. Everything NVIDIA or AMD related in this post is straight from the documention.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;nvidia-compose-example&#34;&gt;NVIDIA Compose Example:
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin/jellyfin:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8096:8096&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/jellyfin/config:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/media:/media&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;runtime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nvidia&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;deploy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resources&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;reservations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nvidia&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;all&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;capabilities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gpu]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;intelamd-compose-example&#34;&gt;Intel/AMD Compose Example:
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin/jellyfin:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/dev/dri/renderD128:/dev/dri/renderD128&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1000:1000&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Adjust to your host user UID:GID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group_add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;render_gid&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Replace with actual host render group GID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;video_gid&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Replace with actual host video group GID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8096:8096&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/jellyfin/config:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/media:/media&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc_b580.jpg&#34; alt=&#34;Sparkle Intel Arc B580 Titan: The Intel Arc B580 is a transcoding powerhouse, with full hardware support for AV1, HEVC, VP9, and H.264 plus 12 GB of VRAM for smooth multi-stream 4K/8K workflow&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Sparkle Intel Arc B580 Titan&lt;/strong&gt;
The Intel Arc B580 is a transcoding powerhouse, with full hardware support for AV1, HEVC, VP9, and H.264 plus 12 GB of VRAM for smooth multi-stream 4K/8K workflows. Its 160 XMX AI engines turbocharge upscaling and media conversions, making it perfect for Plex, Jellyfin, or Docker-based media servers.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4oYTbOM&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458311555717803982804097&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fsparkle-computer-co-ltd-intel-arc-b580-titan-oc-12gb-graphics-card-air-cooler%2fp%2fN82E16814993013%3fitem%3dN82E16814993013&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;resolving-common-gpu-passthrough-issues-on-debian-with-docker&#34;&gt;Resolving Common GPU Passthrough Issues on Debian with Docker
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&amp;ldquo;no available runtime&amp;rdquo; or &amp;ldquo;could not select device driver&amp;rdquo; indicates missing NVIDIA Container Toolkit.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;no such device /dev/dri/renderD128&amp;rdquo; means device nodes not mapped or GPU drivers missing.&lt;/li&gt;
&lt;li&gt;Permission denied errors usually stem from missing &lt;code&gt;group_add&lt;/code&gt; for &lt;code&gt;render&lt;/code&gt; and &lt;code&gt;video&lt;/code&gt; groups.&lt;/li&gt;
&lt;li&gt;Use udev rules to make permissions persistent across reboots.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;verifying-gpu-access-inside-your-docker-container&#34;&gt;Verifying GPU Access Inside Your Docker Container
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;For NVIDIA: Run &lt;code&gt;docker run --rm --gpus=all nvidia/cuda nvidia-smi&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For Intel/AMD: Run &lt;code&gt;docker run --rm --device /dev/dri:/dev/dri jrottenberg/ffmpeg ffmpeg -hwaccels&lt;/code&gt; and look for &lt;code&gt;vaapi&lt;/code&gt; or &lt;code&gt;qsv&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;real-world-example-jellyfin-gpu-passthrough-on-debian&#34;&gt;Real-World Example: Jellyfin GPU Passthrough on Debian
&lt;/h2&gt;&lt;h3 id=&#34;nvidia-enabled-jellyfin&#34;&gt;NVIDIA-enabled Jellyfin:
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin/jellyfin:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/jellyfin/config:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/media:/media&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8096:8096&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;runtime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nvidia&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;deploy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resources&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;reservations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nvidia&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;all&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;capabilities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gpu]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;intel-igpu-jellyfin&#34;&gt;Intel iGPU Jellyfin:
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin/jellyfin:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;devices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/dev/dri/renderD128:/dev/dri/renderD128&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1000:1000&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group_add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;render_gid&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;video_gid&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/jellyfin/config:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/srv/media:/media&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8096:8096&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;final-tips-for-installing-docker-on-debian-and-running-gpu-passthrough-on-raspberry-pi-and-home-servers&#34;&gt;Final Tips for Installing Docker on Debian and Running GPU Passthrough on Raspberry Pi and Home Servers
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Always start by verifying GPU functionality on the host Linux system.&lt;/li&gt;
&lt;li&gt;Install Docker on Debian using the official repositories or Docker’s install script.
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-how-to-install-docker/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;My Docker install instructions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;docker run -it&lt;/code&gt; with &lt;code&gt;--gpus&lt;/code&gt; for quick NVIDIA GPU container testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With these steps, you can enjoy hardware-accelerated transcoding and efficient GPU usage inside Docker containers on Linux.&lt;/p&gt;
&lt;h2 id=&#34;other-resources&#34;&gt;Other Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NVIDIA Container Toolkit install guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/config/containers/resource_constraints/#gpu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker GPU guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jellyfin.org/docs/general/administration/hardware-acceleration&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jellyfin hardware acceleration docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://trac.ffmpeg.org/wiki/Hardware/VAAPI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FFmpeg VA-API guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENC&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FFmpeg NVENC guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy transcoding with Docker!&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/NUC12.jpg&#34; alt=&#34;Intel NUC 12 Pro (NUC12WSHi5): Compact mini PC for lightweight servers, GPU Passthrough, Docker stacks, and VMs.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Intel NUC 12 Pro (NUC12WSHi5)&lt;/strong&gt;
Compact mini PC for lightweight servers, GPU Passthrough, Docker stacks, and VMs.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3JyPlM4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445831098683742853224568&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fnuc-12-pro-barebone-12th-gen-intel-core-i5-1240p-rnuc12wshi50000%2fp%2f1VK-004K-068E6%3fitem%3d9SIBPASKBH4509&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>GPU Passthrough with Proxmox: A Practical Guide</title>
        <link>https://diymediaserver.com/post/gpu-passthrough-proxmox-quicksync-guide/</link>
        <pubDate>Fri, 15 Aug 2025 05:17:37 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/gpu-passthrough-proxmox-quicksync-guide/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/gpu-passthrough-proxmox-quicksync-guide/featured.jpg" alt="Featured image of post GPU Passthrough with Proxmox: A Practical Guide" /&gt;&lt;p&gt;So, you want smooth media transcoding in your Jellyfin VM running on Proxmox, and you&amp;rsquo;ve heard Intel QuickSync is that silver bullet. Or maybe you’re chasing GPU cycles for gaming, but Proxmox’s default CPU emulation just isn’t cutting it. Enter hardware passthrough: a fascinating promise of bare-metal performance wrapped in the warm hug of virtualization.&lt;/p&gt;
&lt;p&gt;But here’s the kicker Reddit forgets to mention: halfway in, your server can just black out. Silent, unresponsive, and only revivable through SSH. Think digital coma. Good times.&lt;/p&gt;
&lt;p&gt;If you’ve ever wrestled with PCIe passthrough, IOMMU groups, or found yourself frantically Googling “why is my Proxmox host dead after GPU passthrough?” at 2 AM, welcome to the club. The membership fee? A few gray hairs and an extra helping of existential dread. If not, congrats, and read on to keep it that way.&lt;/p&gt;
&lt;p&gt;Let’s simplify GPU passthrough in proxmox, break down the gotchas that matter, and get you transcoding with QuickSync (or any GPU) without turning your Proxmox box into a doorstop.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Want blazing-fast media transcodes in your Jellyfin or Plex VM? GPU passthrough lets your VM access your Intel QuickSync or discrete GPU directly—no emulation, no lag. But if you recklessly hand over your only GPU, your Proxmox host might go dark faster than your hopes during a Blue Screen of death. This guide walks you through setup, IOMMU group hell, and how to avoid turning your homelab into a brick.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc.jpg&#34; alt=&#34;ASRock Intel ARC A380 Challenger: The Arc A380 isn&amp;#39;t for gaming—it’s for obliterating video streams. With support for H.264, HEVC, and full AV1 hardware encode/decode, it crushes 20&amp;#43; 1080p streams or 6–8 HDR tone-mapped 4Ks without breaking a sweat. Drop it in your media server, give Jellyfin direct VA-API access, and watch your CPU finally cool off for a bit.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;ASRock Intel ARC A380 Challenger&lt;/strong&gt;
The Arc A380 isn&amp;rsquo;t for gaming, it’s for obliterating video streams. With support for H.264, HEVC, and full AV1 hardware encode/decode, it crushes 20+ 1080p streams or 6–8 HDR tone-mapped 4Ks without breaking a sweat. Drop it in your media server, give Jellyfin direct VA-API access, and watch your CPU finally cool off for a bit.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45n6UHq&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;what-is-hardware-passthrough-really&#34;&gt;What Is Hardware Passthrough, Really?
&lt;/h2&gt;&lt;p&gt;Think of your typical VM setup like a hotel stay. Your VM gets a comfortable room (virtualized hardware), but it shares resources with every other guest. Proxmox, our hypervisor, is the hotel manager allocating what you get and when.&lt;/p&gt;
&lt;p&gt;Hardware passthrough is like buying out an entire floor, with an express elevator. Instead of your VM politely asking Proxmox for GPU power, you hand over the hardware directly. “This is yours, use it as you like.”&lt;/p&gt;
&lt;p&gt;The magic? Your VM’s applications can communicate directly with the hardware, bypassing virtualization overhead. For transcoding, Intel QuickSync runs exactly as it does on bare metal—full.&lt;/p&gt;
&lt;p&gt;But here’s the kicker: when you do proxmox pcie passthrough, you’re snatching that hardware away from the host. Was Proxmox using that GPU for the console display? Guess what just went dark?&lt;/p&gt;
&lt;h2 id=&#34;the-iommu-groups-reality-check&#34;&gt;The IOMMU Groups Reality Check
&lt;/h2&gt;&lt;p&gt;Let’s talk IOMMU groups, the mystical rules determining what hardware you can actually pass through.&lt;/p&gt;
&lt;p&gt;IOMMU (Input-Output Memory Management Unit) groups are like apartment buildings for PCIe devices. Everything in one group shares certain pathways, so you can’t just evict one tenant, you have to pass the whole group to your VM.&lt;/p&gt;
&lt;p&gt;Why does this matter? If your GPU shares an IOMMU group with, say, your network card, you can’t just pass through the GPU. It’s all or nothing. This is where most passthrough dreams go to die.&lt;/p&gt;
&lt;p&gt;The good news? Most modern systems have sensible group layouts, especially for integrated graphics. Intel’s QuickSync, baked into the CPU, usually plays nice.&lt;/p&gt;
&lt;h2 id=&#34;pre-flight-checklist-what-you-actually-need&#34;&gt;Pre-Flight Checklist: What You Actually Need
&lt;/h2&gt;&lt;p&gt;Before you tear apart a perfectly functional Proxmox setup, check these requirements:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hardware Requirements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU with Intel QuickSync (think almost any modern Intel CPU)&lt;/li&gt;
&lt;li&gt;Motherboard with IOMMU/VT-d (enable in BIOS)&lt;/li&gt;
&lt;li&gt;Enough PCIe lanes (if you&amp;rsquo;re using a discrete GPU)&lt;/li&gt;
&lt;li&gt;Backup access to your Proxmox host (SSH, IPMI, or a secondary GPU)&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-danger&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;❌&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Danger:&lt;/strong&gt;
    The Backup Access Point Crucial Detail:
Don’t pass through your only graphics output to a VM without an alternative. SSH is great, until something breaks and you need console access. IPMI is king if you have it, and a basic secondary GPU for the host is even better.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Software Prerequisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxmox VE (obviously)&lt;/li&gt;
&lt;li&gt;A guest OS that supports your hardware&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_i5_12th.jpg&#34; alt=&#34;Intel® Core™ i5-12500 12th Generation Desktop Processor: Forget GPUs. This 12th-gen i5 packs QuickSync with UHD 770 graphics, enough to power 4K → 1080p transcodes like a champ. You’ll push 10&amp;#43; simultaneous 1080p streams with near-zero CPU load. Ideal for low-power, headless Proxmox boxes that run hot and quiet. No dGPU? No problem.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Intel® Core™ i5-12500 12th Generation Desktop Processor&lt;/strong&gt;
This 12th-gen i5 packs QuickSync with UHD 770 graphics, enough to power 4K → 1080p transcodes like a champ. You’ll push 10+ simultaneous 1080p streams with near-zero CPU load. Ideal for low-power, headless Proxmox boxes that run hot and quiet. No dGPU? No problem.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4lGjveC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445833438084862958009096&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fintel-core-i5-12th-gen-core-i5-12500-alder-lake-lga-1700-desktop-cpu-processor%2fp%2fN82E16819118374&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Let’s be honest, if you’re here, your CPU is probably choking on media transcoding while you’re dreaming of QuickSync’s magic.&lt;/p&gt;
&lt;h2 id=&#34;what-is-gpu-passthrough-and-why-should-you-care&#34;&gt;What Is GPU Passthrough and Why Should You Care?
&lt;/h2&gt;&lt;p&gt;GPU passthrough in proxmox means telling Proxmox to stop hogging your GPU and give it directly to your VM. This gives your VM the keys to the Ferrari while Proxmox walks home. For QuickSync, this means Jellyfin or any media workflow will fly through transcoding.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Once you pass that GPU through, your Proxmox host loses access. If it’s your only GPU, the host display output goes dark. Remote access via SSH (or a serial console) is essential, not optional.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;prerequisites-what-youll-need-before-diving-in&#34;&gt;Prerequisites: What You’ll Need Before Diving In
&lt;/h2&gt;&lt;p&gt;Don’t skip the homework before shuffling hardware assignments:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CPU must support IOMMU:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel calls it &lt;code&gt;VT-d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;AMD calls it: &lt;code&gt;AMD-Vi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;And enable it in the BIOS (often OFF by default).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Motherboard must support IOMMU groups properly:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;These groups decide what you can pass through&lt;/li&gt;
&lt;li&gt;Some boards group devices nonsensically, making passthrough a pain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;You need remote access (SSH/IPMI):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Without it, losing your display means flying blind.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;My SSH Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;GPU isolation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The PCIe slot should NOT share an IOMMU group with critical components, or passthrough may not work.&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-danger&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;❌&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Danger:&lt;/strong&gt;
    This is the quickest way to break your server.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;checking-iommu-groups-the-foundation&#34;&gt;Checking IOMMU Groups: The Foundation
&lt;/h2&gt;&lt;p&gt;Check how your system organizes devices. On your Proxmox host:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find /sys/kernel/iommu_groups/ -type l &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sort -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should look something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/0/devices/0000:00:02.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/1/devices/0000:00:00.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/2/devices/0000:00:06.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/3/devices/0000:00:14.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/3/devices/0000:00:14.2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/4/devices/0000:00:15.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/5/devices/0000:00:16.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/6/devices/0000:00:17.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/7/devices/0000:00:1c.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/8/devices/0000:00:1c.2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/9/devices/0000:00:1f.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/9/devices/0000:00:1f.3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/9/devices/0000:00:1f.4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/9/devices/0000:00:1f.5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/10/devices/0000:01:00.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/11/devices/0000:02:00.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/12/devices/0000:02:00.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys/kernel/iommu_groups/13/devices/0000:03:00.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To better ID what these components are run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lspci -nn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Results:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:00.0 Host bridge &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0600&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Device &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:4648&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 02&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:02.0 VGA compatible controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0300&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation AlderLake-S GT1 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:4680&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 0c&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:06.0 PCI bridge &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0604&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation 12th Gen Core Processor PCI Express x4 Controller &lt;span class=&#34;c1&#34;&gt;#0 [8086:464d] (rev 02)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:14.0 USB controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0c03&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH USB 3.2 Gen 2x2 XHCI Controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7ae0&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:14.2 RAM memory &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0500&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH Shared SRAM &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7aa7&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:15.0 Serial bus controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0c80&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller &lt;span class=&#34;c1&#34;&gt;#0 [8086:7acc] (rev 11)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:16.0 Communication controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0780&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH HECI Controller &lt;span class=&#34;c1&#34;&gt;#1 [8086:7ae8] (rev 11)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:17.0 SATA controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0106&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH SATA Controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;AHCI Mode&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7ae2&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:1c.0 PCI bridge &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0604&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH PCI Express Root Port &lt;span class=&#34;c1&#34;&gt;#2 [8086:7ab9] (rev 11)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:1c.2 PCI bridge &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0604&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH PCI Express Root Port &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7aba&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:1f.0 ISA bridge &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0601&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Z690 Chipset LPC/eSPI Controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7a84&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:1f.3 Audio device &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0403&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S HD Audio Controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7ad0&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:1f.4 SMBus &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0c05&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH SMBus Controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7aa3&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00:1f.5 Serial bus controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0c80&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation Alder Lake-S PCH SPI Controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:7aa4&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;01:00.0 Non-Volatile memory controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0108&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Sandisk Corp WD Black SN770 NVMe SSD &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;15b7:5017&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 01&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;02:00.0 Ethernet controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0200&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation &lt;span class=&#34;m&#34;&gt;82576&lt;/span&gt; Gigabit Network Connection &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:10c9&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 01&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;02:00.1 Ethernet controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0200&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Intel Corporation &lt;span class=&#34;m&#34;&gt;82576&lt;/span&gt; Gigabit Network Connection &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;8086:10c9&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 01&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;03:00.0 Ethernet controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;0200&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;10ec:8125&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rev 05&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Find your GPU in the output. Ideally, it stands alone or with non-essential devices. If grouped with essentials (USB, network), you might need to pass more than planned or use ACS override patches (advanced territory that I will not be covering).&lt;/p&gt;
&lt;p&gt;You can see my GPU on &lt;code&gt;00:02.0&lt;/code&gt;. This is my QuickSync GPU.&lt;/p&gt;
&lt;h2 id=&#34;configuring-proxmox-for-gpu-passthrough&#34;&gt;Configuring Proxmox for GPU Passthrough
&lt;/h2&gt;&lt;p&gt;If your hardware checks out, congrats, now on to configuration:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Enable IOMMU in Proxmox:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edit &lt;code&gt;/etc/default/grub&lt;/code&gt; and change &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/default/grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Intel example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;quiet intel_iommu=on iommu=pt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;AMD example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;quiet amd_iommu=on iommu=pt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update grub with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;update-grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Load VFIO modules:&lt;/strong&gt;
Add these to &lt;code&gt;/etc/modules&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/modules
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste these in:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio_iommu_type1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio_pci
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vfio_virqfd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. Blacklist host GPU drivers:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For Intel iGPU (QuickSync):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;blacklist i915&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For NVIDIA:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;blacklist nouveau&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For AMD:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;blacklist amdgpu&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4. Bind GPU to VFIO:&lt;/strong&gt;
Find your GPU’s PCI ID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lspci -nn &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -E &lt;span class=&#34;s2&#34;&gt;&amp;#34;VGA|3D|Display&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then create &lt;code&gt;/etc/modprobe.d/vfio.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /etc/modprobe.d/vfio.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste this (Replace &lt;code&gt;YOUR_GUP_ID&lt;/code&gt; with your ID example &lt;code&gt;00:02.0&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;options vfio-pci ids=YOUR_GPU_ID
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;5. Rebuild initramfs and reboot:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;update-initramfs -u
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then reboot&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;vm-setup-the-fun-part&#34;&gt;VM Setup: The Fun Part
&lt;/h2&gt;&lt;p&gt;In Proxmox UI:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Edit your VM → Hardware → Add PCI Device&lt;/li&gt;
&lt;li&gt;Select your GPU (and its audio function, if present)&lt;/li&gt;
&lt;li&gt;Check “All Functions” and “Primary GPU” if necessary&lt;/li&gt;
&lt;li&gt;For some VMs (Windows), you may need a matching VBIOS/ROM file&lt;/li&gt;
&lt;li&gt;Boot VM and install drivers (Linux: &lt;code&gt;intel-media-driver&lt;/code&gt; for QuickSync, or the Windows/OS driver you need)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Passing through both graphics and audio functions mimics real hardware. The “All Functions” and “Primary GPU” options help make the transition smooth, especially for picky OSes like Windows.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/NUC12.jpg&#34; alt=&#34;Intel NUC 12 Pro (NUC12WSHi5): Compact mini PC for lightweight servers, GPU Passthrough, Docker stacks, and VMs.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Intel NUC 12 Pro (NUC12WSHi5)&lt;/strong&gt;
Compact mini PC for lightweight servers, GPU Passthrough, Docker stacks, and VMs.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3JyPlM4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445831098683742853224568&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fnuc-12-pro-barebone-12th-gen-intel-core-i5-1240p-rnuc12wshi50000%2fp%2f1VK-004K-068E6%3fitem%3d9SIBPASKBH4509&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;troubleshooting-when-things-go-sideways&#34;&gt;Troubleshooting: When Things Go Sideways
&lt;/h2&gt;&lt;p&gt;Proxmox PCIe passthrough feels like wizardry, until it doesn’t. If you get a black screen or your VM crashes, don’t panic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Double-check driver blacklists: One typo can ruin your weekend&lt;/li&gt;
&lt;li&gt;Confirm IOMMU: &lt;code&gt;dmesg | grep IOMMU&lt;/code&gt; should show happy messages&lt;/li&gt;
&lt;li&gt;Rely on SSH/IPMI over the local console&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;/var/log/syslog&lt;/code&gt; and VM logs for PCI errors&lt;/li&gt;
&lt;li&gt;Try another PCI slot or disable peripheral devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your system is completely unresponsive, comment out VFIO and GPU configurations, rebuild initramfs, and reboot. Most disasters are reversible if you don&amp;rsquo;t panic.&lt;/p&gt;
&lt;h2 id=&#34;gotchas-caveats-and-advanced-notes&#34;&gt;Gotchas, Caveats, and Advanced Notes
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Single-GPU pass-through disables your Proxmox host’s display.&lt;/strong&gt;&lt;br&gt;
You &lt;em&gt;will&lt;/em&gt; lose all video output on the host, and recovery requires remote access or another GPU.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NVIDIA consumer cards may throw tantrums.&lt;/strong&gt;&lt;br&gt;
Windows “Code 43” errors can appear.&lt;br&gt;
Hyper-V spoofing and other tweaks often help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QuickSync isn’t always present—verify your CPU model.&lt;/strong&gt;&lt;br&gt;
Xeon CPUs may lack QuickSync even if they have integrated graphics.&lt;br&gt;
Always check official Intel docs:&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://www.intel.com/content/www/us/en/ark.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Intel Product Details&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LXC vs. VM passthrough are different creatures.&lt;/strong&gt;&lt;br&gt;
LXCs share hardware via device mapping.&lt;br&gt;
VMs demand exclusive, full PCI assignment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EULA caveats for consumer GPUs in datacenters.&lt;/strong&gt;&lt;br&gt;
NVIDIA and AMD consumer cards often restrict use in virtualized environments (especially commercial/datacenter).&lt;/p&gt;
&lt;h2 id=&#34;common-misconceptions&#34;&gt;Common Misconceptions
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Myth:&lt;/strong&gt; Any consumer GPU works.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Pro cards (Quadro/Radeon Pro) are better supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Myth:&lt;/strong&gt; Rebooting fixes &lt;em&gt;EVERYTHING&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Sometimes you need to completely remove and re-add the GPU or reset the PCIe slot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Myth:&lt;/strong&gt; Passthrough is rock-solid once it boots.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reality:&lt;/strong&gt; VM restarts may need extra care (cold boots, PCIe resets).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;recovery-best-practices-and-sanity-saving&#34;&gt;Recovery, Best Practices, and Sanity Saving
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use multiple GPUs if possible (one for Proxmox, one for your VM).&lt;/li&gt;
&lt;li&gt;Always set up SSH or IPMI access before tinkering.&lt;/li&gt;
&lt;li&gt;Backup &lt;code&gt;/etc/pve&lt;/code&gt; before major changes.&lt;/li&gt;
&lt;li&gt;Keep copies of your IOMMU and driver blacklist configs.&lt;/li&gt;
&lt;li&gt;If locked out: Boot live USB, chroot, and reverse your changes step-by-step.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For stability:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Match your VM’s drivers to your GPU&lt;/li&gt;
&lt;li&gt;Set VM CPU type to &lt;code&gt;host&lt;/code&gt; or enable passthrough&lt;/li&gt;
&lt;li&gt;Only pass through required PCI devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Successful GPU passthrough means less troubleshooting, and more transcoding, and/or gaming.&lt;/p&gt;
&lt;h2 id=&#34;wrapping-up-your-quicksyncvm-turbocharging-journey&#34;&gt;Wrapping Up: Your QuickSync/VM-Turbocharging Journey
&lt;/h2&gt;&lt;p&gt;GPU passthrough on Proxmox is like taming a clever, unpredictable cat. When it works, your VM doesn’t know it’s virtual anymore, and you’ll watch QuickSync or your RTX card rev through tasks you once thought were impossible. However, when it doesn’t… you’ll become very familiar with the recovery console.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Passthrough gives your VM direct hardware access but your host loses it. Plan accordingly.&lt;/li&gt;
&lt;li&gt;Never pass through your last GPU unless you’re ready for a headless server.&lt;/li&gt;
&lt;li&gt;IOMMU groups, BIOS settings, and Proxmox module configs must all align.&lt;/li&gt;
&lt;li&gt;Backup before making changes.&lt;/li&gt;
&lt;li&gt;Know your command line for when things go wrong, it’s your lifeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The beauty of proxmox pcie passthrough is in blending virtualization flexibility with true GPU performance. Once you nail it, your gpu passthrough virtual machine setup will deliver transcoding, and gaming power without compromise.&lt;/p&gt;
&lt;p&gt;Need more information?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://pve.proxmox.com/wiki/Pci_passthrough&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Proxmox Passthrough Official Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/categories/basics/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DIYMediaServer Guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://forum.proxmox.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Proxmox Forum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now go forth and make your hardware dance. Your QuickSync and GPU passthrough adventure in Proxmox awaits!&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: A Ryzen-powered beast in a mini PC shell. Dual 2.5GbE, 10GbE option, triple NVMe. Small box, big Proxmox energy.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
A Ryzen-powered beast in a mini PC shell. Dual 2.5GbE, 10GbE option, triple NVMe. Small box, big Proxmox energy.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Master the Basics - SMB Guide for Media Servers</title>
        <link>https://diymediaserver.com/post/smb-guide/</link>
        <pubDate>Sat, 09 Aug 2025 05:53:49 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/smb-guide/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/smb-guide/featured.jpg" alt="Featured image of post Master the Basics - SMB Guide for Media Servers" /&gt;&lt;p&gt;You&amp;rsquo;ve got files. You&amp;rsquo;ve got machines. And you&amp;rsquo;re tired of playing sneakernet with USB sticks like some kind of caveman.&lt;/p&gt;
&lt;p&gt;What you want is simple: a shared folder that every device on your network can see. Windows boxes. Macs. That crusty ThinkPad running Ubuntu in the corner. Even your &amp;ldquo;smart&amp;rdquo; TV that somehow needs to stream 4K remuxes but can&amp;rsquo;t figure out basic networking.&lt;/p&gt;
&lt;p&gt;Enter Samba. It&amp;rsquo;s your network&amp;rsquo;s Swiss Army knife, part bouncer, part bartender, part DJ. And once you set it up right, it just works.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Samba turns your Linux box into a file server that every device on your network can actually use. We&#39;ll skip the garbage defaults and build something that streams 4K without stuttering and doesn&#39;t require a PhD to troubleshoot.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ugreen-NAS.jpg&#34; alt=&#34;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS&lt;/strong&gt;
UGREEN NASync DXP4800, 4-Bay NAS with Intel N100 Quad-Core CPU (Up to 3.4GHz) 8GB DDR5, 2x M.2 PCIe Slots and a 2.5GbE Port (Diskless). This is perfect if you don&amp;rsquo;t want to DIY your NAS.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42YZpnB&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445838038135512313043163&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-r5-atx-micro-atx-mid-tower%2fp%2fN82E16811352048&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;when-smb-is-your-best-friend&#34;&gt;When SMB Is Your Best Friend
&lt;/h2&gt;&lt;h3 id=&#34;smb-shines-in-these-scenarios&#34;&gt;SMB shines in these scenarios:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mixed OS chaos&lt;/strong&gt;: Windows, macOS, Linux all playing nice together. No more &amp;ldquo;sorry, your OS isn&amp;rsquo;t supported.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apps that demand SMB&lt;/strong&gt;: Time Machine backups. Windows Explorer mapping. Kodi libraries. Sonos music folders. They speak SMB or they speak nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User-based security&lt;/strong&gt;: You decide who gets in and what they can touch. No more &amp;ldquo;everyone has access to everything&amp;rdquo; nonsense.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dumb devices&lt;/strong&gt;: Your smart TV, IoT gadgets, and network printers don&amp;rsquo;t know NFS from a hole in the ground. But they know SMB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-platform development&lt;/strong&gt;: Same project folder on Windows, Mac, and Linux. No sync conflicts, no version hell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;skip-smb-when&#34;&gt;Skip SMB When&amp;hellip;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux-only network&lt;/strong&gt;: NFS is faster, simpler, and doesn&amp;rsquo;t carry Windows baggage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote access&lt;/strong&gt;: SSHFS or WebDAV won&amp;rsquo;t make you cry when you&amp;rsquo;re connecting over WAN.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;install-samba-debianubuntu&#34;&gt;Install Samba (Debian/Ubuntu)
&lt;/h2&gt;&lt;p&gt;Install the &lt;code&gt;samba&lt;/code&gt; package:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install samba
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. No package maze, no dependency hell.&lt;/p&gt;
&lt;p&gt;Now set the Samba user&amp;rsquo;s password. This is &lt;strong&gt;not&lt;/strong&gt; optional:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo smbpasswd -a yourusername
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    &lt;strong&gt;Why this matters&lt;/strong&gt;: Samba uses its own password database. Your Linux user exists? Great. But without &lt;code&gt;smbpasswd&lt;/code&gt;, you&amp;rsquo;re locked out. I&amp;rsquo;ve watched too many people bang their head against &amp;ldquo;authentication failed&amp;rdquo; errors because they skipped this step.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Start the services:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now smbd nmbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;configuration-file-that-actually-works&#34;&gt;Configuration File That Actually Works
&lt;/h2&gt;&lt;p&gt;Time to ditch the ancient defaults in &lt;code&gt;/etc/samba/smb.conf&lt;/code&gt;. Here&amp;rsquo;s what you actually need.&lt;/p&gt;
&lt;h3 id=&#34;global-settings-with-large-file-transfers-and-security-in-mind&#34;&gt;&lt;code&gt;[global]&lt;/code&gt; Settings: With Large File Transfers and Security in Mind
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;global&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;workgroup&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; WORKGROUP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  netbios &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; MEDIA-SERVER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  server &lt;span class=&#34;nv&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; %h server &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Samba %v&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Security that makes sense&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;security&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; user
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  map to &lt;span class=&#34;nv&#34;&gt;guest&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; Bad User
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Force modern protocols&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  server min &lt;span class=&#34;nv&#34;&gt;protocol&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; SMB2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  server max &lt;span class=&#34;nv&#34;&gt;protocol&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; SMB3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  client min &lt;span class=&#34;nv&#34;&gt;protocol&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; SMB2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Encrypt everything&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  smb &lt;span class=&#34;nv&#34;&gt;encrypt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; required
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Disable insecure features&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  lanman &lt;span class=&#34;nv&#34;&gt;auth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; no
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ntlm &lt;span class=&#34;nv&#34;&gt;auth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; no
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Kill anonymous access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  restrict &lt;span class=&#34;nv&#34;&gt;anonymous&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Network optimizations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  socket &lt;span class=&#34;nv&#34;&gt;options&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; TCP_NODELAY &lt;span class=&#34;nv&#34;&gt;SO_RCVBUF&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;131072&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;SO_SNDBUF&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;131072&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# File transfer optimization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  use &lt;span class=&#34;nv&#34;&gt;sendfile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Async I/O for large files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  aio &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  aio write &lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Reduce metadata overhead&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  strict &lt;span class=&#34;nv&#34;&gt;allocate&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Logging that helps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  log &lt;span class=&#34;nv&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; /var/log/samba/log.%m
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  max log &lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Stop being a DNS server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dns &lt;span class=&#34;nv&#34;&gt;proxy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; no
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Why these settings work&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;security = user&lt;/code&gt;: Per-user authentication. Not &amp;ldquo;everyone&amp;rsquo;s admin&amp;rdquo; madness.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;map to guest = Bad User&lt;/code&gt;: Invalid usernames become guest access (if you allow it).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server min/max protocol&lt;/code&gt;: Forces SMB2/3, ditches the security nightmare that is SMB1.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dns proxy = no&lt;/code&gt;: Samba shouldn&amp;rsquo;t handle DNS. That&amp;rsquo;s your DNS server&amp;rsquo;s job.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smb encrypt = required&lt;/code&gt;: All traffic encrypted. No plaintext passwords floating around.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;restrict anonymous = 2&lt;/code&gt;: Kills guest browsing and anonymous enumeration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lanman/ntlm auth = no&lt;/code&gt;: Forces modern authentication methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;share-definition-where-the-magic-happens&#34;&gt;&lt;code&gt;[share]&lt;/code&gt; Definition: Where the Magic Happens
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;media&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;browseable&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;only&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; no
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  guest &lt;span class=&#34;nv&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; no
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  valid &lt;span class=&#34;nv&#34;&gt;users&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; yourusername
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  force &lt;span class=&#34;nv&#34;&gt;user&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; yourusername
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  create &lt;span class=&#34;nv&#34;&gt;mask&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0660&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  directory &lt;span class=&#34;nv&#34;&gt;mask&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0770&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Why this configuration works&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;force user/group&lt;/code&gt;: Every file gets the same owner. No more permission spaghetti.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create/directory mask&lt;/code&gt;: Sane default permissions. Files get &lt;code&gt;660&lt;/code&gt;, directories get &lt;code&gt;770&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browseable = yes&lt;/code&gt;: Shows up in Windows Network Explorer without extra clicking.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;guest ok = no&lt;/code&gt;: Authentication required. Because security matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/TX201.jpg&#34; alt=&#34;TP-Link 2.5GB PCIe Network Card (TX201)&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;TP-Link 2.5GB PCIe Network Card (TX201)&lt;/strong&gt;
Plug-and-play 2.5GbE PCIe card that unlocks multi-gig speeds for about $30. Works out of the box with Proxmox, Linux, and Windows. No drama—just faster transfers.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4mafK0R&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;troubleshooting-fix-the-usual-suspects&#34;&gt;Troubleshooting: Fix the Usual Suspects
&lt;/h2&gt;&lt;p&gt;Check your configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo testparm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Test shares without leaving the server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;smbclient -L localhost -U yourusername
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check Samba’s view of connected users:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo smbstatus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Watch logs live:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -f /var/log/samba/log.smbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Flush config changes without a reboot:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart smbd nmbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;common-problems-fast-fixes&#34;&gt;Common Problems, Fast Fixes
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&amp;ldquo;Access denied&amp;rdquo; but login works&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check Linux filesystem permissions&lt;/li&gt;
&lt;li&gt;Verify &lt;code&gt;valid users&lt;/code&gt; matches actual usernames&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Share invisible in Windows&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;netbios name&lt;/code&gt; to &lt;code&gt;[global]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Restart both services: &lt;code&gt;sudo systemctl restart smbd nmbd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Windows sometimes caches old network info. Reboot the client.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Slow transfers&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable &lt;code&gt;use sendfile = yes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check your network. Gigabit wired &amp;gt; WiFi &amp;gt; carrier pigeon&lt;/li&gt;
&lt;li&gt;Large files? Enable async I/O settings above&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Mount error: Protocol not supported&amp;rdquo;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Client trying to use SMB1&lt;/li&gt;
&lt;li&gt;Fix: &lt;code&gt;mount -t cifs //server/share /mnt -o vers=3.0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Nuclear Option:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When nothing else works:
Stop &lt;code&gt;samba&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl stop smbd nmbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remove samba&amp;rsquo;s cache files:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rm /var/cache/samba/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start &lt;code&gt;samba&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start smbd nmbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;real-world-scenarios&#34;&gt;Real-World Scenarios
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Media Server Hub:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Point Jellyfin, Plex, or Kodi at your SMB share. Works across containers, VMs, and bare metal. One library, every device.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Development Folder&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Same codebase accessible from your Windows IDE, Mac laptop, and Linux server. No git commits just to move files around.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Backup Target&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Time Machine over SMB. Veeam backups. Even &lt;code&gt;rsync&lt;/code&gt; via mounted shares. Central storage that everything can hit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cheap NAS Alternative&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Old PC + big drives + Samba = network storage that doesn&amp;rsquo;t cost $800.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;smb-vs-the-alternatives&#34;&gt;SMB vs. The Alternatives
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;SMB&lt;/th&gt;
          &lt;th&gt;NFS&lt;/th&gt;
          &lt;th&gt;SSHFS&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows native&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS native&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Performance (LAN)&lt;/td&gt;
          &lt;td&gt;Good&lt;/td&gt;
          &lt;td&gt;Excellent&lt;/td&gt;
          &lt;td&gt;Okay&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Security over WAN&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Setup complexity&lt;/td&gt;
          &lt;td&gt;Medium&lt;/td&gt;
          &lt;td&gt;Low&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Device compatibility&lt;/td&gt;
          &lt;td&gt;Excellent&lt;/td&gt;
          &lt;td&gt;Poor&lt;/td&gt;
          &lt;td&gt;Poor&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;The verdict&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMB wins on compatibility.&lt;/li&gt;
&lt;li&gt;NFS wins on pure speed.&lt;/li&gt;
&lt;li&gt;SSHFS wins on security.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pick your poison based on what matters most.&lt;/p&gt;
&lt;h2 id=&#34;the-mac-update-that-broke-everything&#34;&gt;The mac Update That Broke Everything
&lt;/h2&gt;&lt;p&gt;Client calls at 5 PM. &amp;ldquo;My media server just died.&amp;rdquo; Nothing changed on his end except a macOS update.&lt;/p&gt;
&lt;p&gt;The culprit? Apple dropped SMB1 support. His Samba config was still allowing the old protocol, and macOS decided it wasn&amp;rsquo;t secure enough anymore.&lt;/p&gt;
&lt;p&gt;One line in &lt;code&gt;/etc/samba/smb.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server min &lt;span class=&#34;nv&#34;&gt;protocol&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; SMB2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Five minutes later, his movie night was back on track.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lesson learned&lt;/strong&gt;: Always set your protocol minimums. Let the OS updates come. You&amp;rsquo;ll be ready.&lt;/p&gt;
&lt;h2 id=&#34;the-bottom-line&#34;&gt;The Bottom Line
&lt;/h2&gt;&lt;p&gt;Samba isn&amp;rsquo;t sexy. It&amp;rsquo;s not the hot new container orchestration platform. It doesn&amp;rsquo;t have a JavaScript framework named after it.&lt;/p&gt;
&lt;p&gt;But it works. It connects everything to everything else. And once you configure it right, it fades into the background and just does its job.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the best kind of technology.&lt;/p&gt;
&lt;h2 id=&#34;your-network-your-rules&#34;&gt;Your Network, Your Rules
&lt;/h2&gt;&lt;p&gt;Stop wrestling with cloud sync conflicts and USB cable hell. Set up a proper SMB share. Stream your movies without stuttering. Back up your machines to something you control.&lt;/p&gt;
&lt;p&gt;Because when you run your own file server, you&amp;rsquo;re not just sharing files, you&amp;rsquo;re taking back control of your data. And that&amp;rsquo;s worth the thirty minutes it takes to get Samba running right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to build something that works?&lt;/strong&gt; Start with the basic config above, test it with one device, then expand from there. Your future self will thank you when everything just connects.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Master the Basics - NFS Guide for Media Servers</title>
        <link>https://diymediaserver.com/post/nfs-guide/</link>
        <pubDate>Sat, 02 Aug 2025 07:46:39 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/nfs-guide/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/nfs-guide/featured.jpg" alt="Featured image of post Master the Basics - NFS Guide for Media Servers" /&gt;&lt;p&gt;You spin up an NFS share and think you&amp;rsquo;re done. Your media server is humming, files are flowing, everything looks perfect. But here&amp;rsquo;s what you probably missed: you just gave every client&amp;rsquo;s root user complete administrative access to your server. That &amp;ldquo;quick setup&amp;rdquo; you found online? It basically handed out master keys to anyone on your network.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t panic. We&amp;rsquo;ve all been there. The good news? Setting up NFS properly isn&amp;rsquo;t rocket science once you understand what&amp;rsquo;s actually happening under the hood. Let me walk you through building an NFS setup that&amp;rsquo;s fast, secure, and won&amp;rsquo;t make you lose sleep at night.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Use `root_squash` to keep remote root users from becoming your new system admin. Lock down access to specific trusted IPs, not your entire network. Always use `sync` because files sitting in memory aren&#39;t actually saved files, they&#39;re just hopes. Never touch `no_root_squash` unless you&#39;d literally give that client machine your banking passwords. Get your user IDs sorted across all systems, or use `all_squash` to sidestep the whole mess.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ugreen-NAS.jpg&#34; alt=&#34;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS&lt;/strong&gt;
UGREEN NASync DXP4800, 4-Bay NAS with Intel N100 Quad-Core CPU (Up to 3.4GHz) 8GB DDR5, 2x M.2 PCIe Slots and a 2.5GbE Port (Diskless). This is perfect if you don&amp;rsquo;t want to DIY your NAS.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42YZpnB&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445838038135512313043163&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-r5-atx-micro-atx-mid-tower%2fp%2fN82E16811352048&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-nfs-matters-for-your-home-lab&#34;&gt;Why NFS Matters for Your Home Lab
&lt;/h2&gt;&lt;p&gt;Network File System (NFS) is the backbone of most serious home media setups. Unlike Samba (which can be sluggish) or FTP (which is a pain for media apps), NFS gives you near-native filesystem performance across your network. Your Jellyfin server, Sonarr, Radarr, and download clients can all share the same storage seamlessly.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the catch: NFS was designed back when networks were trusted and security was someone else&amp;rsquo;s problem. It assumes every client is honest about who they are. Spoiler alert: that&amp;rsquo;s not how the real world works.&lt;/p&gt;
&lt;h2 id=&#34;understanding-nfs-security-why-your-setup-matters&#34;&gt;Understanding NFS Security: Why Your Setup Matters
&lt;/h2&gt;&lt;p&gt;Before we dive into the technical stuff, let&amp;rsquo;s talk about why NFS security isn&amp;rsquo;t just paranoid overthinking. When you share a folder via NFS, you&amp;rsquo;re essentially saying &amp;ldquo;hey network, here&amp;rsquo;s some storage you can use.&amp;rdquo; The problem is that NFS trusts whatever user ID (UID) the client claims to be.&lt;/p&gt;
&lt;p&gt;Think about it: if your client machine says &amp;ldquo;hey, I&amp;rsquo;m root (UID 0), give me access,&amp;rdquo; NFS just shrugs and says &amp;ldquo;sure thing, boss.&amp;rdquo; That client can now read, write, delete, and modify permissions on anything in your share. Not exactly what you had in mind when you just wanted to stream some movies.&lt;/p&gt;
&lt;p&gt;This is where &amp;ldquo;squashing&amp;rdquo; comes in. This is NFS&amp;rsquo;s way of saying &amp;ldquo;I don&amp;rsquo;t care who you claim to be, you&amp;rsquo;re getting mapped to this safe user instead.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;setting-up-the-nfs-server&#34;&gt;Setting Up the NFS Server
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Install NFS server:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install nfs-kernel-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Create your share directory. For media servers, something like &lt;code&gt;/media/storage&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Create the folder:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set the ownership of the folder:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R nobody:nogroup /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set the permissions on the folder:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod &lt;span class=&#34;m&#34;&gt;755&lt;/span&gt; /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Why &lt;code&gt;nobody:nogroup&lt;/code&gt;? This gives us a safe default owner that unprivileged processes can work with.
  &lt;/div&gt;
&lt;/div&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Configure Your Exports&lt;/p&gt;
&lt;p&gt;Open up &lt;code&gt;/etc/exports&lt;/code&gt; in your favorite editor and add your share configuration. Here&amp;rsquo;s where the magic happens:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/media/storage 192.168.1.0/24&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rw,sync,no_subtree_check,root_squash&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s break this down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/srv/media&lt;/code&gt;: The directory you&amp;rsquo;re sharing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;192.168.1.0/24&lt;/code&gt;: Your network subnet (adjust this to match your actual network)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rw&lt;/code&gt;: Read-write access&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync&lt;/code&gt;: Wait for writes to complete before responding (more on this later)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no_subtree_check&lt;/code&gt;: Skip path validation for better performance&lt;/li&gt;
&lt;li&gt;&lt;code&gt;root_squash&lt;/code&gt;: Map remote root to nobody user&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Apply and Start NFS&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo exportfs -ra sudo systemctl restart nfs-kernel-server sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; nfs-kernel-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note: The &lt;code&gt;-ra&lt;/code&gt; flag tells NFS to re-export all shares and apply your new configuration.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;nfs-squash-options-your-security-toolkit&#34;&gt;NFS Squash Options: Your Security Toolkit
&lt;/h2&gt;&lt;p&gt;This is where most people get confused, so let&amp;rsquo;s make it crystal clear.&lt;/p&gt;
&lt;h3 id=&#34;root_squash-the-sensible-default&#34;&gt;root_squash: The Sensible Default
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/media/storage 192.168.1.100&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rw,sync,root_squash&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you use &lt;code&gt;root_squash&lt;/code&gt;, any client claiming to be root (UID 0) gets mapped to the &lt;code&gt;nobody&lt;/code&gt; user instead. This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Root can&amp;rsquo;t change file ownership&lt;/li&gt;
&lt;li&gt;Root can&amp;rsquo;t set special permissions&lt;/li&gt;
&lt;li&gt;Root can&amp;rsquo;t access files owned by other users&lt;/li&gt;
&lt;li&gt;Your server stays safe from root-level shenanigans&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use this for:&lt;/strong&gt; Pretty much everything unless you have a specific reason not to.&lt;/p&gt;
&lt;h3 id=&#34;all_squash-maximum-security-this-is-what-i-use&#34;&gt;all_squash: Maximum Security (This is what I use)
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/media/storage 192.168.1.100&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rw,sync,all_squash,anonuid&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1000,anongid&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With &lt;code&gt;all_squash&lt;/code&gt;, &lt;em&gt;everyone&lt;/em&gt; gets mapped to the anonymous user you specify. This is like having a shared account where nobody can tell who did what.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    &lt;strong&gt;Use this for:&lt;/strong&gt; Public drop folders, backup destinations, or anywhere you want maximum simplicity and security.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;no_root_squash-danger-zone&#34;&gt;no_root_squash: Danger Zone
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/media/storage 192.168.1.100&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;rw,sync,no_root_squash&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This disables squashing entirely. Remote root stays root with full privileges.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-danger&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;❌&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Danger:&lt;/strong&gt;
    &lt;strong&gt;Use this for:&lt;/strong&gt; Honestly? Almost never in a home setup. Maybe for Proxmox backup storage or if you&amp;rsquo;re doing system imaging. Just remember: only use this if you&amp;rsquo;d trust that client with SSH root access to your server.
  &lt;/div&gt;
&lt;/div&gt;

&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Option&lt;/th&gt;
          &lt;th&gt;Who’s Root on Client&lt;/th&gt;
          &lt;th&gt;Permissions on Server&lt;/th&gt;
          &lt;th&gt;Best For&lt;/th&gt;
          &lt;th&gt;Danger Level&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;root_squash&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Root becomes &lt;code&gt;nfsnobody&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Limited, can’t chown/setuid&lt;/td&gt;
          &lt;td&gt;Multi-user environments&lt;/td&gt;
          &lt;td&gt;🟢 Low&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;all_squash&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Everyone becomes &lt;code&gt;anonuid&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Everyone writes as same safe user&lt;/td&gt;
          &lt;td&gt;Guest shares, dropzones&lt;/td&gt;
          &lt;td&gt;🟡 Medium&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;no_root_squash&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Root stays root&lt;/td&gt;
          &lt;td&gt;Full control&lt;/td&gt;
          &lt;td&gt;Proxmox backups (maybe)&lt;/td&gt;
          &lt;td&gt;🔴 High&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;nfs-client-setup-connecting-the-pieces&#34;&gt;NFS Client Setup: Connecting the Pieces
&lt;/h2&gt;&lt;p&gt;Now let&amp;rsquo;s get your client machines connected properly.&lt;/p&gt;
&lt;h3 id=&#34;install-client-tools&#34;&gt;Install Client Tools
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install nfs-common
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;create-mount-points&#34;&gt;Create Mount Points
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;test-your-connection&#34;&gt;Test Your Connection
&lt;/h3&gt;&lt;p&gt;Before making anything permanent, test your mount:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -t nfs 192.168.1.5:/media/storage /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If this works, you should be able to &lt;code&gt;ls /mnt/media&lt;/code&gt; and see your shared content.&lt;/p&gt;
&lt;h3 id=&#34;make-it-permanent&#34;&gt;Make It Permanent
&lt;/h3&gt;&lt;p&gt;Add this line to &lt;code&gt;/etc/fstab&lt;/code&gt; to mount automatically on boot:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.1.5:/media/storage /mnt/media nfs defaults,nfsvers&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;4,hard,intr &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/TX201.jpg&#34; alt=&#34;TP-Link 2.5GB PCIe Network Card (TX201)&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;TP-Link 2.5GB PCIe Network Card (TX201)&lt;/strong&gt;
Plug-and-play 2.5GbE PCIe card that unlocks multi-gig speeds for about $30. Works out of the box with Proxmox, Linux, and Windows. No drama—just faster transfers.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4mafK0R&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;additional-details&#34;&gt;Additional Details
&lt;/h2&gt;&lt;h3 id=&#34;the-sync-vs-async-debate-why-data-integrity-matters&#34;&gt;The sync vs async Debate: Why Data Integrity Matters
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s a crucial decision that affects both performance and safety.&lt;/p&gt;
&lt;h4 id=&#34;sync-the-safe-choice&#34;&gt;sync: The Safe Choice
&lt;/h4&gt;&lt;p&gt;With &lt;code&gt;sync&lt;/code&gt;, your NFS server waits for each write to actually hit the disk before telling the client &amp;ldquo;yep, that&amp;rsquo;s saved.&amp;rdquo; It&amp;rsquo;s slower, but your data is actually safe.&lt;/p&gt;
&lt;h4 id=&#34;async-the-fast-and-furious-option&#34;&gt;async: The Fast and Furious Option
&lt;/h4&gt;&lt;p&gt;With &lt;code&gt;async&lt;/code&gt;, the server says &amp;ldquo;sure, I&amp;rsquo;ll save that&amp;rdquo; and returns immediately, even if the data is still sitting in memory. It&amp;rsquo;s faster, but if your server crashes, you might lose recent writes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The verdict:&lt;/strong&gt; Use &lt;code&gt;sync&lt;/code&gt; unless you&amp;rsquo;re running benchmarks or you enjoy living dangerously. Your media library is worth the small performance hit.&lt;/p&gt;
&lt;h3 id=&#34;solving-the-uidgid-nightmare&#34;&gt;Solving the UID/GID Nightmare
&lt;/h3&gt;&lt;p&gt;This is where many NFS setups fall apart. Here&amp;rsquo;s the problem: your Jellyfin server runs as user ID 998 on one machine, but your download client runs as user ID 1001 on another. When they try to access the same files over NFS, permissions explode.&lt;/p&gt;
&lt;h4 id=&#34;the-manual-approach&#34;&gt;The Manual Approach
&lt;/h4&gt;&lt;p&gt;Align user IDs across all your machines:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# On each client machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; sonarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo groupmod -g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;the-group-approach-recommended&#34;&gt;The Group Approach (Recommended)
&lt;/h4&gt;&lt;p&gt;Create a shared group and add all your media services to it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# On the NFS server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo groupadd -g &lt;span class=&#34;m&#34;&gt;2000&lt;/span&gt; mediausers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chgrp -R mediausers /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod -R &lt;span class=&#34;m&#34;&gt;775&lt;/span&gt; /media/storage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# On each client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -a -G mediausers jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -a -G mediausers sonarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This way, everyone in the &lt;code&gt;mediausers&lt;/code&gt; group can read and write, regardless of their individual user IDs.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;nfsv3-vs-nfsv4-choosing-your-version&#34;&gt;NFSv3 vs NFSv4: Choosing Your Version
&lt;/h2&gt;&lt;p&gt;Understanding the differences helps you make the right choice.&lt;/p&gt;
&lt;h3 id=&#34;nfsv3-the-old-reliable&#34;&gt;NFSv3: The Old Reliable
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uses multiple ports (2049 plus random high ports)&lt;/li&gt;
&lt;li&gt;Separate daemons for locking and status&lt;/li&gt;
&lt;li&gt;Simpler protocol, potentially faster for basic operations&lt;/li&gt;
&lt;li&gt;Pain in the neck for firewalls&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;nfsv4-the-modern-choice&#34;&gt;NFSv4: The Modern Choice
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Single port (2049)&lt;/li&gt;
&lt;li&gt;Built-in locking and security&lt;/li&gt;
&lt;li&gt;Better support for ACLs and modern features&lt;/li&gt;
&lt;li&gt;Slightly more overhead but much easier to secure&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    Go with NFSv4 unless you have specific legacy requirements. It&amp;rsquo;s easier to firewall and generally more robust.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;mount-options-that-actually-matter&#34;&gt;Mount Options That Actually Matter
&lt;/h2&gt;&lt;p&gt;The default mount options are okay, but you can do better:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.1.5:/media/storage /mnt/media nfs hard,intr,nfsvers&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;4,rsize&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1048576,wsize&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1048576,noatime &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s break down what each option does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hard&lt;/code&gt;: Don&amp;rsquo;t give up on network failures, keep retrying&lt;/li&gt;
&lt;li&gt;&lt;code&gt;intr&lt;/code&gt;: Allow interruption with Ctrl+C if things get stuck&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nfsvers=4&lt;/code&gt;: Force NFSv4 for better security and single-port operation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rsize/wsize=1048576&lt;/code&gt;: Use 1MB read/write buffers for better performance&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noatime&lt;/code&gt;: Don&amp;rsquo;t update access timestamps, reduces I/O overhead&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;docker-and-nfs-the-right-way&#34;&gt;Docker and NFS: The Right Way
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a common mistake: mounting NFS shares directly inside Docker containers. Don&amp;rsquo;t do this. It&amp;rsquo;s unreliable and causes weird permission issues.&lt;/p&gt;
&lt;p&gt;Instead, mount NFS on your Docker host and bind-mount into containers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Mount on the host first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount 192.168.1.5:/media/storage /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Then use in docker-compose.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - /mnt/media:/data/movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    user: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1000:1000&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Match your media user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This approach is more reliable and gives you better control over permissions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;firewall-configuration-locking-down-access&#34;&gt;Firewall Configuration: Locking Down Access
&lt;/h2&gt;&lt;p&gt;Out of the box, NFSv3 can open multiple ports, which is a security nightmare. Here&amp;rsquo;s how to lock it down:&lt;/p&gt;
&lt;h3 id=&#34;for-nfsv3-if-you-must&#34;&gt;For NFSv3 (If You Must)
&lt;/h3&gt;&lt;p&gt;You&amp;rsquo;ll need to pin the additional services to specific ports. Add this to &lt;code&gt;/etc/default/nfs-kernel-server&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RPCMOUNTDOPTS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;--manage-gids --port 32767&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;STATDOPTS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;--port 32765 --outgoing-port 32766&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then restart NFS and open the ports:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart nfs-kernel-server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw allow from 192.168.1.0/24 to any port &lt;span class=&#34;m&#34;&gt;2049&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw allow from 192.168.1.0/24 to any port 32765:32767
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;for-nfsv4-recommended&#34;&gt;For NFSv4 (Recommended)
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw allow from 192.168.1.0/24 to any port &lt;span class=&#34;m&#34;&gt;2049&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;common-nfs-problems-and-how-to-fix-them&#34;&gt;Common NFS Problems and How to Fix Them
&lt;/h2&gt;&lt;h3 id=&#34;stale-file-handles&#34;&gt;Stale File Handles
&lt;/h3&gt;&lt;p&gt;This happens when you move or delete files on the server while clients are accessing them. The fix is usually a remount:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo umount /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount 192.168.1.5:/media/storage /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To prevent this, avoid editing files directly on the NFS share. Instead, work on files locally and then move them into place when complete.&lt;/p&gt;
&lt;p&gt;For example, if you&amp;rsquo;re processing a video file, edit it in &lt;code&gt;/tmp/processing/movie.mkv&lt;/code&gt; and then mv &lt;code&gt;/tmp/processing/movie.mkv&lt;/code&gt; to &lt;code&gt;/mnt/media/movies/movie.mkv&lt;/code&gt; when done. This way, NFS clients either see the old file or the new file, never a half-written mess that causes stale handles.&lt;/p&gt;
&lt;h3 id=&#34;performance-issues&#34;&gt;Performance Issues
&lt;/h3&gt;&lt;p&gt;If NFS feels slow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check your network, gigabit Ethernet minimum for media streaming&lt;/li&gt;
&lt;li&gt;Verify your disk I/O isn&amp;rsquo;t the bottleneck with &lt;code&gt;iostat -x 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Try increasing rsize/wsize values in your mount options&lt;/li&gt;
&lt;li&gt;Consider NFSv4 if you&amp;rsquo;re still on v3&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;permission-denied-errors&#34;&gt;Permission Denied Errors
&lt;/h3&gt;&lt;p&gt;Usually a UID/GID mismatch. Check:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What user/group owns the files on the server?&lt;/li&gt;
&lt;li&gt;What user/group is your client process running as?&lt;/li&gt;
&lt;li&gt;Are your squash settings allowing the access you need?&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;performance-tuning-and-benchmarking&#34;&gt;Performance Tuning and Benchmarking
&lt;/h2&gt;&lt;p&gt;Don&amp;rsquo;t just assume your NFS setup is fast, measure it:&lt;/p&gt;
&lt;h3 id=&#34;basic-write-test&#34;&gt;Basic Write Test
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dd &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/dev/zero &lt;span class=&#34;nv&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/mnt/media/testfile &lt;span class=&#34;nv&#34;&gt;bs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1M &lt;span class=&#34;nv&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;real-world-performance-testing&#34;&gt;Real-World Performance Testing
&lt;/h3&gt;&lt;p&gt;Install &lt;code&gt;fio&lt;/code&gt; for more realistic testing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install fio
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Test random read/write (simulates media streaming)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fio --name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;nfs-test --ioengine&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;libaio --rw&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;randrw --bs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;64k --size&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1G --numjobs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; --runtime&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;60&lt;/span&gt; --group_reporting --filename&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/mnt/media/fiotest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sustained throughput above 100MB/s for 4K media streaming&lt;/li&gt;
&lt;li&gt;Low latency (under 10ms for most operations)&lt;/li&gt;
&lt;li&gt;No dramatic performance drops under load&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;advanced-security-beyond-basic-ip-filtering&#34;&gt;Advanced Security: Beyond Basic IP Filtering
&lt;/h2&gt;&lt;h3 id=&#34;using-hostsallow-and-hostsdeny&#34;&gt;Using hosts.allow and hosts.deny
&lt;/h3&gt;&lt;p&gt;Add an extra layer of access control:
Add this to &lt;code&gt;/etc/hosts.allow&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpcbind mountd nfsd statd lockd rquotad : 192.168.1.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add this to &lt;code&gt;/etc/hosts.deny&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpcbind mountd nfsd statd lockd rquotad : ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;network-segmentation&#34;&gt;Network Segmentation
&lt;/h3&gt;&lt;p&gt;Consider putting your NFS traffic on a dedicated VLAN or subnet. This limits the blast radius if something goes wrong and makes monitoring easier.&lt;/p&gt;
&lt;h2 id=&#34;your-nfs-pre-flight-checklist&#34;&gt;Your NFS Pre-Flight Checklist
&lt;/h2&gt;&lt;p&gt;Before you call your setup &amp;ldquo;done,&amp;rdquo; verify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Squash options are configured for your security needs&lt;/li&gt;
&lt;li&gt;✅ You&amp;rsquo;re using &lt;code&gt;sync&lt;/code&gt; for data safety&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;no_subtree_check&lt;/code&gt; is enabled for performance&lt;/li&gt;
&lt;li&gt;✅ IP restrictions are tight and tested from allowed/denied hosts&lt;/li&gt;
&lt;li&gt;✅ Firewall rules only allow access from trusted networks&lt;/li&gt;
&lt;li&gt;✅ User IDs are aligned or properly squashed&lt;/li&gt;
&lt;li&gt;✅ Docker containers use host bind mounts, not direct NFS mounts&lt;/li&gt;
&lt;li&gt;✅ Mount options include &lt;code&gt;hard,intr,nfsvers=4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;✅ You&amp;rsquo;ve tested normal operations and permissions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;wrapping-up-nfs-that-actually-works&#34;&gt;Wrapping Up: NFS That Actually Works
&lt;/h2&gt;&lt;p&gt;Look, anyone can copy-paste some commands and get NFS technically functioning. But there&amp;rsquo;s a massive difference between &amp;ldquo;technically working&amp;rdquo; and &amp;ldquo;rock-solid reliable.&amp;rdquo; One approach gets you streaming tonight but leaves you troubleshooting permission disasters next month. The other gets you streaming tonight and still working flawlessly two years from now.&lt;/p&gt;
&lt;p&gt;The security stuff isn&amp;rsquo;t paranoia, it&amp;rsquo;s insurance. Those squash settings and firewall rules seem like overkill until the day they save you from a client machine that&amp;rsquo;s been compromised or misconfigured. Your media server should be boring in the best possible way: it just works, day after day, without drama.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;ve done NFS right, you&amp;rsquo;ll forget it exists. Your Jellyfin scans will run smoothly, your download clients will move files without hiccups, and you&amp;rsquo;ll never get woken up by permission errors. That&amp;rsquo;s not luck, that&amp;rsquo;s good engineering.&lt;/p&gt;
&lt;p&gt;Build it once, build it right, then move on to the next cool project in your lab. Your future self will thank you for not cutting corners.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Jellyfin &#43; Intel QuickSync in Unprivileged LXC - The Complete Guide</title>
        <link>https://diymediaserver.com/post/jellyfin_intel_quicksync_unprivileged_lxc/</link>
        <pubDate>Sat, 26 Jul 2025 07:46:41 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/jellyfin_intel_quicksync_unprivileged_lxc/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/jellyfin_intel_quicksync_unprivileged_lxc/featured.jpg" alt="Featured image of post Jellyfin &#43; Intel QuickSync in Unprivileged LXC - The Complete Guide" /&gt;&lt;h2 id=&#34;why-everyone-gets-this-wrong&#34;&gt;Why Everyone Gets This Wrong
&lt;/h2&gt;&lt;p&gt;People treat unprivileged LXC like it&amp;rsquo;s cursed black magic. &amp;ldquo;You can&amp;rsquo;t do NFS!&amp;rdquo; &amp;ldquo;GPU passthrough is impossible!&amp;rdquo; &amp;ldquo;Just use a VM, it&amp;rsquo;s easier!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complete bullshit.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You absolutely can run Jellyfin with Intel QuickSync transcoding in an unprivileged LXC container. The problem isn&amp;rsquo;t the technology, it&amp;rsquo;s that most tutorials skip the crucial details or rely on hacky workarounds that break on the first system update.&lt;/p&gt;
&lt;p&gt;This guide walks you through the &lt;em&gt;proper&lt;/em&gt; way to set up hardware-accelerated Jellyfin transcoding in an unprivileged LXC on Proxmox. No sketchy scripts. No Snap packages. No privileged containers. Just clean, secure, transcoding.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Yes, Intel QuickSync works in unprivileged LXC. All you need is to give the container access to the GPU, map its group IDs to match the host, install Intel drivers and Jellyfin using APT (not Snap), and flip the hardware transcoding switch in Jellyfin. The result? A secure, lightweight setup that chews through simultaneous 1080p streams without breaking a sweat.

&lt;/div&gt;
&lt;h2 id=&#34;why-vms-are-overkill-for-this-job&#34;&gt;Why VMs Are Overkill for This Job
&lt;/h2&gt;&lt;p&gt;Before we dive in, let&amp;rsquo;s destroy the lazy &amp;ldquo;just use a VM&amp;rdquo; argument once and for all.&lt;/p&gt;
&lt;h3 id=&#34;the-resource-waste-is-criminal&#34;&gt;The Resource Waste is Criminal
&lt;/h3&gt;&lt;p&gt;Running Jellyfin in a VM means you&amp;rsquo;re literally wasting resources you paid for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Memory: 512MB-1GB VM overhead vs. 10-20MB for LXC&lt;/li&gt;
&lt;li&gt;Storage: 12-20GB VM footprint vs. 400-800MB container&lt;/li&gt;
&lt;li&gt;Boot time: 30-60 seconds vs. 2-5 seconds&lt;/li&gt;
&lt;li&gt;Backups: 10-20GB snapshots vs. 200-500MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On a typical 16GB homelab box, that VM overhead costs you 2-3 additional services you could be running.&lt;/p&gt;
&lt;h3 id=&#34;gpu-passthrough-complexity&#34;&gt;GPU Passthrough Complexity
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VM route:&lt;/strong&gt; VFIO setup, IOMMU groups, driver blacklisting, potential single-GPU nightmares.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LXC route:&lt;/strong&gt; Map device nodes. Done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every disk I/O and network packet in a VM goes through unnecessary virtualization layers. LXC gives you direct host kernel access with zero translation overhead.&lt;/p&gt;
&lt;h3 id=&#34;the-easier-myth&#34;&gt;The &amp;ldquo;Easier&amp;rdquo; Myth
&lt;/h3&gt;&lt;p&gt;People claim VMs are &amp;ldquo;easier&amp;rdquo; because they&amp;rsquo;re familiar. That&amp;rsquo;s not easier. That&amp;rsquo;s just lazy.
You are wasting resources, creating a more complex GPU passthrough, larger backups, and full OS maintenance overhead for zero benefit. VMs make sense for different kernels, untrusted workloads, or legacy apps that need system control.
For a media server? Not so much.&lt;/p&gt;
&lt;h3 id=&#34;the-real-reason&#34;&gt;The Real Reason
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Fear.&lt;/strong&gt; Fear of learning device mapping. Fear of doing things better instead of familiar.
This guide eliminates that fear. Once you understand LXC device passthrough, you&amp;rsquo;ll wonder why you ever considered wasting resources on a VM for simple application hosting.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites-what-you-need&#34;&gt;Prerequisites: What You Need
&lt;/h2&gt;&lt;h3 id=&#34;hardware-requirements&#34;&gt;Hardware Requirements
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Intel 8th gen CPU or newer with integrated graphics (Coffee Lake+)&lt;/li&gt;
&lt;li&gt;QuickSync support enabled in BIOS&lt;/li&gt;
&lt;li&gt;Proxmox VE 7.0+ host&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_i5_12th.jpg&#34; alt=&#34;Intel® Core™ i5-12500 12th Generation Desktop Processor&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Intel® Core™ i5-12500 12th Generation Desktop Processor&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Forget GPUs. This 12th-gen i5 packs QuickSync with UHD 770 graphics, enough to power 4K → 1080p transcodes like a champ. You’ll push 10+ simultaneous 1080p streams with near-zero CPU load. Ideal for low-power, headless Proxmox boxes that run hot and quiet. No dGPU? No problem.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4lGjveC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445833438084862958009096&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fintel-core-i5-12th-gen-core-i5-12500-alder-lake-lga-1700-desktop-cpu-processor%2fp%2fN82E16819118374&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;supported-codecs&#34;&gt;Supported Codecs
&lt;/h3&gt;&lt;p&gt;Intel QuickSync can hardware-accelerate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;H.264&lt;/strong&gt; (AVC) - encode/decode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H.265&lt;/strong&gt; (HEVC) - encode/decode (9th gen+)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VP9&lt;/strong&gt; - decode only (some newer CPUs)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AV1&lt;/strong&gt; - decode only (12th gen+)&lt;/li&gt;
&lt;/ul&gt;








  
  

&lt;div class=&#34;alert alert-danger&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;❌&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Danger:&lt;/strong&gt;
    &lt;p&gt;This is an in-depth topic.&lt;/p&gt;
&lt;p&gt;Any missed or skipped details could casue Quicksync transcoding to not work correctly.&lt;/p&gt;
&lt;p&gt;All commands and confs have been tested and re-tested to ensure everything is accurate.&lt;/p&gt;

  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-1-verify-your-hardware-setup&#34;&gt;Step 1: Verify Your Hardware Setup
&lt;/h2&gt;&lt;p&gt;Before diving into container configuration, confirm your hardware is ready.&lt;/p&gt;
&lt;h3 id=&#34;check-igpu-detection&#34;&gt;Check iGPU Detection
&lt;/h3&gt;&lt;p&gt;On your Proxmox host:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -la /dev/dri/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crw-rw---- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root video 226,   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; card0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crw-rw---- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root render 226, &lt;span class=&#34;m&#34;&gt;128&lt;/span&gt; renderD128
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;card0&lt;/code&gt; - Display interface (major:minor = 226:0)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;renderD128&lt;/code&gt; - Render interface for compute (major:minor = 226:128)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;understanding-device-majorminor-numbers&#34;&gt;Understanding Device Major:Minor Numbers
&lt;/h3&gt;&lt;p&gt;When you see &lt;code&gt;226:0&lt;/code&gt; and &lt;code&gt;226:128&lt;/code&gt; in the GPU device configuration, these aren&amp;rsquo;t random numbers, they&amp;rsquo;re part of Linux&amp;rsquo;s device identification system. Understanding them is crucial for GPU passthrough because you need to grant the container permission to access these specific device numbers.&lt;/p&gt;
&lt;h4 id=&#34;what-the-hell-are-majorminor-device-numbers&#34;&gt;What the Hell Are Major:Minor Device Numbers?
&lt;/h4&gt;&lt;p&gt;In Linux, every hardware device is represented by a file in &lt;code&gt;/dev/&lt;/code&gt;. But don&amp;rsquo;t get too excited, are not files you can open and modify. They are more like hotline numbers that the kernel uses to dial up the right hardware driver.&lt;/p&gt;
&lt;h4 id=&#34;each-device-file-has-two-id-numbers&#34;&gt;Each device file has two ID numbers:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Major Number: Identifies the device driver/subsystem&lt;/li&gt;
&lt;li&gt;Minor Number: Identifies the specific device within that subsystem&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;think-of-it-like-a-phone-system&#34;&gt;Think of it like a phone system:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Major number = Area code (which phone company/region)&lt;/li&gt;
&lt;li&gt;Minor number = Local number (which specific phone)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;load-intel-graphics-driver&#34;&gt;Load Intel Graphics Driver
&lt;/h3&gt;&lt;p&gt;Ensure the i915 kernel module is loaded:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsmod &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep i915
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Load if missing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modprobe i915
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make persistent across reboots:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;i915&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modules
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;verify-quicksync-capability&#34;&gt;Verify QuickSync Capability
&lt;/h3&gt;&lt;p&gt;Install tools if not present:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install intel-gpu-tools vainfo intel-media-va-driver-non-free
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check available encoders&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vainfo &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -i enc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look for entries like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileH264Main               : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileH264High               : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileJPEGBaseline           : VAEntrypointEncPicture
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCMain               : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCMain10             : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileVP9Profile0            : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileVP9Profile1            : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileVP9Profile2            : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileVP9Profile3            : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCMain444            : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCMain444_10         : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCSccMain            : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCSccMain10          : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCSccMain444         : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      VAProfileHEVCSccMain444_10      : VAEntrypointEncSliceLP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you don&amp;rsquo;t see these, your CPU might not support QuickSync or it&amp;rsquo;s disabled in BIOS.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc.jpg&#34; alt=&#34;ASRock Intel ARC A380 Challenger&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;ASRock Intel ARC A380 Challenger&lt;/strong&gt;&lt;br&gt;
The Arc A380 isn&amp;rsquo;t for gaming—it’s for obliterating video streams. With support for H.264, HEVC, and full AV1 hardware encode/decode, it crushes 20+ 1080p streams or 6–8 HDR tone-mapped 4Ks without breaking a sweat. Drop it in your media server, give Jellyfin direct VA-API access, and watch your CPU finally cool off for a bit.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45n6UHq&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-2-create-the-lxc-container&#34;&gt;Step 2: Create the LXC Container
&lt;/h2&gt;&lt;p&gt;In Proxmox web interface:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create CT&lt;/strong&gt; → Use Ubuntu 24.04 LTS template (Jellyfin prefers Ubuntu over Debian)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep &amp;ldquo;Unprivileged&amp;rdquo; checked&lt;/strong&gt; (this is crucial)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resources&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;CPU: 2-4 cores&lt;/li&gt;
&lt;li&gt;RAM: 2GB minimum, 4GB recommended&lt;/li&gt;
&lt;li&gt;Disk: 80GB+ for Jellyfin metadata and cache&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt;: Bridge to your main network&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t start the container yet&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-3-configure-device-access&#34;&gt;Step 3: Configure Device Access
&lt;/h2&gt;&lt;p&gt;This is where the magic happens. Edit &lt;code&gt;/etc/pve/lxc/&amp;lt;CTID&amp;gt;.conf&lt;/code&gt; and add:&lt;/p&gt;
&lt;p&gt;Allow access to DRI devices:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;lxc.cgroup2.devices.allow: c 226:0 rwm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;lxc.cgroup2.devices.allow: c 226:128 rwm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mount DRI devices into container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;lxc.mount.entry: /dev/dri/ dev/dri/ none bind,optional,create&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;dir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;what-these-lines-do&#34;&gt;What These Lines Do
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lxc.cgroup2.devices.allow&lt;/code&gt; - Grants permission to access specific device nodes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxc.mount.entry&lt;/code&gt; - Bind mounts the entire &lt;code&gt;/dev/dri&lt;/code&gt; directory into the container&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-4-handle-group-id-mapping-critical&#34;&gt;Step 4: Handle Group ID Mapping (Critical!)
&lt;/h2&gt;&lt;p&gt;This step trips up 90% of people attempting GPU passthrough. Why: Unprivileged LXC containers use user namespaces to isolate processes, which means group IDs inside the container don&amp;rsquo;t directly correspond to group IDs on the host. Without proper mapping, your container processes can&amp;rsquo;t access the GPU devices even if the device files are present.&lt;/p&gt;
&lt;h3 id=&#34;understanding-user-namespaces-and-id-mapping&#34;&gt;Understanding User Namespaces and ID Mapping
&lt;/h3&gt;&lt;p&gt;When Proxmox creates an unprivileged container, it maps container user/group IDs to a range of IDs on the host system. By default:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container UID/GID 0 (root) → Host UID/GID 100000&lt;/li&gt;
&lt;li&gt;Container UID/GID 1 → Host UID/GID 100001&lt;/li&gt;
&lt;li&gt;Container UID/GID 1000 → Host UID/GID 101000&lt;/li&gt;
&lt;li&gt;And so on&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means when a process inside the container tries to access &lt;code&gt;/dev/dri/renderD128&lt;/code&gt; (owned by group ID &lt;code&gt;104&lt;/code&gt; on the host), the kernel sees it as an access attempt from group ID &lt;code&gt;100104&lt;/code&gt;, which doesn&amp;rsquo;t exist and has no permissions.&lt;/p&gt;
&lt;h3 id=&#34;the-id-mapping-strategy&#34;&gt;The ID Mapping Strategy
&lt;/h3&gt;&lt;p&gt;We need to create &amp;ldquo;holes&amp;rdquo; in the default mapping to let specific container group IDs map directly to host group IDs. Think of it like creating bridges between the container and host for specific groups while keeping everything else isolated. This is similar to how firewall rules work.&lt;/p&gt;
&lt;h3 id=&#34;find-the-host-group-id-of&#34;&gt;Find the Host Group ID of
&lt;/h3&gt;&lt;p&gt;On the Proxmox host:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -n /dev/dri/renderD128
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crw-rw---- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;104&lt;/span&gt; 226, &lt;span class=&#34;m&#34;&gt;128&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;15&lt;/span&gt; 10:30 /dev/dri/renderD128
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Breaking this down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;crw-rw----&lt;/code&gt; = Character device with read/write for owner/group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt; = Owner UID (root)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;104&lt;/code&gt; = Group ID that owns the device (usually render group)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;226, 128&lt;/code&gt; = Major:minor device numbers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;104&lt;/code&gt; is what we need to remember. This is the host group ID we need to map later.&lt;/p&gt;
&lt;h3 id=&#34;standardize-gpu-device-ownership&#34;&gt;Standardize GPU Device Ownership
&lt;/h3&gt;&lt;p&gt;Instead of dealing with potentially different group IDs for different GPU devices, let&amp;rsquo;s ensure both GPU devices use the same group:&lt;/p&gt;
&lt;p&gt;Change the group for &lt;code&gt;card0&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chgrp render /dev/dri/card0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make it persistent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;SUBSYSTEM==&amp;#34;drm&amp;#34;, KERNEL==&amp;#34;card0&amp;#34;, GROUP=&amp;#34;render&amp;#34;, MODE=&amp;#34;0660&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt; /etc/udev/rules.d/99-render.rules
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;udevadm control --reload-rules &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; udevadm trigger
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now both &lt;code&gt;card0&lt;/code&gt; and &lt;code&gt;renderD128&lt;/code&gt; should be owned by the same group ID (usually &lt;code&gt;104&lt;/code&gt; for render).&lt;/p&gt;
&lt;h3 id=&#34;create-user-in-container&#34;&gt;Create User in Container
&lt;/h3&gt;&lt;p&gt;Start the container and enter the console to create the Jellyfin user:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;adduser jellyfin --system --group --home /var/lib/jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the group &lt;code&gt;render&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;groupadd -g &lt;span class=&#34;m&#34;&gt;993&lt;/span&gt; render
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the &lt;code&gt;render&lt;/code&gt; group to the &lt;code&gt;Jellyfin&lt;/code&gt; user:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usermod -aG render,media jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;why-gid-993&#34;&gt;Why GID 993?
&lt;/h3&gt;&lt;p&gt;We&amp;rsquo;re going to map container GID &lt;code&gt;993&lt;/code&gt; to host GID &lt;code&gt;104&lt;/code&gt; (the render group).&lt;br&gt;
The choice of 993 is arbitrary, it just needs to be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Available in the container (not already used)&lt;/li&gt;
&lt;li&gt;Consistent with our mapping configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Show the group IDs of the user &lt;code&gt;jellyfin&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure the &lt;code&gt;993&lt;/code&gt; render group is listed.&lt;/p&gt;
&lt;h3 id=&#34;configure-id-mapping&#34;&gt;Configure ID Mapping
&lt;/h3&gt;&lt;p&gt;







  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    This assumes your are using the group &lt;code&gt;media&lt;/code&gt; with an ID of &lt;code&gt;1001&lt;/code&gt; to access your media.&lt;br&gt;
If yours is diffrent replace any refernces to &lt;code&gt;media&lt;/code&gt; and &lt;code&gt;1001&lt;/code&gt; with your own.
  &lt;/div&gt;
&lt;/div&gt;

Stop the container and edit &lt;code&gt;/etc/pve/lxc/&amp;lt;CTID&amp;gt;.conf&lt;/code&gt;:&lt;br&gt;
Map container UIDs/GIDs to host:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;65536&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;993&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;993&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;104&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;994&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100994&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64534&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;detailed-breaking-down-each-mapping-line&#34;&gt;Detailed Breaking Down Each Mapping Line:
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;lxc.idmap: u 0 100000 65536&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maps all container UIDs (user IDs) normally&lt;/li&gt;
&lt;li&gt;Container UID 0 → Host UID 100000&lt;/li&gt;
&lt;li&gt;Maps 65536 UIDs total (standard range)&lt;/li&gt;
&lt;li&gt;This line handles all user accounts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lxc.idmap: g 0 100000 993&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maps container GIDs 0-992 to host GIDs 100000-100992&lt;/li&gt;
&lt;li&gt;This is the &amp;ldquo;normal&amp;rdquo; mapping for system groups&lt;/li&gt;
&lt;li&gt;Stops at 992 to leave room for our special mapping&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lxc.idmap: g 993 104 1&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is the critical line.&lt;/li&gt;
&lt;li&gt;Maps container GID 993 → host GID 104 (render group)&lt;/li&gt;
&lt;li&gt;Only maps 1 GID (just this specific group)&lt;/li&gt;
&lt;li&gt;This creates our bridge to GPU device access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lxc.idmap: g 994 100994 7&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resumes normal mapping for GIDs 994-1000&lt;/li&gt;
&lt;li&gt;Maps to host GIDs 100994-101000&lt;/li&gt;
&lt;li&gt;Fills the gap between our special mapping and media group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lxc.idmap: g 1001 1001 1&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maps container GID 1001 → host GID 1001 (media group)&lt;/li&gt;
&lt;li&gt;Assumes your media files are owned by GID 1001&lt;/li&gt;
&lt;li&gt;Adjust this to match your actual media group ID&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lxc.idmap: g 1002 101002 64534&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resumes normal mapping for all remaining GIDs&lt;/li&gt;
&lt;li&gt;Maps container GIDs 1002-65535 → host GIDs 101002-165535&lt;/li&gt;
&lt;li&gt;Handles any additional groups that might be created&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;update-host-subordinate-gids&#34;&gt;Update Host Subordinate GIDs
&lt;/h3&gt;&lt;p&gt;On the Proxmox host add the &lt;code&gt;render&lt;/code&gt; and &lt;code&gt;media&lt;/code&gt; groups to the &lt;code&gt;subgid&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;root:104:1&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/subgid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;root:1001:1&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/subgid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This tells the system that the root user (which manages LXC containers) can map:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Host GID &lt;code&gt;104&lt;/code&gt; (render group) into containers&lt;/li&gt;
&lt;li&gt;Host GID &lt;code&gt;1001&lt;/code&gt; (media group) into containers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-5-install-software-stack&#34;&gt;Step 5: Install Software Stack
&lt;/h2&gt;&lt;p&gt;Start the container and install the required packages:&lt;/p&gt;
&lt;p&gt;Update package lists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install Intel GPU drivers and tools&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install intel-gpu-tools intel-media-va-driver libdrm-intel1 vainfo curl gnupg software-properties-common -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add Jellyfin repository:&lt;/p&gt;
&lt;p&gt;Pull the gpg key:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; gpg --dearmor -o /usr/share/keyrings/jellyfin-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the Repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb [signed-by=/usr/share/keyrings/jellyfin-archive-keyring.gpg] https://repo.jellyfin.org/ubuntu &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; main&amp;#34;&lt;/span&gt; &amp;gt; /etc/apt/sources.list.d/jellyfin.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install Jellyfin:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install jellyfin -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;why-not-snapflatpakdocker&#34;&gt;Why Not Snap/Flatpak/Docker?
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Snap&lt;/strong&gt;: Broken device access due to confinement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flatpak&lt;/strong&gt;: Similar sandboxing issues&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt;: Adds unnecessary complexity to device mapping&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;APT packages have proper system integration and device access.&lt;/p&gt;
&lt;h2 id=&#34;step-6-verify-device-access&#34;&gt;Step 6: Verify Device Access
&lt;/h2&gt;&lt;h3 id=&#34;check-device-permissions&#34;&gt;Check Device Permissions
&lt;/h3&gt;&lt;p&gt;Inside the container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -la /dev/dri/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;crw-rw---- 1 nobody render 226,   0 card0
crw-rw---- 1 nobody render 226, 128 renderD128
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If the group isn&amp;rsquo;t &lt;code&gt;render&lt;/code&gt;, you need to check your:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lxc.mount.entry&lt;/code&gt; and/or &lt;code&gt;lxc.idmap&lt;/code&gt; entries in the LXC conf file.&lt;/p&gt;
&lt;h3 id=&#34;test-hardware-acceleration&#34;&gt;Test Hardware Acceleration
&lt;/h3&gt;&lt;p&gt;Read Test:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -u jellyfin &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -r /dev/dri/renderD128 &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Readable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Write Test:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -u jellyfin &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -w /dev/dri/renderD128 &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Writable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-7-configure-jellyfin&#34;&gt;Step 7: Configure Jellyfin
&lt;/h2&gt;&lt;h3 id=&#34;access-web-interface&#34;&gt;Access Web Interface
&lt;/h3&gt;&lt;p&gt;Navigate to &lt;code&gt;http://&amp;lt;container-ip&amp;gt;:8096&lt;/code&gt; and complete the initial setup wizard.&lt;/p&gt;
&lt;h3 id=&#34;enable-hardware-acceleration&#34;&gt;Enable Hardware Acceleration
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dashboard&lt;/strong&gt; → &lt;strong&gt;Playback&lt;/strong&gt; → &lt;strong&gt;Transcoding&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware acceleration&lt;/strong&gt;: Intel QuickSync (QSV)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable hardware decoding for&lt;/strong&gt;: H264, HEVC, VP9 (as supported)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable hardware encoding&lt;/strong&gt;: Yes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable VPP Tone mapping&lt;/strong&gt;: Yes (for HDR content)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;advanced-settings&#34;&gt;Advanced Settings
&lt;/h3&gt;&lt;p&gt;For better performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Allow encoding in HEVC format&lt;/strong&gt;: Yes (if supported)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transcoding thread count&lt;/strong&gt;: Auto&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/minidesktop.png&#34; alt=&#34;ASROCK Mini-Desktop Computer&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Need a Mini Server?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The DeskMini B760 is a compact and powerful barebone system perfect for homelab use. It supports 14th Gen Intel CPUs, dual DDR4 RAM up to 64GB, and fast storage via M.2 slots plus dual 2.5&amp;quot; drive bays. It&amp;rsquo;s ideal for running lightweight VMs and/or containers.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4kVe2jP&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445836990415726193859040&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fasrock-deskmini-b760-series-barebone-system-supports-14th-13th-12th-gen-intel-core-processors-max-tdp-65w-deskmini-b760w%2fp%2fN82E16856158095&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;step-8-test-hardware-transcoding&#34;&gt;Step 8: Test Hardware Transcoding
&lt;/h2&gt;&lt;h3 id=&#34;force-transcoding-test&#34;&gt;Force Transcoding Test
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Upload a high-bitrate H.264/HEVC video to Jellyfin&lt;/li&gt;
&lt;li&gt;Start playback and immediately change quality to force transcoding&lt;/li&gt;
&lt;li&gt;On the Proxmox host (not in container) run:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;intel_gpu_top
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see spikes in the &lt;strong&gt;Video&lt;/strong&gt; engine usage during transcoding.&lt;/p&gt;
&lt;h3 id=&#34;browser-verification&#34;&gt;Browser Verification
&lt;/h3&gt;&lt;p&gt;In Chrome/Edge:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to &lt;code&gt;chrome://media-internals/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Start playing your test video&lt;/li&gt;
&lt;li&gt;Look for:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;video_codec: h264&lt;/code&gt; or &lt;code&gt;hevc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hardwareAccelerated: true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;jellyfin-dashboard&#34;&gt;Jellyfin Dashboard
&lt;/h3&gt;&lt;p&gt;Check &lt;strong&gt;Dashboard&lt;/strong&gt; → &lt;strong&gt;Activity&lt;/strong&gt; for active transcodes. Hardware transcoding shows much lower CPU usage than software.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-guide&#34;&gt;Troubleshooting Guide
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Problem&lt;/th&gt;
          &lt;th&gt;Symptoms&lt;/th&gt;
          &lt;th&gt;Solution&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;No /dev/dri in container&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Missing device files&lt;/td&gt;
          &lt;td&gt;Check &lt;code&gt;lxc.mount.entry&lt;/code&gt; in config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Permission denied on GPU&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&amp;ldquo;Cannot access /dev/dri/renderD128&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;Fix GID mapping or group membership&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;vainfo fails&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&amp;ldquo;libva error&amp;rdquo; or crashes&lt;/td&gt;
          &lt;td&gt;Normal in LXC - test via Jellyfin instead&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;CPU still transcoding&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;High CPU usage during playback&lt;/td&gt;
          &lt;td&gt;Enable QSV in Jellyfin playback settings&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Transcoding fails entirely&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Playback errors or fallback to direct play&lt;/td&gt;
          &lt;td&gt;Check Jellyfin logs for codec support issues&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;GPU owned by wrong group&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Device shows render/video instead of jellyfin&lt;/td&gt;
          &lt;td&gt;Map to correct host group ID&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;advanced-debugging&#34;&gt;Advanced Debugging
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Check Jellyfin logs:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -f /var/log/jellyfin/jellyfin.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Verify codec support:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -hide_banner -encoders &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep qsv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;performance-expectations&#34;&gt;Performance Expectations
&lt;/h2&gt;&lt;h3 id=&#34;transcoding-capacity&#34;&gt;Transcoding Capacity
&lt;/h3&gt;&lt;p&gt;Intel QuickSync can typically handle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;8th-10th gen&lt;/strong&gt;: 4-6 simultaneous 1080p H.264 transcodes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;11th gen+&lt;/strong&gt;: 6-8 simultaneous 1080p transcodes, 2-3 4K HEVC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;12th gen+&lt;/strong&gt;: 8-10 simultaneous 1080p, 3-4 4K transcodes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;quality-considerations&#34;&gt;Quality Considerations
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Hardware encoding produces slightly larger files than software (x264)&lt;/li&gt;
&lt;li&gt;Quality is excellent for streaming but may not match software for archival&lt;/li&gt;
&lt;li&gt;HEVC hardware encoding (if available) provides better efficiency than H.264&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;additional-optimizations&#34;&gt;Additional Optimizations
&lt;/h2&gt;&lt;h3 id=&#34;performance-tweeks&#34;&gt;Performance Tweeks
&lt;/h3&gt;&lt;h4 id=&#34;memory-tuning&#34;&gt;Memory Tuning
&lt;/h4&gt;&lt;p&gt;For 4K transcoding, increase container RAM:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;memory: 4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;cpu-priority&#34;&gt;CPU Priority
&lt;/h4&gt;&lt;p&gt;Give transcoding higher priority:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cores: 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cpulimit: 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cpuunits: 1024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;what-about-nfs&#34;&gt;What About NFS?
&lt;/h2&gt;&lt;p&gt;Since we&amp;rsquo;re on the topic of &amp;ldquo;impossible&amp;rdquo; things in unprivileged LXC:&lt;/p&gt;
&lt;p&gt;NFS works perfectly fine. Mount it on the host, then bind mount into the container:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Host:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mount -t nfs nas.local:/volume1/media /mnt/nas-media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Container config:&lt;/strong&gt;
In &lt;code&gt;/etc/pve/lxc/CTID.conf&lt;/code&gt; add:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;mp0: /mnt/nas-media,mp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/mnt/media&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;security-benefits&#34;&gt;Security Benefits
&lt;/h2&gt;&lt;p&gt;This setup provides several security advantages over alternatives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Process isolation&lt;/strong&gt;: Jellyfin runs in its own namespace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limited privilege&lt;/strong&gt;: No root access to host system&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource limits&lt;/strong&gt;: CPU/memory can be strictly controlled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network isolation&lt;/strong&gt;: Can be restricted to specific VLANs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal attack surface&lt;/strong&gt;: Only required devices are exposed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Unprivileged LXC containers are not the limitation—lack of understanding is. With proper device mapping and group management, you get the security benefits of containerization with near-native hardware performance.&lt;/p&gt;
&lt;p&gt;This setup gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Secure, unprivileged execution&lt;/li&gt;
&lt;li&gt;Direct GPU access without overhead&lt;/li&gt;
&lt;li&gt;Professional-grade media streaming&lt;/li&gt;
&lt;li&gt;Easy maintenance and updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stop settling for bloated VMs or dangerous privileged containers. Master the mappings and run Jellyfin the right way.&lt;/p&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps
&lt;/h2&gt;&lt;p&gt;Want to level up further? Consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Remote storage&lt;/strong&gt;: Set up NFS/SMB mounts for media libraries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reverse proxy&lt;/strong&gt;: Add Nginx/Traefik for HTTPS and custom domains&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup strategy&lt;/strong&gt;: Implement container snapshots and config backups&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;&lt;br&gt;
A Ryzen-powered beast in a mini PC shell. Dual 2.5 GbE, 10 GbE option, triple NVMe. Small box, big Proxmox energy.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Why I Ditched My VM NAS and Went Bare-Metal (And You Should Too)</title>
        <link>https://diymediaserver.com/post/why_i_ditched_my_vm_nas_and_went_bare-metal/</link>
        <pubDate>Thu, 24 Jul 2025 06:44:27 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/why_i_ditched_my_vm_nas_and_went_bare-metal/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/why_i_ditched_my_vm_nas_and_went_bare-metal/featured.jpg" alt="Featured image of post Why I Ditched My VM NAS and Went Bare-Metal (And You Should Too)" /&gt;&lt;p&gt;My Jellyfin server used to forget movies. Random ones wouldn&amp;rsquo;t show up, or new ones would vanish into the ether. Reboot Proxmox, and poof, they&amp;rsquo;re back. The culprit? A race condition nightmare from running my NAS in a Proxmox-hosted VM.&lt;/p&gt;
&lt;p&gt;I tried everything: automount, systemd, UID hacks, ritual sacrifices to the filesystem gods. Best I ever got was &amp;ldquo;mostly works.&amp;rdquo; And that&amp;rsquo;s not good enough when Jellyfin&amp;rsquo;s your nightly unwind ritual.&lt;/p&gt;
&lt;p&gt;So I ditched the VM, went bare-metal with XFS and MergerFS, and finally, &lt;strong&gt;finally&lt;/strong&gt;, built a NAS that boots clean and mounts right. Every. Single. Time.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Running your NAS inside a VM? That&#39;s fine until you&#39;re fighting race conditions you didn&#39;t sign up for. Go bare-metal with XFS and MergerFS for simplicity, speed, and rock-solid reliability. Just know you&#39;re trading Proxmox&#39;s creature comforts for predictable behavior that actually works.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/define-r5-45deg.webp&#34; alt=&#34;Fractal Design Define 7 XL&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Fractal Design Define 7 XL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Define 7 XL can accommodate up to 18 HDDs/SSDs plus five additional SSDs in the Storage Layout, with flexible configurations using included multi-brackets and HDD/SSD trays.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3GG6cLC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458314954463885947040221&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-7-xl-atx-full-tower%2fp%2fN82E16811352120&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;why-vm-nas-setups-sound-sexy-but-arent&#34;&gt;Why VM NAS Setups Sound Sexy (But Aren’t)
&lt;/h2&gt;&lt;p&gt;Sure, it looks efficient on paper. One box. Multiple VMs. Snapshots. Live migrations. The homelab porn writes itself. But reality hits a bit different:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Race conditions from hell&lt;/strong&gt;: Proxmox boots, VMs start spinning up, but your containers beat NFS to the punch. Result? Jellyfin loads with a library that looks like Swiss cheese.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mounting nightmares&lt;/strong&gt;: Getting the Proxmox host to mount NFS shares &lt;em&gt;after&lt;/em&gt; the NAS VM boots is like herding cats. I tried automounts, failed spectacularly. Switched to systemd mounts, same story. Finally built UID-mapped folders to sidestep Proxmox&amp;rsquo;s &lt;code&gt;100000&lt;/code&gt; offset nonsense. Worked 97% of the time, but &amp;ldquo;mostly working&amp;rdquo; storage is like being &amp;ldquo;mostly pregnant.&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Death by a thousand cuts&lt;/strong&gt;: Every virtualization layer (Proxmox → QEMU → ext4/XFS → NFS → LXC) adds latency. You bleed throughput. You sacrifice reliability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The debugging tax&lt;/strong&gt;: When things break (and they will), you&amp;rsquo;re troubleshooting across multiple abstraction layers. Is it the VM? The host? The container? The mount? Good luck figuring that out Sunday afternoon when your family is rioting when they can&amp;rsquo;t watch their favorite movie or the latest episode of their current indulgence.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;There is not much difference in performance if any at all.&amp;rdquo;&lt;/em&gt; &amp;ndash; Some Reddit user who clearly never spent a weekend troubleshooting missing folders and/or files.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Try saying that after your fourth reboot hoping your media will magically reappear.&lt;/p&gt;
&lt;h2 id=&#34;why-bare-metal-xfs--mergerfs-actually-wins&#34;&gt;Why Bare-Metal XFS + MergerFS Actually Wins
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No more race conditions&lt;/strong&gt;: NFS shares mount early via proper systemd ordering. Containers see their media, first boot, every boot, forever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Direct I/O that doesn&amp;rsquo;t suck&lt;/strong&gt;: XFS is battle-tested and fast. MergerFS pools drives seamlessly without the virtualization overhead tax. Your drives work at their actual speed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Predictable boots&lt;/strong&gt;: No more crossing your fingers hoping your storage VM came up in time. No more UID hacks. Just clean systemd dependencies that do what they say on the tin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bonus wins&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full 10GbE bandwidth (not strangled by virtio drivers)&lt;/li&gt;
&lt;li&gt;Simpler storage stack = fewer things to break&lt;/li&gt;
&lt;li&gt;Cleaner disaster recovery: rsync, backups, and mounts you actually understand&lt;/li&gt;
&lt;li&gt;Sleep peacefully knowing your storage isn&amp;rsquo;t playing startup roulette&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bare-metal-vs-vm-the-real-scorecard&#34;&gt;Bare-Metal vs. VM: The Real Scorecard
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Setup&lt;/th&gt;
          &lt;th&gt;Pros&lt;/th&gt;
          &lt;th&gt;Cons&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;VM NAS&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;✔️ Snapshots&lt;br&gt;✔️ Easy Proxmox backups&lt;br&gt;✔️ Service consolidation&lt;br&gt;✔️ Looks good in /r/homelab&lt;/td&gt;
          &lt;td&gt;❌ NFS race conditions&lt;br&gt;❌ I/O performance tax&lt;br&gt;❌ Complex UID/GID mapping&lt;br&gt;❌ Multi-layer debugging hell&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Bare-Metal NAS&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;✔️ Predictable boots&lt;br&gt;✔️ Zero virtualization overhead&lt;br&gt;✔️ Simple, direct mounts&lt;br&gt;✔️ Full hardware performance&lt;/td&gt;
          &lt;td&gt;⚠️ Manual backup strategy&lt;br&gt;⚠️ Extra box to power &amp;amp; manage&lt;br&gt;⚠️ No VM convenience features&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Power tradeoff?&lt;/strong&gt; Absolutely. That&amp;rsquo;s why I went with a G3220. It sips power like a gentleman but handles the workload without breaking a sweat. The 10Gb NIC and HBA get to stretch their legs properly.&lt;/p&gt;
&lt;h2 id=&#34;build-blueprint-what-actually-works&#34;&gt;Build Blueprint: What Actually Works
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt; (Stuff I had lying around):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel G3220&lt;/li&gt;
&lt;li&gt;Gigabyte GA-Z87X-D3H&lt;/li&gt;
&lt;li&gt;16GB DDR3&lt;/li&gt;
&lt;li&gt;LSI 9300-8i HBA in IT mode&lt;/li&gt;
&lt;li&gt;10Gb NIC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Software Stack&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian Trixie&lt;/li&gt;
&lt;li&gt;XFS on each drive&lt;/li&gt;
&lt;li&gt;MergerFS for seamless pooling&lt;/li&gt;
&lt;li&gt;NFS for rock-solid container access&lt;/li&gt;
&lt;li&gt;systemd for proper mount ordering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why this combo works&lt;/strong&gt;: Dead simple architecture. Nothing fancy. It just boots and works, every time.&lt;/p&gt;
&lt;h3 id=&#34;for-details-on-mergerfs-and-hbas&#34;&gt;For Details on MergerFS and HBAs:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-mergerfs-the-best-way-to-combine-drives-for-your-home-media-server/&#34; &gt;Master the Basics - MergerFS the Best Way to Combine Drives for Your Home Media Server&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/hardware-why-you-need-an-hba/&#34; &gt;Hardware - Why You Need an HBA&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/LSI-9300-8i.webp&#34; alt=&#34;LSI 9300-8i IT MODE&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;LSI 9300-8i&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Already Flashed to IT mode.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3R5XJU0&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;the-cold-hard-truth-about-my-experience&#34;&gt;The Cold, Hard Truth About My Experience
&lt;/h2&gt;&lt;p&gt;I burned two entire weekends trying to make VM-NAS race conditions disappear. They laughed at my attempts.&lt;/p&gt;
&lt;p&gt;I deployed automounts like a hopeful fool. I crafted systemd units with the precision of a Swiss watchmaker. I even UID-hacked workarounds that would make a kernel developer weep. And still, some folders only materialized after rebooting the entire Proxmox host.&lt;/p&gt;
&lt;p&gt;Bare-metal isn&amp;rsquo;t perfect. You lose snapshots. You lose centralized VM backups. You lose the satisfaction of running everything on one box.&lt;/p&gt;
&lt;p&gt;But you gain something precious: &lt;strong&gt;predictability&lt;/strong&gt;. When you power on your NAS, it works. When containers start, they see their media. When users browse your library, the files are actually there.&lt;/p&gt;
&lt;p&gt;One box, one job, one stack to debug. That clarity is worth the extra 20 watts, especially when your CPU barely registers on the power meter and your Jellyfin setup never misses a beat.&lt;/p&gt;
&lt;h2 id=&#34;the-bottom-line&#34;&gt;The Bottom Line
&lt;/h2&gt;&lt;p&gt;A VM NAS &lt;em&gt;can&lt;/em&gt; work if you enjoy weekend troubleshooting sessions and the thrill of uncertainty. But a bare-metal NAS &lt;em&gt;does&lt;/em&gt; work, every single time, without drama or surprise downtime.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re tired of startup order roulette, phantom mount points, and explaining to family why half the movie collection disappeared again. Go physical. Go simple. Go fast.&lt;/p&gt;
&lt;p&gt;Your sanity will thank you. Your users will thank you. Your Saturday mornings will thank you.&lt;/p&gt;
&lt;h2 id=&#34;ready-to-build-it-right&#34;&gt;Ready to Build It Right?
&lt;/h2&gt;&lt;p&gt;Ditch the VM complexity. Build your NAS properly with bare-metal XFS and MergerFS. Stop trusting virtualization layers to mount your media collection in the correct order.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got &lt;code&gt;fstab&lt;/code&gt; configs, systemd unit files, and plenty of battle scars if you need guidance.&lt;/p&gt;
&lt;p&gt;Just ask.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Why Unprivileged LXC &#43; NFS = Regret (Here’s How I Learned the Hard Way)</title>
        <link>https://diymediaserver.com/post/unprivileged_lxc_regret/</link>
        <pubDate>Tue, 22 Jul 2025 06:04:43 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/unprivileged_lxc_regret/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/unprivileged_lxc_regret/featured.jpg" alt="Featured image of post Why Unprivileged LXC &#43; NFS = Regret (Here’s How I Learned the Hard Way)" /&gt;&lt;p&gt;I spun up some unprivileged LXCs on Proxmox (Jellyfin, Sonarr, Radarr, and Audiobookshelf). The plan was to keep it lightweight, clean, and have them all talk to my NAS over NFS.&lt;/p&gt;
&lt;p&gt;That plan lasted about a week.&lt;/p&gt;
&lt;p&gt;What followed was a parade of silent failures, missing files, and permission bugs that made me question reality. Unprivileged sounded safe. Turns out LXCs are just too stripped down to work reliably if you need NFS access.&lt;/p&gt;
&lt;p&gt;Let me show you why unprivileged LXC is a trap for anything that needs NFS access, and how I crawled back to VMs running Docker. Humbled but functional.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Unprivileged LXC + NFS seems awesome and secure until root mapping, id shifts, and bind mount hell break your stack. Use privileged LXC or, better yet for NFS, a VM. I learned this the hard way with Proxmox.

&lt;/div&gt;
&lt;h2 id=&#34;the-two-faces-of-lxc-privileged-vs-unprivileged&#34;&gt;The Two Faces of LXC: Privileged vs Unprivileged
&lt;/h2&gt;&lt;p&gt;LXC containers come in two flavors: &lt;strong&gt;privileged&lt;/strong&gt; and &lt;strong&gt;unprivileged&lt;/strong&gt;. That one word changes everything about how your containers behave, what they can access, and how much pain you&amp;rsquo;ll experience.&lt;/p&gt;
&lt;h3 id=&#34;-privileged-containers-power-at-a-price&#34;&gt;🔓 Privileged Containers: Power at a Price
&lt;/h3&gt;&lt;p&gt;A &lt;strong&gt;privileged container&lt;/strong&gt; runs as root on the host. Not “container root.” Actual host root.&lt;/p&gt;
&lt;p&gt;What that means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container UID 0 = host UID 0&lt;/li&gt;
&lt;li&gt;Full access to system calls&lt;/li&gt;
&lt;li&gt;Direct read/write access to host files&lt;/li&gt;
&lt;li&gt;Minimal UID translation (things &lt;em&gt;just work&lt;/em&gt; with NFS, USB devices, bind mounts, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sounds scary? It should be. If a service inside that container gets compromised, the attacker now has &lt;strong&gt;root on your host&lt;/strong&gt;. Full stop.&lt;/p&gt;
&lt;p&gt;When privileged LXC makes sense:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal-only services you fully trust&lt;/li&gt;
&lt;li&gt;Containers behind a firewall, with zero external exposure&lt;/li&gt;
&lt;li&gt;Services that &lt;strong&gt;need&lt;/strong&gt; real root access&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;-unprivileged-containers-safe-but-issues-with-nfs&#34;&gt;🔒 Unprivileged Containers: Safe but Issues with NFS
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Unprivileged containers&lt;/strong&gt; were designed to fix that security risk by adding a layer of UID mapping.&lt;/p&gt;
&lt;p&gt;They add 100000 to all container UIDs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container UID 0 → host UID 100000&lt;/li&gt;
&lt;li&gt;Container UID 1000 → host UID 101000&lt;/li&gt;
&lt;li&gt;And so on&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So even if something breaks inside, the container can&amp;rsquo;t mess with your host. It&amp;rsquo;s sandboxed. Safe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But here’s the catch&lt;/strong&gt;: that UID mapping breaks everything outside the container.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NFS doesn’t recognize 100000 as root.&lt;/li&gt;
&lt;li&gt;File permissions stop making sense.&lt;/li&gt;
&lt;li&gt;Accessing anything shared with the host becomes a pain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unprivileged containers work great when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You don’t need to write to NFS&lt;/li&gt;
&lt;li&gt;You don’t care about permissions on shared files&lt;/li&gt;
&lt;li&gt;You want to sandbox a sketchy app or test environment&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;so-which-one-should-you-use&#34;&gt;So Which One Should You Use?
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Use Case&lt;/th&gt;
          &lt;th&gt;Best Container Type&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Running Jellyfin/Arr stack with NFS&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Virtual Machine&lt;/strong&gt; or Privileged&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Public-facing container&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Virtual Machine&lt;/strong&gt; or Unprivileged&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Docker inside LXC&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Privileged&lt;/strong&gt; (not recommended)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Internal utility that touches host fs&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Privileged&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Unsafe app or 3rd-party binary&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Unprivileged&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt;&lt;br&gt;
Privileged = easier, more powerful, more dangerous&lt;br&gt;
Unprivileged = safer, but crippled when it comes to real-world file access&lt;/p&gt;
&lt;p&gt;And if you’re mixing in NFS?&lt;br&gt;
Unprivileged goes from “safe” to “useless.”&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;&lt;br&gt;
A Ryzen-powered beast in a mini PC shell. Dual 2.5 GbE, 10 GbE option, triple NVMe. Small box, big Proxmox energy.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;my-descent-into-troubleshooting-hell&#34;&gt;My Descent Into Troubleshooting Hell
&lt;/h2&gt;&lt;p&gt;Let me walk you through the steps I took. Each one with hope, each one crushed by reality. If this looks like your future, do yourself a favor and skip ahead to VMs now.&lt;/p&gt;
&lt;h3 id=&#34;attempt-1-custom-uid-mapping&#34;&gt;Attempt #1: Custom UID Mapping
&lt;/h3&gt;&lt;p&gt;I tried overriding &lt;code&gt;lxc.idmap&lt;/code&gt; to fake container UID 0 as host UID 1000:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;100000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101000&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: u &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64534&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lxc.idmap: g &lt;span class=&#34;m&#34;&gt;1002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;101002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;64534&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: Partially worked, but created more permission edge cases.&lt;/p&gt;
&lt;h3 id=&#34;attempt-2-nfs-export-tweaking&#34;&gt;Attempt #2: NFS Export Tweaking
&lt;/h3&gt;&lt;p&gt;I tried various NFS settings and settled on this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/media/Storage/ *&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;all_squash,anongid&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1001,anonuid&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1000,insecure,rw,fsid&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;100,subtree_check&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: Files appeared but the permissions were still an issue.&lt;/p&gt;
&lt;h3 id=&#34;attempt-3-host-mount--bind-mount&#34;&gt;Attempt #3: Host Mount + Bind Mount
&lt;/h3&gt;&lt;p&gt;I mounted NFS on the host, then bind-mounted into the LXC:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp0: /mnt/storage/Shows,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/Shows
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp1: /mnt/storage/Movies,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/Movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp2: /mnt/storage/Music,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/Music
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp3: /mnt/storage/eBooks,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/eBooks
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mp4: /mnt/storage/AudioBooks,mp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/AudioBooks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: Files showed up but were owned by &lt;code&gt;nobody:nogroup&lt;/code&gt;. Jellyfin couldn&amp;rsquo;t scan, play, or write. When the host mount failed during reboots, containers booted with empty folders. Silent disasters everywhere.&lt;/p&gt;
&lt;h3 id=&#34;attempt-4-the-bindfs-hail-mary&#34;&gt;Attempt #4: The bindfs Hail Mary
&lt;/h3&gt;&lt;p&gt;In my final attempt, I tried &lt;code&gt;bindfs&lt;/code&gt; to remap ownership:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Bindfs mounts &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; NAS directories
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Requires&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mnt-nas_storage.mount
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;oneshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/bin/bindfs -u &lt;span class=&#34;m&#34;&gt;101000&lt;/span&gt; -g &lt;span class=&#34;m&#34;&gt;101001&lt;/span&gt; /mnt/nas_storage /mnt/mapped_nas_storage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RemainAfterExit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: This worked the best, but I&amp;rsquo;d still randomly lose files. Every workaround fixed &lt;em&gt;one&lt;/em&gt; thing and broke &lt;em&gt;three more&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure someone has &lt;strong&gt;forced&lt;/strong&gt; unprivileged LXCs to work, but I just want to enjoy my media and not be constantly fight with permissions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-privileged-container-security-trap&#34;&gt;The Privileged Container Security Trap
&lt;/h2&gt;&lt;p&gt;So what&amp;rsquo;s the catch with using a privileged container to fix NFS? You&amp;rsquo;ve now handed root access from the container &lt;em&gt;directly&lt;/em&gt; to the host.&lt;/p&gt;
&lt;h3 id=&#34;root-inside--root-outside&#34;&gt;Root inside = root outside
&lt;/h3&gt;&lt;p&gt;If someone compromises Jellyfin (or any dependency), they&amp;rsquo;re root on your Proxmox node. Game over.&lt;/p&gt;
&lt;h3 id=&#34;security-misconfigurations&#34;&gt;Security Misconfigurations
&lt;/h3&gt;&lt;p&gt;Most people don&amp;rsquo;t harden their containers. Leave one small crack that someone could exploit, and the container can damage your host or pivot to other network devices.&lt;/p&gt;
&lt;h3 id=&#34;network-exposure-risks&#34;&gt;Network Exposure Risks
&lt;/h3&gt;&lt;p&gt;Privileged containers can mess with host-level network settings. Bridge them carelessly, and an attacker could sniff or spoof traffic across your entire LAN.&lt;/p&gt;
&lt;h3 id=&#34;shared-kernel--shared-fate&#34;&gt;Shared kernel = Shared fate
&lt;/h3&gt;&lt;p&gt;Containers don&amp;rsquo;t isolate the kernel. A bug in &lt;code&gt;ffmpeg&lt;/code&gt;, &lt;code&gt;libva&lt;/code&gt;, or any media processing library could expose your entire host system.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not a sandbox. It&amp;rsquo;s a potential backdoor.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/SG3210X-M2.jpg&#34; alt=&#34;TP-Link Omada SG3210X-M2&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;TP-Link Omada SG3210X-M2&lt;/strong&gt;&lt;br&gt;
Full-featured, compact, rack-ready. Eight multi-gig ports, dual 10 GbE uplinks, VLAN/QoS/ACL/LACP, and seamless integration with TP‑Link’s Omada controller. It locks down your Jellyfin/NAS traffic while scaling effortlessly with your homelab.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/44ZP0Jk&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;the-solution-embrace-vms-with-docker&#34;&gt;The Solution: Embrace VMs with Docker
&lt;/h2&gt;&lt;p&gt;After weeks of fighting with LXC permissions, I gave up and moved everything to VMs running Docker. Here&amp;rsquo;s why this works:&lt;/p&gt;
&lt;h3 id=&#34;true-isolation&#34;&gt;True Isolation
&lt;/h3&gt;&lt;p&gt;VMs provide actual isolation. If Jellyfin gets compromised, the attacker is trapped in a virtual machine and not loose on your host.&lt;/p&gt;
&lt;h3 id=&#34;docker-handles-permissions&#34;&gt;Docker Handles Permissions
&lt;/h3&gt;&lt;p&gt;Docker&amp;rsquo;s built-in user mapping and volume mounts handle NFS permissions much more gracefully than LXC&amp;rsquo;s UID mapping.&lt;/p&gt;
&lt;h3 id=&#34;predictable-behavior&#34;&gt;Predictable Behavior
&lt;/h3&gt;&lt;p&gt;No more silent failures, missing files, or permission mysteries. Things work the way you expect them to.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;final-recommendations&#34;&gt;Final Recommendations
&lt;/h2&gt;&lt;h3 id=&#34;for-jellyfin--nfs--remote-access&#34;&gt;For Jellyfin + NFS + Remote Access:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Use a VM with Docker (best option)&lt;/li&gt;
&lt;li&gt;Use privileged LXC only if it&amp;rsquo;s internal-only and you understand the risks&lt;/li&gt;
&lt;li&gt;Avoid unprivileged LXC entirely for this use case&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;for-other-use-cases&#34;&gt;For Other Use Cases:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Internal utilities: Privileged LXC is fine&lt;/li&gt;
&lt;li&gt;Public-facing services: Unprivileged LXC or VM&lt;/li&gt;
&lt;li&gt;Anything touching NFS: VM with Docker&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-bottom-line&#34;&gt;&lt;strong&gt;The Bottom Line:&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Unprivileged LXC sounds safe until it isn&amp;rsquo;t. Add NFS, media servers, and remote access, and you&amp;rsquo;re stacking pain on top of pain.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve patched, mounted, and prayed my way through this mess. My final verdict? If you&amp;rsquo;re doing anything serious with NFS or Jellyfin, ditch the LXC complexity and use VMs with Docker.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t fight your stack. If you need NFS, go VM. If you&amp;rsquo;re exposing Jellyfin publicly, go VM. Save your sanity and your weekends.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/TX201.jpg&#34; alt=&#34;TP-Link 2.5GB PCIe Network Card (TX201)&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;TP-Link 2.5GB PCIe Network Card (TX201)&lt;/strong&gt;&lt;br&gt;
Plug-and-play 2.5 GbE PCIe card that unlocks multi-gig speeds for about $30. Works out of the box with Proxmox, Linux, and Windows. No drama—just faster transfers.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4mafK0R&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Two Years of LXC Hell - Why I Crawled Back to Docker (And You Should Too)</title>
        <link>https://diymediaserver.com/post/two-years-of-lxc-hell/</link>
        <pubDate>Sun, 06 Jul 2025 07:29:44 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/two-years-of-lxc-hell/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/two-years-of-lxc-hell/featured.jpg" alt="Featured image of post Two Years of LXC Hell - Why I Crawled Back to Docker (And You Should Too)" /&gt;&lt;p&gt;So, you&amp;rsquo;re feeling clever. You&amp;rsquo;ve read the blogs, watched the YouTube tutorials, and decided that unprivileged LXC containers are the &amp;ldquo;right&amp;rdquo; way to run your Arr stack. Lightweight! Efficient! &lt;em&gt;So much better than Docker!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Fast forward two years. You&amp;rsquo;re debugging NFS stale handle errors at 2 AM, your downloads corrupt mid-transfer, and you&amp;rsquo;re questioning every life choice that led you to this moment.&lt;/p&gt;
&lt;p&gt;That was me. Now I&amp;rsquo;m back on Docker, tail between my legs, with a rock-solid &lt;code&gt;docker-compose.yml&lt;/code&gt; that works.&lt;/p&gt;
&lt;div class=&#34;tldr-heading&#34;&gt;💭 TL;DR&lt;/div&gt;
&lt;div class=&#34;tldr-summary&#34;&gt;
  
Thought LXC was smarter than Docker? So did I. Until stale NFS handles, ghost downloads, and permission nightmares broke my will to live. This Docker Compose setup just works. Copy, run, exhale.

&lt;/div&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/minidesktop.png&#34; alt=&#34;ASROCK Mini-Desktop Computer&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Need a Mini Server?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The DeskMini B760 is a compact and powerful barebone system perfect for homelab use. It supports 14th Gen Intel CPUs, dual DDR4 RAM up to 64GB, and fast storage via M.2 slots plus dual 2.5&amp;quot; drive bays. It&amp;rsquo;s ideal for running lightweight VMs and/or containers.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4kVe2jP&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445836990415726193859040&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fasrock-deskmini-b760-series-barebone-system-supports-14th-13th-12th-gen-intel-core-processors-max-tdp-65w-deskmini-b760w%2fp%2fN82E16856158095&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;the-hard-truth-about-lxc-vs-docker-compose&#34;&gt;The Hard Truth About LXC vs Docker Compose
&lt;/h2&gt;&lt;p&gt;Let me save you the pain I went through. LXC &lt;em&gt;sounds&lt;/em&gt; perfect for media servers until you try to run something complex like the full Arr suite and NFS shares.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what Docker Compose gives you that LXC never could:&lt;/p&gt;
&lt;h3 id=&#34;one-file-to-rule-them-all&#34;&gt;One File to Rule Them All
&lt;/h3&gt;&lt;p&gt;With LXC, adding a new service means spinning up another container, configuring networking, setting up mounts, and praying everything talks to each other. With Docker Compose: Edit a few lines, run &lt;code&gt;docker compose up -d&lt;/code&gt;, and you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;Want to restart everything?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Want to migrate to a new server? Copy two files: your &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;docker-compose.yml&lt;/code&gt; and you are back online in minutes.&lt;/p&gt;
&lt;h3 id=&#34;no-more-permission-purgatory&#34;&gt;No More Permission Purgatory
&lt;/h3&gt;&lt;p&gt;Ever watch a file download successfully but never move to your media folder? Or see Sonarr throw &amp;ldquo;access denied&amp;rdquo; errors with zero explanation? That&amp;rsquo;s LXC&amp;rsquo;s unprivileged user permissions playing games with your sanity.&lt;/p&gt;
&lt;p&gt;This is the one I could never resolve: the file is downloaded and moved to the NFS share but the LXC host never sees it in the mount point until the system is rebooted.&lt;/p&gt;
&lt;p&gt;This Docker setup uses &lt;code&gt;PUID&lt;/code&gt; and &lt;code&gt;PGID&lt;/code&gt; across every container, so they all behave like the same user on your host. No more mystery permission errors. No more &lt;code&gt;chmod 777&lt;/code&gt; voodoo dances.&lt;/p&gt;
&lt;h3 id=&#34;shared-downloads-that-actually-work&#34;&gt;Shared Downloads That Actually Work
&lt;/h3&gt;&lt;p&gt;One &lt;code&gt;/downloads&lt;/code&gt; directory for everything. SABnzbd drops files there. Sonarr, Radarr, and their friends watch that same folder and move files cleanly. No bind mount spaghetti. No symbolic link nightmares. Just clean, predictable file handling.&lt;/p&gt;
&lt;h2 id=&#34;what-finally-broke-me&#34;&gt;What Finally Broke Me
&lt;/h2&gt;&lt;p&gt;After two years of LXC &amp;ldquo;optimizations,&amp;rdquo; these were the straws that broke the camel&amp;rsquo;s back:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NFS + LXC = Stale File Handle Roulette&lt;/strong&gt;&lt;br&gt;
Try debugging why your mounts randomly go read-only mid-download or why Jellyfin can&amp;rsquo;t see a file that&amp;rsquo;s clearly in the share until you restart NFS. I spent &lt;em&gt;months&lt;/em&gt; chasing these ghosts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every Container Needs Its Own IP (Maybe)&lt;/strong&gt;&lt;br&gt;
Unless you NAT everything (gross), LXC means manually assigning static IPs and keeping track of them. Docker Compose skips this entirely. All your apps talk over an internal bridge network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updates Are a Gamble&lt;/strong&gt;&lt;br&gt;
Something breaks in LXC? Hope you documented every tweak you made over the past six months. Docker? Blow it away and recreate it in seconds. Your config survives because it&amp;rsquo;s volume-mounted.&lt;/p&gt;
&lt;h2 id=&#34;the-stack-that-actually-works&#34;&gt;The Stack That Actually Works
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the battle-tested &lt;code&gt;docker-compose.yml&lt;/code&gt; that ended my suffering:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  PROWLARR                   ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/prowlarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${PROWLARR_PORT}:9696&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/prowlarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SONARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sonarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SONARR_PORT}:8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sonarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Shows:/tv&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  RADARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/radarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${RADARR_PORT}:7878&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/radarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  Lidarr                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lidarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/lidarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lidarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${LIDARR_PORT}:8686&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/lidarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Music:/music&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  Readarr1 eBooks            ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;readarr1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/readarr:develop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;readarr1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${READARR1_PORT}:8787&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/readarr1:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/eBooks:/books&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  Readarr2                   ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;readarr2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/readarr:develop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;readarr2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${READARR2_PORT}:8787&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/readarr2:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/AudioBooks:/books&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  Bazarr                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;bazarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/bazarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bazarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${BAZARR_PORT}:6767&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/bazarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SABnzbd                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sabnzbd:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${PUID}:${PGID}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SABNZBD_PORT}:8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sabnzbd:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  NETWORK                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;external&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;what-each-piece-actually-does&#34;&gt;What Each Piece Actually Does
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;services:&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Each app gets its own container. Easier to debug, update, or nuke from orbit when things go sideways.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;image:&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
I use &lt;code&gt;linuxserver.io&lt;/code&gt; images exclusively. It is clean, well-documented, and no weird surprises hiding in &lt;code&gt;latest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;user: &amp;quot;${PUID}:${PGID}&amp;quot;&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
This is the magic that prevents permission hell. Every container runs as your host user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;env_file: .env&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Keeps sensitive info and paths out of the compose file. Makes the whole thing portable between servers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;volumes:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/config&lt;/code&gt;: App settings and databases that persist forever&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/downloads&lt;/code&gt;: Shared workspace for all apps and SAB&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/media&lt;/code&gt;: Your precious media collection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;networks:&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Everything sits on &lt;code&gt;media_network&lt;/code&gt;. Internal traffic stays inside Docker. No extra IPs to manage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;restart: unless-stopped&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Containers come back after reboots, crashes, or when you&amp;rsquo;re mid-binge and don&amp;rsquo;t want to babysit anything.&lt;/p&gt;
&lt;h2 id=&#34;the-essential-env-file&#34;&gt;The Essential .env File
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# User and Group ID (Prevents permission issues)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Main user ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PUID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Main group ID:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PGID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Timezone (Ensures correct scheduling and logs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;America/Denver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Define Ports (Ports for each container are defined here)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RADARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7878&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SONARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8989&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SABNZBD_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PROWLARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;9696&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LIDARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8686&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;READARR1_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8787&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;READARR2_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8788&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BAZARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;6767&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Data Directories (Keeps storage paths centralized)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DOWNLOADS_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/downloads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MEDIA_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/Storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;







  
  

&lt;div class=&#34;alert alert-tip&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💡&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Tip:&lt;/strong&gt;
    &lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;id&lt;/code&gt; to get your &lt;code&gt;PUID&lt;/code&gt; and &lt;code&gt;PGID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;TZ&lt;/code&gt; correctly or your downloads will happen at weird hours&lt;/li&gt;
&lt;li&gt;Use absolute paths everywhere—don&amp;rsquo;t get cute with relative paths&lt;/li&gt;
&lt;/ul&gt;

  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;getting-started-the-easy-way&#34;&gt;Getting Started (The Easy Way)
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Drop both files in the same folder:&lt;/strong&gt; Edit the &lt;code&gt;.env&lt;/code&gt; to match your real paths and UID/GID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fire it up:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access your apps:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sonarr: &lt;code&gt;http://your-ip:8989&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Radarr: &lt;code&gt;http://your-ip:7878&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prowlarr: &lt;code&gt;http://your-ip:9696&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(and so on&amp;hellip;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;real-world-scenarios-where-this-shines&#34;&gt;Real-World Scenarios Where This Shines
&lt;/h2&gt;&lt;h3 id=&#34;running-jellyfin&#34;&gt;Running Jellyfin?
&lt;/h3&gt;&lt;p&gt;This stack becomes your automated feeder system. Jellyfin handles playback, and the Arr apps handle acquisition. New episode downloads → automatically appear in Jellyfin. No more manual file moves. No more metadata headaches.&lt;/p&gt;
&lt;h3 id=&#34;tired-of-snaps-bs-on-ubuntu&#34;&gt;Tired of Snap&amp;rsquo;s BS on Ubuntu?
&lt;/h3&gt;&lt;p&gt;Snap has a mind of its own. Sometimes Snap won&amp;rsquo;t update, force-updates when you don&amp;rsquo;t want it to, or your Docker CLI vanishes.&lt;/p&gt;
&lt;p&gt;This stack uses real Docker, on your terms, with predictable behavior. (Also why I moved everything back to Debian, but that&amp;rsquo;s another rant.)&lt;/p&gt;
&lt;h3 id=&#34;want-boring-updates-yes-please&#34;&gt;Want Boring Updates? Yes please.
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose pull
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Your config persists, your ports don&amp;rsquo;t change, and you&amp;rsquo;re back online in seconds with fresh code.&lt;/p&gt;
&lt;h2 id=&#34;the-one-gotcha-thatll-bite-you&#34;&gt;The One Gotcha That&amp;rsquo;ll Bite You
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Mounts matter.&lt;/strong&gt; If your paths don&amp;rsquo;t match between host and container, nothing works.&lt;/p&gt;
&lt;p&gt;Double-check that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Host &lt;code&gt;/downloads&lt;/code&gt; maps to container &lt;code&gt;/downloads&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Same for &lt;code&gt;/media&lt;/code&gt; and &lt;code&gt;/config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Your &lt;code&gt;PUID&lt;/code&gt;/&lt;code&gt;PGID&lt;/code&gt; match your actual user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get this wrong, and you&amp;rsquo;ll be back to debugging permission errors like it&amp;rsquo;s 2019.&lt;/p&gt;
&lt;h2 id=&#34;the-one-gotcha-thatll-bite-you-1&#34;&gt;The One Gotcha That&amp;rsquo;ll Bite You
&lt;/h2&gt;







  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    &lt;p&gt;&lt;strong&gt;Mounts matter.&lt;/strong&gt; If your paths don&amp;rsquo;t match between host and container, nothing is going to work.&lt;/p&gt;
&lt;p&gt;Double-check that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Host &lt;code&gt;/downloads&lt;/code&gt; maps to container &lt;code&gt;/downloads&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Same for &lt;code&gt;/media&lt;/code&gt; and &lt;code&gt;/config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Your &lt;code&gt;PUID&lt;/code&gt;/&lt;code&gt;PGID&lt;/code&gt; matches your actual user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If these are wrong, you will be back to debugging permission errors.&lt;/p&gt;

  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;the-bottom-line&#34;&gt;The Bottom Line
&lt;/h2&gt;&lt;p&gt;You now have the complete stack. One YAML file. One &lt;code&gt;.env&lt;/code&gt;. All your media apps work together without fighting over ports, permissions, or your sanity.&lt;/p&gt;
&lt;p&gt;I fought for two years trying to outsmart this problem with clever LXC setups. Turns out the solution was to stop being clever and just let Docker do the work.&lt;/p&gt;
&lt;p&gt;I hope my pain and suffering saves you some time and effort.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/ugreen-NAS.jpg&#34; alt=&#34;UGREEN NASync DXP4800 Plus 4-Bay Desktop NAS&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Need A NAS?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;UGREEN NASync DXP4800, 4-Bay NAS with Intel N100 Quad-Core CPU (Up to 3.4GHz) 8GB DDR5, 2x M.2 PCIe Slots and a 2.5GbE Port (Diskless). This is perfect if you don&amp;rsquo;t want to DIY your NAS.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3TZdbTa&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445834073258455140506374&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fugreen-dxp4800-4-bay-quad-core-2-0-ghz-cpu-processor-diskless-system%2fp%2fN82E16822995002&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Docker vs Mutiple LXCs for the Arr Suite</title>
        <link>https://diymediaserver.com/post/docker-vs-lxcs/</link>
        <pubDate>Sun, 22 Jun 2025 07:13:47 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/docker-vs-lxcs/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/docker-vs-lxcs/docker-vs-lxc.png" alt="Featured image of post Docker vs Mutiple LXCs for the Arr Suite" /&gt;&lt;p&gt;I used to think running each Arr app in its own LXC was a smart move. It felt clean. Minimal. Efficient. However, if you&amp;rsquo;ve ever tried to juggle Sonarr, Radarr, SABnzbd, and the rest across a handful of Proxmox containers, you know the cracks start showing up quickly. Trust me, I&amp;rsquo;ve been there, and it&amp;rsquo;s not worth the pain.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re serious about your media setup, it&amp;rsquo;s time to move your Arr stack into a Docker environment inside a single Virtual Machine. Here&amp;rsquo;s why it matters.&lt;/p&gt;
&lt;h2 id=&#34;points-that-im-willing-to-concede&#34;&gt;Points that I&amp;rsquo;m Willing to Concede
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can setup the Arr Suite in their own unprivileged LXCs. I did it and it worked. However, I didn&amp;rsquo;t like managing it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I know some of you run Docker in LXCs. That is a special kind of headache that I want nothing to do with. It also isn&amp;rsquo;t officially supported by Proxmox.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-were-working-with&#34;&gt;What We&amp;rsquo;re Working With
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Proxmox&lt;/strong&gt; is a virtualization platform that allows you to run multiple operating systems on a single physical machine, perfect for a homelab or media hoarders who want to consolidate services.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LXC containers&lt;/strong&gt; are lightweight virtualized environments that share the host&amp;rsquo;s kernel. Think of them as isolated spaces that use fewer resources than full virtual machines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Virtual machines (VMs)&lt;/strong&gt; are complete, isolated operating systems that don&amp;rsquo;t share anything with the host.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Arr suite&lt;/strong&gt; includes applications like Sonarr (TV show automation), Radarr (movie automation), Lidarr (music automation), and SABnzbd (download client) that work together to automatically find, download, and organize your media library.&lt;/p&gt;
&lt;h2 id=&#34;lxc-containers-look-great-on-paper-but-they-will-trip-you-up-fast&#34;&gt;LXC Containers Look Great on Paper, But They Will Trip You Up Fast
&lt;/h2&gt;&lt;p&gt;Sure, LXCs are lightweight. They share the Proxmox host&amp;rsquo;s kernel and do not suck up much in the way of resources. That sounds ideal until you realize just how tightly integrated the Arr apps are.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Too Many Moving Parts&lt;/strong&gt;: Seven LXCs means seven operating systems, seven update schedules, seven IP addresses, and seven chances for something to break. Docker bundles everything together. Less patching, fewer surprises.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Networking Gets Messy&lt;/strong&gt;: Apps like Sonarr and Radarr need to talk to Prowlarr and your downloader constantly. Getting that cross-talk working between LXCs means manually configuring IP addresses, firewall rules, and routing between containers. Here is where Docker shines. It creates an internal network where services can find each other by name automatically. Instead of remembering that Sonarr lives at 192.168.1.100:8989, you tell it to connect to &amp;ldquo;sonarr:8989&amp;rdquo; and Docker handles the rest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Storage and Permissions Are a Nightmare&lt;/strong&gt;: When multiple LXCs attempt to access the same media folders, you might run into user ID and group ID issues. One container might create files that another cannot read or modify. With Docker, you map your storage once to the VM, and all containers share the same user context, eliminating permission headaches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unprivileged Containers Make Network Storage a Pain&lt;/strong&gt;: If you are running unprivileged LXCs (which you should for security), accessing NFS or SMB shares becomes a special kind of hell. Unprivileged containers map user IDs differently than the host system, so your media files could potentially show up as owned by &amp;ldquo;nobody&amp;rdquo; or become completely inaccessible. You will spend hours tweaking UID maps, CIFS mount options, and NFS export settings to get basic file access working. Meanwhile, a VM with Docker mounts your network shares normally and passes them through to containers without the mapping headaches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Config Drift Is Real&lt;/strong&gt;: One LXC might get updated while another does not. Suddenly, one app fails, and you spend hours figuring out why version mismatches are breaking API calls between services. Docker Compose gives you a single source of truth, a YAML file that defines your entire stack with specific versions.&lt;/p&gt;
&lt;h2 id=&#34;docker-in-a-vm-the-sweet-spot-for-media-automation&#34;&gt;Docker in a VM: The Sweet Spot for Media Automation
&lt;/h2&gt;&lt;p&gt;Here is where things get easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One VM to Rule Them All&lt;/strong&gt;: Instead of babysitting a small army of containers, you manage one Debian or Ubuntu VM. Update once. Patch once. Reboot once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose = Sanity&lt;/strong&gt;: Everything is in a single &lt;code&gt;docker-compose.yml&lt;/code&gt; file that handles every Arr app you need (Sonarr, Radarr, Lidarr, SABnzbd, etc.), their connections, volumes, ports, and environment variables, plus user IDs, and timezones are all centralized and clean. Spin up the stack with &lt;code&gt;docker compose up -d&lt;/code&gt;, shut it down with one command &lt;code&gt;docker compose down&lt;/code&gt;, and update the apps without touching the rest of the system &lt;code&gt;docker compose pull&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;True Isolation&lt;/strong&gt;: VMs are completely fenced off from your Proxmox host. If something breaks, it will not leak into your main system. If you ever need to move the stack, just back up the VM and drop it in the new location.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Less Headache When Things Break&lt;/strong&gt;: One place to look for problems. Use &lt;code&gt;docker logs&lt;/code&gt; and get answers fast. No need to jump between different containers and hunt through logs scattered across multiple LXCs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Better Community Support&lt;/strong&gt;: Most media server guides today assume you are running Docker. That means more tutorials, more troubleshooting help, and fewer dead ends when you run into problems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Efficient Use of Resources&lt;/strong&gt;: A single VM with Docker may use slightly more memory than LXCs initially, but long term, it is more stable, more predictable, and easier to maintain. The small resource overhead is worth the massive reduction in complexity.&lt;/p&gt;
&lt;h2 id=&#34;stop-fighting-start-watching&#34;&gt;Stop Fighting. Start Watching.
&lt;/h2&gt;&lt;p&gt;LXCs are ideal for simple, fire-and-forget services that do not need to communicate with each other. But the Arr suite is not that. These apps need to work together seamlessly, and they need consistency across your entire stack.&lt;/p&gt;
&lt;p&gt;Docker inside a VM gives you that consistency. This method provides you with the benefits of isolation and virtualization with the simplicity of containerized applications that can communicate with each other effortlessly.&lt;/p&gt;
&lt;p&gt;So, skip the mess. Build your media automation stack inside a VM. Use Docker Compose. Spend less time debugging networking and permission issues, and more time enjoying your perfectly organized media library.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Set it up once. Watch it work. Enjoy your media.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/minidesktop.png&#34; alt=&#34;ASROCK Mini-Desktop Computer&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;ASROCK Mini-Desktop Computer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The DeskMini B760 is a compact yet powerful barebone system perfect for homelab use. It supports up to 14th Gen Intel CPUs (65W), dual DDR4 RAM up to 64GB, and fast storage via both Gen5 and Gen4 M.2 slots plus dual 2.5&amp;quot; drive bays. It&amp;rsquo;s ideal for running lightweight VMs and/or containers — all in a tiny footprint.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4kVe2jP&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445836990415726193859040&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fasrock-deskmini-b760-series-barebone-system-supports-14th-13th-12th-gen-intel-core-processors-max-tdp-65w-deskmini-b760w%2fp%2fN82E16856158095&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Choosing the Right Linux Distro Debian vs Ubuntu</title>
        <link>https://diymediaserver.com/post/choosing-the-right-linux-distro-debian-vs-ubuntu/</link>
        <pubDate>Sun, 15 Jun 2025 12:47:22 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/choosing-the-right-linux-distro-debian-vs-ubuntu/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/choosing-the-right-linux-distro-debian-vs-ubuntu/debian-vs-ubuntu.webp" alt="Featured image of post Choosing the Right Linux Distro Debian vs Ubuntu" /&gt;&lt;p&gt;So, you want to build a computer (server) that stores and shares files across your home network. Think of it like a digital filing cabinet that everyone in your house can access from their laptops, phones, and tablets. This type of computer is called a NAS (Network Attached Storage) server.&lt;/p&gt;
&lt;p&gt;When building this kind of file server, you have two main choices for the operating system: Debian  or Ubuntu. There are others, but for most people these will be the two they most likely have to decide between. Both are versions of Linux, a free computer operating system that differs from Windows or macOS. Let me explain why Debian is the better choice.&lt;/p&gt;
&lt;h2 id=&#34;what-makes-these-operating-systems-different&#34;&gt;What Makes These Operating Systems Different?
&lt;/h2&gt;&lt;p&gt;First, let&amp;rsquo;s understand what we&amp;rsquo;re comparing. Both Debian and Ubuntu are Linux operating systems, but they work differently:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Debian&lt;/strong&gt; is like a carefully organized library. Everything is tested thoroughly before getting added to the collection. The librarians (developers) ensure each book (software program) works perfectly with all the other books before putting it on the shelf.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt; is like a modern bookstore that gets new releases quickly. They stock the latest books, but sometimes a new book might have printing errors or might not work well with other books you already own.&lt;/p&gt;
&lt;h2 id=&#34;why-debian-is-perfect-for-file-servers&#34;&gt;Why Debian is Perfect for File Servers
&lt;/h2&gt;&lt;h3 id=&#34;rock-solid-reliability&#34;&gt;Rock-Solid Reliability
&lt;/h3&gt;&lt;p&gt;When you&amp;rsquo;re storing your family photos, important documents, and music collection, you want a system that rarely breaks down. Debian is famous for its stability. Here&amp;rsquo;s what that means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No surprise changes&lt;/strong&gt;: Once Debian 13 is released, the software won&amp;rsquo;t suddenly change how it works. Your file server will keep running the same way for years.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fewer crashes&lt;/strong&gt;: Debian tests everything extensively, so your server is much less likely to freeze up or stop working.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable behavior&lt;/strong&gt;: You won&amp;rsquo;t wake up one day to find that an update changed how your file sharing works.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu updates more frequently, which sounds good but can cause problems. Imagine if your car&amp;rsquo;s dashboard randomly rearranged itself every few months – that&amp;rsquo;s what frequent updates can feel like on a file server.&lt;/p&gt;
&lt;h3 id=&#34;starts-clean-and-stays-clean&#34;&gt;Starts Clean and Stays Clean
&lt;/h3&gt;&lt;p&gt;When you install Debian without a desktop environment (the visual interface with windows and icons), you get exactly what you need and nothing else. It&amp;rsquo;s like buying a toolbox with only the tools you actually use.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what this means practically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster startup&lt;/strong&gt;: Your server turns on and gets ready to share files quickly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uses less memory&lt;/strong&gt;: More of your computer&amp;rsquo;s brain power goes to storing and sharing files instead of running unnecessary programs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fewer security risks&lt;/strong&gt;: Fewer programs running means fewer ways for hackers to get in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu, even in server mode, comes with extra programs you might not need. It&amp;rsquo;s like getting a toolbox where half the tools are for jobs you&amp;rsquo;ll never do.&lt;/p&gt;
&lt;h3 id=&#34;software-that-just-works&#34;&gt;Software That Just Works
&lt;/h3&gt;&lt;p&gt;For a file server, you need three main types of programs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Samba/SMB&lt;/strong&gt;: Lets Windows computers access your files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NFS&lt;/strong&gt;: Lets Mac and Linux computers access your files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MergerFS&lt;/strong&gt;: Combines multiple hard drives into one big storage space&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debian gives you older, more stable versions of these programs. Think of it like using a reliable 5-year-old car versus a brand-new model that might have unknown problems. The older car has had all its bugs ironed out over the years of use and testing.&lt;/p&gt;
&lt;p&gt;Ubuntu gives you newer versions, but &amp;ldquo;newer&amp;rdquo; doesn&amp;rsquo;t always mean &amp;ldquo;better&amp;rdquo; when you&amp;rsquo;re dealing with terabytes of critical data.&lt;/p&gt;
&lt;h3 id=&#34;easy-updates&#34;&gt;Easy Updates
&lt;/h3&gt;&lt;p&gt;Every few years, you&amp;rsquo;ll want to update your operating system to a newer version. With Debian, this process is smooth and well-documented. It&amp;rsquo;s like following an easy and clearly written recipe that thousands of people have used successfully.&lt;/p&gt;
&lt;p&gt;Ubuntu&amp;rsquo;s long-term support versions can be trickier to update, especially if you&amp;rsquo;ve customized your system. Sometimes, the Ubuntu update process can break things.&lt;/p&gt;
&lt;h3 id=&#34;no-corporate-control&#34;&gt;No Corporate Control
&lt;/h3&gt;&lt;p&gt;Debian is run entirely by volunteers who believe in free, open software. Ubuntu is owned by  Canonical, which sometimes makes decisions based on business needs rather than what&amp;rsquo;s best for users.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what this means for you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No forced software&lt;/strong&gt;: Debian won&amp;rsquo;t push programs on you that you don&amp;rsquo;t want&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No hidden agenda&lt;/strong&gt;: Every decision is made in the open by the community&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No surprise changes&lt;/strong&gt;: Corporate priorities won&amp;rsquo;t suddenly change how your system works&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;long-term-support&#34;&gt;Long-Term Support
&lt;/h3&gt;&lt;p&gt;Both systems offer long-term support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ubuntu 24.04&lt;/strong&gt;: 5 years of updates (can extend to 10 years for a fee)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debian&lt;/strong&gt;: About 5 years of updates (completely free)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debian&amp;rsquo;s support is entirely free and community-driven, while Ubuntu&amp;rsquo;s extended support requires paying for their &amp;ldquo;Pro&amp;rdquo; service.&lt;/p&gt;
&lt;h2 id=&#34;what-about-debian-13s-release-date&#34;&gt;What About Debian 13&amp;rsquo;s Release Date?
&lt;/h2&gt;&lt;p&gt;Debian 13 (code-named &amp;ldquo;Trixie&amp;rdquo;) isn&amp;rsquo;t available yet – it&amp;rsquo;s expected around mid-2025. If you&amp;rsquo;re building your file server now, you can start with Debian 12 and easily upgrade to Debian 13 when released. The upgrade process is designed to be smooth and safe.&lt;/p&gt;
&lt;h2 id=&#34;debian-just-feels-like-home&#34;&gt;Debian Just Feels Like Home
&lt;/h2&gt;&lt;p&gt;I’ve spent the last two weeks migrating all my VMs and LXC containers back to Debian. Not because something broke but because Debian feels more like home. It’s clean, it’s predictable, and I can make it my own without a corporation like Canonical getting in my way. Just the system I want and nothing more.&lt;/p&gt;
&lt;h2 id=&#34;the-bottom-line&#34;&gt;The Bottom Line
&lt;/h2&gt;&lt;p&gt;Building a home file server is like setting up a digital foundation for your family&amp;rsquo;s data. You want something reliable, simple, and long-lasting. Debian 13 provides exactly that – a clean, stable system that will quietly do its job for years without causing headaches.&lt;/p&gt;
&lt;p&gt;Ubuntu 24.04 isn&amp;rsquo;t bad, but it comes with extra complexity and corporate decisions that can get in your way. When your goal is simple file sharing that just works, Debian&amp;rsquo;s straightforward approach is hard to beat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For peace of mind and reliable file storage, choose Debian for your home server.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;need-a-new-hdd-to-keep-up-with-your-downloads&#34;&gt;Need a new HDD to keep up with your downloads?
&lt;/h3&gt;&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>How To Install Prowlarr in Docker</title>
        <link>https://diymediaserver.com/post/how-to-install-prowlarr-in-docker/</link>
        <pubDate>Sun, 25 May 2025 06:24:52 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/how-to-install-prowlarr-in-docker/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-to-install-prowlarr-in-docker/prowlarr.webp" alt="Featured image of post How To Install Prowlarr in Docker" /&gt;&lt;h2 id=&#34;what-is-prowlarr&#34;&gt;What is Prowlarr?
&lt;/h2&gt;&lt;p&gt;Prowlarr is the download and index manager for your media server. Think of it as the glue between your torrent/Usenet sources and the Arr apps like Sonarr, Radarr, and Lidarr. Instead of configuring downloaders and indexers manually in every app, you set them up once in Prowlarr.&lt;/p&gt;
&lt;h3 id=&#34;heres-how-it-works&#34;&gt;Here’s how it works:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;It connects to public and private torrent trackers, and/or Usenet indexers.&lt;/li&gt;
&lt;li&gt;It connects your loacal downloaders to the ARR apps.&lt;/li&gt;
&lt;li&gt;It centralizes these connections and monitors them for availability.&lt;/li&gt;
&lt;li&gt;It automatically syncs these indexers to your other Arr apps using API connections.&lt;/li&gt;
&lt;li&gt;It lets you categorize indexers by media type (TV, movies, music) and push them to the right apps.&lt;/li&gt;
&lt;li&gt;You log into one dashboard to manage every source your automation relies on. And when something goes wrong with an indexer? Prowlarr lets you know.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-you-should-use-prowlarr&#34;&gt;Why You Should Use Prowlarr
&lt;/h2&gt;&lt;p&gt;Running a media server without Prowlarr is like trying to drive a car without tires. You can sort of do it, but why?&lt;/p&gt;
&lt;h3 id=&#34;heres-why-you-want-it&#34;&gt;Here’s why you want it:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Saves Time&lt;/strong&gt;: Add an indexer or downloader once. That’s it. No more copy/paste API keys and login info three or more times.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduces Errors&lt;/strong&gt;: When one app works and another doesn’t, the culprit is often a misconfigured or outdated indexer. Prowlarr fixes that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitors Health&lt;/strong&gt;: Know immediately when an indexer or downloader goes offline. You don’t find out a week later when you are missing your favorite show.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supports Everything&lt;/strong&gt;: Private trackers, paid Usenet, free public indexers—Prowlarr works with all of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It turns a messy, manual setup into a clean, scalable system that you can set and forget.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-1-install-docker&#34;&gt;Step 1: Install Docker
&lt;/h2&gt;&lt;p&gt;To get started, you’ll need Docker installed on your server.&lt;br&gt;
Check out this guide for step-by-step instructions: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-how-to-install-docker/&#34; &gt;Master the Basics - How to Install Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-2-create-or-modify-your-docker-compose-file&#34;&gt;Step 2: Create or Modify Your Docker Compose File
&lt;/h2&gt;&lt;p&gt;Let’s define your Prowlarr container using &lt;code&gt;docker-compose.yml&lt;/code&gt;. In this post we will be adding Prowlarr to our existing &lt;code&gt;docker-compose.yml&lt;/code&gt; that contains the settings for the rest of the stack.
Post: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to-install-sonarr-in-docker/&#34; &gt;How to Install Sonarr in Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;open-the-compose-file&#34;&gt;Open the Compose File
&lt;/h3&gt;&lt;p&gt;Open your existing &lt;code&gt;docker-compose.yml&lt;/code&gt; or create a new one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, copy and paste the SABnzbd Section:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  PROWLARR                   ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official Linuxserver.io Prowlarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/prowlarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${PROWLARR_PORT}:9696&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Sonarr&amp;#39;s configuration data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/prowlarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SONARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io Sonarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sonarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SONARR_PORT}:8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Sonarr&amp;#39;s configuration data &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sonarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where downloaded TV shows are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Shows:/tv&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  RADARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io Radarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/radarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${RADARR_PORT}:7878&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Radarr&amp;#39;s configuration data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/radarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where downloaded Movies are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SABnzbd                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io SABnzbd image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sabnzbd:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SABNZBD_PORT}:8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores SABnzbd&amp;#39;s configuration data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sabnzbd:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  NETWORK                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Creates an isolated Docker network for media containers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💡 Tip: Make sure the spacing is correct. YAML is very picky about spacing. The key is that each indent is two spaces not a &lt;code&gt;tab&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-3-customize-the-env-file&#34;&gt;Step 3: Customize the .env File
&lt;/h2&gt;&lt;h3 id=&#34;open-the-env-file&#34;&gt;Open the .env File
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/.env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The content of the .env file should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# User and Group ID (Prevents permission issues)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Main user ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PUID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Our media group:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PGID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Timezone (Ensures correct scheduling and logs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;America/Denver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Define Ports (Ports for each container are defined here)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Radarr’s web UI to port 7878 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RADARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7878&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Sonarr’s web UI to port 8989 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SONARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8989&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps SABnzbd’s web UI to port 8080 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SABNZBD_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Prowlarr&amp;#39;s web UI to 9696&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PROWLARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;9696&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Data Directories (Keeps storage paths centralized)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DOWNLOADS_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/downloads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MEDIA_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;step-4-start-sabnzbd&#34;&gt;Step 4: Start SABnzbd
&lt;/h2&gt;&lt;p&gt;Bring your new SABnzbd container online:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check it’s running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;prowlarr&lt;/code&gt; in the list of containers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CONTAINER ID   IMAGE                                 COMMAND   CREATED         STATUS         PORTS                                         NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;65470f79b320   lscr.io/linuxserver/radarr:latest     &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; seconds   0.0.0.0:7878-&amp;gt;7878/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:7878-&amp;gt;7878/tcp   radarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3e96643b0ba9   lscr.io/linuxserver/sabnzbd:latest    &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; seconds   0.0.0.0:8080-&amp;gt;8080/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:8080-&amp;gt;8080/tcp   sabnzbd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;604d2ed3850c   lscr.io/linuxserver/prowlarr:latest   &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; seconds   0.0.0.0:9696-&amp;gt;9696/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:9696-&amp;gt;9696/tcp   prowlarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;52c78c78f541   lscr.io/linuxserver/sonarr:latest     &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; seconds   0.0.0.0:8989-&amp;gt;8989/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:8989-&amp;gt;8989/tcp   sonarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;step-5-fix-permissions-if-needed&#34;&gt;Step 5: Fix Permissions (If Needed)
&lt;/h2&gt;&lt;p&gt;Permissions issues are a common snag with media containers. Here’s how to make sure everything plays nice:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /docker/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /docker/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /media/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /media/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check out this post if you want to learn more about Linux permissions:&lt;br&gt;
&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/&#34; &gt;Master the Basics - Linux Permissions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-6-access-and-set-up-prowlarr-in-your-browser&#34;&gt;Step 6: Access and Set Up Prowlarr in Your Browser
&lt;/h2&gt;&lt;p&gt;Open a web browser and visit:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://your-server-ip:9696&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Follow the setup wizard to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add your Usenet and torrent indexers&lt;/li&gt;
&lt;li&gt;Link your downloader (qBittorent, SABnzbd, or NZBget) via API&lt;/li&gt;
&lt;li&gt;Link Sonarr, Radarr, Lidarr via API&lt;/li&gt;
&lt;li&gt;Set up categories (movies → Radarr, TV → Sonarr, etc.)&lt;/li&gt;
&lt;li&gt;Turn on Sync to push indexers automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once connected, Prowlarr becomes the single point to update these apps in your stack.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-7-keep-your-docker-software-updated&#34;&gt;Step 7: Keep Your Docker Software Updated
&lt;/h2&gt;&lt;p&gt;To update:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose pull  &lt;span class=&#34;c1&#34;&gt;# Fetches the latest image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose down  &lt;span class=&#34;c1&#34;&gt;# Stops and removes the running container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d  &lt;span class=&#34;c1&#34;&gt;# Starts a fresh container with the new image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Radarr, Sonarr, SABnzbd, and Prowlarr will restart with the latest version, no reconfig needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;in-closing&#34;&gt;In Closing
&lt;/h2&gt;&lt;p&gt;Prowlarr plugs a gap in the automation chain. It keeps indexers and downloaders consistent, online, and working with your stack. Run it in Docker and forget about it. You’ll spend less time troubleshooting and more time enjoying your media.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Want a real hands-off setup? Prowlarr is the piece you’re missing. Install it. Sync it. Forget it.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;need-a-new-hdd-to-keep-up-with-your-downloads&#34;&gt;Need a new HDD to keep up with your downloads?
&lt;/h3&gt;&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>How To Install SABnzbd in Docker</title>
        <link>https://diymediaserver.com/post/how-to_install-sabnzbd-in-docker/</link>
        <pubDate>Sat, 10 May 2025 05:04:12 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/how-to_install-sabnzbd-in-docker/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-to_install-sabnzbd-in-docker/sabnzbd.webp" alt="Featured image of post How To Install SABnzbd in Docker" /&gt;&lt;p&gt;If you’re diving into the world of Usenet, you’ll learn of &lt;strong&gt;SABnzbd&lt;/strong&gt; existence immediately and for good reason. While tools like Radarr and Sonarr handle the &lt;em&gt;what&lt;/em&gt; and &lt;em&gt;when&lt;/em&gt; part of downloading, SABnzbd takes care of the &lt;em&gt;how&lt;/em&gt;. SABnzbd is the download engine that grabs NZB files from your indexer, handles repairs and unpacking, and drops the final product into your media library.&lt;/p&gt;
&lt;p&gt;And the best part? &lt;strong&gt;It just works&lt;/strong&gt;. Once configured, SABnzbd hums quietly in the background, handling downloads with zero fuss.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-sabnzbd-is-a-core-part-of-your-media-stack&#34;&gt;Why SABnzbd Is a Core Part of Your Media Stack
&lt;/h2&gt;&lt;p&gt;Here’s why SABnzbd remains a fan favorite:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;100% Free and Open Source&lt;/strong&gt; – No premium licenses or paywalls. It’s fully featured out of the box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handles Everything Automatically&lt;/strong&gt; – SABnzbd can repair, extract, and even clean up files after download using built-in tools like par2 and unrar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Categories&lt;/strong&gt; – Create custom routing rules for different media types so that Radarr, Sonarr, and Lidarr can each get their own download folders.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Interface&lt;/strong&gt; – Clean, responsive UI for managing and monitoring downloads from any device.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API + Script Support&lt;/strong&gt; – Want to customize behavior? SABnzbd supports post-processing scripts and integrates easily with tools like Radarr and Sonarr.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’re using Usenet, SABnzbd is the no-brainer choice for managing your downloads.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-run-sabnzbd-in-docker&#34;&gt;Why Run SABnzbd in Docker?
&lt;/h2&gt;&lt;p&gt;Docker makes SABnzbd easier to manage and more portable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cleaner Installs&lt;/strong&gt; – No Python dependencies or package conflicts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effortless Updates&lt;/strong&gt; – Updating is as easy as pulling the latest image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy to Move&lt;/strong&gt; – Need to switch servers? Just copy your config folder and go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better Separation&lt;/strong&gt; – Keep your download service sandboxed from the rest of your system.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-1-install-docker&#34;&gt;Step 1: Install Docker
&lt;/h2&gt;&lt;p&gt;To get started, you’ll need Docker installed on your server.&lt;br&gt;
Check out this guide for step-by-step instructions: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-how-to-install-docker/&#34; &gt;Master the Basics - How to Install Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-2-create-or-modify-your-docker-compose-file&#34;&gt;Step 2: Create or Modify Your Docker Compose File
&lt;/h2&gt;&lt;p&gt;Let’s define your SABnzbd container using &lt;code&gt;docker-compose.yml&lt;/code&gt;. In this post we will be adding SABnzbd to our existing &lt;code&gt;docker-compose.yml&lt;/code&gt; that contains the settings for the rest of the stack.
Post: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to-install-sonarr-in-docker/&#34; &gt;How to Install Sonarr in Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;open-the-compose-file&#34;&gt;Open the Compose File
&lt;/h3&gt;&lt;p&gt;Open your existing &lt;code&gt;docker-compose.yml&lt;/code&gt; or create a new one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, copy and paste the SABnzbd Section:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SONARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io Sonarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sonarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SONARR_PORT}:8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Sonarr&amp;#39;s configuration data &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sonarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where downloaded TV shows are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Shows:/tv&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  RADARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io Radarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/radarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${RADARR_PORT}:7878&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Radarr&amp;#39;s configuration data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/radarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where downloaded Movies are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SABnzbd                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io SABnzbd image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sabnzbd:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SABNZBD_PORT}:8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores SABnzbd&amp;#39;s configuration data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sabnzbd:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  NETWORK                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Creates an isolated Docker network for media containers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💡 Tip: Make sure the spacing is correct. YAML is very picky about spacing. The key is that each indent is two spaces not a &lt;code&gt;tab&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-3-customize-the-env-file&#34;&gt;Step 3: Customize the .env File
&lt;/h2&gt;&lt;h3 id=&#34;open-the-env-file&#34;&gt;Open the .env File
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/.env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The content of the .env file should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# User and Group ID (Prevents permission issues)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Main user ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PUID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Our media group:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PGID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Timezone (Ensures correct scheduling and logs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;America/Denver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Define Ports (Ports for each container are defined here)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Radarr’s web UI to port 7878 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RADARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7878&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Sonarr’s web UI to port 8989 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SONARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8989&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps SABnzbd’s web UI to port 8080 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SABNZBD_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Data Directories (Keeps storage paths centralized)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DOWNLOADS_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/downloads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MEDIA_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update the SABnzbd file paths as needed. Here’s what to change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CONFIG_PATH=/docker&lt;/code&gt; → Root folder where Docker stores persistent files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DOWNLOADS_PATH=/media/downloads&lt;/code&gt; → Root folder where your download client stores temp/incomplete files&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure the SABnzbd container access to the &lt;code&gt;/downloads&lt;/code&gt; path.&lt;/p&gt;
&lt;p&gt;Also update the timezone (TZ) to match yours.&lt;br&gt;
Refer to: &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This list of valid timezones&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-4-start-sabnzbd&#34;&gt;Step 4: Start SABnzbd
&lt;/h2&gt;&lt;p&gt;Bring your new SABnzbd container online:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check it’s running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;sabnzbd&lt;/code&gt; in the list of containers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CONTAINER ID   IMAGE                               COMMAND   CREATED          STATUS          PORTS                                         NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;c8d2c60a955b   lscr.io/linuxserver/sonarr:latest   &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;54&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; seconds   0.0.0.0:8989-&amp;gt;8989/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:8989-&amp;gt;8989/tcp   sonarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ff12a474a4fe   lscr.io/linuxserver/radarr:latest   &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;54&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; seconds   0.0.0.0:7878-&amp;gt;7878/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:7878-&amp;gt;7878/tcp   radarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;d152d14e3fe3   lscr.io/linuxserver/sabnzbd:latest  &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;15&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;11&lt;/span&gt; seconds   0.0.0.0:8080-&amp;gt;8080/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:8080-&amp;gt;8080/tcp   sabnzbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;step-5-fix-permissions-if-needed&#34;&gt;Step 5: Fix Permissions (If Needed)
&lt;/h2&gt;&lt;p&gt;Permissions issues are a common snag with media containers. Here’s how to make sure everything plays nice:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /docker/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /docker/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /media/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /media/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check out this post if you want to learn more about Linux permissions:&lt;br&gt;
&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/&#34; &gt;Master the Basics - Linux Permissions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-6-set-up-sabnzbd-in-your-browser&#34;&gt;Step 6: Set Up SABnzbd in Your Browser
&lt;/h2&gt;&lt;p&gt;Open a web browser and visit:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://your-server-ip:8080&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Follow the setup wizard to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add your Usenet provider’s server info&lt;/li&gt;
&lt;li&gt;Set up download folders&lt;/li&gt;
&lt;li&gt;Create categories like &lt;code&gt;tv&lt;/code&gt; and &lt;code&gt;movies&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Configure API keys for Radarr and Sonarr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once connected, SABnzbd becomes the download engine for your automated stack.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-7-keep-your-docker-software-updated&#34;&gt;Step 7: Keep Your Docker Software Updated
&lt;/h2&gt;&lt;p&gt;To update:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose pull  &lt;span class=&#34;c1&#34;&gt;# Fetches the latest image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose down  &lt;span class=&#34;c1&#34;&gt;# Stops and removes the running container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d  &lt;span class=&#34;c1&#34;&gt;# Starts a fresh container with the new image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Radarr, Sonarr, and SABnzbd will restart with the latest version, no reconfig needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;in-closing&#34;&gt;In Closing
&lt;/h2&gt;&lt;p&gt;SABnzbd is the &lt;strong&gt;workhorse behind Usenet downloads&lt;/strong&gt;. It’s reliable, fast, and customizable. When paired with Radarr and Sonarr, it forms the core of an automated media server setup.&lt;/p&gt;
&lt;p&gt;By running it in Docker, you keep things clean, portable, and easy to maintain. Once set up, SABnzbd quietly handles the heavy lifting while your media library manages itself. Just how it should be.&lt;/p&gt;
&lt;p&gt;If you’re serious about automation and want a hands-off experience with your downloads, SABnzbd is non-negotiable.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - How to Use parted to Create Partitions Format Them and Add a Mount Point</title>
        <link>https://diymediaserver.com/post/master-the-basics-how-to-use-parted-to-create-partitions/</link>
        <pubDate>Fri, 09 May 2025 06:24:47 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-how-to-use-parted-to-create-partitions/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-how-to-use-parted-to-create-partitions/parted.webp" alt="Featured image of post Master the Basics - How to Use parted to Create Partitions Format Them and Add a Mount Point" /&gt;&lt;p&gt;You purchased a new multi-terabyte drive for your media server and are ready to slap it into service. But hold up, before you run &lt;code&gt;fdisk&lt;/code&gt; like it’s 1999, it’s worth knowing it is no longer the right tool for the job. If your drive is over 2TB you need to use GPT instead of MBR. &lt;code&gt;fdisk&lt;/code&gt; cannot create GPT partitions, so &lt;code&gt;parted&lt;/code&gt; is the way to go.&lt;/p&gt;
&lt;p&gt;I’ll walk you through how to use &lt;code&gt;parted&lt;/code&gt; to create partitions, format them, and set up automatic mounting using &lt;code&gt;fstab&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;why-parted-over-fdisk&#34;&gt;Why Parted Over Fdisk?
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;fdisk&lt;/code&gt; only works with MBR partition tables, which limits your partition sizes to 2TB. That’s a deal-breaker for modern drives. &lt;code&gt;parted&lt;/code&gt;, on the other hand, works with both MBR and GPT and doesn’t care how big the drive is.&lt;/p&gt;
&lt;p&gt;It also has more robust support for scripting, alignment, and resizing. If you’re working with advanced setups or need to future-proof your system, &lt;code&gt;parted&lt;/code&gt; is the tool to learn.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;fdisk-vs-parted-feature-comparison&#34;&gt;fdisk vs parted: Feature Comparison
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;&lt;code&gt;fdisk&lt;/code&gt;&lt;/th&gt;
          &lt;th&gt;&lt;code&gt;parted&lt;/code&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Partition Table Support&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;MBR (Master Boot Record) only&lt;/td&gt;
          &lt;td&gt;MBR and GPT (GUID Partition Table)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Maximum Disk Size&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Up to 2TB&lt;/td&gt;
          &lt;td&gt;Supports disks larger than 2TB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Partition Resizing&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Not supported&lt;/td&gt;
          &lt;td&gt;Supports resizing and moving partitions&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Filesystem Creation&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;No (requires separate tools like &lt;code&gt;mkfs&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;Yes (can create filesystems during partitioning)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;User Interface&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Text-based, menu-driven&lt;/td&gt;
          &lt;td&gt;Command-line and scriptable interface&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Advanced Features&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Basic partitioning tasks&lt;/td&gt;
          &lt;td&gt;Advanced features like alignment and scripting&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Best Use Case&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Simple setups with MBR partitioning&lt;/td&gt;
          &lt;td&gt;Complex setups, large disks, GPT partitioning&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;when-to-use-each-tool&#34;&gt;When to Use Each Tool
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;fdisk&lt;/code&gt;&lt;/strong&gt; for straightforward partitioning tasks on disks smaller than 2TB using the MBR scheme. It&amp;rsquo;s suitable for legacy systems and simple setups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;parted&lt;/code&gt;&lt;/strong&gt; when dealing with disks larger than 2TB, requiring GPT partitioning, or needing advanced features like resizing partitions and scripting. It&amp;rsquo;s ideal for modern systems and complex configurations.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;setting-up-your-new-drive-with-parted&#34;&gt;Setting Up Your New Drive with Parted
&lt;/h3&gt;&lt;p&gt;Here’s how to prep that new drive using &lt;code&gt;parted&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Identify the Target Disk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsblk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look for the disk you just installed. If it’s &lt;code&gt;/dev/sdb&lt;/code&gt; and it’s showing no partitions, that’s the one we’ll use.&lt;/p&gt;
&lt;p&gt;⚠️ Triple-check you’ve got the right disk before proceeding.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Install and Launch Parted and Create a GPT Partition Table&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Install parted and xfsprogs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install parted xfsprogs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start parted:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo parted /dev/sdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set the disk label to GPT (recommended for drives over 2TB or UEFI systems):&lt;/p&gt;
&lt;p&gt;In the parted shell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mklabel gpt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Create a New Partition&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Still inside parted:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkpart primary xfs 0% 100%
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can swap out &lt;code&gt;xfs&lt;/code&gt; for another filesystem label if you plan to use ext4 or btrfs later. Don’t worry, this step doesn’t actually format the drive, it just defines what it’s &lt;em&gt;for&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Now type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;quit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Followed by:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo partprobe /dev/sdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Format the New Partition&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkfs.xfs /dev/sdb1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can use &lt;code&gt;ext4&lt;/code&gt; if you prefer, but for media servers handling big files, XFS is fast and reliable.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Step 5: Create a Mount Point&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let’s say you’re adding a 5th disk to a mergerFS pool:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /mnt/pool0/disk5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Step 6: Mount It for Testing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Test it out before making anything permanent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount /dev/sdb1 /mnt/pool0/disk5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check that it worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;/dev/sdb1&lt;/code&gt; mounted at &lt;code&gt;/mnt/media&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Step 7: Add It to fstab&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First, grab the UUID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo blkid /dev/sdb1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You’ll get something like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;UUID=&amp;#34;abc123-xyz789&amp;#34; TYPE=&amp;#34;xfs&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copy the UUID&lt;/p&gt;
&lt;p&gt;Edit your fstab:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add this line:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;UUID=abc123-xyz789 /mnt/media xfs defaults 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Save and exit.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Step 8: Test Your fstab Config&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unmount the drive:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo umount /mnt/pool0/disk5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now reload fstab:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you get no errors, you’re good to go.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;wrapping-up&#34;&gt;Wrapping Up
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;parted&lt;/code&gt; isn’t just a newer tool, it’s the right one when working with modern storage. You’ve now set up your drive with a GPT table, created a partition, formatted it, and mounted it with fstab. All without hitting the 2TB wall that haunts &lt;code&gt;fdisk&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next time you drop a new drive into your rig, make &lt;code&gt;parted&lt;/code&gt; your go-to tool. Your future self will thank you.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t have a new drive yet pick one up here:&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>The Best and Worst PC Cases for Media Servers – Ranked and Reviewed</title>
        <link>https://diymediaserver.com/post/review-best-desktop-cases-nas-build/</link>
        <pubDate>Sat, 03 May 2025 07:39:35 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/review-best-desktop-cases-nas-build/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/review-best-desktop-cases-nas-build/desktop_case.webp" alt="Featured image of post The Best and Worst PC Cases for Media Servers – Ranked and Reviewed" /&gt;&lt;p&gt;You don’t need RGB LEDs and tempered glass side panels to build a good home server. You need airflow. You need drive bays. And most of all, you need peace of mind. Let’s be honest, most PC cases aren’t built for this. They’re built for looks, not longevity. If you&amp;rsquo;re stacking hard drives and chasing silence, the case matters more than you think.&lt;/p&gt;
&lt;p&gt;I’ve built more home servers than I can count. Friends, clients, online strangers, and all run into the same wall: case selection. They assume any big or “premium” tower will do. Then they try to cram 12 spinning drives into a gaming case and realize there’s no airflow, no cable space, and no way to keep it quiet. The whole thing sounds like an F/A-18 Super Hornet and cooks the hard drives like an air fryer.&lt;/p&gt;
&lt;p&gt;This is not the way.&lt;/p&gt;
&lt;p&gt;Home media servers aren’t about flexing GPU specs or running rainbow light shows. They’re about stacking storage, managing heat, and keeping your build dead silent. Whether building a 100TB media monster or a modest 24TB file server, the case is the make-or-break stat.&lt;/p&gt;
&lt;p&gt;So, to help with your case selection I have ranked the best cases for media servers. This isn’t fluff. This is a tier list based on hands-on experience, airflow, cable management sanity, and raw drive capacity. Every pick includes specs and an honest verdict. No sponsorships, no hype, just what works when you&amp;rsquo;re building practicality.&lt;/p&gt;
&lt;p&gt;Let’s get into it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-s-tier--best-of-the-best&#34;&gt;🟩 S-Tier – Best of the Best
&lt;/h2&gt;&lt;hr&gt;
&lt;h2 id=&#34;fractal-design-define-7-xl&#34;&gt;&lt;strong&gt;Fractal Design Define 7 XL&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.fractal-design.com/products/cases/define/define-7-xl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Factal Design&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;Define_7_XL/45deg.webp&#34; alt=&#34;Fractal Design Define 7 XL 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Define_7_XL/side1.webp&#34; alt=&#34;Fractal Design Define 7 XL Side1&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Define_7_XL/side2.webp&#34; alt=&#34;Fractal Design Define 7 XL Side2&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;The Define 7 XL is the endgame for serious NAS and media server builders. It’s big, heavy, and not cheap, but it earns every inch and dollar. With room for up to 18 drives, whisper-quiet acoustics, and a modular layout that adapts to your needs, it’s the only consumer case that handles a 100TB+ array without hacks or headaches.&lt;/p&gt;
&lt;p&gt;This isn’t just a good case. It’s the gold standard. Built like a tank, cooled like a server, and quiet enough to live next to your desk, the Define 7 XL dominates when it comes to long-term, high-capacity builds.&lt;/p&gt;
&lt;p&gt;If you want to build it once and use it forever, this is the case you buy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Full Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 23.8&amp;quot; × 9.4&amp;quot; × 22.3&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: E-ATX / ATX / mATX / mITX / EE-ATX / SSI-CEB / SSI-EEB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: You can get up to 18 3.5”/2.5” drives inside with optional trays.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Three 140mm fans out of the box. You can fit a 480/420mm rad in the top, another 480/420mm rad in the front, and still have room to breathe. Upto 11 120mm fans or 9 140mm fan can be used in this case. Airflow is good, even fully loaded.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: You’ve got space behind the motherboard tray for thick SATA and power cables—even with 10+ drives. Velcro straps and deep channels make routing easy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: Sound-dampening panels on all major surfaces. It’s incredibly quiet, even with a full drive load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Thick steel, zero flex, excellent panel fitment. You can tell Fractal didn’t cheap out here.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: Steel, plastic, sound-dampened panels&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: It’s big. You need room on or under your desk. And it’s not cheap, but it’s absolutely worth it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: If you&amp;rsquo;re serious about building a media server you can set and forget, the Define 7 XL is the one to beat. Yes, it&amp;rsquo;s expensive, but you&amp;rsquo;ll never outgrow it.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Define_7_XL/45deg.webp&#34; alt=&#34;Fractal Design Define 7 XL&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Fractal Design Define 7 XL&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3GG6cLC&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458314954463885947040221&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-7-xl-atx-full-tower%2fp%2fN82E16811352120&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;silverstone-cs380b&#34;&gt;&lt;strong&gt;SilverStone CS380B&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.silverstonetek.com/en/product/info/server-nas/CS380/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SilverStone&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;CS380B/45deg.webp&#34; alt=&#34;SilverStone CS380B 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;CS380B/45deg2.webp&#34; alt=&#34;SilverStone CS380B Side1&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;CS380B/side.webp&#34; alt=&#34;SilverStone CS380B Side2&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;Built for one job, and built well. The SilverStone CS380B is a no-nonsense NAS case with real hot-swap support at a price that won’t gut your budget. You get 8 hot-swap bays with proper backplanes, solid cooling, and a compact footprint perfect for closet installs or headless setups.&lt;/p&gt;
&lt;p&gt;Yeah, the internal layout is cramped. Cable routing is a pain. And no, it won’t win any beauty contests. But if you care more about function than flash, this case delivers exactly what matters: easy drive access, reliable airflow, and a build that’s purpose-built for storage.&lt;/p&gt;
&lt;p&gt;If hot-swapping is a must, this is the case to get.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Mid Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 16.8&amp;quot; × 8.5&amp;quot; × 19.2&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 8 hot-swap bays in the front, each with a metal tray and built-in backplane. Add two 5.25&amp;quot; bays above for accessories or more drives with adapters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Includes two 120mm side fans and a 120mm rear fan keep drives reasonably cool, but if you load all 8 bays, you’ll want better fans.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: This is where it hurts. It’s tight. Especially around the drive bay area. You’ll fight with SATA power cables. Modular PSUs help.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: Not dampened. The stock fans are loud. You’ll hear the drives spinning. Not ideal for a living room.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: The frame is solid, but the plastic front door feels cheap and wobbly. Hinges are known to pop loose over time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: SECC steel, plastic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: Limited GPU space (9.5”) and low CPU cooler clearance (5.7”) restrict future upgrades.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: It is a bit awkward to build in, but for a dedicated NAS tucked in a closet or rack, this case nails the essentials, hot-swap support at a fair price.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;CS380B/45deg.webp&#34; alt=&#34;SilverStone CS380B&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;SilverStone CS380B&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/43fb7vN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;-a-tier--strong-performers-with-minor-quirks&#34;&gt;🟨 A-Tier – Strong Performers with Minor Quirks
&lt;/h2&gt;&lt;hr&gt;
&lt;h2 id=&#34;fractal-design-define-r5&#34;&gt;&lt;strong&gt;Fractal Design Define R5&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.fractal-design.com/products/cases/define/define-r5/black/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Fractal Design&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;Define_R5/45deg.webp&#34; alt=&#34;SilverStone CS380B 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Define_R5/hdd.webp&#34; alt=&#34;SilverStone CS380B Side1&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Define_R5/side2.webp&#34; alt=&#34;SilverStone CS380B Side2&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;The Define R5 is the quiet, compact workhorse of the Fractal lineup. Think of it as the little brother to the Define 7 XL, smaller, easier to fit into media centers or home offices, and still packed with premium features. You lose some drive slots but gain acoustic dampening, modular cages, and a build that feels perfect.&lt;/p&gt;
&lt;p&gt;It’s not built for massive arrays or hot-swapping, but for up to 10 drives in a whisper-quiet setup, the R5 hits a sweet spot. Perfect for bedroom or office servers where silence matters more than scale.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Mid Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 20.5&amp;quot; × 9.1&amp;quot; × 17.8&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: Comes with 8 combo 3.5&amp;quot;/2.5&amp;quot; bays plus 2 SSD mounts. Enough for a modest media or backup server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Two quiet 140mm fans included. Add more if needed. This case supports up to 9 fans total or a 420mm rad.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Generous space behind the board. It’s easy to keep things clean, even with a bunch of SATA runs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: It’s quiet. One of the quietest mid-towers you can buy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Excellent. Panels are thick, the door is sturdy, and everything lines up perfectly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: Steel, plastic, sound-dampened panels&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: You’re capped at 10 total drives, and no hot-swap. Front I/O is aging. Like no USB-C.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: If you want a whisper-quiet server in the same room you work or sleep in, the R5 is a top choice. Just keep in mind the front I/O is a little dated.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Define_R5/45deg.webp&#34; alt=&#34;Fractal Design Define R5&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Fractal Design Define R5&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42YZpnB&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445838038135512313043163&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-r5-atx-micro-atx-mid-tower%2fp%2fN82E16811352048&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;montech-king-95-pro&#34;&gt;&lt;strong&gt;Montech KING 95 PRO&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.montechpc.com/king-95-pro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Montech&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;King/45deg.webp&#34; alt=&#34;Montech KING 95 PRO 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;King/side.webp&#34; alt=&#34;Montech KING 95 PRO Side&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;King/back.webp&#34; alt=&#34;Montech KING 95 PRO Back&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;If you want a media server that performs well and looks good doing it, the KING 95 PRO delivers. With space for up to 13 drives, strong airflow, and a dual-chamber layout, it is more than just a pretty face. The tempered glass and ARGB fans add flair without getting in the way.&lt;/p&gt;
&lt;p&gt;It is not a perfect case, but for the price, it is surprisingly capable. This is the budget-friendly case that proves your server doesn’t have to look like a file cabinet to get the job done.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Mid Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 18.7&amp;quot; × 11.8&amp;quot; × 17.4&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 8 x 3.5&amp;quot; HDDs and 5 x 2.5&amp;quot; SSDs. Enough for most users unless you’re running a full-blown archive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Comes with six PWM ARGB fans and a 10-port hub. Excellent airflow. Great out of the box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Dual-chamber layout makes routing super easy. You’ll have plenty of room to hide cables.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: Not bad, but no insulation. Fan curve tuning will matter here.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Surprisingly solid. Panels fit well. The curved tempered glass is sturdy, but it’s a fingerprint magnet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: 0.8mm SPCC steel, tempered glass&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: No hot-swap. Bottom filter is a pain to clean. Riser cable for vertical GPU not included.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: Slick, spacious, and stylish, this case looks great in an office or home theater setup. It’s not for massive arrays or hot-swapping, and build quality isn’t perfect, but for the price, it punches way above its weight.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;King/45deg.webp&#34; alt=&#34;Montech KING 95 PRO&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Montech KING 95 PRO&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3EY2Bba&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458317921745511331573986&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-montech-king-95-atx-mid-tower%2fp%2fN82E16811970005&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;rosewill-helium-nas&#34;&gt;&lt;strong&gt;Rosewill Helium NAS&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.rosewill.com/p/9SIA072KE80547&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rosewill&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;Helium/45deg.webp&#34; alt=&#34;Rosewill Helium NAS 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Helium/side.webp&#34; alt=&#34;Rosewill Helium NAS Side&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Helium/side2.webp&#34; alt=&#34;Rosewill Helium NAS Side 2&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;The Helium NAS is all about stuffing in drives without draining your wallet. It’s not polished. The case suffers from thin panels, sharp edges, and noisy stock fans, but for under $100, it gets the job done. You get high drive capacity, reasonable airflow, and enough room to build something serious on a tight budget.&lt;/p&gt;
&lt;p&gt;It’s rough around the edges, but if you care more about storage than style, the Helium NAS delivers real value where it counts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Mid Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 19.2&amp;quot; × 8.5&amp;quot; × 19.2&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 10 x 3.5&amp;quot; + 3 x 2.5&amp;quot;. Huge capacity for the price.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Four 140mm fans stock. All intake by default and needs reconfiguration for proper airflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Tight. Especially with full SATA and Molex bundles. Plan your routing before plugging anything in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: Mesh front and aggressive airflow = louder than you&amp;rsquo;d expect. But temps stay good.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: It’s budget steel. Side panels flex. Drive cage fitment isn’t always great. Expect quirks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: SECC steel, plastic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: No hot-swap. Some drives may block airflow. Front I/O is decent though with USB-C included.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: You’ll fight some build quirks, but for under $100, it’s a solid budget case for stuffing full of drives. 13 bays and mesh airflow seal the deal.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Helium/45deg.webp&#34; alt=&#34;Rosewill Helium NAS&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Rosewill Helium NAS&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4jHANHo&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445835579000723662190808&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2fN82E16811147365&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;-b-tier--usable-if-youre-handy&#34;&gt;🟧 B-Tier – Usable if You&amp;rsquo;re Handy
&lt;/h2&gt;&lt;hr&gt;
&lt;h2 id=&#34;darkrock-classico-max&#34;&gt;&lt;strong&gt;DARKROCK Classico Max&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://darkrockpc.com/products/darkrock-classico-max-storage-master-case-e-atx-computer-case-with-4x120mm-black-fan-10-x3-5-hdd-3-x2-5-sdd-usb-3-0-ready-360mm-radiator-supported-vertical-slots-for-gpu-vertically-mount-black&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DARKROCK&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;DarkRock/45deg.webp&#34; alt=&#34;DARKROCK Classico Max 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;DarkRock/explode.webp&#34; alt=&#34;DARKROCK Classico Max Exploded View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;DarkRock/side.webp&#34; alt=&#34;DARKROCK Classico Max Side&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;This case aims for maximum drive count on a budget and mostly nails it. It has space for 13 drives, four pre-installed fans, and a clean exterior, all for around $90. It’s a solid foundation for a media server, especially if you’re trying to stretch every dollar.&lt;/p&gt;
&lt;p&gt;That said, the build quality won’t blow you away. Thin panels, tight cable routing, and sharp edges make the build process a hassle. But if you have patience and a first aid kit (You will cut your hands), it’s hard to beat the value for the drive count.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Mid Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 18.9&amp;quot; × 8.3&amp;quot; × 18.5&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: E-ATX (with drive cage removed) / ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 10 x 3.5&amp;quot;, 3 x 2.5&amp;quot;. Impressive at this price.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Four fans included, and it fits a 360mm rad on top. Drive area airflow could be better.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Weak spot. Rear cable space is limited. SATA and Molex cables bulge the panel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: No dampening. Expect noticeable fan and drive noise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Metal panels are thin. Side panel fitment is hit-or-miss.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: Steel, plastic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: USB-C missing. One USB 3.0 port only. Watch out for cable bulk behind the tray.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: If you need maximum drive count at a low cost, this case has you covered (in your own blood). However, expect thin panels and a serious fight for cable space.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;DarkRock/45deg.webp&#34; alt=&#34;DARKROCK Classico Max&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;DARKROCK Classico Max&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4jEs7Br&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313355880409301029734&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2f2AM-05K6-00012%3fitem%3d9SIBGX1KGP9736&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;thermaltake-cte-c700-tg&#34;&gt;&lt;strong&gt;Thermaltake CTE C700 TG&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.thermaltake.com/cte-c700-tg-argb-mid-tower-chassis.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thermaltake&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;CTE_C700/45deg.webp&#34; alt=&#34;Thermaltake CTE C700 TG 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;CTE_C700/hdd.webp&#34; alt=&#34;Thermaltake CTE C700 TG HDD View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;CTE_C700/side.webp&#34; alt=&#34;Thermaltake CTE C700 TG Side&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;The C700 TG isn’t necessarily built for storage, but it brings some serious firepower if you’re building a hybrid rig. With a rotated motherboard layout for direct airflow, triple ARGB fans, and room for custom loops, it’s clearly aimed at high-performance builds. Think media storage, gaming, and VMs all in one box.&lt;/p&gt;
&lt;p&gt;It’s massive, flashy, and absolutely overkill for a pure NAS. But if you need a case that can handle mixed workloads and look good doing it, the C700 TG pulls it off with style. Just don’t expect drive-focused design. It’s all about airflow and flexibility.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Mid Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 22.3&amp;quot; × 12.9&amp;quot; × 19.8&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: E-ATX / ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 7 x 3.5&amp;quot; + 6 x 2.5&amp;quot;. Okay, but not great for dedicated NAS use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Includes 3 140mm fans. This case can support up to 11 fans. One of the best for airflow. Additionally, it can also support up to 3 rads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Excellent, thanks to the dual chamber. Cables route cleanly, even with multiple drives and fans.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: With high-RPM fans, it gets loud. Replace them for silence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Very solid. Premium glass and thick panels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: Steel, tempered glass, plastic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: Heavy. Top I/O not ideal for under-desk setups.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: This case is suited for high-performance setups like gaming, media playback, VMs, or creative workstations. It’s overkill for pure storage but works if you want fancy cooling and extra headroom.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;CTE_C700/45deg.webp&#34; alt=&#34;Thermaltake CTE C700 TG&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Thermaltake CTE C700 TG&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42XDXiX&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445835071540184151610070&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2fN82E16811133514%3fitem%3d9SIA8EFJYS9760&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;phanteks-enthoo-pro-tg&#34;&gt;&lt;strong&gt;Phanteks Enthoo Pro TG&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://phanteks.com/product/enthoo-pro-tg/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Phanteks&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;Enthoo/45deg.webp&#34; alt=&#34;Phanteks Enthoo Pro TG 45 Degree View&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Enthoo/side.webp&#34; alt=&#34;Phanteks Enthoo Pro TG Side&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
  &lt;img src=&#34;Enthoo/side2.webp&#34; alt=&#34;Phanteks Enthoo Pro TG Side 2&#34; style=&#34;width: 100%; max-width: 275px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;This case is starting to show its age, but it still holds up if you manage your expectations. You get decent drive support, solid build quality, and enough room for fans, but airflow and cable management don’t match what newer cases offer.&lt;/p&gt;
&lt;p&gt;It was top-tier back in 2016. Today? It’s functional, not exceptional. If you already own it, it’s worth using. But if you’re shopping for something new, there are better options on the market.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Full Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 21.1&amp;quot; × 9.3&amp;quot; × 21.7&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: SSI-EEB / E-ATX / ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 6 x 3.5&amp;quot;, 4 x 2.5&amp;quot;. Good for mid-size builds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: One front fan and one rear fan are included. Airflow is okay, but you’ll want more fans.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Lots of tie points and channels. Easy to keep tidy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: No insulation. Average sound profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Decent. Nothing to write home about.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: Steel, tempered glass, plastic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: Vertical GPU mount needs a riser. Build layout is less optimized by today’s standards.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: This case is dated but dependable. Still usable if you already have it, but if you&amp;rsquo;re buying new, there are better options for the price.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Enthoo/45deg.webp&#34; alt=&#34;Phanteks Enthoo Pro TG&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Phanteks Enthoo Pro TG&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4iPsFmV&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458312829691810885126678&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-phanteks-enthoo-pro-atx-full-tower%2fp%2fN82E16811854069&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;-c-tier--functional-with-major-tradeoffs&#34;&gt;🟥 C-Tier – Functional with Major Tradeoffs
&lt;/h2&gt;&lt;hr&gt;
&lt;h2 id=&#34;corsair-7000d-airflow&#34;&gt;&lt;strong&gt;Corsair 7000D AIRFLOW&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.corsair.com/us/en/p/pc-cases/cc-9011218-ww/7000d-airflow-full-tower-atx-pc-case-black-cc-9011218-ww&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Corsair&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;Airflow/45deg.webp&#34; alt=&#34;Corsair 7000D AIRFLOW 45 Degree View&#34; style=&#34;width: 100%; max-width: 200px;&#34;&gt;
  &lt;img src=&#34;Airflow/side.webp&#34; alt=&#34;Corsair 7000D AIRFLOW Side&#34; style=&#34;width: 100%; max-width: 300px;&#34;&gt;
  &lt;img src=&#34;Airflow/side2.webp&#34; alt=&#34;Corsair 7000D AIRFLOW Side 2&#34; style=&#34;width: 100%; max-width: 300px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;This case is an absolute monster. Built for custom loops, high-end hardware, and airflow that won’t quit. It’s big, bold, and stunning to look at. But when it comes to media server duty, it misses the mark.&lt;/p&gt;
&lt;p&gt;Drive support is the weak link. You’ll be improvising mounts by the time you hit six drives, and it’s clearly not designed with storage in mind. Unless you’re building a dual-purpose gaming and media rig, this is the wrong tool for the job. Beautiful, but not practical for a server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Full Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 21.6&amp;quot; × 9.8&amp;quot; × 23.6&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: E-ATX / ATX / mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 6 x 3.5&amp;quot; and 4 x 2.5&amp;quot; out of the box. You’ll need adapters or mods to expand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: 3 140mm fan are included. Supports up to 12 120mm or 7 140mm fans. Top-tier airflow. Fits basically every radiator and fan combo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Corsair’s RapidRoute system is excellent. 36mm of routing space.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: Loud with stock fans. Quiet down with Noctua or Be Quiet swaps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Premium all the way. Heavy, rigid, and beautifully finished.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: Steel, tempered glass, plastic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: Expensive, overkill for NAS use, lacking drive expansion out of the box.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: This case looks amazing and works great for gaming or workstations, but for a media server, the size and cost aren’t worth it. There are better picks for storage and cooling.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Airflow/45deg.webp&#34; alt=&#34;Corsair 7000D AIRFLOW&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Corsair 7000D AIRFLOW&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4jDi1ka&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;cooler-master-masterbox-nr400&#34;&gt;&lt;strong&gt;Cooler Master MasterBox NR400&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Manufacturer&amp;rsquo;s Link&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.coolermaster.com/en-us/products/masterbox-nr400-with-odd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cooler Master&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: 💰💰💰&lt;/p&gt;
&lt;div style=&#34;display: flex; justify-content: center; gap: 1rem;&#34;&gt;
  &lt;img src=&#34;Masterbox/front.webp&#34; alt=&#34;Cooler Master MasterBox NR400 45 Degree View&#34; style=&#34;max-width: 200px;&#34;&gt;
  &lt;img src=&#34;Masterbox/side.webp&#34; alt=&#34;Cooler Master MasterBox NR400 Side&#34; style=&#34;max-width: 300px;&#34;&gt;
  &lt;img src=&#34;Masterbox/topside.webp&#34; alt=&#34;Cooler Master MasterBox NR400 Top Side&#34; style=&#34;max-width: 300px;&#34;&gt;
&lt;/div&gt;
&lt;p&gt;The NR400 is compact, clean, and easy to work with. It has great ventilation, a solid layout, and a breeze to build in. But with support for just 4 drives, it’s not built for serious media server applications.&lt;/p&gt;
&lt;p&gt;It’s a good fit for HTPCs, small servers, or setups where storage is handled elsewhere. But if you are planning to scale your media library, you’ll outgrow it quickly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;: Mini Tower&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: 16.2&amp;quot; × 8.3&amp;quot; × 16.2&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motherboard Support&lt;/strong&gt;: mATX / Mini-ITX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 4 x 3.5&amp;quot;/2.5&amp;quot; bays. That&amp;rsquo;s it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooling&lt;/strong&gt;: Two 120mm fans included. Good airflow, but not enough for dense builds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cable Management&lt;/strong&gt;: Space is tight. Modular PSU strongly recommended.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise&lt;/strong&gt;: No insulation. Expect fan and drive noise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Quality&lt;/strong&gt;: Not bad for a mini-tower. Side panel is a bit wobbly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Material&lt;/strong&gt;: Steel, plastic, tempered glass&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pain Points&lt;/strong&gt;: Drive cage blocks PSU airflow. Limited upgrade path.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: Good airflow and a simple layout make it beginner-friendly, but it’s more HTPC than a server case. This case is best for a tiny, low-power build with storage handled elsewhere.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Masterbox/front.webp&#34; alt=&#34;Cooler Master MasterBox NR400&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Cooler Master MasterBox NR400&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4cZ98yV&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458315874830154981027590&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-cooler-master-masterbox-nr400-with-odd-micro-atx-mini-itx%2fp%2fN82E16811119369&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;final-words&#34;&gt;Final Words
&lt;/h2&gt;&lt;p&gt;If you are building a home media server, you need to prioritize function over flashy aesthetics. This means thinking about storage, airflow, cable space, and noise before aesthetics or gaming extras. The &lt;strong&gt;Fractal Define 7 XL&lt;/strong&gt; is the top recommendation for anyone serious about capacity and silence. The &lt;strong&gt;SilverStone CS380B&lt;/strong&gt; is the best plug-and-play option if you need hot-swap capabilities. And if you’re building on a budget, the &lt;strong&gt;Rosewill Helium&lt;/strong&gt; or &lt;strong&gt;DARKROCK Classico&lt;/strong&gt; will get you there with a little extra effort.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pick based on your storage needs, noise tolerance, and build experience. Pick right, and you will only have to buy a case once.&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to Install Radarr in Docker</title>
        <link>https://diymediaserver.com/post/how-to-install-radarr-in-docker/</link>
        <pubDate>Sun, 20 Apr 2025 05:50:50 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/how-to-install-radarr-in-docker/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-to-install-radarr-in-docker/radarr.webp" alt="Featured image of post How to Install Radarr in Docker" /&gt;&lt;p&gt;Automate Your Movie Downloads: A Step-by-Step Guide to Installing Radarr in Docker&lt;/p&gt;
&lt;p&gt;If you are like me and love watching movies. However, keeping them organized and up to date can feel like a full-time job. Between release dates, varying quality options, and sources scattered across the internet, managing your movie library can quickly become a frustrating mess.&lt;/p&gt;
&lt;p&gt;This is where &lt;strong&gt;Radarr&lt;/strong&gt; comes in. Instead of rummaging through torrent or Usenet sites for that new release or trying to remember when a movie drops digitally, Radarr automates the entire process. It monitors your wanted list, watches for new releases, and grabs them using torrents or Usenet. Once downloaded, it renames, organizes, and moves the files into your media library, ready to watch on &lt;strong&gt;Jellyfin, Plex,&lt;/strong&gt; or &lt;strong&gt;Kodi&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Radarr lets you &lt;em&gt;set it and forget it&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-radarr-is-a-must-have&#34;&gt;Why Radarr Is a Must-Have
&lt;/h2&gt;&lt;p&gt;Here’s why Radarr is my go-to tool for movie automation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automated Downloads&lt;/strong&gt; – Add the movie you want, and Radarr will handle the rest. It’ll search for it, download it, and upgrade it when better quality becomes available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing Movie Search&lt;/strong&gt; – Radarr continuously scans for movies that are missing or were not available when you added it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration with Download Clients&lt;/strong&gt; – Works seamlessly with &lt;strong&gt;qBittorrent, Deluge, SABnzbd,&lt;/strong&gt; and &lt;strong&gt;NZBGet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Library Management&lt;/strong&gt; – Organizes downloaded movies into clean folder structures, complete with proper naming and metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Radarr transforms your movie library into a hands-off system that just works.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-run-radarr-in-docker&#34;&gt;Why Run Radarr in Docker?
&lt;/h2&gt;&lt;p&gt;Docker is the one of the best ways to run it. Here’s why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clean Isolation&lt;/strong&gt; – Keep Radarr and its dependencies separate from your main system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effortless Updates&lt;/strong&gt; – Updating is as easy as pulling the latest image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portability&lt;/strong&gt; – Easily move your setup to another machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified Maintenance&lt;/strong&gt; – Avoid dependency hell and conflicting libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Running Radarr in Docker keeps things clean, organized, and easy to manage, update, and troubleshoot.&lt;/p&gt;
&lt;p&gt;If you’re ready to take control of your digital movie collection, setting up Radarr in Docker is the way to go.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-1-install-docker&#34;&gt;Step 1: Install Docker
&lt;/h2&gt;&lt;p&gt;To get started, you’ll need Docker installed on your server.&lt;br&gt;
Check out this guide for step-by-step instructions: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-how-to-install-docker/&#34; &gt;Master the Basics - How to Install Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-2-create-or-modify-your-docker-compose-file&#34;&gt;Step 2: Create or Modify Your Docker Compose File
&lt;/h2&gt;&lt;p&gt;Let’s define your Radarr container using &lt;code&gt;docker-compose.yml&lt;/code&gt;. In this post we will be adding Radarr to our existing &lt;code&gt;docker-compose.yml&lt;/code&gt; that contains the settings for Sonarr.
Post: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to-install-sonarr-in-docker/&#34; &gt;How to Install Sonarr in Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;open-the-compose-file&#34;&gt;Open the Compose File
&lt;/h3&gt;&lt;p&gt;Open your existing &lt;code&gt;docker-compose.yml&lt;/code&gt; or create a new one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, copy and paste the Radarr Section:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SONARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io Sonarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sonarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SONARR_PORT}:8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Sonarr&amp;#39;s configuration data &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sonarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where downloaded TV shows are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Shows:/tv&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  RADARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io Radarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/radarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${RADARR_PORT}:7878&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Radarr&amp;#39;s configuration data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/radarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where downloaded Movies are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  NETWORK                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Creates an isolated Docker network for media containers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💡 Tip: Make sure the spacing is correct. YAML is very picky about spacing. The key is that each indent is two spaces not a &lt;code&gt;tab&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-3-customize-the-env-file&#34;&gt;Step 3: Customize the .env File
&lt;/h2&gt;&lt;h3 id=&#34;open-the-env-file&#34;&gt;Open the .env File
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/.env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The content of the .env file should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# User and Group ID (Prevents permission issues)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Main user ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PUID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Our media group:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PGID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Timezone (Ensures correct scheduling and logs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;America/Denver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Define Ports (Ports for each container are defined here)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Radarr’s web UI to port 7878 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RADARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7878&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Sonarr’s web UI to port 8989 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SONARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8989&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Data Directories (Keeps storage paths centralized)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DOWNLOADS_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/downloads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MEDIA_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update the Radarr file paths as needed. Here’s what to change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CONFIG_PATH=/docker&lt;/code&gt; → Root folder where Docker stores persistent files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;MEDIA_PATH=/media&lt;/code&gt; → Root folder for your media files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DOWNLOADS_PATH=/media/downloads&lt;/code&gt; → Root folder where your download client stores temp/incomplete files&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure the download client container shares access to the &lt;code&gt;/downloads&lt;/code&gt; path.&lt;/p&gt;
&lt;p&gt;Also update the timezone (TZ) to match yours.&lt;br&gt;
Refer to: &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This list of valid timezones&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-4-start-radarr&#34;&gt;Step 4: Start Radarr
&lt;/h2&gt;&lt;p&gt;Bring your new Radarr container online:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check it’s running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;radarr&lt;/code&gt; in the list of containers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CONTAINER ID   IMAGE                               COMMAND   CREATED          STATUS          PORTS                                         NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;c8d2c60a955b   lscr.io/linuxserver/sonarr:latest   &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;54&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; seconds   0.0.0.0:8989-&amp;gt;8989/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:8989-&amp;gt;8989/tcp   sonarr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ff12a474a4fe   lscr.io/linuxserver/radarr:latest   &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;54&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; seconds   0.0.0.0:7878-&amp;gt;7878/tcp, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;::&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:7878-&amp;gt;7878/tcp   radarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;step-5-fix-permissions-if-needed&#34;&gt;Step 5: Fix Permissions (If Needed)
&lt;/h2&gt;&lt;p&gt;Permissions issues are a common snag with media containers. Here’s how to make sure everything plays nice:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /docker/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /docker/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /media/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /media/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check out this post if you want to learn more about Linux permissions:&lt;br&gt;
&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/&#34; &gt;Master the Basics - Linux Permissions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-6-access-radarr&#34;&gt;Step 6: Access Radarr
&lt;/h2&gt;&lt;p&gt;Open your browser and go to:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://your-server-ip:7878&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;From there, you can add movies, set quality profiles, and connect your favorite download clients.&lt;/p&gt;
&lt;p&gt;For detailed configuration help, check the official &lt;a class=&#34;link&#34; href=&#34;https://wiki.servarr.com/radarr&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Radarr Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-7-keep-your-docker-software-updated&#34;&gt;Step 7: Keep Your Docker Software Updated
&lt;/h2&gt;&lt;p&gt;To update:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose pull  &lt;span class=&#34;c1&#34;&gt;# Fetches the latest image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose down  &lt;span class=&#34;c1&#34;&gt;# Stops and removes the running container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d  &lt;span class=&#34;c1&#34;&gt;# Starts a fresh container with the new image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Radarr and Sonarr will restart with the latest version, no reconfig needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Radarr is &lt;strong&gt;an absolute game-changer for movie lovers&lt;/strong&gt;. It tracks, downloads, upgrades, and organizes your collection automatically. No more hunting for files, renaming, or manually moving stuff around.&lt;/p&gt;
&lt;p&gt;Running it in Docker makes everything easier to manage and keeps your system clean. And when you combine it with other tools like &lt;strong&gt;Sonarr for TV shows&lt;/strong&gt; or &lt;strong&gt;Lidarr for music&lt;/strong&gt;, you’re well on your way to a fully automated, self-updating media empire.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How I Fixed My 24 Hour NFS Crash Loop With MergerFS LXC and Proxmox</title>
        <link>https://diymediaserver.com/post/how-i-fixed-my-24-hour-nfs-crash-loop-with-mergerfs-lxc-and-proxmox/</link>
        <pubDate>Fri, 11 Apr 2025 06:52:23 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/how-i-fixed-my-24-hour-nfs-crash-loop-with-mergerfs-lxc-and-proxmox/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-i-fixed-my-24-hour-nfs-crash-loop-with-mergerfs-lxc-and-proxmox/inodes_kill.webp" alt="Featured image of post How I Fixed My 24 Hour NFS Crash Loop With MergerFS LXC and Proxmox" /&gt;&lt;p&gt;Every professional and/or weekend warrior sysadmin has that one issue that haunts them. For me, this week, it was a weird NFS crash loop that kicked in like clockwork. Every 24 hours, like it was on a timer (it was, my backups were running). The server booted, NFS shares mounted fine, and media apps ran smoothly. Looked solid. Then&amp;hellip; boom. NFS would stop responding. Containers started throwing stale file handle errors and memory usage shot through the roof.&lt;/p&gt;
&lt;p&gt;I spent days chasing ghosts trying to figure it out. If you’re running NFS exports from a MergerFS-backed VM in Proxmox, especially with LXC clients, here’s what fixed it for me and why you should check your setup too.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;stack-snapshot&#34;&gt;Stack Snapshot
&lt;/h2&gt;&lt;p&gt;Before we dig into the fix, here&amp;rsquo;s what my setup looked like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proxmox&lt;/strong&gt; host with a ZFS RAIDZ1 pool&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NAS VM&lt;/strong&gt; with an HBA passing through XFS drives, combined using MergerFS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MergerFS&lt;/strong&gt; presenting &lt;code&gt;/media/Storage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NFS server&lt;/strong&gt; inside the NAS VM, exporting that MergerFS mount&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LXC containers&lt;/strong&gt; (Sonarr, Jellyfin, etc.) mounting those exports as clients&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On paper, this setup checks out. But under the hood, it was primed for failure thanks to one small flag: &lt;code&gt;noforget&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;where-things-went-sideways&#34;&gt;Where Things Went Sideways
&lt;/h2&gt;&lt;p&gt;It wasn’t obvious at first. But symptoms started stacking:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM would freeze after &lt;strong&gt;~24 hours&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;LXC clients hit &lt;strong&gt;&amp;ldquo;stale file handle&amp;rdquo;&lt;/strong&gt; errors&lt;/li&gt;
&lt;li&gt;Slab memory ballooned, especially &lt;code&gt;fuse_inode&lt;/code&gt; (Over 110,000 inodes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last part was the key. Hundreds of thousands of inodes hanging around with no cleanup.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;waitwhats-an-inode&#34;&gt;Wait—What’s an Inode?
&lt;/h2&gt;&lt;p&gt;Think of an inode as the metadata brain behind every file in a Linux filesystem. It stores everything about the file &lt;em&gt;except&lt;/em&gt; its name and contents. That means stuff like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File size&lt;/li&gt;
&lt;li&gt;Permissions&lt;/li&gt;
&lt;li&gt;Owner and group&lt;/li&gt;
&lt;li&gt;Timestamps&lt;/li&gt;
&lt;li&gt;Pointers to where the actual data lives on the disk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every time you create, read, or move a file, the system checks the inode to figure out what it’s dealing with. The inode number is what NFS uses to track files across the network. If those numbers change or pile up, things can get ugly fast, especially with MergerFS and NFS in the mix.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;smoking-gun-noforget-in-mergerfs&#34;&gt;Smoking Gun: &lt;code&gt;noforget&lt;/code&gt; in MergerFS
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s what I originally had for my MergerFS entry in &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/mnt/Pool0/Disk* /media/Storage fuse.mergerfs direct_io,defaults,allow_other,noforget,dropcacheonclose&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;true,category.create&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mfs,minfreespace&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;50G,fsname&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;storage &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;noforget&lt;/code&gt; flag was the root of my problems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;br&gt;
Prevents the kernel from purging unused FUSE inodes. Great for certain workloads. Awful for MergerFS over NFS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt;&lt;br&gt;
Every NFS client interaction added more FUSE inodes. The kernel kept them all. Memory usage exploded. Stability collapsed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;you-can-check-your-fuse_inode&#34;&gt;You Can Check Your &lt;code&gt;fuse_inode&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Run this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /proc/slabinfo &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep fuse_inode
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before the fix, mine hit &lt;strong&gt;100,000+ entries&lt;/strong&gt;. After? Around &lt;strong&gt;200&lt;/strong&gt;. Immediate memory relief.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-fixes-that-saved-my-sanity-and-marriage&#34;&gt;The Fixes That Saved My Sanity and Marriage
&lt;/h2&gt;&lt;h3 id=&#34;1-replace-noforget-with-inodecalcpath-hash&#34;&gt;1. Replace &lt;code&gt;noforget&lt;/code&gt; with &lt;code&gt;inodecalc=path-hash&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;I replaced &lt;code&gt;noforget&lt;/code&gt; from my MergerFS options with this instead. This is key for NFS stability. Without it, inode numbers jump around and NFS freaks out. New MergerFS line in &lt;code&gt;/etc/fstab/&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/mnt/Pool0/Disk* /media/Storage fuse.mergerfs direct_io,defaults,allow_other,dropcacheonclose&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;true,category.create&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mfs,minfreespace&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;50G,inodecalc&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;path-hash,fsname&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;storage &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now FUSE inodes are purged normally, and NFS clients get consistent inode numbers.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-boost-vfs_cache_pressure&#34;&gt;2. Boost &lt;code&gt;vfs_cache_pressure&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Force the kernel clean inodes and dentries more aggressively. In &lt;code&gt;/etc/sysctl.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; vm.vfs_cache_pressure&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;200&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then reboot or run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sysctl -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;3-change-proxmox-disk-cache-to-writethrough&#34;&gt;3. Change Proxmox Disk Cache to &lt;code&gt;writethrough&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;In the Proxmox VM Hardware settings, switch the disk cache mode to:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cache=writethrough&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It forces better consistency between Proxmox, ZFS, and your VM’s disk I/O.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-stability-looks-like-now&#34;&gt;What Stability Looks Like Now
&lt;/h2&gt;&lt;p&gt;After these changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No more stale handles or NFS hangs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fuse_inode&lt;/code&gt; count is flat — around 8,000 after days of uptime&lt;/li&gt;
&lt;li&gt;Memory usage is predictable&lt;/li&gt;
&lt;li&gt;LXC clients mount and run cleanly — even under load&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;quick-fix-table&#34;&gt;Quick Fix Table
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Tweak&lt;/th&gt;
          &lt;th&gt;Why It Matters&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;❌ Remove &lt;code&gt;noforget&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Stops memory leaks via inode bloat&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;✅ Add &lt;code&gt;inodecalc=path-hash&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Prevents NFS from freaking out&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;⚙️ Set &lt;code&gt;vfs_cache_pressure=200&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Cleans up unused inode/dentry entries&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;💽 Use &lt;code&gt;writethrough&lt;/code&gt; in Proxmox&lt;/td&gt;
          &lt;td&gt;Improves disk I/O behavior with ZFS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;👀 Monitor &lt;code&gt;/proc/slabinfo&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Catch inode bloat before it breaks stuff&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR
&lt;/h2&gt;&lt;p&gt;NFS + MergerFS + Proxmox VM + LXC? Check your MergerFS flags.&lt;/p&gt;
&lt;p&gt;Specifically:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ditch &lt;code&gt;noforget&lt;/code&gt;. Add &lt;code&gt;inodecalc=path-hash&lt;/code&gt;. Crank &lt;code&gt;vfs_cache_pressure&lt;/code&gt;. Set Proxmox disk cache to &lt;code&gt;writethrough&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These four config change saved my server from a daily crashes. If your NFS setup feels haunted, you might want to start here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try it. Save your sanity and sleep again.&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Hardware - Why You Need an HBA</title>
        <link>https://diymediaserver.com/post/hardware-why-you-need-an-hba/</link>
        <pubDate>Sun, 06 Apr 2025 08:14:46 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/hardware-why-you-need-an-hba/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/hardware-why-you-need-an-hba/hba.webp" alt="Featured image of post Hardware - Why You Need an HBA" /&gt;&lt;p&gt;Ever hit a wall with your media server setup? Maybe you maxed out your motherboard’s SATA ports. Or you want to hand control of your drives to a VM in Proxmox without the host getting in the way. That’s where a &lt;strong&gt;Host Bus Adapter (HBA)&lt;/strong&gt; becomes your best friend. It’s your ticket to smoother storage configuration, more drives, and better performance, especially if you’re running a virtualized environment.&lt;/p&gt;
&lt;p&gt;Here’s what you need to know: when to use an HBA, why it works great in virtual storage VMs, what cables you&amp;rsquo;ll need, and how to buy an HBA that works out of the box.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;whats-an-hba-and-when-should-you-use-it&#34;&gt;&lt;strong&gt;What’s an HBA and When Should You Use It?&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;A Host Bus Adapter (HBA) is a PCIe card that gives your server more drive connectivity than your motherboard can. Think of it as a high-performance SATA or SAS controller, just way more capable than those cheap expansion cards that drop drives under load.&lt;/p&gt;
&lt;p&gt;You’ll want one if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;You’re out of SATA ports.&lt;/strong&gt; Most motherboards provide you with six. If you’re running a Plex or Jellyfin server, you’ll blow through those fast.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;You’re using Proxmox or any hypervisor.&lt;/strong&gt; Want to pass your drives directly to a VM? You need an HBA flashed to IT mode.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;You care about reliability.&lt;/strong&gt; HBAs are built to handle a bunch of drives without dropping them randomly like bargain-bin SATA controllers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;when-to-use-an-hba&#34;&gt;When to Use an HBA
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Problem&lt;/th&gt;
          &lt;th&gt;HBA Fixes It By&amp;hellip;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Not enough SATA ports&lt;/td&gt;
          &lt;td&gt;Expands drive capacity (8+ drives)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Running Proxmox VMs&lt;/td&gt;
          &lt;td&gt;Allows direct passthrough to VM&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Cheap SATA cards unreliable&lt;/td&gt;
          &lt;td&gt;Provides stable, enterprise-grade control&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Want future expansion&lt;/td&gt;
          &lt;td&gt;Supports SAS expanders (24+ drives)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;hbas-in-virtual-storage-vms-this-is-where-they-shine&#34;&gt;&lt;strong&gt;HBAs in Virtual Storage VMs (This Is Where They Shine)&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Running a NAS in a VM? Stop fighting your hypervisor. Pass the HBA straight to the storage VM and let it take over.&lt;/p&gt;
&lt;h3 id=&#34;1-direct-passthrough--better-performance&#34;&gt;1. Direct Passthrough = Better Performance
&lt;/h3&gt;&lt;p&gt;Instead of juggling drive access through the host, pass the HBA to your VM. That VM gets direct, raw control over the drives. Perfect for ZFS, MergerFS, or SnapRAID.&lt;/p&gt;
&lt;h3 id=&#34;2-it-mode-no-raid-no-nonsense&#34;&gt;2. IT Mode: No RAID, No Nonsense
&lt;/h3&gt;&lt;p&gt;Flashing the HBA to IT mode removes the RAID stuff. The VM sees each drive on its own, just like it should. This avoids weird RAID layers interfering with smart tools or parity calculations.&lt;/p&gt;
&lt;h3 id=&#34;3-fewer-headaches-more-stability&#34;&gt;3. Fewer Headaches, More Stability
&lt;/h3&gt;&lt;p&gt;Onboard SATA gets weird in VMs. Unreliable, slow, or just flaky. An HBA gives you dedicated hardware built for this job.&lt;/p&gt;
&lt;h3 id=&#34;4-room-to-grow&#34;&gt;4. Room to Grow
&lt;/h3&gt;&lt;p&gt;Planning for expansion? A single HBA can talk to a &lt;strong&gt;SAS expander&lt;/strong&gt; and let you run 24 or more drives through one PCIe slot.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;how-to-buy-an-hba-that-just-works&#34;&gt;&lt;strong&gt;How to Buy an HBA That Just Works&lt;/strong&gt;
&lt;/h2&gt;&lt;h3 id=&#34;get-one-already-flashed-to-it-mode&#34;&gt;Get One Already Flashed to IT Mode
&lt;/h3&gt;&lt;p&gt;Most used enterprise HBAs ship with RAID firmware (IR mode). You want &lt;strong&gt;IT mode&lt;/strong&gt;. This makes each drive show up independently.&lt;/p&gt;
&lt;p&gt;Popular models:&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;LSI-9211-8iB.webp&#34; alt=&#34;LSI 9211-8iB IT MODE&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;LSI 9211-8iB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Already Flashed to IT mode.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4iXST7J&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;LSI-9300-8i.webp&#34; alt=&#34;LSI 9300-8i IT MODE&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;LSI 9300-8i&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Already Flashed to IT mode.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3R5XJU0&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Dell-310.jpg&#34; alt=&#34;Dell H310 IT MODE&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Dell H310&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Already Flashed to IT mode.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3FYkcQv&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Also look for &lt;strong&gt;pre-flashed cards&lt;/strong&gt; on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;eBay (Search for &amp;ldquo;IT mode HBA&amp;rdquo;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Server resellers with refurb listings&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They usually run $50 to $100. Cheap, considering the performance and stability boost.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;need-more-drives-get-a-sas-expander&#34;&gt;&lt;strong&gt;Need More Drives? Get a SAS Expander&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;If 8 ports aren’t enough, plug a &lt;strong&gt;SAS expander&lt;/strong&gt; into your HBA.&lt;/p&gt;
&lt;h3 id=&#34;what-it-does&#34;&gt;What It Does
&lt;/h3&gt;&lt;p&gt;Think of it like a network switch for hard drives. You plug the HBA into the expander, and the expander gives you dozens of ports.&lt;/p&gt;
&lt;h3 id=&#34;why-its-useful&#34;&gt;Why It’s Useful
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;More drives per HBA&lt;/strong&gt; – Some expanders support 24 or more drives.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fewer PCIe slots used&lt;/strong&gt; – Leave room for GPUs, NICs, or other gear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lower cost&lt;/strong&gt; – Expanders cost less than more HBAs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;popular-sas-expander&#34;&gt;Popular SAS Expander
&lt;/h3&gt;&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Intel-Expander.jpg&#34; alt=&#34;Intel RES2SV240&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Intel RES2SV240&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Compact and solid for home labs.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4i5zDUi&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&#34;cables-heres-what-you-need&#34;&gt;&lt;strong&gt;Cables: Here’s What You Need&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;HBAs don’t use regular SATA ports. They use &lt;strong&gt;SFF connectors&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;sff-8087.jpg&#34; alt=&#34;SFF-8087 to 4x SATA&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;SFF-8087 to 4x SATA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used for older HBAs like the LSI 9211-8i.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42fXWsQ&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;sff-8643.jpg&#34; alt=&#34;SFF-8643 to 4x SATA&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;SFF-8643 to 4x SATA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used for newer HBAs like the LSI 9300-8i.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4jkEr9h&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If you’re using an expander, you’ll also need:&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;SFF-8087-SFF-8087.jpg&#34; alt=&#34;SFF-8087 to SFF-8087&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;SFF-8087 to SFF-8087&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used for older HBAs like the LSI 9211-8i.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3Yl3HEp&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;SFF-8643-SFF-8087.jpg&#34; alt=&#34;SFF-8643 to SFF-8087&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;SFF-8643 to SFF-8087&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used for newer HBAs like the LSI 9300-8i.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4llbqMz&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;HBA Port Type&lt;/th&gt;
          &lt;th&gt;Use This Cable&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;SFF-8087&lt;/td&gt;
          &lt;td&gt;SFF-8087 to 4x SATA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SFF-8643&lt;/td&gt;
          &lt;td&gt;SFF-8643 to 4x SATA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Expander Link&lt;/td&gt;
          &lt;td&gt;SFF-8087 ↔ SFF-8087&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;wrap-up-yes-you-should-use-an-hba&#34;&gt;Wrap-Up: Yes, You Should Use an HBA
&lt;/h2&gt;&lt;p&gt;Want to scale up? Make your VM manage your drives directly? Avoid janky SATA cards? Then an HBA flashed to IT mode is a must. Pair it with an expander if you’re going big. Use the right cables. And your home media server just leveled up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skip the guesswork. Get an HBA Controller.&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>SABnzbd vs NZBGet: Which NZB Downloader Should You Choose in 2026?</title>
        <link>https://diymediaserver.com/post/choosing-the-right-usenet-file-manager/</link>
        <pubDate>Sat, 29 Mar 2025 06:26:41 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/choosing-the-right-usenet-file-manager/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/choosing-the-right-usenet-file-manager/featured.jpg" alt="Featured image of post SABnzbd vs NZBGet: Which NZB Downloader Should You Choose in 2026?" /&gt;&lt;p&gt;Choosing between &lt;strong&gt;SABnzbd vs NZBGet&lt;/strong&gt; matters more than most folks realize. Back in the day, using Usenet meant spending hours manually unpacking, repairing, and organizing downloads. Today, tools like SABnzbd and NZBGet handle all of that for you. The hard part now? Choosing which one to use.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re brand new to Usenet or building your first DIY media server, this decision matters more than it seems. Pick the wrong downloader, and you&amp;rsquo;ll end up fighting settings, broken automation, or maxed-out hardware. Pick the right one and Usenet becomes a true set-it-and-forget-it experience.&lt;/p&gt;
&lt;p&gt;This guide breaks down the &lt;strong&gt;sabnzbd vs nzbget&lt;/strong&gt; debate from a beginner&amp;rsquo;s point of view. I&amp;rsquo;ll focus on ease of setup, real-world performance, automation, and long-term support, so you can confidently choose the best NZB downloader for your setup in 2026.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    If you&amp;rsquo;re new to Usenet and want the easiest and least frustrating experience, &lt;strong&gt;SABnzbd is the winner&lt;/strong&gt;. NZBGet is faster and lighter, but SABnzbd&amp;rsquo;s guided setup, polished interface, and straightforward automation make it the better choice for most beginners.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;what-are-sabnzbd-and-nzbget&#34;&gt;What Are SABnzbd and NZBGet?
&lt;/h2&gt;&lt;p&gt;Before comparing them, let&amp;rsquo;s define what they are.&lt;/p&gt;
&lt;p&gt;Both SABnzbd and NZBGet are NZB download managers, software that automates Usenet downloads.&lt;/p&gt;
&lt;p&gt;They:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download files from Usenet using NZB files&lt;/li&gt;
&lt;li&gt;Repair missing parts with PAR files&lt;/li&gt;
&lt;li&gt;Unpack archives&lt;/li&gt;
&lt;li&gt;Rename and sort files&lt;/li&gt;
&lt;li&gt;Hand everything off to apps like Sonarr or Radarr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, they&amp;rsquo;re the backbone of any Usenet-based media server.&lt;/p&gt;
&lt;p&gt;The difference is how they do it and how much effort they require from you. And, that effort adds up fast when you&amp;rsquo;re just trying to get things working.&lt;/p&gt;
&lt;h2 id=&#34;sabnzbd-vs-nzbget-performance-and-system-requirements&#34;&gt;SABnzbd vs NZBGet: Performance and System Requirements
&lt;/h2&gt;&lt;h3 id=&#34;raw-speed-and-resource-usage&#34;&gt;Raw Speed and Resource Usage
&lt;/h3&gt;&lt;p&gt;Alright, this is the one area where NZBGet clearly wins.&lt;/p&gt;
&lt;p&gt;NZBGet is written in C++, which makes it extremely efficient. It uses less CPU, less RAM, and generally downloads faster on the same hardware. Real-world reports show noticeable speed differences, especially during heavy post-processing like repairing and unpacking large files.&lt;/p&gt;
&lt;p&gt;SABnzbd is written in Python. Python is easier to maintain and extend, but it costs more CPU cycles. During unpacking and repair, SABnzbd can briefly spike CPU usage, which matters on weaker systems.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Note:&lt;/strong&gt;
    On a Raspberry Pi 4 downloading a 50GB file, NZBGet typically uses 15-20% less CPU during unpacking and completes the job 10-15% faster.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s the thing though, for most people, this doesn&amp;rsquo;t matter as much as you might think.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Decisions:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you&amp;rsquo;re running on a Raspberry Pi, older Intel CPU, or NAS hardware → &lt;strong&gt;Choose NZBGet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;If you have a modern mini PC, desktop CPU, or home server → &lt;strong&gt;Either works fine&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even low-end Intel N100 and Ryzen mini PCs handle SABnzbd without breaking a sweat. Hardware is no longer the bottleneck for most beginners.&lt;/p&gt;
&lt;h2 id=&#34;setup-and-installation-nzbget-vs-sabnzbd&#34;&gt;Setup and Installation: NZBGet vs SABnzbd
&lt;/h2&gt;&lt;h3 id=&#34;sabnzbd-built-for-beginners&#34;&gt;SABnzbd: Built for Beginners
&lt;/h3&gt;&lt;p&gt;This is where SABnzbd earns its reputation.&lt;/p&gt;
&lt;p&gt;On first launch, SABnzbd walks you through a clean setup wizard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter your Usenet provider&lt;/li&gt;
&lt;li&gt;Test the connection&lt;/li&gt;
&lt;li&gt;Pick download and completed folders&lt;/li&gt;
&lt;li&gt;Enable basic security options&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can be downloading within minutes, even if you&amp;rsquo;ve never touched Usenet before. The defaults are sensible, and most users never need to touch advanced settings.&lt;/p&gt;
&lt;h3 id=&#34;nzbget-more-control-more-work&#34;&gt;NZBGet: More Control, More Work
&lt;/h3&gt;&lt;p&gt;NZBGet installs easily, especially via Docker or NAS app stores. The challenge comes after installation.&lt;/p&gt;
&lt;p&gt;Many important behaviors require manual configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paths&lt;/li&gt;
&lt;li&gt;Post-processing options&lt;/li&gt;
&lt;li&gt;Security settings&lt;/li&gt;
&lt;li&gt;Script behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is impossible, but it assumes you know what you&amp;rsquo;re configuring and why. And honestly? When you&amp;rsquo;re just starting out, you probably don&amp;rsquo;t.&lt;/p&gt;
&lt;h4 id=&#34;example-setup-flow&#34;&gt;Example setup flow:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SABnzbd: Install → Run wizard → Start downloading&lt;/li&gt;
&lt;li&gt;NZBGet: Install → Configure paths → Set up categories → Configure post-processing → Start downloading&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the difference? SABnzbd gets you downloading in three steps. NZBGet needs five, and each one requires you to understand what you&amp;rsquo;re doing.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07V5JTMV9&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB: A low-cost, beginner-friendly platform for running SABnzbd or NZBGet, making it ideal for novices following this…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;RaspberryPi 4GB&lt;/strong&gt;
A low-cost, beginner-friendly platform for running SABnzbd or NZBGet, making it ideal for novices following this guide.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;web-interface-and-day-to-day-usability&#34;&gt;Web Interface and Day-to-Day Usability
&lt;/h2&gt;&lt;h3 id=&#34;sabnzbd-interface&#34;&gt;SABnzbd Interface
&lt;/h3&gt;&lt;p&gt;SABnzbd has one of the cleanest web interfaces in the Usenet world.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modern layout&lt;/li&gt;
&lt;li&gt;Clear queue view&lt;/li&gt;
&lt;li&gt;Multiple themes&lt;/li&gt;
&lt;li&gt;Easy access to logs and warnings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You always know what&amp;rsquo;s downloading, what failed, and why. For novices, this matters more than raw speed. Visibility prevents frustration.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t tell you how many times I&amp;rsquo;ve avoided a headache because SABnzbd showed me exactly what went wrong instead of making me dig through logs.&lt;/p&gt;
&lt;h3 id=&#34;nzbget-interface&#34;&gt;NZBGet Interface
&lt;/h3&gt;&lt;p&gt;NZBGet&amp;rsquo;s interface is fast and minimal. It works well, but it assumes you already understand Usenet terminology.&lt;/p&gt;
&lt;p&gt;It shines when customized with widgets and scripts, but out of the box it feels utilitarian rather than welcoming. NZBGet will get the job done, but you won&amp;rsquo;t enjoy looking at it.&lt;/p&gt;
&lt;h2 id=&#34;automation-and-arr-app-integration&#34;&gt;Automation and Arr App Integration
&lt;/h2&gt;&lt;h3 id=&#34;sabnzbd-plug-and-play-automation&#34;&gt;SABnzbd: Plug and Play Automation
&lt;/h3&gt;&lt;p&gt;SABnzbd integrates seamlessly with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sonarr&lt;/li&gt;
&lt;li&gt;Radarr&lt;/li&gt;
&lt;li&gt;Lidarr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No scripts required. You point the Arr apps at SABnzbd, map your folders, and you&amp;rsquo;re done.&lt;/p&gt;
&lt;h4 id=&#34;basic-sonarr-integration&#34;&gt;Basic Sonarr integration:
&lt;/h4&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Sonarr Settings → Download Clients → Add SABnzbd
Host: localhost
Port: 8080
Category: tv
Completed Download Handling: Enabled
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SABnzbd also excels at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handling obfuscated NZBs (those weirdly-named files that trip up other downloaders)&lt;/li&gt;
&lt;li&gt;Renaming files reliably&lt;/li&gt;
&lt;li&gt;Sorting downloads without manual rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What success looks like:&lt;/strong&gt; After adding SABnzbd to Sonarr, you&amp;rsquo;ll see a green checkmark in the download client settings. Your first episode will download, unpack, and appear in your media library without you touching anything.&lt;/p&gt;
&lt;h3 id=&#34;nzbget-powerful-but-script-driven&#34;&gt;NZBGet: Powerful but Script-Driven
&lt;/h3&gt;&lt;p&gt;NZBGet supports everything SABnzbd does, and often more, but frequently through scripts or additional configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom post-processing&lt;/li&gt;
&lt;li&gt;Advanced RSS filters&lt;/li&gt;
&lt;li&gt;RPC API access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both tools integrate with Arr apps just fine. SABnzbd tends to work out of the box, while NZBGet may need category mapping or post-processing scripts for complex workflows.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;📝&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Note:&lt;/strong&gt;
    If you love tinkering, NZBGet gives you more knobs to turn. But if you just want your shows to download while you sleep? SABnzbd gets you there faster.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;power-efficiency-and-background-behavior&#34;&gt;Power Efficiency and Background Behavior
&lt;/h2&gt;&lt;p&gt;This is a subtle but potentially important difference for 24/7 systems.&lt;/p&gt;
&lt;p&gt;SABnzbd uses &lt;strong&gt;iNotify&lt;/strong&gt; on Linux systems, which allows it to detect new files instantly without constantly scanning folders. This can reduce background CPU usage and allows systems to sleep when idle.&lt;/p&gt;
&lt;p&gt;NZBGet periodically rescans folders, which may:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevent sleep modes&lt;/li&gt;
&lt;li&gt;Use more background CPU&lt;/li&gt;
&lt;li&gt;Increase power consumption on always-on systems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The real-world impact varies by system and configuration. On modern hardware, the difference is typically small but can add up over time on power-conscious setups.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re running a home server 24/7 and care about your power bill, this is worth considering. Five watts here, ten watts there, it adds up over a year.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CM293XCL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive: Why it fits this post: Large storage is essential for media server users downloading content with SABnzbd or NZBG…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;
Large storage is essential for media server users downloading content with SABnzbd or NZBGet, but this drive is best for single-drive/light-duty setups, not advanced NAS.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;long-term-support-and-updates&#34;&gt;Long-Term Support and Updates
&lt;/h2&gt;&lt;h3 id=&#34;sabnzbd&#34;&gt;SABnzbd
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Frequent updates&lt;/li&gt;
&lt;li&gt;Active development&lt;/li&gt;
&lt;li&gt;Large user community&lt;/li&gt;
&lt;li&gt;Excellent documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From a stability and security perspective, SABnzbd is the safer long-term choice. When something breaks, SABnzbd usually has a fix within days.&lt;/p&gt;
&lt;h3 id=&#34;nzbget&#34;&gt;NZBGet
&lt;/h3&gt;&lt;p&gt;NZBGet development slowed significantly after 2019, which raised concerns in the community. Development has recently picked back up under new maintainers, but the update cadence is still less predictable.&lt;/p&gt;
&lt;p&gt;It remains stable and functional, but beginners typically benefit from active ecosystems. You want a tool that&amp;rsquo;s being actively maintained when you run into issues.&lt;/p&gt;
&lt;h2 id=&#34;sabnzbd-vs-nzbget-comparison-table&#34;&gt;SABnzbd vs NZBGet Comparison Table
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;SABnzbd&lt;/th&gt;
          &lt;th&gt;NZBGet&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Performance&lt;/td&gt;
          &lt;td&gt;Higher resource usage&lt;/td&gt;
          &lt;td&gt;Extremely lightweight&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Setup&lt;/td&gt;
          &lt;td&gt;Wizard-driven, beginner-friendly&lt;/td&gt;
          &lt;td&gt;Manual configuration&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Interface&lt;/td&gt;
          &lt;td&gt;Polished and modern&lt;/td&gt;
          &lt;td&gt;Minimal and utilitarian&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Automation&lt;/td&gt;
          &lt;td&gt;Plug and play&lt;/td&gt;
          &lt;td&gt;Script-based options&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Power Efficiency&lt;/td&gt;
          &lt;td&gt;iNotify-based monitoring&lt;/td&gt;
          &lt;td&gt;Folder rescans&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Updates&lt;/td&gt;
          &lt;td&gt;Frequent and consistent&lt;/td&gt;
          &lt;td&gt;Less predictable&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Best For&lt;/td&gt;
          &lt;td&gt;New users, automation&lt;/td&gt;
          &lt;td&gt;Low-power hardware&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;troubleshooting-common-beginner-issues&#34;&gt;Troubleshooting Common Beginner Issues
&lt;/h2&gt;&lt;h3 id=&#34;downloads-are-slow&#34;&gt;Downloads Are Slow
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Check Usenet provider connection limits (most cap you at 20-30 connections)&lt;/li&gt;
&lt;li&gt;Verify SSL is enabled (it should be, but double-check)&lt;/li&gt;
&lt;li&gt;NZBGet may outperform SABnzbd on weak CPUs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;files-fail-to-unpack&#34;&gt;Files Fail to Unpack
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Enable automatic repair and unpack (should be on by default in SABnzbd)&lt;/li&gt;
&lt;li&gt;Ensure enough free disk space (you need at least 2x the download size)&lt;/li&gt;
&lt;li&gt;Avoid moving files before post-processing finishes, let the downloader finish its job first&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;sonarr-or-radarr-cannot-see-downloads&#34;&gt;Sonarr or Radarr Cannot See Downloads
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Double-check folder mappings, especially in Docker (this trips up everyone at least once)&lt;/li&gt;
&lt;li&gt;Confirm completed download paths match Arr app settings exactly&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;high-cpu-usage-during-downloads&#34;&gt;High CPU Usage During Downloads
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Normal during unpacking, that&amp;rsquo;s just how PAR repair works&lt;/li&gt;
&lt;li&gt;Consider NZBGet if running on older hardware&lt;/li&gt;
&lt;li&gt;Schedule downloads for off-hours if it&amp;rsquo;s bothering you&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B00Q2Z11QE&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/define-r5-45deg.webp&#34; alt=&#34;Fractal Design Define R5: A quiet, flexible case helps beginners build a tidy, expandable media server for SABnzbd/NZBGet, though not …&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Fractal Design Define R5&lt;/strong&gt;
A quiet, flexible case helps beginners build a tidy, expandable media server for SABnzbd/NZBGet, though not strictly required if reusing existing hardware.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42YZpnB&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445838038135512313043163&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-r5-atx-micro-atx-mid-tower%2fp%2fN82E16811352048&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;faqs-nzbget-vs-sabnzbd-2026&#34;&gt;FAQs: NZBGet vs SABnzbd 2026
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Which is faster, NZBGet or SABnzbd?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;NZBGet is typically faster and more efficient due to its C++ architecture. The difference is most noticeable on low-powered hardware.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ I have a Raspberry Pi or NAS. What should I use?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;NZBGet. It was built for low-resource systems, and you&amp;rsquo;ll actually notice the performance difference.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Which is easier for beginners?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;SABnzbd. The setup wizard, interface, and defaults are designed for novices. You&amp;rsquo;ll be downloading in minutes instead of hours.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Can both integrate with Sonarr and Radarr?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Yes. SABnzbd tends to work out of the box, while NZBGet offers deeper customization options if you need them.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Which one uses less power?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;SABnzbd typically uses less background power thanks to iNotify-based file monitoring, though the difference varies by setup.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Which one should I pick if I&amp;#39;m unsure?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Start with SABnzbd. You can always switch later if you outgrow it, but honestly? Most people never do.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;conclusion-sabnzbd-vs-nzbget-winner&#34;&gt;Conclusion: SABnzbd vs NZBGet Winner
&lt;/h2&gt;&lt;p&gt;After going back and forth between these two for years, I always end up back on SABnzbd.&lt;/p&gt;
&lt;p&gt;Yes, NZBGet is faster and lighter. But &lt;strong&gt;SABnzbd wins the sabnzbd vs nzbget debate&lt;/strong&gt; where it matters most for beginners:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easier setup&lt;/li&gt;
&lt;li&gt;Better interface&lt;/li&gt;
&lt;li&gt;Cleaner automation&lt;/li&gt;
&lt;li&gt;More predictable updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want something that &lt;em&gt;just works&lt;/em&gt; and stays out of your way, &lt;strong&gt;SABnzbd is the best choice for 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re running very limited hardware or love tweaking every detail, NZBGet still has a place. For everyone else? Start with SABnzbd and enjoy Usenet the way it was meant to be used—automatically, reliably, and without constant babysitting.&lt;/p&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources
&lt;/h2&gt;&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/sabnzbd.svg&#34; alt=&#34;SABnzbd Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;SABnzbd Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://sabnzbd.org/wiki/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/nzbget.gif&#34; alt=&#34;NZBGet Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;NZBGet Official Documentation&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://nzbget.net/documentation&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/sonarr.png&#34; alt=&#34;Jellyfin Official Documentation&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Sonarr Integration Guide&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://wiki.servarr.com/sonarr&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/logos/radarr.png&#34; alt=&#34;Radarr Integration Guide&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;Radarr Integration Guide&lt;/strong&gt;&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://wiki.servarr.com/radarr&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      Visit
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CJM1GNFQ&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/amazonfire-stick.jpg&#34; alt=&#34;Amazon Fire TV Stick 4K: Useful for streaming downloaded media to a TV, but not necessary for running SABnzbd/NZBGet or building the s…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Amazon Fire TV Stick 4K&lt;/strong&gt;
Useful for streaming downloaded media to a TV, but not necessary for running SABnzbd/NZBGet or building the server itself.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3BGhbTl&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Usenet vs Torrenting: Which Is Best for Your Media Server in 2026?</title>
        <link>https://diymediaserver.com/post/torrent-vs-usenet/</link>
        <pubDate>Fri, 21 Mar 2025 06:52:48 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/torrent-vs-usenet/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/torrent-vs-usenet/featured.jpg" alt="Featured image of post Usenet vs Torrenting: Which Is Best for Your Media Server in 2026?" /&gt;&lt;p&gt;If you&amp;rsquo;re building a home media server with Jellyfin, Kodi, Plex, Emby, or whatever your flavor, you quickly run into the same question everyone does:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do I actually get the media?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For most people, the choice comes down to Usenet or torrenting. They both work, are popular and they both can be automated. But they feel very different once you actually live with them day to day.&lt;/p&gt;
&lt;p&gt;I used torrents for years. They worked, but between sketchy files, malware scares, dead downloads, and always needing a VPN, I eventually hit a point where I just wanted something easier, even if it cost a few extra dollars a month.&lt;/p&gt;
&lt;p&gt;This post breaks down the Usenet vs torrent comparison, so you can make the choice between these systems for your media server, without hype or gatekeeping. You&amp;rsquo;ll learn which system fits your priorities: speed, cost, privacy, or automation and what trade-offs each one brings.&lt;/p&gt;








  
  

&lt;div class=&#34;alert alert-tldr&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;💭&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;TL;DR:&lt;/strong&gt;
    If you want free and familiar, torrents still work. If you want speed, privacy, automation, and fewer headaches, Usenet usually wins for home media servers, even if it costs a bit each month.
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;quick-comparison-usenet-vs-torrent&#34;&gt;Quick Comparison: Usenet vs Torrent
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Factor&lt;/th&gt;
          &lt;th&gt;Torrents&lt;/th&gt;
          &lt;th&gt;Usenet&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Free (VPN ~$5/mo)&lt;/td&gt;
          &lt;td&gt;~$10-15/mo total&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Depends on seeders&lt;/td&gt;
          &lt;td&gt;Maxes your connection&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Privacy&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;VPN required&lt;/td&gt;
          &lt;td&gt;SSL encrypted (No VPN needed)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Automation&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Good with setup&lt;/td&gt;
          &lt;td&gt;Excellent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Old content&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Depends on seeders&lt;/td&gt;
          &lt;td&gt;Up to 18 years or more retention&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Setup complexity&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Simple&lt;/td&gt;
          &lt;td&gt;Moderate&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;usenet-vs-torrenting-what-are-you-really-choosing&#34;&gt;Usenet vs Torrenting: What Are You Really Choosing?
&lt;/h2&gt;&lt;p&gt;Before we compare pros and cons, let&amp;rsquo;s talk about what problem each system actually solves.&lt;/p&gt;
&lt;h3 id=&#34;torrents-p2p-downloading&#34;&gt;Torrents (P2P downloading)
&lt;/h3&gt;&lt;p&gt;Torrents use peer-to-peer sharing. When you download a file, you&amp;rsquo;re pulling pieces from other users (seeders) who already have it, while also uploading pieces you have to others. It&amp;rsquo;s a community effort, which sounds great until you realize that means you&amp;rsquo;re dependent on that community to share the content you want.&lt;/p&gt;
&lt;p&gt;You usually need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A torrent client like qBittorrent&lt;/li&gt;
&lt;li&gt;A tracker (public or private)&lt;/li&gt;
&lt;li&gt;A VPN if you care about privacy (unless you like getting nasty letters in the mail from your ISP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;usenet-nzb-based-downloading&#34;&gt;Usenet (NZB-based downloading)
&lt;/h3&gt;&lt;p&gt;Usenet uses centralized servers run by providers. Files are uploaded once, then stored for years. When you download, you pull directly from those servers using an NZB file as a map. No peers, no sharing, just a direct line to the content.&lt;/p&gt;
&lt;p&gt;You usually need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Usenet provider (paid)&lt;/li&gt;
&lt;li&gt;An indexer (to find content, usually paid)&lt;/li&gt;
&lt;li&gt;A downloader like SABnzbd or NZBGet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Look, if this sounds more complex, it can be at first. But it also unlocks a lot of automation that makes your life way easier down the road.&lt;/p&gt;
&lt;p&gt;If you want the deeper history? Check out these other posts:
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/post/history-torrents/torrent.webp&#34; alt=&#34;History of Torrents&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;History of Torrents&lt;/strong&gt;&lt;br&gt;
How P2P Changed the Way We Share Files&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://diymediaserver.com/post/history-torrents/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      View Article
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class=&#34;backlink-box&#34;&gt;
  
  &lt;div class=&#34;backlink-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/post/history-usenet/usenet.webp&#34; alt=&#34;History of Usenet&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  
  &lt;div class=&#34;backlink-box-content&#34;&gt;
    
    
      &lt;p&gt;&lt;strong&gt;History of Usenet&lt;/strong&gt;&lt;br&gt;
And How It Powers NZB Media Downloads Today&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class=&#34;backlink-box-links&#34;&gt;
    &lt;a href=&#34;https://diymediaserver.com/post/history-usenet/&#34;
      class=&#34;backlink-button&#34;
      target=&#34;_blank&#34;
      rel=&#34;noopener noreferrer&#34;&gt;
      View Article
    &lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;torrents-pros-cons-and-reality-in-2026&#34;&gt;Torrents: Pros, Cons, and Reality in 2026
&lt;/h2&gt;&lt;h3 id=&#34;pros-of-torrents&#34;&gt;Pros of Torrents
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free to use&lt;/strong&gt; - No subscriptions needed (though you&amp;rsquo;ll want a VPN)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Huge content library&lt;/strong&gt; - Almost anything popular has been torrented&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resumable downloads&lt;/strong&gt; - Pick up where you left off, even days later&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple starting point&lt;/strong&gt; - Install client, click magnet link, done&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons-of-torrents&#34;&gt;Cons of Torrents
&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s where it gets real.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speed depends on seeders&lt;/strong&gt; - Few seeders means slow or dead downloads. You&amp;rsquo;ll sit there watching a 4K movie crawl at 200KB/s because three people are seeding and two of them are on dial-up. Okay, maybe not dial-up, but it feels like it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy exposure&lt;/strong&gt; - Your IP is visible to peers and trackers. Everyone can see you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Higher legal risk&lt;/strong&gt; - Copyright monitoring is easier with P2P. Those cease-and-desist letters? They come from torrent activity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dead torrents happen&lt;/strong&gt; - If nobody seeds, the file is gone. I&amp;rsquo;ve spent hours hunting for a specific release only to find every torrent has zero seeders.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sketchy files exist&lt;/strong&gt; - Public torrents can include malware or junk. You wanted a movie, you got a .exe file. Do not run any executable files found in torrents.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07YP9FBMM&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/nvidia-shield-tv-pro.jpg&#34; alt=&#34;NVIDIA SHIELD Pro: Acts as a robust Plex/Jellyfin client and server, making it easy to stream downloaded content to your TV, but not s…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;NVIDIA SHIELD Pro&lt;/strong&gt;&lt;br&gt;
Acts as a robust Jellyfin/Plex client and server, making it easy to stream downloaded content to your TV.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4gZhtU2&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458311262821776245415890&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-nvidia-shield-tv-pro-digital-media-streamer%2fp%2fN82E16815351017&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;usenet-nzb-pros-cons-and-why-it-feels-different&#34;&gt;Usenet (NZB): Pros, Cons, and Why It Feels Different
&lt;/h2&gt;&lt;h3 id=&#34;pros-of-usenet&#34;&gt;Pros of Usenet
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Very fast downloads&lt;/strong&gt; - Direct from high-bandwidth servers. You can max out your gigabit connection, every single time. No waiting, no hoping someone seeds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better privacy by default&lt;/strong&gt; - SSL encryption, no peer exposure. You&amp;rsquo;re not broadcasting to strangers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long retention&lt;/strong&gt; - Top providers offer 18+ years of file storage. That obscure show from 2008? Still there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Excellent automation&lt;/strong&gt; - Pairs seamlessly with Sonarr, Radarr, and the rest of the *arr stack. Set it and forget it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt; - If the NZB exists and your provider has it, it downloads. No &amp;ldquo;check back later, maybe someone will seed.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons-of-usenet&#34;&gt;Cons of Usenet
&lt;/h3&gt;&lt;p&gt;Nothing&amp;rsquo;s perfect.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It costs money&lt;/strong&gt; - $7.50-20/month for unlimited plans. For some people, that&amp;rsquo;s a dealbreaker. I get it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More pieces to set up&lt;/strong&gt; - Provider + indexer + downloader. It&amp;rsquo;s not complicated, but it&amp;rsquo;s more than &amp;ldquo;install qBittorrent.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DMCA takedowns happen&lt;/strong&gt; - Content can be removed faster than torrents. Popular stuff gets hit within hours sometimes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retention is not infinite&lt;/strong&gt; - Files age out after many years.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sketchy files still exist&lt;/strong&gt; - Although I have encountered less on Usenet, they do still exist. Do not run any executable files found in NZBs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;privacy-and-safety&#34;&gt;Privacy and Safety
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s talk about what actually protects you, because there&amp;rsquo;s a lot of misinformation out there.&lt;/p&gt;
&lt;h3 id=&#34;torrents-and-vpns&#34;&gt;Torrents and VPNs
&lt;/h3&gt;&lt;p&gt;If you torrent, a VPN is basically mandatory. But here&amp;rsquo;s what most guides skip: bind your torrent client to the VPN interface. This prevents downloads if the VPN disconnects (Also known as a kill switch).&lt;/p&gt;
&lt;p&gt;Without this, your real IP can leak during connection drops. And it will drop. VPNs aren&amp;rsquo;t perfect. I learned this the hard way when my ISP sent me a friendly letter about a download that happened during a very short VPN hiccup.&lt;/p&gt;
&lt;p&gt;Five minutes setting up interface binding saves you from that.&lt;/p&gt;
&lt;h3 id=&#34;usenet-privacy-limits&#34;&gt;Usenet Privacy Limits
&lt;/h3&gt;&lt;p&gt;Usenet feels more private because you&amp;rsquo;re not sharing with peers, and SSL encrypts the connection. But let&amp;rsquo;s be clear: providers still log your activity, and your payment method links to your identity.&lt;/p&gt;
&lt;p&gt;SSL only protects data in transit, not metadata about what you downloaded. If someone really wants to know what you&amp;rsquo;re doing, they can find out. It&amp;rsquo;s just way harder than with torrents, where your IP is literally broadcast to everyone.&lt;/p&gt;
&lt;h2 id=&#34;nzb-vs-torrent-indexers-and-trackers-explained&#34;&gt;NZB vs Torrent: Indexers and Trackers Explained
&lt;/h2&gt;&lt;p&gt;This is where many beginners get confused, so let me break it down.&lt;/p&gt;
&lt;h3 id=&#34;torrent-trackers&#34;&gt;Torrent Trackers
&lt;/h3&gt;&lt;p&gt;Trackers coordinate who has which pieces of a file. They&amp;rsquo;re like a phonebook for the swarm.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Public trackers are easy but unreliable. Anyone can use them, which means quality varies wildly.&lt;/li&gt;
&lt;li&gt;Private trackers are reliable but invite-only. You&amp;rsquo;ll need to maintain a ratio (upload as much as you download) or get kicked.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trackers don&amp;rsquo;t host files. They just help peers find each other. When a tracker goes down, your torrents stop working until it comes back.&lt;/p&gt;
&lt;h3 id=&#34;usenet-indexers&#34;&gt;Usenet Indexers
&lt;/h3&gt;&lt;p&gt;Indexers catalog Usenet posts and generate NZB files. Think of them as search engines for Usenet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Good indexers show completion rates, file health, and categories&lt;/li&gt;
&lt;li&gt;Some are free, some require invites, some cost money&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll want at least two indexers for coverage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Indexers make Usenet automation work, especially with Prowlarr (which manages all your indexers in one place). Without a good indexer, Usenet is basically useless.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0BWY1VH3V&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/LSI-9211-8iB.webp&#34; alt=&#34;LSI 9211-8iB IT MODE: Useful for expanding storage with multiple drives in a DIY NAS or media server, but only needed if you plan to s…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;LSI 9211-8iB IT MODE&lt;/strong&gt;
Useful for expanding storage with multiple drives in a DIY NAS or media server, but only needed if you plan to scale beyond a few disks.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4iXST7J&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;decision-guide-usenet-vs-torrenting-for-your-setup&#34;&gt;Decision Guide: Usenet vs Torrenting for Your Setup
&lt;/h2&gt;&lt;p&gt;Alright, so which one&amp;rsquo;s right for you?&lt;/p&gt;
&lt;h3 id=&#34;choose-torrents-if&#34;&gt;Choose Torrents if:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;You want &lt;strong&gt;zero monthly cost&lt;/strong&gt; and don&amp;rsquo;t mind the VPN subscription&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re comfortable using a VPN at all times (and binding it properly)&lt;/li&gt;
&lt;li&gt;You mainly download popular, well-seeded content&lt;/li&gt;
&lt;li&gt;You don&amp;rsquo;t mind occasional dead or slow downloads&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;choose-usenet-if&#34;&gt;Choose Usenet if:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;You want &lt;strong&gt;fast, consistent downloads&lt;/strong&gt; without the seeder lottery&lt;/li&gt;
&lt;li&gt;You value privacy without mandatory VPN usage&lt;/li&gt;
&lt;li&gt;You want full automation with media management tools&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re okay paying a small monthly fee for the convenience&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;budget-reality-check&#34;&gt;Budget reality check
&lt;/h3&gt;&lt;p&gt;If your budget is under $10 per month, here&amp;rsquo;s what I&amp;rsquo;d do:&lt;/p&gt;
&lt;p&gt;Try Usenet free trials first. Most providers offer them. See if it works for you. If it feels too complex or limited, fall back to torrents + VPN. There&amp;rsquo;s no shame in that. Torrents still work, they&amp;rsquo;re just more hands-on.&lt;/p&gt;
&lt;h2 id=&#34;basic-setup-overview-high-level&#34;&gt;Basic Setup Overview (High Level)
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s walk through what you&amp;rsquo;re actually signing up for with each system.&lt;/p&gt;
&lt;h3 id=&#34;torrent-setup-in-practice&#34;&gt;Torrent setup in practice
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Install qBittorrent&lt;/li&gt;
&lt;li&gt;Subscribe to a VPN and bind the client to VPN interface (seriously, do this)&lt;/li&gt;
&lt;li&gt;Add trackers (public or private)&lt;/li&gt;
&lt;li&gt;Optional: connect Sonarr (TV shows) and Radarr (movies) via Prowlarr&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;What success looks like:&lt;/strong&gt; You click a magnet link, the download starts immediately, and your VPN shows as connected. If you disconnect the VPN, downloads pause automatically.&lt;/p&gt;
&lt;p&gt;If downloads are slow, check seeders. If there are fewer than 10, expect problems. That&amp;rsquo;s just how P2P works.&lt;/p&gt;
&lt;h3 id=&#34;usenet-setup-in-practice&#34;&gt;Usenet setup in practice
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Choose a provider (trial first—don&amp;rsquo;t commit until you&amp;rsquo;ve tested)&lt;/li&gt;
&lt;li&gt;Join one or two indexers&lt;/li&gt;
&lt;li&gt;Install SABnzbd or NZBGet&lt;/li&gt;
&lt;li&gt;Add provider details, enable SSL&lt;/li&gt;
&lt;li&gt;Connect Sonarr and Radarr via Prowlarr&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;What success looks like:&lt;/strong&gt; You add a show to Sonarr, and within minutes it&amp;rsquo;s downloading at full speed. No waiting, no checking seeders, just done.&lt;/p&gt;
&lt;p&gt;If speeds are slow, check that you&amp;rsquo;re on an unlimited plan and using enough connections (20-60 depending on provider). Some providers throttle if you&amp;rsquo;re not using their recommended settings.&lt;/p&gt;
&lt;h2 id=&#34;hybrid-approach-best-of-both-worlds&#34;&gt;Hybrid Approach: Best of Both Worlds
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s what many experienced homelab users actually do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Usenet as primary&lt;/strong&gt; for new and popular media&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Torrents as backup&lt;/strong&gt; for rare or niche content&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives you speed and automation without losing coverage. Sonarr and Radarr can search both simultaneously, grabbing from whichever source has the best release.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been running this setup for 10 years. Usenet handles 95% of my downloads, torrents catch the rest. It&amp;rsquo;s the best of both worlds, and honestly, once you&amp;rsquo;ve got it configured, you forget it&amp;rsquo;s even there.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CM293XCL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive: Why it fits this post: Large, reliable storage is essential for both torrent and Usenet media libraries, and this…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;
&lt;strong&gt;Must have for this build.&lt;/strong&gt;
Why it fits this post: Large, reliable storage is essential for both torrent and Usenet media libraries, and this drive offers high capacity for bulk downloads and archiving.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;troubleshooting-common-problems&#34;&gt;Troubleshooting Common Problems
&lt;/h2&gt;&lt;p&gt;You&amp;rsquo;re going to hit issues. Everyone does. Here&amp;rsquo;s how to fix the most common ones.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Problem&lt;/th&gt;
          &lt;th&gt;System&lt;/th&gt;
          &lt;th&gt;Solution&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Downloads are slow&lt;/td&gt;
          &lt;td&gt;Torrents&lt;/td&gt;
          &lt;td&gt;Check seeders (need 5+), try different tracker, verify VPN isn&amp;rsquo;t throttling&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Downloads never finish&lt;/td&gt;
          &lt;td&gt;Torrents&lt;/td&gt;
          &lt;td&gt;Dead torrent. Look for different release with active seeders&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Downloads are slow&lt;/td&gt;
          &lt;td&gt;Usenet&lt;/td&gt;
          &lt;td&gt;Confirm unlimited plan, increase connections (20-60)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;NZBs fail or missing blocks&lt;/td&gt;
          &lt;td&gt;Usenet&lt;/td&gt;
          &lt;td&gt;DMCA takedown. Try different indexer or provider&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;No results in Sonarr/Radarr&lt;/td&gt;
          &lt;td&gt;Both&lt;/td&gt;
          &lt;td&gt;Sync Prowlarr, check indexer categories, verify retention settings&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;faqs-usenet-vs-torrent-questions&#34;&gt;FAQs: Usenet vs Torrent Questions
&lt;/h2&gt;&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ What is the difference between NZB vs torrent files?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;A torrent file points to peers sharing pieces of a file. An NZB file points to Usenet servers storing those pieces. Same end result, completely different infrastructure.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Do I need a VPN with Usenet?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Usually no. SSL encryption is standard, and you&amp;rsquo;re not exposing your IP to a swarm. Some users still use a VPN for extra privacy, but it&amp;rsquo;s not required like torrenting.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Are there free Usenet providers?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;There are free tiers and trials, but they&amp;rsquo;re limited by speed, data, or retention. You&amp;rsquo;ll hit those limits fast if you&amp;rsquo;re actually using it. Think of free tiers as test drives, not long-term solutions.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Why do torrents die, but Usenet files last years?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;Torrents need active seeders. If everyone stops seeding, the file&amp;rsquo;s gone. Usenet&amp;rsquo;s files are stored on servers for a defined retention period, usually years. The file exists whether anyone&amp;rsquo;s downloading it or not.&lt;/div&gt;
&lt;/details&gt;
&lt;details class=&#34;collapse md&#34; &gt;
  &lt;summary&gt;➤ Which is better for old or rare content?&lt;/summary&gt;
  &lt;div class=&#34;collapse-content&#34;&gt;It depends. Usenet has long retention (18+ years on some providers), but private torrent trackers can sometimes win for ultra-niche content. If you&amp;rsquo;re looking for a specific fansub from 2005, you might need both.&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;final-verdict-usenet-vs-torrenting&#34;&gt;Final Verdict: Usenet vs Torrenting
&lt;/h2&gt;&lt;p&gt;The Usenet vs torrenting debate really comes down to what you value.&lt;/p&gt;
&lt;p&gt;Torrents are free, familiar, and still useful. But they come with trade-offs: slower speeds, privacy risks, dead files, and the constant need for a VPN.&lt;/p&gt;
&lt;p&gt;Usenet costs money, but in return you get speed, privacy, automation, and reliability. For me, that trade was worth it. I stopped worrying about sketchy downloads and just let my media server do its thing.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re brand new, try both. Use trials. Break things. Learn what annoys you. Then make your decision.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s how you end up with a setup you actually enjoy using.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0F8JG2SHN&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/MS-A2.jpg&#34; alt=&#34;MINISFORUM MS-A2: Why it fits this post: A powerful, flexible mini-server that can handle torrent/Usenet clients, indexers, and media server duties with ampl…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;MINISFORUM MS-A2&lt;/strong&gt;
&lt;strong&gt;Must have for this build.&lt;/strong&gt;
Why it fits this post: A powerful, flexible mini-server that can handle torrent/Usenet clients, indexers, and media server duties with ample I/O for future growth.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4o0suZN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>The History and Usage of Torrents</title>
        <link>https://diymediaserver.com/post/history-torrents/</link>
        <pubDate>Sat, 15 Mar 2025 07:29:33 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/history-torrents/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/history-torrents/torrent.webp" alt="Featured image of post The History and Usage of Torrents" /&gt;&lt;p&gt;Back in the early 2000s, the internet was changing rapidly, and new ways to share files were emerging. Traditional downloads had a major problem because servers would get overloaded when too many people tried to access the same file. This led to the development of torrents, which provided a way to distribute data by allowing users to share pieces of a file with each other instead of downloading from a single source. Torrents have been widely associated with piracy, but the technology itself is 100% legal. Many people use torrents to distribute Linux ISOs, share public domain media, and transfer large files efficiently.&lt;/p&gt;
&lt;p&gt;If you have ever been curious about how torrents work, how they are used for media, and why people recommend using a VPN when downloading them, this guide will break it down.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-are-torrents-and-how-do-they-work&#34;&gt;What Are Torrents, and How Do They Work?
&lt;/h2&gt;&lt;p&gt;A torrent is a peer-to-peer (P2P) file-sharing method that relies on a decentralized network. Instead of downloading a file from a single server, torrents allow users to download bits and pieces of the file from multiple users who already have it. This process is coordinated by a &lt;strong&gt;BitTorrent client&lt;/strong&gt;, which connects users and ensures everyone is sending and receiving pieces of the file efficiently.&lt;/p&gt;
&lt;p&gt;How the process works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;You download a torrent file or magnet link.&lt;/strong&gt; This file contains metadata about the content you are trying to download.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your BitTorrent client connects to a tracker.&lt;/strong&gt; A tracker is a server that helps coordinate the connections between different users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You download file fragments from multiple sources.&lt;/strong&gt; Instead of getting the file from one place, your client pulls bits from users all over the world.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You upload pieces while you download.&lt;/strong&gt; As you receive parts of the file, your client shares them with others, which speeds up the process for everyone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The file is reassembled on your device.&lt;/strong&gt; Once all pieces have been collected, your client puts them together into the final usable file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This system makes torrenting incredibly fast and efficient, especially for large files.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-rise-of-p2p-file-sharing-napster-limewire-and-kazaa&#34;&gt;The Rise of P2P File Sharing: Napster, Limewire, and Kazaa
&lt;/h2&gt;&lt;p&gt;Before torrents became the dominant method for peer-to-peer (P2P) file sharing, early P2P networks laid the foundation for how digital media was distributed online. These early services were the beginning of digital file sharing, and they influenced how torrents evolved into a more efficient and resilient system.&lt;/p&gt;
&lt;h3 id=&#34;1-napster-1999--2001-the-beginning-of-p2p&#34;&gt;&lt;strong&gt;1. Napster (1999 – 2001): The Beginning of P2P&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Napster was the first major P2P file-sharing service to gain mainstream popularity. It allowed users to share MP3 files directly with each other, creating the first large-scale digital music piracy issue. Napster’s centralized nature made it easy to use, but it also made it easy to shut down. In 2001, after a massive legal battle with the Recording Industry Association of America (RIAA), Napster was forced to shut down. However, the concept of P2P file sharing had already taken root.&lt;/p&gt;
&lt;h3 id=&#34;2-limewire--kazaa-2001--2010-decentralization-and-the-golden-age-of-p2p&#34;&gt;&lt;strong&gt;2. Limewire &amp;amp; Kazaa (2001 – 2010): Decentralization and the Golden Age of P2P&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;After Napster fell, new P2P networks emerged that were more decentralized, which made them harder to shut down. Limewire and Kazaa became the next big platforms, using the &lt;strong&gt;Gnutella and FastTrack networks&lt;/strong&gt; to share files without relying on a central server.&lt;/p&gt;
&lt;p&gt;These programs allowed users to share not just music but also movies, software, and other files. However, they had major issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Malware &amp;amp; Viruses:&lt;/strong&gt; Many downloads came packed with spyware, adware, or outright malicious programs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fake Files &amp;amp; Corrupt Downloads:&lt;/strong&gt; Since there was no verification system, many files were mislabeled or incomplete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legal Battles:&lt;/strong&gt; Like Napster, Limewire and Kazaa were eventually shut down due to lawsuits from copyright holders.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite their flaws, these services influenced modern torrenting by proving that &lt;strong&gt;decentralized file-sharing networks were the future&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;3-how-these-p2p-networks-shaped-modern-torrents&#34;&gt;&lt;strong&gt;3. How These P2P Networks Shaped Modern Torrents&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;The downfall of Napster, Limewire, and Kazaa made it clear that centralized P2P networks were too easy to take down. This led to the rise of BitTorrent technology, which improved on past P2P models by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Using swarming technology.&lt;/strong&gt; Instead of downloading from one source, BitTorrent splits files into small pieces and downloads them from multiple users, which speeds up transfers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eliminating reliance on a single server.&lt;/strong&gt; Unlike Napster or Kazaa, torrents do not rely on a single central authority, which makes them more resilient to shutdowns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Providing better file integrity.&lt;/strong&gt; Torrents use &lt;strong&gt;hash checks&lt;/strong&gt; to verify that each piece of a file is correct, which prevents corrupt downloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essentially, torrents are the evolution of early P2P networks. They fixed many flaws while maintaining the core idea of distributed file sharing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;how-are-torrents-used-for-media&#34;&gt;How Are Torrents Used for Media?
&lt;/h2&gt;&lt;p&gt;Torrents have played a major role in how media is distributed online. Here are some of the most common legal and practical uses:&lt;/p&gt;
&lt;h3 id=&#34;1-distributing-open-source-software&#34;&gt;1. &lt;strong&gt;Distributing Open-Source Software&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Many open-source projects rely on torrents to distribute their software. For example, Linux distributions like Ubuntu or Debian offer torrents as a way to download the latest ISO files without overloading their servers.&lt;/p&gt;
&lt;h3 id=&#34;2-archiving-public-domain-media&#34;&gt;2. &lt;strong&gt;Archiving Public Domain Media&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Organizations like The Internet Archive use torrents to distribute massive amounts of public domain books, movies, and music. Since torrents reduce bandwidth costs, they are a great tool for distributing freely available media.&lt;/p&gt;
&lt;h3 id=&#34;3-gaming-and-large-file-transfers&#34;&gt;3. &lt;strong&gt;Gaming and Large File Transfers&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Some game developers, especially in the early days of digital distribution, used torrents to distribute patches or entire game files. This method helps reduce strain on central servers when thousands of users try to download updates at the same time.&lt;/p&gt;
&lt;h3 id=&#34;4-peer-to-peer-streaming&#34;&gt;4. &lt;strong&gt;Peer-to-Peer Streaming&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Some platforms have experimented with using torrent-based streaming, where users share video files as they watch, which reduces reliance on a single hosting provider.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-dark-side-of-torrents-piracy-and-legal-issues&#34;&gt;The Dark Side of Torrents: Piracy and Legal Issues
&lt;/h2&gt;&lt;p&gt;While torrents have many legal uses, they have also been widely used for piracy. Some of the most common illegal uses include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Downloading pirated movies, TV shows, and music&lt;/strong&gt; from torrent sites like The Pirate Bay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sharing cracked software and video games&lt;/strong&gt; that bypass DRM protections.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distributing leaked content and pre-release media&lt;/strong&gt; without authorization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spreading malware and scams&lt;/strong&gt; by disguising harmful files as legitimate downloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;legal-consequences-of-illegal-torrenting&#34;&gt;&lt;strong&gt;Legal Consequences of Illegal Torrenting&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Many countries have strict anti-piracy laws, and ISPs monitor torrent traffic. If caught downloading copyrighted material, you could face:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fines.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ISP warnings and throttling.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lawsuits from copyright holders.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The best way to avoid legal trouble is to &lt;strong&gt;only use torrents for legal purposes&lt;/strong&gt; and download from trusted sources.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-you-might-need-a-vpn-when-downloading-torrents&#34;&gt;Why You Might Need a VPN When Downloading Torrents
&lt;/h2&gt;&lt;p&gt;Even if you are only using torrents for legal purposes, your ISP (Internet Service Provider) might not be too thrilled. Here is why you might want a VPN when torrenting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Protect Your Privacy.&lt;/strong&gt; A VPN hides your IP address from other users in the swarm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid ISP Throttling.&lt;/strong&gt; Some ISPs slow down torrent traffic. A VPN prevents this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass Geo-Restrictions.&lt;/strong&gt; Some countries block torrent sites. A VPN lets you access them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stay Anonymous on Public Trackers.&lt;/strong&gt; Public torrents expose your IP to thousands of users. A VPN reduces your risk.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;Torrents have been a game-changer for file distribution, allowing users to share large files quickly and efficiently. Early P2P networks like Napster and Limewire introduced the world to decentralized file sharing, and torrents perfected the concept by making downloads faster, safer, and more efficient.&lt;/p&gt;
&lt;p&gt;However, with great power comes great responsibility. While the technology is legal, &lt;strong&gt;what you download matters&lt;/strong&gt;. Always ensure you are using torrents for legal purposes, and consider using a VPN to protect your privacy.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>The Rise, Fall, and Rebirth of Usenet</title>
        <link>https://diymediaserver.com/post/history-usenet/</link>
        <pubDate>Tue, 11 Mar 2025 07:57:16 -0600</pubDate>
        
        <guid>https://diymediaserver.com/post/history-usenet/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/history-usenet/usenet.webp" alt="Featured image of post The Rise, Fall, and Rebirth of Usenet" /&gt;&lt;p&gt;Before Google, social media, or even the World Wide Web, Usenet was the backbone of online communication. It began as a simple way for researchers and tech enthusiasts to exchange information but soon evolved into a massive, decentralized network for discussions, debates, and file sharing. While it may not be as widely known today, Usenet is still active and remains a powerful tool for downloading media through NZB files.&lt;/p&gt;
&lt;h2 id=&#34;what-is-usenet&#34;&gt;What Is Usenet?
&lt;/h2&gt;&lt;p&gt;Usenet was created in 1979 as a decentralized system for exchanging messages across a network of servers. Unlike web forums or email, it functioned as a distributed platform where messages, known as &amp;ldquo;articles,&amp;rdquo; were copied across multiple servers to ensure accessibility and reliability.&lt;/p&gt;
&lt;p&gt;In its early days, Usenet focused on discussion groups, much like an early version of Reddit. These groups, called &amp;ldquo;newsgroups,&amp;rdquo; were organized by topics ranging from technology and science to music and movies. Users would post messages, which would then be distributed across multiple Usenet servers, making them accessible for others to read and respond to.&lt;/p&gt;
&lt;h2 id=&#34;the-evolution-of-usenet-from-text-to-binaries&#34;&gt;The Evolution of Usenet: From Text to Binaries
&lt;/h2&gt;&lt;p&gt;As the internet advanced, Usenet’s purpose expanded. By the 1990s, users realized it could do more than host discussions. It could also distribute files. This led to the creation of &amp;ldquo;binary newsgroups,&amp;rdquo; where people began sharing images, software, and eventually full-length movies and TV shows.&lt;/p&gt;
&lt;p&gt;However, Usenet was not designed for file transfers. Files had to be split into small fragments and posted as separate articles. If even one piece was missing, the file would be incomplete. To solve this problem, the Usenet community introduced the &lt;strong&gt;NZB file format&lt;/strong&gt;, which made downloading files faster and more reliable.&lt;/p&gt;
&lt;h2 id=&#34;nzb-files-the-modern-usenet-experience&#34;&gt;NZB Files: The Modern Usenet Experience
&lt;/h2&gt;&lt;p&gt;An NZB file works like a &lt;strong&gt;torrent file&lt;/strong&gt;, but for Usenet. Instead of manually searching for and downloading hundreds of file fragments, an NZB file directs your Usenet client to locate all the pieces and assemble them automatically.&lt;/p&gt;
&lt;p&gt;Here’s how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download an NZB file from an &lt;strong&gt;indexer&lt;/strong&gt;, a website that catalogs and organizes Usenet content.&lt;/li&gt;
&lt;li&gt;Open the NZB file using a &lt;strong&gt;Usenet client&lt;/strong&gt; such as SABnzbd, NZBGet, or Newsbin.&lt;/li&gt;
&lt;li&gt;The client connects to a Usenet provider, retrieves all file parts, and reassembles them into a complete download.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This method is extremely fast, often outpacing torrents because Usenet providers offer direct high-speed downloads without requiring seeding or peer-to-peer connections.&lt;/p&gt;
&lt;h2 id=&#34;do-you-need-a-vpn-for-usenet&#34;&gt;Do You Need a VPN for Usenet?
&lt;/h2&gt;&lt;p&gt;One of the most common questions from new Usenet users is whether a VPN is necessary for downloading files. The answer depends on your privacy concerns and how your internet service provider (ISP) handles Usenet traffic.&lt;/p&gt;
&lt;p&gt;Unlike torrents, where your IP address is exposed to other users in a peer-to-peer network, Usenet downloads are direct connections to a Usenet provider’s servers. This means your activity is not publicly visible. Most Usenet providers also support &lt;strong&gt;SSL encryption&lt;/strong&gt;, which secures your connection and prevents third parties, including your ISP, from seeing what you are downloading.&lt;/p&gt;
&lt;p&gt;However, there are still reasons why some users choose to use a VPN with Usenet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ISP Throttling&lt;/strong&gt; – Some ISPs slow down Usenet traffic, especially if they detect large downloads. A VPN can mask your Usenet activity, preventing throttling and ensuring maximum download speeds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Privacy&lt;/strong&gt; – While SSL encryption secures your data in transit, it does not hide the fact that you are using Usenet. A VPN conceals your internet activity from your ISP and anyone monitoring your connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access to Restricted Content&lt;/strong&gt; – In some countries, ISPs block access to certain Usenet providers or indexers. A VPN allows users to bypass these restrictions by connecting through servers in other locations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most users, an SSL-encrypted Usenet connection is secure enough. But if you want extra privacy, a VPN can provide another layer of protection, ensuring your Usenet usage remains completely anonymous.&lt;/p&gt;
&lt;h2 id=&#34;why-choose-usenet-over-torrents&#34;&gt;Why Choose Usenet Over Torrents?
&lt;/h2&gt;&lt;p&gt;Usenet offers several advantages over torrents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speed:&lt;/strong&gt; Downloads come directly from high-speed servers, allowing you to fully utilize your internet connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy:&lt;/strong&gt; Unlike torrents, there’s no need to join a peer-to-peer network, which minimizes your exposure and keeps your activity more private.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retention:&lt;/strong&gt; Usenet providers typically store files for &lt;strong&gt;years&lt;/strong&gt;, and in some cases, even more than a decade. This makes it easier to find older content that may no longer be available on torrents.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;getting-started-with-usenet&#34;&gt;Getting Started with Usenet
&lt;/h2&gt;&lt;p&gt;If you want to dive into Usenet and NZB downloads, here’s what you’ll need:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;A Usenet Provider&lt;/strong&gt; – Services like Newshosting, Eweka, or UsenetServer give you access to Usenet newsgroups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An NZB Indexer&lt;/strong&gt; – These sites help you find NZB files. Some popular ones include NZBGeek, DrunkenSlug, and NZBPlanet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Usenet Client&lt;/strong&gt; – SABnzbd, NZBGet, and Newsbin are great choices for downloading and managing files.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;While Usenet may not be as well-known as modern streaming services or torrenting, it remains one of the most powerful and efficient ways to download media. Its combination of high-speed downloads, privacy benefits, and long-term file retention makes it an excellent alternative to peer-to-peer sharing. With NZB files simplifying the process, Usenet is now more accessible than ever, even for beginners.&lt;/p&gt;
&lt;p&gt;If you value speed, security, and reliability, Usenet is worth exploring. Whether you&amp;rsquo;re setting up a Usenet client for the first time or fine-tuning an existing setup, there’s always something new to learn.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics Dockers Compose</title>
        <link>https://diymediaserver.com/post/master-the-basics-docker-compose/</link>
        <pubDate>Sat, 08 Mar 2025 05:34:38 -0800</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-docker-compose/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-docker-compose/docker_compose.webp" alt="Featured image of post Master the Basics Dockers Compose" /&gt;&lt;p&gt;So, you’ve heard about Docker and the magic of containers, but the words “YAML” and “Compose file” sound like something out of a sci-fi movie? Don’t worry. You are in the right place. If you’re new to Docker and wondering how to use a &lt;strong&gt;docker-compose.yml&lt;/strong&gt; file to manage your containers, I’ve got you covered.&lt;/p&gt;
&lt;p&gt;When you finish this guide, you’ll know what a &lt;strong&gt;Docker Compose file&lt;/strong&gt; is, how to use it, and why it makes running multiple Docker containers easier.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-is-a-docker-compose-file&#34;&gt;What Is a Docker Compose File?
&lt;/h2&gt;&lt;p&gt;At its core, a &lt;strong&gt;Docker Compose file&lt;/strong&gt; is just a simple YAML file (usually named &lt;code&gt;docker-compose.yml&lt;/code&gt;) that tells Docker how to &lt;strong&gt;run multiple containers&lt;/strong&gt; together.&lt;/p&gt;
&lt;p&gt;Think of it like a recipe. Instead of manually starting each container, setting its configurations, and linking them together one by one, you write it all down in this file, and &lt;strong&gt;Docker does the rest&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-use-docker-compose&#34;&gt;Why Use Docker Compose?
&lt;/h2&gt;&lt;p&gt;Docker Compose simplifies container management. Here’s why you should use it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easy multi-container setup&lt;/strong&gt; – Instead of running multiple &lt;code&gt;docker run&lt;/code&gt; commands, you define everything in one file.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Portability&lt;/strong&gt; – Share your &lt;code&gt;docker-compose.yml&lt;/code&gt; file to allow anyone to replicate your setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easier management&lt;/strong&gt; – Start, stop, or restart all your containers with a single command.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Environment variables&lt;/strong&gt; – Configure your setup using a simple &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that you know why it’s useful, I will break down my &lt;code&gt;docker-compose.yml&lt;/code&gt; file later in this post.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-is-orchestration&#34;&gt;What Is Orchestration?
&lt;/h2&gt;&lt;p&gt;Orchestration is just a fancy word for &lt;strong&gt;automating how different parts of your system work together&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Think of it like a movie production. You have multiple moving parts that all need to work together seamlessly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;director&lt;/strong&gt; ensures everything happens at the right time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;actors&lt;/strong&gt; perform their roles based on the script.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;camera crew&lt;/strong&gt; captures the right angles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;editors&lt;/strong&gt; put everything together in post-production.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If each person had to be manually told what to do every single time, it would be chaos. Instead, they follow a predefined plan, and &lt;strong&gt;everything runs smoothly without constant micromanagement&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Docker Compose works the same way. Instead of manually starting each container, configuring it, and linking everything together, &lt;strong&gt;Docker automates the process&lt;/strong&gt; so your services interact as expected.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;yaml-formatting-rules-read-this-or-nothing-will-work&#34;&gt;YAML Formatting Rules (Read This or Nothing Will Work!)
&lt;/h2&gt;&lt;p&gt;Before diving into the actual &lt;code&gt;docker-compose.yml&lt;/code&gt;, you must understand &lt;strong&gt;YAML formatting&lt;/strong&gt; because &lt;strong&gt;one small mistake in spacing or indentation will break everything&lt;/strong&gt;. Unlike JSON or XML, YAML relies heavily on proper indentation and formatting.&lt;/p&gt;
&lt;h3 id=&#34;yaml-rules-you-must-follow&#34;&gt;&lt;strong&gt;YAML Rules You Must Follow:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use spaces, not tabs&lt;/strong&gt; – Indentation must be done using spaces. Tabs are not allowed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consistent indentation&lt;/strong&gt; – Always use the same number of spaces per level (2 or 4 spaces are common).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Key-value pairs are separated by colons&lt;/strong&gt; – Example: &lt;code&gt;container_name: radarr&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lists use dashes (-)&lt;/strong&gt; – Each item in a list starts with &lt;code&gt;-&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Strings don’t need quotes (but sometimes they do)&lt;/strong&gt; – Strings are usually fine without quotes, but use double quotes &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; if the string contains special characters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Boolean values (&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;) and numbers don’t need quotes&lt;/strong&gt; – Just write them as they are.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-of-correct-vs-incorrect-yaml-formatting&#34;&gt;&lt;strong&gt;Example of Correct vs. Incorrect YAML Formatting&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;✅ &lt;strong&gt;Correct YAML&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;❌ &lt;strong&gt;Incorrect YAML (Tabs used instead of spaces)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ❌ Tabs used (invalid)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;❌ &lt;strong&gt;Incorrect YAML (Inconsistent indentation)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ❌ Indentation is off (invalid)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;breaking-down-a-docker-compose-file&#34;&gt;Breaking Down a Docker Compose File
&lt;/h2&gt;&lt;p&gt;Here’s a real-world example of a &lt;code&gt;docker-compose.yml&lt;/code&gt; file that sets up &lt;strong&gt;Radarr, Sonarr, Prowlarr, and SABnzbd&lt;/strong&gt; essential tools for an automated media server. Following this example, you should be able to easily add other services.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/radarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;${RADARR_PORT}:7878&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/radarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sonarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;${SONARR_PORT}:8989&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sonarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/TV:/tv&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/prowlarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;${PROWLARR_PORT}:9696&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/prowlarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sabnzbd:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;${SABNZBD_PORT}:8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sabnzbd:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let’s break it down.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-defining-services&#34;&gt;1. &lt;strong&gt;Defining Services&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;services:&lt;/code&gt; section lists all the containers you want to run. Each service is essentially a &lt;strong&gt;separate Docker container&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;radarr&lt;/code&gt; and &lt;code&gt;sonarr&lt;/code&gt; are the names of each service.&lt;/li&gt;
&lt;li&gt;Each service runs a specific &lt;strong&gt;Docker image&lt;/strong&gt; (&lt;code&gt;lscr.io/linuxserver/radarr&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;container_name&lt;/strong&gt; specifies a custom name for each running container.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-environment-variables&#34;&gt;2. &lt;strong&gt;Environment Variables&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Instead of hardcoding values, we use an &lt;code&gt;.env&lt;/code&gt; file to store &lt;strong&gt;environment variables&lt;/strong&gt;. This makes it easy to change settings without modifying the Compose file.&lt;/p&gt;
&lt;p&gt;Example &lt;code&gt;.env&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;l&#34;&gt;RADARR_PORT=7878&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;SONARR_PORT=8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;PROWLARR_PORT=9696&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;SABNZBD_PORT=8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;CONFIG_PATH=/path/to/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;DOWNLOADS_PATH=/path/to/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;MEDIA_PATH=/path/to/media&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;PUID=1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;PGID=1001&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;TZ=America/Denver&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This way, you can just change the &lt;code&gt;.env&lt;/code&gt; file without editing the &lt;code&gt;docker-compose.yml&lt;/code&gt; every time.&lt;/p&gt;
&lt;h3 id=&#34;3-port-mapping&#34;&gt;3. &lt;strong&gt;Port Mapping&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Each container has ports mapped like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;${RADARR_PORT}:7878&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means &lt;strong&gt;port 7878 inside the container&lt;/strong&gt; (where Radarr runs) is accessible on &lt;strong&gt;your local machine&lt;/strong&gt; at &lt;code&gt;${RADARR_PORT}&lt;/code&gt; (set in the &lt;code&gt;.env&lt;/code&gt; file).&lt;/p&gt;
&lt;h3 id=&#34;4-volume-mounts&#34;&gt;4. &lt;strong&gt;Volume Mounts&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Volumes &lt;strong&gt;persist data&lt;/strong&gt; between container restarts. Without them, you’d lose your settings when restarting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/radarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;5-restart-policy&#34;&gt;5. &lt;strong&gt;Restart Policy&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;restart: unless-stopped&lt;/code&gt; line ensures the container will &lt;strong&gt;restart automatically&lt;/strong&gt; unless you manually stop it.&lt;/p&gt;
&lt;h3 id=&#34;6-depends-on&#34;&gt;6. &lt;strong&gt;Depends On&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;depends_on&lt;/code&gt; keyword is used to define startup order between containers. It ensures that certain containers &lt;strong&gt;start before others&lt;/strong&gt;, but it &lt;strong&gt;does NOT&lt;/strong&gt; wait until the dependent container is fully ready, only that it has started.&lt;/p&gt;
&lt;p&gt;Confused about .env files? See my &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-dockers-env-files/&#34; &gt;Master the Basics - Docker&amp;rsquo;s .env Files&lt;/a&gt;&lt;/strong&gt; post for a detailed breakdown.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;running-the-docker-compose-file&#34;&gt;Running the Docker Compose File
&lt;/h2&gt;&lt;p&gt;Once your &lt;code&gt;docker-compose.yml&lt;/code&gt; and &lt;code&gt;.env&lt;/code&gt; files are ready, all you have to do is:&lt;/p&gt;
&lt;h3 id=&#34;1-navigate-to-the-folder-containing-your-compose-file&#34;&gt;1. &lt;strong&gt;Navigate to the folder&lt;/strong&gt; containing your Compose file:
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-start-your-containers-in-the-background&#34;&gt;2. &lt;strong&gt;Start your containers&lt;/strong&gt; (in the background):
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-d&lt;/code&gt; runs the containers in &lt;strong&gt;detached mode&lt;/strong&gt;, so they keep running in the background.&lt;/p&gt;
&lt;h3 id=&#34;3-check-running-containers&#34;&gt;3. &lt;strong&gt;Check running containers:&lt;/strong&gt;
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;4-stopping-the-containers&#34;&gt;4. &lt;strong&gt;Stopping the containers:&lt;/strong&gt;
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This stops and removes all containers but &lt;strong&gt;keeps your data&lt;/strong&gt; intact.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;wrapping-it-up&#34;&gt;Wrapping It Up
&lt;/h2&gt;&lt;p&gt;Congratulations. You now know how to use a &lt;strong&gt;Docker Compose YAML file&lt;/strong&gt; to spin up multiple containers with just one command.&lt;/p&gt;
&lt;p&gt;This is just the start. Docker Compose can manage networks and even define dependencies between services. But for now, you have a solid foundation.&lt;/p&gt;
&lt;p&gt;Give it a try, and soon you’ll wonder how you ever managed Docker without it.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - Docker Env Files</title>
        <link>https://diymediaserver.com/post/master-the-basics-dockers-env-files/</link>
        <pubDate>Fri, 28 Feb 2025 07:00:25 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-dockers-env-files/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-dockers-env-files/env_files.webp" alt="Featured image of post Master the Basics - Docker Env Files" /&gt;&lt;h2 id=&#34;why-you-need-a&#34;&gt;&lt;strong&gt;Why You Need a &lt;code&gt;.env&lt;/code&gt; File&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Setting up a media server with Radarr, Sonarr, Prowlarr, and SABnzbd can get complicated fast. If you’ve ever found yourself digging through your &lt;code&gt;docker-compose.yml&lt;/code&gt; or manually editing container configurations to change a single setting, you know the pain.&lt;/p&gt;
&lt;p&gt;Hardcoding paths, user IDs, and environment variables across multiple containers make updates a nightmare. Want to change your downloads directory? That’s at least four places you’ll need to edit. Move your media to a new drive? Even worse.&lt;/p&gt;
&lt;p&gt;That’s where the &lt;code&gt;.env&lt;/code&gt; file comes in.&lt;/p&gt;
&lt;p&gt;With a &lt;code&gt;.env&lt;/code&gt; file, you centralize all your important variables into a single, easy-to-edit file. Instead of making changes across multiple configurations, you update one file, and everything follows suit. This approach keeps your setup &lt;strong&gt;clean, modular, and easily portable&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let’s dive into how to create, use, and secure a &lt;code&gt;.env&lt;/code&gt; file to streamline your Arr stack.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-1-creating-the&#34;&gt;&lt;strong&gt;Step 1: Creating the &lt;code&gt;.env&lt;/code&gt; File&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;The first step is to create the &lt;code&gt;.env&lt;/code&gt; file in the same directory as your &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;In previous posts, the docker compose file lives in your &lt;code&gt;root&lt;/code&gt; directory in the folder &lt;code&gt;docker&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano .env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The .env file is a hidden file. In fact any file that starts with &lt;code&gt;.&lt;/code&gt; is hidden from the ls command.&lt;/p&gt;
&lt;p&gt;Paste this in to your .env file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# User and Group ID (Prevents permission issues)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Main user ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;PUID=1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Our media group:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;PGID=1001&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Timezone (Ensures correct scheduling and logs)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;TZ=America/Denver&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Define Ports (Ports for each container are defined here)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;RADARR_PORT=7878&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;SONARR_PORT=8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;PROWLARR_PORT=9696&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;SABNZBD_PORT=8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Data Directories (Keeps storage paths centralized)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;CONFIG_PATH=/docker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;DOWNLOADS_PATH=/media/Downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;MEDIA_PATH=/media&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;breaking-down-the-variables&#34;&gt;&lt;strong&gt;Breaking Down the Variables&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PUID&lt;/code&gt; &amp;amp; &lt;code&gt;PGID&lt;/code&gt;&lt;/strong&gt; – These define which user the container runs as. If you’ve ever had issues with files being created with the wrong ownership, this fixes it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;TZ&lt;/code&gt; (Time Zone)&lt;/strong&gt; – Ensures logs and scheduled tasks (like downloads and media scans) are in the correct time zone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PORT&lt;/code&gt;&lt;/strong&gt; – These define the port configuration for each container.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CONFIG_PATH&lt;/code&gt;&lt;/strong&gt; – A dedicated directory for your app settings. Keeping all config files in one place makes backups and migrations easy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;DOWNLOADS_PATH&lt;/code&gt;&lt;/strong&gt; – Centralized directory for your download clients (SABnzbd, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;MEDIA_PATH&lt;/code&gt;&lt;/strong&gt; – This is where your completed movies and TV shows live. Your media player (like Jellyfin or Plex) will read from here. If you are following along, the media folder is located here: &lt;code&gt;/media&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This &lt;code&gt;.env&lt;/code&gt; file keeps everything in one place, so you &lt;strong&gt;never have to edit multiple files when making a change.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;important-note&#34;&gt;Important Note:
&lt;/h4&gt;&lt;p&gt;Ensure the &lt;code&gt;CONFIG_PATH&lt;/code&gt; folder exists and has the correct permissions set before proceeding:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir /docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;nv&#34;&gt;$USER&lt;/span&gt;:media /docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;step-2-securing-the&#34;&gt;&lt;strong&gt;Step 2: Securing the &lt;code&gt;.env&lt;/code&gt; File&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Since this file stores important configuration values (and possibly API keys if you extend it), we need to lock it down:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; /docker/.env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;why-this-is-important&#34;&gt;&lt;strong&gt;Why This Is Important&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chmod 600&lt;/code&gt; ensures &lt;strong&gt;only the owner&lt;/strong&gt; can read and write the file.&lt;/li&gt;
&lt;li&gt;Prevents accidental edits or unauthorized access (especially if you store sensitive data later, like API keys).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-3-using-the&#34;&gt;&lt;strong&gt;Step 3: Using the &lt;code&gt;.env&lt;/code&gt; File in &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Now, let’s modify your &lt;code&gt;docker-compose.yml&lt;/code&gt; file to pull values from &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;radarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${RADARR_PORT}:7878&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/radarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Movies:/movies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SONARR_PORT}:8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sonarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Shows:/tv&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/prowlarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;prowlarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${PROWLARR_PORT}:9696&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/prowlarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sabnzbd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SABNZBD_PORT}:8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sabnzbd:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;how-this-works&#34;&gt;&lt;strong&gt;How This Works&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;env_file: .env&lt;/code&gt; &lt;strong&gt;automatically loads all the variables from &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt;, making them accessible inside the container.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${CONFIG_PATH}&lt;/code&gt;, &lt;code&gt;${DOWNLOADS_PATH}&lt;/code&gt;, and &lt;code&gt;${MEDIA_PATH}&lt;/code&gt; &lt;strong&gt;dynamically replace the hardcoded paths&lt;/strong&gt; with the values from &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you ever need to move your media directories, &lt;strong&gt;just update &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt;, and all containers will follow suit.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${PUID}&lt;/code&gt; and &lt;code&gt;${PGID}&lt;/code&gt; are used if you need to change the user or the group running the containers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${TZ}&lt;/code&gt; is used if you would like to change the time zone.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-4-testing-and-validating-your-setup&#34;&gt;&lt;strong&gt;Step 4: Testing and Validating Your Setup&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Once everything is set, bring up your stack:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To verify that the &lt;code&gt;.env&lt;/code&gt; file is being used correctly, check the logs of any container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker logs radarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see environment variables applied (like correct directories being loaded).&lt;/p&gt;
&lt;p&gt;You can also inspect a container to confirm environment variables:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it radarr env &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep CONFIG_PATH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should return:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If everything checks out, you’re good to go!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-5-why-this-matters-in-the-long-run&#34;&gt;&lt;strong&gt;Step 5: Why This Matters in the Long Run&lt;/strong&gt;
&lt;/h2&gt;&lt;h3 id=&#34;1-easy-updates&#34;&gt;&lt;strong&gt;1. Easy Updates&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Need to move your media to a new drive? Just update &lt;code&gt;.env&lt;/code&gt;, and every container will follow.&lt;/li&gt;
&lt;li&gt;Changing the timezone? One edit in &lt;code&gt;.env&lt;/code&gt; instead of hunting through multiple config files.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-portability&#34;&gt;&lt;strong&gt;2. Portability&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Moving to a new server? Copy &lt;code&gt;docker-compose.yml&lt;/code&gt; and &lt;code&gt;.env&lt;/code&gt;, and your entire stack is configured instantly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-clean-and-readable-configs&#34;&gt;&lt;strong&gt;3. Clean and Readable Configs&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;No more massive, unreadable &lt;code&gt;docker-compose.yml&lt;/code&gt; files with long, hardcoded paths.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-security-and-best-practices&#34;&gt;&lt;strong&gt;4. Security and Best Practices&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Keeps sensitive info (API keys, passwords) &lt;strong&gt;out of &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/strong&gt; for a cleaner and more secure setup.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;taking-it-further-advanced&#34;&gt;&lt;strong&gt;Taking It Further: Advanced &lt;code&gt;.env&lt;/code&gt; Use Cases&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Want to level up your &lt;code&gt;.env&lt;/code&gt; game? Here are a few extra tricks:&lt;/p&gt;
&lt;h3 id=&#34;use&#34;&gt;&lt;strong&gt;Use &lt;code&gt;.env&lt;/code&gt; for API Keys (Carefully)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;If you’re using a service like NZBHydra or a third-party indexer, add API keys to &lt;code&gt;.env&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;NZBHYDRA_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;yourapikeyhere&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then in &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;API_KEY=${NZBHYDRA_API_KEY}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💡 &lt;strong&gt;Caution:&lt;/strong&gt; &lt;strong&gt;Never commit &lt;code&gt;.env&lt;/code&gt; to GitHub&lt;/strong&gt; or public repositories! Use &lt;code&gt;.gitignore&lt;/code&gt; to exclude it.&lt;/p&gt;
&lt;p&gt;One file. Easy updates. No headaches.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;wrapping-up&#34;&gt;&lt;strong&gt;Wrapping Up&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;You should now be able to access these containers from your browser like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sonarr&lt;/strong&gt;: http://your-server-ip:8989&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Radarr&lt;/strong&gt;: http://your-server-ip:7878&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prowlarr&lt;/strong&gt;: http://your-server-ip:9696&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SABnzbd&lt;/strong&gt;: http://your-server-ip:8080&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Reminder: you can find your server IP address using this command:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip a &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep inet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A &lt;code&gt;.env&lt;/code&gt; file is &lt;strong&gt;one of the simplest yet most powerful tools&lt;/strong&gt; in your Docker toolbox. It keeps your Arr stack &lt;strong&gt;modular, easy to manage, and future-proof&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Set it up today and never hardcode settings again.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - Understanding Linux Permissions</title>
        <link>https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/</link>
        <pubDate>Fri, 28 Feb 2025 05:52:14 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/linux_permissions.webp" alt="Featured image of post Master the Basics - Understanding Linux Permissions" /&gt;&lt;p&gt;Ever tried to open a file on Linux and been hit with a &amp;ldquo;Permission Denied&amp;rdquo; error? It’s one of those moments that makes you feel like your computer is laughing at you. But don’t worry, you’re not alone, and it’s not as complicated as it seems. Linux permissions might seem cryptic at first, but once you understand the basics, you’ll be using them like a pro.&lt;/p&gt;
&lt;p&gt;Let’s break down how Linux permissions work and how you can manage who can read, write, or execute files on your system. By the end of this, you’ll not only understand what &amp;ldquo;Permission Denied&amp;rdquo; messages mean but also how to fix them.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-are-linux-permissions&#34;&gt;What Are Linux Permissions?
&lt;/h2&gt;&lt;p&gt;In Linux, every file and directory has a set of permissions that determine who can read, write, or execute them. These permissions are essential for security and controlling user access to different parts of the system. They’re divided into three categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Owner&lt;/strong&gt; – The person who created the file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group&lt;/strong&gt; – A set of users who share permissions for the file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Others&lt;/strong&gt; – Anyone else who has access to the system.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When you look at a file’s permissions with the &lt;code&gt;ls -l&lt;/code&gt; command, you’ll see something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr--
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This might look like gibberish, but it actually breaks down like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first character (&lt;code&gt;-&lt;/code&gt;) indicates the type of file (e.g., &lt;code&gt;-&lt;/code&gt; for a regular file, &lt;code&gt;d&lt;/code&gt; for a directory).&lt;/li&gt;
&lt;li&gt;The next three characters (&lt;code&gt;rwx&lt;/code&gt;) are the &lt;strong&gt;Owner’s&lt;/strong&gt; permissions.&lt;/li&gt;
&lt;li&gt;The next three (&lt;code&gt;r-x&lt;/code&gt;) are for the &lt;strong&gt;Group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The final three (&lt;code&gt;r--&lt;/code&gt;) are for &lt;strong&gt;Others&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s break down what these letters mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; – Read permission (view the file’s contents)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; – Write permission (modify the file)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; – Execute permission (run the file as a program)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;how-to-read-linux-permissions&#34;&gt;How to Read Linux Permissions
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s look at an example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr--
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here’s how you read it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Owner&lt;/strong&gt; has &lt;code&gt;rwx&lt;/code&gt; which means they can read, write, and execute the file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group&lt;/strong&gt; has &lt;code&gt;r-x&lt;/code&gt;, so they can read and execute, but not modify it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Others&lt;/strong&gt; have &lt;code&gt;r--&lt;/code&gt;, so they can only read the file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Want to see this in action? Run this command in your terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You’ll see the permissions, owner, group, and other file details. It’s a quick way to check who can do what with your files.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;changing-permissions-with-chmod&#34;&gt;Changing Permissions with &lt;code&gt;chmod&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;To change permissions, you use the &lt;code&gt;chmod&lt;/code&gt; (change mode) command. There are two ways to do this: &lt;strong&gt;Symbolic&lt;/strong&gt; and &lt;strong&gt;Numeric&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;symbolic-method&#34;&gt;Symbolic Method
&lt;/h3&gt;&lt;p&gt;The symbolic method uses letters to specify permissions. Here’s the syntax:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;who&lt;span class=&#34;o&#34;&gt;][&lt;/span&gt;operation&lt;span class=&#34;o&#34;&gt;][&lt;/span&gt;permissions&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;who&lt;/code&gt;: &lt;code&gt;u&lt;/code&gt; (user/owner), &lt;code&gt;g&lt;/code&gt; (group), &lt;code&gt;o&lt;/code&gt; (others), &lt;code&gt;a&lt;/code&gt; (all)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;operation&lt;/code&gt;: &lt;code&gt;+&lt;/code&gt; (add), &lt;code&gt;-&lt;/code&gt; (remove)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;permissions&lt;/code&gt;: &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod u+x filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This gives the owner execute permission.&lt;/p&gt;
&lt;p&gt;You can combine multiple changes like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod u+x,g-w filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This allows the owner to execute the file while preventing the group from writing to it.&lt;/p&gt;
&lt;h3 id=&#34;numeric-method&#34;&gt;Numeric Method
&lt;/h3&gt;&lt;p&gt;The numeric method uses three numbers to set permissions, corresponding to Owner, Group, and Others. Each type of permission has a value:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; = 4&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; = 2&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; = 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add the numbers together to get the desired permission:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;7&lt;/code&gt; (4+2+1) = Read, Write, Execute&lt;/li&gt;
&lt;li&gt;&lt;code&gt;6&lt;/code&gt; (4+2) = Read, Write&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5&lt;/code&gt; (4+1) = Read, Execute&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4&lt;/code&gt; = Read only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;755&lt;/span&gt; filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This breaks down as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;7&lt;/strong&gt; (Owner: &lt;code&gt;rwx&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; (Group: &lt;code&gt;r-x&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; (Others: &lt;code&gt;r-x&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This setting lets the owner read, write, and execute the file, while the group and others can only read and execute it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;changing-file-ownership-with-chown&#34;&gt;Changing File Ownership with &lt;code&gt;chown&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;In Linux, you can also change who owns a file using the &lt;code&gt;chown&lt;/code&gt; command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown newowner filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or change both owner and group:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown newowner:newgroup filename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To make changes recursively (like for an entire directory), use the &lt;code&gt;-R&lt;/code&gt; option:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown -R newowner:newgroup directoryname
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;practical-examples&#34;&gt;Practical Examples
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s put this into practice. Suppose you have a script called &lt;code&gt;backup.sh&lt;/code&gt;, and you want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make it executable for yourself,&lt;/li&gt;
&lt;li&gt;Allow your group to read it but not modify or execute it,&lt;/li&gt;
&lt;li&gt;Prevent everyone else from accessing it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s how to do it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod u+x,g&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;r,o&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively, using the numeric method:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;750&lt;/span&gt; backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, check the result with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-x---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This confirms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Owner&lt;/strong&gt; can read, write, and execute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group&lt;/strong&gt; can read but not write or execute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Others&lt;/strong&gt; have no access.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-understanding-permissions-is-crucial&#34;&gt;Why Understanding Permissions is Crucial
&lt;/h2&gt;&lt;p&gt;Learning Linux permissions isn’t just about avoiding “Permission Denied” errors. It’s about controlling who can access sensitive files, protecting your system from accidental modifications, and maintaining overall system security.&lt;/p&gt;
&lt;p&gt;Linux is powerful because it puts you in control, but with great power comes great responsibility. Misconfigured permissions can lead to security risks or system failures, so it’s worth taking the time to learn how they work.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-using-777-permissions-is-a-bad-idea&#34;&gt;Why Using 777 Permissions is a Bad Idea
&lt;/h2&gt;&lt;p&gt;If you’ve spent time searching for fixes to permission issues on Linux, you’ve probably come across the advice to “just use 777 permissions.” At first glance, it sounds like a magic bullet—after all, it gives everyone full access to read, write, and execute the file. Problem solved, right? Well, not exactly.&lt;/p&gt;
&lt;p&gt;Setting permissions to 777 is basically the equivalent of leaving your front door wide open with a neon sign that says, “Come on in, take whatever you want!” It grants read, write, and execute access to everyone—Owner, Group, and Others. This means that any user on the system can do anything they want with that file or directory. They can modify or delete it, or even run malicious scripts. That’s a security nightmare waiting to happen.&lt;/p&gt;
&lt;p&gt;Imagine you have a web server running a site, and you set one of the directories to 777 because it “fixes” a permission error. Congratulations, you’ve just allowed every user, including anonymous visitors, to upload and execute any file they want. Hackers love this kind of thing because it makes compromising your system laughably easy.&lt;/p&gt;
&lt;p&gt;It’s also risky from a stability perspective. If anyone, even by accident, modifies or deletes a critical file, it could cause applications to crash or the entire system to become unstable. You’ll be left scratching your head, wondering what went wrong.&lt;/p&gt;
&lt;p&gt;So, what should you do instead? Always follow the principle of least privilege. Grant only the permissions that are absolutely necessary for the file or directory to function. If you’re unsure which permissions to use, take a moment to think about who actually needs access and what they need to do. Need a web server to read files but not modify them? Use 755 instead. Need a directory where a specific group can write files? Try 775.&lt;/p&gt;
&lt;p&gt;The bottom line is this: &lt;strong&gt;Avoid using 777 unless you’re in a testing environment and understand the risks.&lt;/strong&gt; In a production system, it’s an invitation for trouble. Secure your files properly, and you’ll save yourself a lot of headaches (and potentially some sleepless nights).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;Mastering Linux permissions is one of the first steps toward becoming comfortable with the command line. It might feel a bit overwhelming at first, but with practice, it will start to make sense.&lt;/p&gt;
&lt;p&gt;The next time you see &lt;code&gt;-rw-r--r--&lt;/code&gt;, you’ll know what it means—and how to change it if you need to.&lt;/p&gt;
&lt;p&gt;Ready to try it out? Open up your terminal and take control of your files.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;Linux-Basics.jpg&#34; alt=&#34;Linux Basics for Hackers: Getting Started with Networking, Scripting, and Security in Kali&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Linux Basics for Hackers:&lt;/strong&gt; &lt;em&gt;Getting Started with Networking, Scripting, and Security in Kali&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the book I used to learn Linux basics&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4hUO4LN&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>How to Install Sonarr in Docker</title>
        <link>https://diymediaserver.com/post/how-to-install-sonarr-in-docker/</link>
        <pubDate>Tue, 18 Feb 2025 06:24:50 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/how-to-install-sonarr-in-docker/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-to-install-sonarr-in-docker/sonarr.webp" alt="Featured image of post How to Install Sonarr in Docker" /&gt;&lt;p&gt;If you’re anything like me and love watching a few good TV shows, keeping up with new episodes can be a real headache, especially with the chaotic streaming landscape today. One week, your favorite show is on Netflix, and the next, it’s pulled for an exclusive run on yet another platform. Trying to keep track of what’s available where, remembering release dates, and manually downloading episodes can quickly feel like more work than it’s worth.&lt;/p&gt;
&lt;p&gt;That’s where &lt;strong&gt;Sonarr&lt;/strong&gt; comes in. Instead of hopping between streaming platforms or endlessly searching the web for downloads, Sonarr automates the entire process. It keeps track of your favorite TV shows, detects new episodes as soon as they’re available, and downloads them using your preferred method (torrent or Usenet). Once downloaded, it renames, organizes, and moves the files into your media library, ready to watch on &lt;strong&gt;Jellyfin, Plex,&lt;/strong&gt; or &lt;strong&gt;Kodi.&lt;/strong&gt; With Sonarr, your shows come to you—no more hunting them down.&lt;/p&gt;
&lt;h2 id=&#34;why-sonarr-is-a-game-changer&#34;&gt;Why Sonarr is a Game-Changer
&lt;/h2&gt;&lt;p&gt;Here’s why Sonarr is a must-have for any TV show enthusiast:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation&lt;/strong&gt; – Say goodbye to manually searching for torrents or NZB files. Sonarr does it all for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Seamless Integration&lt;/strong&gt; – Works perfectly with popular download clients like &lt;strong&gt;qBittorrent, Deluge, SABnzbd,&lt;/strong&gt; and &lt;strong&gt;NZBGet.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Library Organization&lt;/strong&gt; – Automatically renames and organizes downloaded episodes into neatly structured folders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Quality Control&lt;/strong&gt; – Prefer 4K for some shows but okay with 1080p for others? Sonarr lets you set your preferred resolution and will even upgrade files if better versions become available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Missing Episode Search&lt;/strong&gt; – If an episode isn’t immediately available, Sonarr keeps searching until it finds a valid source.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of juggling multiple websites and tools, Sonarr turns your TV show collection into a &lt;strong&gt;hands-off, fully automated system.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-run-sonarr-in-docker&#34;&gt;Why Run Sonarr in Docker?
&lt;/h2&gt;&lt;p&gt;Once you see how powerful Sonarr is, the next step is figuring out the best way to install it. While you could install it directly on your system, running Sonarr in &lt;strong&gt;Docker&lt;/strong&gt; has some serious advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolation&lt;/strong&gt; – Keeps Sonarr and its dependencies separate from your main system, reducing conflicts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easy Updates&lt;/strong&gt; – Updating Sonarr is as simple as pulling the latest Docker image.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Portability&lt;/strong&gt; – Easily move your setup to a new machine without the hassle of reconfiguring everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplified Dependency Management&lt;/strong&gt; – No more worrying about conflicting libraries or compatibility issues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Running Sonarr in Docker keeps things clean, organized, and easy to manage, update, and troubleshoot. If you’re ready to take control of your TV show collection, setting up Sonarr in Docker is the way to go.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-1-install-docker&#34;&gt;Step 1: Install Docker
&lt;/h2&gt;&lt;p&gt;To get started, you’ll need Docker. Check out this guide for step-by-step instructions: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-how-to-install-docker/&#34; &gt;Master the Basics - How to Install Docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-2-create-the-sonarr-docker-compose-file&#34;&gt;Step 2: Create the Sonarr Docker Compose File
&lt;/h2&gt;&lt;p&gt;Let’s set up a &lt;code&gt;docker-compose.yml&lt;/code&gt; file to define the Sonarr container.&lt;/p&gt;
&lt;h3 id=&#34;navigate-to-your-desired-folder&#34;&gt;Navigate to Your Desired Folder
&lt;/h3&gt;&lt;p&gt;Choose where you want to store Sonarr’s configuration files (I use a root folder named docker):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /docker &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;create-the-docker-composeyml-file&#34;&gt;Create the &lt;code&gt;docker-compose.yml&lt;/code&gt; File
&lt;/h3&gt;&lt;p&gt;Use your favorite text editor:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, paste the following content:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  SONARR                     ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Official LinuxServer.io Sonarr image&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lscr.io/linuxserver/sonarr:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Sets a custom name for the container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonarr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Name and location of the .env file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Ensures the container restarts if it crashes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${SONARR_PORT}:8989&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Stores Sonarr&amp;#39;s configuration data &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${CONFIG_PATH}/sonarr:/config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where downloaded TV shows are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${MEDIA_PATH}/Shows:/tv&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Directory where incomplete downloads are stored  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;${DOWNLOADS_PATH}:/downloads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=${PUID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=${PGID}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UMASK=0007&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=${TZ}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Connects the container to the custom media network  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;##  NETWORK                    ##&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#################################&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Creates an isolated Docker network for media containers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;media_network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;step-3-customize-the-env-file&#34;&gt;Step 3: Customize the .env File
&lt;/h2&gt;&lt;h3 id=&#34;open-the-env-file&#34;&gt;Open the .env File
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano /docker/.env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The content of the .env file should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# User and Group ID (Prevents permission issues)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Main user ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PUID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Our media group:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PGID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Timezone (Ensures correct scheduling and logs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;America/Denver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Define Ports (Ports for each container are defined here)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Maps Sonarr’s web UI to port 8989 on the host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SONARR_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8989&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Data Directories (Keeps storage paths centralized)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONFIG_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DOWNLOADS_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media/downloads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MEDIA_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update the Radarr file paths as needed. Here’s what to change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CONFIG_PATH=/docker&lt;/code&gt; → Root folder where Docker stores persistent files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;MEDIA_PATH=/media&lt;/code&gt; → Root folder for your media files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DOWNLOADS_PATH=/media/downloads&lt;/code&gt; → Root folder where your download client stores temp/incomplete files&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure the download client container shares access to the &lt;code&gt;/downloads&lt;/code&gt; path.&lt;/p&gt;
&lt;p&gt;Also update the timezone (TZ) to match yours.&lt;br&gt;
Refer to: &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This list of valid timezones&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;💡 Pro Tip: Make sure your download client (like qBittorrent or SABnzbd) also has access to the /downloads folder for smooth integration.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-4-start-sonarr&#34;&gt;Step 4: Start Sonarr
&lt;/h2&gt;&lt;p&gt;With everything set up, start the container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;-d&lt;/code&gt; flag runs the container in the background (detached mode).&lt;/li&gt;
&lt;li&gt;Sonarr should now be running.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Verify Sonarr is running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;sonarr&lt;/code&gt; in the list of running containers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CONTAINER ID   IMAGE                               COMMAND   CREATED          STATUS          PORTS                                       NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;e49175ef37c5   lscr.io/linuxserver/sonarr:latest   &lt;span class=&#34;s2&#34;&gt;&amp;#34;/init&amp;#34;&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;23&lt;/span&gt; seconds ago   Up &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; seconds   0.0.0.0:8989-&amp;gt;8989/tcp, :::8989-&amp;gt;8989/tcp   sonarr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;step-5-ensure-permissions-are-set-correctly&#34;&gt;Step 5: Ensure Permissions Are Set Correctly
&lt;/h2&gt;&lt;p&gt;Folder permissions are one of the most common issues people run into when setting up the Arr suite in Docker. To avoid headaches, make sure your docker and media folders have the correct permissions set. Here’s what you need to do:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /docker/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /docker/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;yourusername&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;:media /media/ &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /media/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For more information on Linux permissions see this post: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-understanding-linux-permissions/&#34; &gt;Master the Basics - Linux Permissions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-6-access-and-configure-sonarr&#34;&gt;Step 6: Access and Configure Sonarr
&lt;/h2&gt;&lt;p&gt;Open a web browser and visit:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://your-server-ip:8989
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;From here, you can configure Sonarr to connect with your download client and set up your TV show library. For detailed guidance, check out the official &lt;a class=&#34;link&#34; href=&#34;https://wiki.servarr.com/sonarr&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Sonarr Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-7-keeping-sonarr-updated&#34;&gt;Step 7: Keeping Sonarr Updated
&lt;/h2&gt;&lt;p&gt;One of Docker’s biggest advantages is easy updates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose pull  &lt;span class=&#34;c1&#34;&gt;# Fetches the latest image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose down  &lt;span class=&#34;c1&#34;&gt;# Stops and removes the running container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d  &lt;span class=&#34;c1&#34;&gt;# Starts a fresh container with the new image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This keeps you up to date with the latest features and security patches.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Sonarr is an &lt;strong&gt;essential tool for automating TV show downloads&lt;/strong&gt;. It monitors, downloads, and organizes episodes effortlessly, turning your media library into a &lt;strong&gt;fully automated system&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;By running Sonarr in Docker, you get all these benefits &lt;strong&gt;without cluttering your system&lt;/strong&gt;. It’s straightforward to install, update, and manage—freeing up more time to enjoy your favorite shows instead of dealing with download hassles.&lt;/p&gt;
&lt;p&gt;With Sonarr up and running, consider pairing it with other Arr suite members like Radarr for movies and Lidarr for music. You’ll be well on your way to the &lt;strong&gt;ultimate automated media setup&lt;/strong&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master The Basics - Linux File Folders - What They Do and Why They Matter</title>
        <link>https://diymediaserver.com/post/master-the-basics-understanding-linux-file-folders/</link>
        <pubDate>Sun, 16 Feb 2025 07:15:05 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-understanding-linux-file-folders/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-understanding-linux-file-folders/linux_file_folders.webp" alt="Featured image of post Master The Basics - Linux File Folders - What They Do and Why They Matter" /&gt;&lt;p&gt;If you are new to Linux, the file system structure can initially seem confusing. Unlike Windows, which organizes files using separate drives (C:, D:, etc.), Linux uses a single hierarchical tree with everything stemming from the &lt;strong&gt;root (&lt;code&gt;/&lt;/code&gt;) directory&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Each folder inside &lt;code&gt;/&lt;/code&gt; has a specific role, and understanding these roles can make troubleshooting, system management, and daily tasks easier. In this post, I will explain the &lt;strong&gt;10ish important directories in Linux&lt;/strong&gt;, explaining their purpose and contents in detail.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1----the-root-directory&#34;&gt;1. &lt;code&gt;/&lt;/code&gt; - The Root Directory
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The root directory (&lt;code&gt;/&lt;/code&gt;) is the top-level directory in the Linux file system. Everything in Linux is stored inside this directory, whether they are files, folders, or mounted devices.&lt;/li&gt;
&lt;li&gt;It contains all other directories, forming the base of the Linux file hierarchy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlike Windows, where programs and files can be scattered across multiple drives, Linux organizes everything under &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When you install Linux, this structure is created automatically.&lt;/li&gt;
&lt;li&gt;If you delete or corrupt files inside &lt;code&gt;/&lt;/code&gt;, your system may become unusable.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-home---user-home-directories&#34;&gt;2. &lt;code&gt;/home&lt;/code&gt; - User Home Directories
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;/home&lt;/code&gt; directory contains personal directories for each user on the system.&lt;/li&gt;
&lt;li&gt;For example, if your username is &lt;code&gt;john&lt;/code&gt;, your personal files are stored in &lt;code&gt;/home/john/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Personal files:&lt;/strong&gt; Documents, downloads, pictures, music, videos, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration files:&lt;/strong&gt; Hidden &amp;ldquo;dotfiles&amp;rdquo; (like &lt;code&gt;.bashrc&lt;/code&gt; or &lt;code&gt;.profile&lt;/code&gt;) that store user-specific settings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User-specific applications:&lt;/strong&gt; Some apps store user data in directories like &lt;code&gt;~/.config/&lt;/code&gt; or &lt;code&gt;~/.local/share/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlike Windows, where user data is stored in &lt;code&gt;C:\Users\&lt;/code&gt;, Linux keeps everything neatly inside &lt;code&gt;/home&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you reinstall Linux, you can keep your &lt;code&gt;/home&lt;/code&gt; directory separate so you do not lose personal data.&lt;/li&gt;
&lt;li&gt;This is why it is recommend that your home directory is created on its own partition.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-root---the-root-user-home-directory&#34;&gt;3. &lt;code&gt;/root&lt;/code&gt; - The Root user Home Directory
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/root&lt;/code&gt; is the home directory for the &lt;strong&gt;root user&lt;/strong&gt; (the superuser or administrator).&lt;/li&gt;
&lt;li&gt;It is separate from regular user directories (&lt;code&gt;/home/username/&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Root user-specific files and settings.&lt;/li&gt;
&lt;li&gt;This folder contains system administration scripts or commands only accessible by the root user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Regular users are restricted from the folder &lt;code&gt;/root&lt;/code&gt;, preventing them from making critical system changes.&lt;/li&gt;
&lt;li&gt;If you log in as root (not recommended for daily use), this is where your personal files would be.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-etc---system-configuration-files&#34;&gt;4. &lt;code&gt;/etc&lt;/code&gt; - System Configuration Files
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This directory stores &lt;strong&gt;system-wide configuration files&lt;/strong&gt; that control how Linux behaves.&lt;/li&gt;
&lt;li&gt;Most applications and services have their settings stored here.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network settings:&lt;/strong&gt; &lt;code&gt;/etc/network/interfaces&lt;/code&gt; (network configuration), &lt;code&gt;/etc/hosts&lt;/code&gt; (local hostnames).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User authentication files:&lt;/strong&gt; &lt;code&gt;/etc/passwd&lt;/code&gt; (user accounts), &lt;code&gt;/etc/shadow&lt;/code&gt; (encrypted passwords).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service configurations:&lt;/strong&gt; Web servers, SSH settings, firewall rules, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you want to change system settings, these files are found in the &lt;code&gt;/etc&lt;/code&gt; folder, where you will edit them.&lt;/li&gt;
&lt;li&gt;Modifying some of these files can break your system, so always make backups before editing.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-bin-and-sbin---essential-system-programs&#34;&gt;5. &lt;code&gt;/bin&lt;/code&gt; and &lt;code&gt;/sbin&lt;/code&gt; - Essential System Programs
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/bin/&lt;/code&gt; (binaries) and &lt;code&gt;/sbin/&lt;/code&gt; (system binaries) store essential programs that let you interact with Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside &lt;code&gt;/bin/&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basic commands available to all users, like:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ls&lt;/code&gt; (list files)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cp&lt;/code&gt; (copy files)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rm&lt;/code&gt; (remove files)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat&lt;/code&gt; (view file contents)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside &lt;code&gt;/sbin/&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System administrator commands, like:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shutdown&lt;/code&gt; (turn off the system)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fdisk&lt;/code&gt; (manage disk partitions)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iptables&lt;/code&gt; (configure firewalls)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why they matter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;These directories contain fundamental Linux tools required to run the system.&lt;/li&gt;
&lt;li&gt;Without &lt;code&gt;/bin/&lt;/code&gt;, you could not execute basic commands like the ones listed above.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-var---variable-data-logs-caches-databases&#34;&gt;6. &lt;code&gt;/var&lt;/code&gt; - Variable Data (Logs, Caches, Databases)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stores files that &lt;strong&gt;change frequently&lt;/strong&gt;, such as logs, cache files, and mail queues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Logs:&lt;/strong&gt; &lt;code&gt;/var/log/&lt;/code&gt; contains system logs (&lt;code&gt;syslog&lt;/code&gt;, &lt;code&gt;auth.log&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web server files:&lt;/strong&gt; &lt;code&gt;/var/www/&lt;/code&gt; stores website files if you run a web server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Print and mail files:&lt;/strong&gt; &lt;code&gt;/var/spool/&lt;/code&gt; contains print queues and email processing data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your server is suffering from unexplained issues, checking logs in &lt;code&gt;/var/log/&lt;/code&gt; can help pinpoint the problem(s).&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;/var/&lt;/code&gt; fills up, it can cause services to fail (e.g., an overfull log partition might crash a web server).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-usr---user-installed-programs-and-libraries&#34;&gt;7. &lt;code&gt;/usr&lt;/code&gt; - User-installed Programs and Libraries
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contains applications and libraries that users install manually or via package managers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/usr/bin/&lt;/code&gt;: Most common Linux programs (e.g., &lt;code&gt;nano&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;firefox&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/local/&lt;/code&gt;: Custom software installed by the user (not managed by the OS).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you install software manually, you will often find it in &lt;code&gt;/usr/local/bin/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Unlike &lt;code&gt;/bin/&lt;/code&gt; (which holds system-critical commands), &lt;code&gt;/usr/bin/&lt;/code&gt; is for user applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-tmp---temporary-files&#34;&gt;8. &lt;code&gt;/tmp&lt;/code&gt; - Temporary Files
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stores temporary files that are &lt;strong&gt;automatically deleted&lt;/strong&gt; when the system reboots.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Temporary user files.&lt;/li&gt;
&lt;li&gt;Session data for running applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Useful for storing temporary downloads or test files.&lt;/li&gt;
&lt;li&gt;Do &lt;strong&gt;not&lt;/strong&gt; store important files here—they will be erased on reboot!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-mnt-and-media---mount-points-for-external-drives&#34;&gt;9. &lt;code&gt;/mnt&lt;/code&gt; and &lt;code&gt;/media&lt;/code&gt; - Mount Points for External Drives
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;These directories are used for mounting internal or external drives (USBs, CDs, network drives).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What&amp;rsquo;s inside:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/mnt/&lt;/code&gt;: A generic folder where you can manually mount devices.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/media/&lt;/code&gt;: Used by the system to auto-mount removable storage (e.g., &lt;code&gt;/media/usbdrive&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why they matter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you plug in a USB drive and it does not appear in &lt;code&gt;/media/&lt;/code&gt;, you might need to mount it manually.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount /dev/sdc1 /mnt/usb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;10-dev-proc-and-sys---system-and-hardware-information&#34;&gt;10. &lt;code&gt;/dev&lt;/code&gt;, &lt;code&gt;/proc&lt;/code&gt;, and &lt;code&gt;/sys&lt;/code&gt; - System and Hardware Information
&lt;/h2&gt;&lt;h3 id=&#34;dev---device-files&#34;&gt;&lt;code&gt;/dev/&lt;/code&gt; - Device Files
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Contains files representing hardware devices, like:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/dev/sda&lt;/code&gt; (primary hard drive)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/usb0&lt;/code&gt; (USB devices)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;proc---process-information&#34;&gt;&lt;code&gt;/proc/&lt;/code&gt; - Process Information
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Contains real-time system info, such as:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/proc/cpuinfo&lt;/code&gt; (CPU details)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/proc/meminfo&lt;/code&gt; (memory usage)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;sys---kernel-and-hardware-settings&#34;&gt;&lt;code&gt;/sys/&lt;/code&gt; - Kernel and Hardware Settings
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Provides a way for the system to interact with hardware components.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why they matter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Need to check system info? (&lt;code&gt;cat /proc/cpuinfo&lt;/code&gt;), These directories are invaluable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/&lt;/code&gt; is crucial for mounting drives and accessing hardware.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;wrapping-up&#34;&gt;Wrapping Up
&lt;/h2&gt;&lt;p&gt;The Linux file system might seem complex, but once you understand the role of each folder, it becomes much easier to navigate and manage. The more you explore, the more comfortable you will become.&lt;/p&gt;
&lt;p&gt;If you are new to Linux, try using the &lt;code&gt;ls&lt;/code&gt; command to look inside each folder. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /etc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /usr/bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This hands-on approach will help reinforce what you have learned. Happy exploring.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - How to Install Docker in Linux</title>
        <link>https://diymediaserver.com/post/master-the-basics-how-to-install-docker/</link>
        <pubDate>Thu, 13 Feb 2025 07:02:47 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-how-to-install-docker/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-how-to-install-docker/docker.webp" alt="Featured image of post Master the Basics - How to Install Docker in Linux" /&gt;&lt;h2 id=&#34;what-is-docker-and-why-should-you-use-it&#34;&gt;What Is Docker and Why Should You Use It?
&lt;/h2&gt;&lt;p&gt;Docker is a &lt;strong&gt;containerization platform&lt;/strong&gt; that lets you run applications in &lt;strong&gt;isolated environments&lt;/strong&gt; called &lt;strong&gt;containers&lt;/strong&gt;. These containers package an application with all its dependencies, making them &lt;strong&gt;lightweight, portable, and easy to manage&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;why-use-docker&#34;&gt;&lt;strong&gt;Why Use Docker?&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Simplifies Application Deployment&lt;/strong&gt;&lt;br&gt;
Instead of installing software directly on your server (which can lead to dependency conflicts), Docker packages everything into self-contained units that &lt;strong&gt;run the same way on any system&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saves System Resources&lt;/strong&gt;&lt;br&gt;
Unlike virtual machines (VMs), Docker containers &lt;strong&gt;share the host OS kernel&lt;/strong&gt;, making them far more &lt;strong&gt;efficient&lt;/strong&gt; with memory and CPU usage. You can run &lt;strong&gt;dozens of containers&lt;/strong&gt; on one machine without the overhead of multiple full operating systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Easy Software Management&lt;/strong&gt;&lt;br&gt;
Need to install &lt;strong&gt;Jellyfin, Sonarr, Radarr, or Home Assistant&lt;/strong&gt;? With Docker, it’s as easy as running a command to pull the application and all its dependencies—no manual configuration required.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keeps Applications Isolated&lt;/strong&gt;&lt;br&gt;
Docker &lt;strong&gt;isolates applications&lt;/strong&gt; from each other. If one container crashes or gets compromised, it &lt;strong&gt;won’t affect&lt;/strong&gt; the rest of your system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Effortless Updates and Rollbacks&lt;/strong&gt;&lt;br&gt;
Updating an app is as simple as &lt;strong&gt;pulling the latest container image&lt;/strong&gt;. And if something goes wrong? Just &lt;strong&gt;roll back&lt;/strong&gt; to the previous version with ease.&lt;/p&gt;
&lt;p&gt;Now that you know why Docker is such a &lt;strong&gt;powerful tool for your home server&lt;/strong&gt;, let’s install it &lt;strong&gt;correctly&lt;/strong&gt;, with security in mind.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/NUC12.jpg&#34; alt=&#34;Intel NUC 12 Pro (NUC12WSHi5): Compact mini PC for lightweight servers, GPU Passthrough, Docker stacks, and VMs.&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Intel NUC 12 Pro (NUC12WSHi5)&lt;/strong&gt;
Compact mini PC for lightweight servers, GPU Passthrough, Docker stacks, and VMs.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3JyPlM4&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445831098683742853224568&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fnuc-12-pro-barebone-12th-gen-intel-core-i5-1240p-rnuc12wshi50000%2fp%2f1VK-004K-068E6%3fitem%3d9SIBPASKBH4509&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;1-update-your-system-and-install-dependencies&#34;&gt;1. Update Your System and Install Dependencies
&lt;/h2&gt;&lt;p&gt;Before installing Docker, your system needs to be updated. Additionally, the necessary dependencies also need to be installed. These steps ensure a &lt;strong&gt;clean, stable&lt;/strong&gt; installation.
Run the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y ca-certificates curl gnupg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update your package list&lt;/strong&gt; (&lt;code&gt;apt update&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upgrade installed packages&lt;/strong&gt; (&lt;code&gt;apt upgrade -y&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install the essential dependencies&lt;/strong&gt; (if &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;gnupg&lt;/code&gt; are not already installed)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-add-dockers-official-gpg-key-and-repository&#34;&gt;2. Add Docker’s Official GPG Key and Repository
&lt;/h2&gt;&lt;p&gt;Ubuntu includes Docker in its default repositories, but &lt;strong&gt;you should not use it&lt;/strong&gt;. Why?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outdated versions&lt;/strong&gt;: Ubuntu&amp;rsquo;s repository often lags behind Docker’s latest stable releases, meaning you could be missing important features and security fixes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slower updates&lt;/strong&gt;: Critical bug fixes and security patches may take longer to arrive in Ubuntu&amp;rsquo;s repositories. Where Docker’s official repository adds these patches immediately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing features&lt;/strong&gt;: The Ubuntu version may lack support for new Docker functionalities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To install the latest version, add Docker’s &lt;strong&gt;official repository&lt;/strong&gt; run the following commands:&lt;/p&gt;
&lt;h3 id=&#34;tldr---i-just-want-to-cut--paste-commands&#34;&gt;TL;DR - I Just Want to Cut &amp;amp; Paste Commands:
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo install -m &lt;span class=&#34;m&#34;&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/keyrings/docker.asc &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; stable&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;the-long-and-detailed-explanation-of-the-commands&#34;&gt;The Long and Detailed Explanation of the Commands:
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo install -m &lt;span class=&#34;m&#34;&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;breaking-it-down&#34;&gt;Breaking It Down:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; → Runs the command with &lt;strong&gt;superuser (root) privileges&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;install&lt;/code&gt; → A command that can &lt;strong&gt;copy files&lt;/strong&gt;, &lt;strong&gt;set permissions&lt;/strong&gt;, and &lt;strong&gt;create directories&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m 0755&lt;/code&gt; → Sets the &lt;strong&gt;permissions&lt;/strong&gt; of the directory to &lt;code&gt;0755&lt;/code&gt; (read &amp;amp; execute for everyone, write for the owner).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; → Tells &lt;code&gt;install&lt;/code&gt; to &lt;strong&gt;create a directory&lt;/strong&gt; (if it doesn’t exist).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/apt/keyrings&lt;/code&gt; → The &lt;strong&gt;path&lt;/strong&gt; where the directory is created. This is where trusted GPG keys for package signing are stored.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;-security-purpose&#34;&gt;🔒 Security Purpose:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Ensures &lt;strong&gt;only the owner (root) can modify&lt;/strong&gt; the keyring directory.&lt;/li&gt;
&lt;li&gt;Prevents unauthorized users from tampering with &lt;strong&gt;trusted GPG keys&lt;/strong&gt; used to verify software packages.&lt;/li&gt;
&lt;li&gt;Ubuntu 24.04 and later recommend storing &lt;strong&gt;GPG keys in &lt;code&gt;/etc/apt/keyrings/&lt;/code&gt;&lt;/strong&gt; instead of the older &lt;code&gt;/etc/apt/trusted.gpg&lt;/code&gt; for &lt;strong&gt;better security&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/keyrings/docker.asc &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;breaking-the-three-parts-of-this-command-down&#34;&gt;Breaking The Three Parts of This Command Down:
&lt;/h3&gt;&lt;h4 id=&#34;1-curl--fssl-httpsdownloaddockercomlinuxubuntugpg&#34;&gt;1 &lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg&lt;/code&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl&lt;/code&gt; → A tool to download files from the internet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt; → Fails silently if the URL is incorrect (avoids downloading error messages).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt; → Runs in &lt;strong&gt;silent mode&lt;/strong&gt; (hides progress output).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-S&lt;/code&gt; → Shows errors (only if they occur, making troubleshooting easier).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-L&lt;/code&gt; → Follows redirects (in case the URL redirects to another location).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://download.docker.com/linux/ubuntu/gpg&lt;/code&gt; → The &lt;strong&gt;URL to Docker&amp;rsquo;s official GPG key&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;br&gt;
Downloads Docker’s &lt;strong&gt;GPG key&lt;/strong&gt;, which is used to &lt;strong&gt;verify&lt;/strong&gt; the authenticity of Docker packages.&lt;/p&gt;
&lt;h4 id=&#34;2--sudo-tee-etcaptkeyringsdockerasc&#34;&gt;2️ &lt;code&gt;| sudo tee /etc/apt/keyrings/docker.asc&lt;/code&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt; → &lt;strong&gt;Pipes&lt;/strong&gt; (redirects) the output of &lt;code&gt;curl&lt;/code&gt; to the &lt;code&gt;tee&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; → Runs the command as &lt;strong&gt;root&lt;/strong&gt; (needed to write to system directories).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tee /etc/apt/keyrings/docker.asc&lt;/code&gt; →
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tee&lt;/code&gt; writes the &lt;strong&gt;Docker GPG key&lt;/strong&gt; into &lt;code&gt;/etc/apt/keyrings/docker.asc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;This file will later be used to verify that Docker packages are &lt;strong&gt;signed and authentic&lt;/strong&gt; before installing them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3--devnull&#34;&gt;3 &lt;code&gt;&amp;gt; /dev/null&lt;/code&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&lt;/code&gt; redirects output somewhere else.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/null&lt;/code&gt; is a &lt;strong&gt;special &amp;ldquo;trash&amp;rdquo; file&lt;/strong&gt; in Linux that discards anything written to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;breaking-it-down-1&#34;&gt;Breaking It Down:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; → Runs the command with &lt;strong&gt;superuser (root) privileges&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod&lt;/code&gt; → &lt;strong&gt;Changes file permissions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt; → Stands for &lt;strong&gt;&amp;ldquo;all users&amp;rdquo;&lt;/strong&gt; (owner, group, and others).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+r&lt;/code&gt; → &lt;strong&gt;Adds read permission&lt;/strong&gt; (so the file can be read by everyone).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/apt/keyrings/docker.asc&lt;/code&gt; This is the &lt;strong&gt;GPG key file&lt;/strong&gt; used to verify Docker packages when installing/updating via &lt;code&gt;apt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;what-this-does&#34;&gt;What this does:
&lt;/h4&gt;&lt;p&gt;1️ &lt;strong&gt;Allows the System to Use the Key&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When &lt;code&gt;apt&lt;/code&gt; installs or updates Docker, it &lt;strong&gt;checks package signatures&lt;/strong&gt; using this GPG key.&lt;/li&gt;
&lt;li&gt;Without &lt;strong&gt;read access&lt;/strong&gt;, &lt;code&gt;apt&lt;/code&gt; might fail to verify Docker&amp;rsquo;s authenticity, causing errors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2 &lt;strong&gt;Prevents Unauthorized Modifications&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;file remains protected&lt;/strong&gt; (only root can modify it), but now all users can read it.&lt;/li&gt;
&lt;li&gt;This ensures that system processes and normal users can &lt;strong&gt;verify packages but not modify the key&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3️ &lt;strong&gt;Follows Ubuntu’s New Security Guidelines&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Older versions stored GPG keys in &lt;code&gt;/etc/apt/trusted.gpg&lt;/code&gt;, which gave &lt;strong&gt;all keys full system-wide trust&lt;/strong&gt; (less secure).&lt;/li&gt;
&lt;li&gt;Newer Ubuntu releases use &lt;code&gt;/etc/apt/keyrings/&lt;/code&gt;, where each key is &lt;strong&gt;isolated and explicitly trusted only for its repository&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; stable&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;breaking-the-three-parts-of-this-command-down-1&#34;&gt;Breaking The Three Parts of This Command Down:
&lt;/h3&gt;&lt;h4 id=&#34;1&#34;&gt;&lt;strong&gt;1️ &lt;code&gt;echo &amp;quot;deb [...] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&amp;quot;&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;echo&lt;/code&gt; → Outputs the text inside quotes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;deb [...] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&amp;quot;&lt;/code&gt; →&lt;br&gt;
This is a &lt;strong&gt;software repository entry&lt;/strong&gt; in Debian/Ubuntu format.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;whats-inside-the&#34;&gt;&lt;strong&gt;What’s inside the &lt;code&gt;deb [...]&lt;/code&gt; line?&lt;/strong&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deb&lt;/code&gt; → Tells &lt;code&gt;apt&lt;/code&gt; this is a &lt;strong&gt;binary package repository&lt;/strong&gt; (not source code).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arch=$(dpkg --print-architecture)&lt;/code&gt; → Detects your system architecture (&lt;code&gt;amd64&lt;/code&gt;, &lt;code&gt;arm64&lt;/code&gt;, etc.), ensuring you install the correct version.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;signed-by=/etc/apt/keyrings/docker.asc&lt;/code&gt; → Uses &lt;strong&gt;Docker’s GPG key&lt;/strong&gt; (previously downloaded) to verify package authenticity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://download.docker.com/linux/ubuntu&lt;/code&gt; → The &lt;strong&gt;URL of Docker&amp;rsquo;s official repository&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$(lsb_release -cs)&lt;/code&gt; → Dynamically inserts your &lt;strong&gt;Ubuntu codename&lt;/strong&gt; (e.g., &lt;code&gt;noble&lt;/code&gt; for 24.04), ensuring compatibility.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stable&lt;/code&gt; → Installs the &lt;strong&gt;stable&lt;/strong&gt; version of Docker (instead of edge/testing builds).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2&#34;&gt;&lt;strong&gt;2️ &lt;code&gt;| sudo tee /etc/apt/sources.list.d/docker.list&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt; → Pipes (&lt;code&gt;echo&lt;/code&gt; output) to &lt;code&gt;tee&lt;/code&gt;, which writes it to a file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; → Runs with &lt;strong&gt;root privileges&lt;/strong&gt; (since &lt;code&gt;/etc/apt/sources.list.d/&lt;/code&gt; requires admin access).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tee /etc/apt/sources.list.d/docker.list&lt;/code&gt; → Saves the repository entry into &lt;code&gt;/etc/apt/sources.list.d/docker.list&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3&#34;&gt;&lt;strong&gt;3️ &lt;code&gt;&amp;gt; /dev/null&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Discards the output from &lt;code&gt;tee&lt;/code&gt;, keeping the terminal clean.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Update your apt repositories:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-install-docker&#34;&gt;3. Install Docker
&lt;/h2&gt;&lt;p&gt;To install &lt;strong&gt;Docker&lt;/strong&gt; (The following command will also install the needed dependencies):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y docker-ce
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To ensure Docker starts when the system boots:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once installed and enabled, verify that Docker is running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If docker is running you should see the following after running &lt;code&gt;docker ps&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With nothing showing under these headers.&lt;/p&gt;
&lt;h3 id=&#34;-security-step-prevent-unauthorized-docker-access&#34;&gt;🔒 &lt;strong&gt;Security Step: Prevent Unauthorized Docker Access&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;By default, Docker runs as &lt;strong&gt;root&lt;/strong&gt;, which is a security risk. A safer approach is to create a &lt;strong&gt;dedicated user group&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo groupadd docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -aG docker &lt;span class=&#34;nv&#34;&gt;$USER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;newgrp docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After running these commands, you can run Docker &lt;strong&gt;without sudo&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run hello-world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;4-configure-docker-for-better-security&#34;&gt;4. Configure Docker for Better Security
&lt;/h2&gt;&lt;p&gt;A default Docker installation exposes certain risks. Let’s &lt;strong&gt;harden&lt;/strong&gt; it.&lt;/p&gt;
&lt;h3 id=&#34;enable-apparmor&#34;&gt;Enable AppArmor
&lt;/h3&gt;&lt;p&gt;Ubuntu ships with &lt;strong&gt;AppArmor&lt;/strong&gt;, a security module that restricts what Docker containers can access.&lt;/p&gt;
&lt;p&gt;Check if it’s enabled:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo aa-status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If not, enable it with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now apparmor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;disable-containers-from-getting-root-privileges&#34;&gt;Disable Containers from Getting Root Privileges
&lt;/h3&gt;&lt;p&gt;By default, containers can run with elevated privileges. Restrict this with &lt;strong&gt;user namespaces&lt;/strong&gt;:&lt;/p&gt;
&lt;h4 id=&#34;tldr-cut--paste-these-commands&#34;&gt;TL;DR Cut &amp;amp; Paste These Commands:
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /etc/systemd/system/docker.service.d
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;[Service]\nExecStart=\nExecStart=/usr/bin/dockerd --userns-remap=default&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/systemd/system/docker.service.d/override.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;breakdown-of-these-commands&#34;&gt;Breakdown of These Commands:
&lt;/h4&gt;&lt;p&gt;Create a Configuration Directory for Docker&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /etc/systemd/system/docker.service.d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; → Runs the command as &lt;strong&gt;root&lt;/strong&gt; (required for modifying system settings).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkdir -p&lt;/code&gt; → Creates a directory &lt;strong&gt;if it doesn’t already exist&lt;/strong&gt; (&lt;code&gt;-p&lt;/code&gt; ensures no error if the directory exists).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/systemd/system/docker.service.d&lt;/code&gt; → This is where &lt;strong&gt;custom systemd overrides&lt;/strong&gt; for Docker are stored.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;br&gt;
This ensures we have a place to store a custom configuration for the Docker service without modifying the main Docker service file.&lt;/p&gt;
&lt;p&gt;Create an Override File to Enable User Namespace Remapping&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;[Service]\nExecStart=\nExecStart=/usr/bin/dockerd --userns-remap=default&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/systemd/system/docker.service.d/override.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;echo -e &amp;quot;[Service]\nExecStart=\nExecStart=/usr/bin/dockerd --userns-remap=default&amp;quot;&lt;/code&gt; →
&lt;ul&gt;
&lt;li&gt;Creates a &lt;strong&gt;custom systemd service override&lt;/strong&gt; for Docker.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ExecStart=&lt;/code&gt; (empty) &lt;strong&gt;clears the previous ExecStart setting&lt;/strong&gt; from the default Docker service.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ExecStart=/usr/bin/dockerd --userns-remap=default&lt;/code&gt; &lt;strong&gt;replaces it with a new one&lt;/strong&gt; that enables &lt;strong&gt;user namespace remapping&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;| sudo tee /etc/systemd/system/docker.service.d/override.conf&lt;/code&gt; →
&lt;ul&gt;
&lt;li&gt;Pipes the output (&lt;code&gt;|&lt;/code&gt;) to &lt;code&gt;tee&lt;/code&gt;, which writes it into the override file at &lt;code&gt;/etc/systemd/system/docker.service.d/override.conf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; ensures &lt;strong&gt;root access&lt;/strong&gt; for writing the file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User namespace remapping (&lt;code&gt;--userns-remap=default&lt;/code&gt;) makes Docker containers run as an unprivileged user instead of root.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;This mitigates risks if a container is compromised—&lt;strong&gt;it won’t have full root access on the host&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reload &lt;code&gt;systemd&lt;/code&gt; to Apply the Changes&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; → Runs as &lt;strong&gt;root&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl daemon-reload&lt;/code&gt; → Reloads &lt;strong&gt;systemd&lt;/strong&gt; so it recognizes the new Docker service override.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;br&gt;
Without this, &lt;code&gt;systemd&lt;/code&gt; won’t detect the new &lt;code&gt;override.conf&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Restart Docker to Apply the New Configuration&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo&lt;/code&gt; → Runs as &lt;strong&gt;root&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl restart docker&lt;/code&gt; → Restarts Docker so it runs with the new &lt;code&gt;--userns-remap=default&lt;/code&gt; setting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This applies the security changes &lt;strong&gt;without rebooting the system&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;From now on, Docker containers will &lt;strong&gt;run as an unprivileged user&lt;/strong&gt; instead of root.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;wrapping-up&#34;&gt;Wrapping Up
&lt;/h2&gt;&lt;p&gt;Docker is a powerful tool for running apps on your &lt;strong&gt;Ubuntu 24.04 server&lt;/strong&gt;, but an &lt;strong&gt;insecure setup&lt;/strong&gt; can put your system at risk. By following this guide, you now have Docker installed &lt;strong&gt;correctly&lt;/strong&gt;—with some security mitigations in place.&lt;/p&gt;
&lt;p&gt;Want to take security even further? Consider &lt;strong&gt;ufw&lt;/strong&gt; and/or &lt;strong&gt;fail2ban&lt;/strong&gt; for added protection.&lt;/p&gt;
&lt;p&gt;This sets us up for deploying Sonarr and Radarr services in the next posts.&lt;/p&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/intel_arc.jpg&#34; alt=&#34;ASRock Intel ARC A380 Challenger: The Arc A380 isn&amp;#39;t for gaming—it’s for obliterating video streams. With support for H.264, HEVC, and full AV1 hardware enco…&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;ASRock Intel ARC A380 Challenger&lt;/strong&gt;
The Arc A380 isn&amp;rsquo;t for gaming—it’s for obliterating video streams. With support for H.264, HEVC, and full AV1 hardware encode/decode, it crushes 20+ 1080p streams or 6–8 HDR tone-mapped 4Ks without breaking a sweat. Drop it in your media server, give Jellyfin direct VA-API access, and watch your CPU finally cool off for a bit.&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/45n6UHq&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>Master the Basics - How to Install and Use SnapRAID for a Resilient Home Media Server</title>
        <link>https://diymediaserver.com/post/master-the-basics-how-to-install-snapraid/</link>
        <pubDate>Sat, 08 Feb 2025 07:26:32 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-how-to-install-snapraid/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-how-to-install-snapraid/snapraid2.webp" alt="Featured image of post Master the Basics - How to Install and Use SnapRAID for a Resilient Home Media Server" /&gt;&lt;h2 id=&#34;why-you-need-snapraid-with-mergerfs&#34;&gt;Why You Need SnapRAID with MergerFS
&lt;/h2&gt;&lt;p&gt;Picture this: You’ve spent years building the perfect media collection—movies, TV shows, music, and personal backups—all neatly stored across multiple hard drives. Then one day, you hear that dreaded clicking sound from one of your server’s drives. Panic sets in. Did you just lose everything on that drive? Not if you planned ahead.&lt;/p&gt;
&lt;p&gt;This is where MergerFS and SnapRAID come to the rescue. MergerFS lets you combine multiple drives into a single, easy-to-manage storage pool, while SnapRAID adds redundancy to protect against drive failures. See my &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-mergerfs-the-best-way-to-combine-drives-for-your-home-media-server/&#34; &gt;Master the Basics - MergerFS&lt;/a&gt;&lt;/strong&gt; post. Together, they provide a cost-effective way to safeguard your data without the complexity of traditional RAID setups.&lt;/p&gt;
&lt;p&gt;SnapRAID is a parity-based backup system that protects against drive failures. Unlike traditional RAID, it doesn’t constantly write to all drives, making it ideal for media servers with mostly static data.&lt;/p&gt;
&lt;p&gt;In this post, I’ll walk you through how to install and use SnapRAID with MergerFS to build a robust and flexible home media server.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-is-snapraid-parity&#34;&gt;What is SnapRAID Parity?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;SnapRAID parity&lt;/strong&gt; is the backbone of SnapRAID&amp;rsquo;s data protection. It works by creating a special file containing &lt;strong&gt;mathematical information (parity data)&lt;/strong&gt; about the files on your data disks. This parity data allows SnapRAID to &lt;strong&gt;reconstruct lost files&lt;/strong&gt; if a drive fails.&lt;/p&gt;
&lt;p&gt;Think of parity as an insurance policy for your media collection. If one of your drives crashes, the parity file acts like a backup blueprint, enabling SnapRAID to rebuild the missing data using the remaining disks.&lt;/p&gt;
&lt;h3 id=&#34;how-snapraid-parity-works&#34;&gt;How SnapRAID Parity Works
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Parity Calculation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SnapRAID scans all data disks and calculates parity information based on their contents.&lt;/li&gt;
&lt;li&gt;This parity data is stored on a dedicated &lt;strong&gt;parity disk(s)&lt;/strong&gt;, separate from the data drives.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Parity Updates:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlike traditional RAID, SnapRAID &lt;strong&gt;does not&lt;/strong&gt; automatically update parity when you add, remove, or modify files.&lt;/li&gt;
&lt;li&gt;You need to run &lt;code&gt;snapraid sync&lt;/code&gt; to refresh the parity data. I’ll show you how to automate this with a cron job later.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Drive Recovery:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If a data disk fails, SnapRAID uses the &lt;strong&gt;remaining data drives + parity disk&lt;/strong&gt; to reconstruct the lost files.&lt;/li&gt;
&lt;li&gt;The more parity disks you have, the more failures you can recover from.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;why-is-snapraid-parity-important&#34;&gt;Why Is SnapRAID Parity Important?
&lt;/h3&gt;&lt;h4 id=&#34;protects-against-drive-failures&#34;&gt;Protects Against Drive Failures
&lt;/h4&gt;&lt;p&gt;The main reason to use SnapRAID is &lt;strong&gt;data redundancy&lt;/strong&gt;. Without parity, a drive failure means losing everything on that disk. SnapRAID parity lets you &lt;strong&gt;recover&lt;/strong&gt; the lost files, preventing catastrophic data loss.&lt;/p&gt;
&lt;h4 id=&#34;saves-space-compared-to-full-backups&#34;&gt;Saves Space Compared to Full Backups
&lt;/h4&gt;&lt;p&gt;Unlike traditional backups, SnapRAID parity only stores &lt;strong&gt;difference-based&lt;/strong&gt; data, taking up much less space than making full copies of your drives. One &lt;strong&gt;parity drive can protect multiple data drives&lt;/strong&gt;, making it a space-efficient solution.&lt;/p&gt;
&lt;h4 id=&#34;scales-with-your-storage-needs&#34;&gt;Scales with Your Storage Needs
&lt;/h4&gt;&lt;p&gt;SnapRAID allows you to mix and match different-sized disks—no need for matching drives like in traditional RAID. You can start with one parity drive and add more as your storage needs grow.&lt;/p&gt;
&lt;h4 id=&#34;allows-multiple-parity-drives-for-extra-protection&#34;&gt;Allows Multiple Parity Drives for Extra Protection
&lt;/h4&gt;&lt;p&gt;One parity drive protects against &lt;strong&gt;one&lt;/strong&gt; failed disk. For more security, you can add additional parity drives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 parity drive&lt;/strong&gt; → Recovers from &lt;strong&gt;1 failed disk&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2 parity drives&lt;/strong&gt; → Recovers from &lt;strong&gt;2 failed disks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3 parity drives&lt;/strong&gt; → Recovers from &lt;strong&gt;3 failed disks&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SnapRAID’s flexible and scalable parity system makes it a powerful choice for home media servers, keeping your data safe without wasting space.&lt;/p&gt;
&lt;p&gt;To add more parity drives, update your &lt;strong&gt;&lt;code&gt;/etc/snapraid.conf&lt;/code&gt;&lt;/strong&gt; file like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;parity /mnt/disk4/snapraid.parity
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;parity /mnt/disk5/snapraid.parity2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SnapRAID parity is &lt;strong&gt;crucial&lt;/strong&gt; for protecting your home media server from hard drive failures. By setting up at least &lt;strong&gt;one parity drive&lt;/strong&gt;, you ensure that your Movie, TV Shows, and Music collections are safe from unexpected data loss.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-is-snapraid-content&#34;&gt;What Is SnapRAID Content?
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;SnapRAID content file&lt;/strong&gt; (&lt;code&gt;snapraid.content&lt;/code&gt;) is a critical part of the SnapRAID system. It stores metadata about all your files, including checksums, timestamps, and information necessary for data recovery. Unlike the parity file, which is used to reconstruct lost data, the content file tells SnapRAID &lt;strong&gt;what your data looked like at the last sync&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Every time you run &lt;code&gt;snapraid sync&lt;/code&gt;, the content file is updated with new metadata. This allows SnapRAID to detect changes, check for corruption, and restore lost files when needed.&lt;/p&gt;
&lt;h3 id=&#34;why-is-it-important-to-have-snapraidcontent-on-multiple-drives&#34;&gt;Why Is It Important to Have &lt;code&gt;snapraid.content&lt;/code&gt; on Multiple Drives?
&lt;/h3&gt;&lt;h4 id=&#34;prevents-complete-data-loss-in-case-of-a-crash&#34;&gt;Prevents Complete Data Loss in Case of a Crash
&lt;/h4&gt;&lt;p&gt;The &lt;strong&gt;SnapRAID content file&lt;/strong&gt; (&lt;code&gt;snapraid.content&lt;/code&gt;) is a critical part of the SnapRAID system. It stores metadata about all your files, including checksums, timestamps, and information necessary for data recovery. Unlike the parity file, which is used to rebuild lost files, the content file tells SnapRAID &lt;strong&gt;what your data looked like at the last sync&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&#34;ensures-snapraid-can-rebuild-your-files&#34;&gt;Ensures SnapRAID Can Rebuild Your Files
&lt;/h4&gt;&lt;p&gt;If you were to only store &lt;code&gt;snapraid.content&lt;/code&gt; on &lt;code&gt;disk1&lt;/code&gt;, and &lt;code&gt;disk1&lt;/code&gt; fails. When you try to run SnapRAID recovery, it will fail because it no longer has a record of your data layout. However, if you also had a copy of &lt;code&gt;snapraid.content&lt;/code&gt; on &lt;code&gt;disk2&lt;/code&gt;, SnapRAID could still function and restore the missing data.&lt;/p&gt;
&lt;p&gt;SnapRAID is designed for &lt;strong&gt;data resilience&lt;/strong&gt;, and having multiple copies of the content file aligns with that philosophy. If a drive fails and you only have one copy, you risk losing access to your recovery information. Multiple content files make SnapRAID &lt;strong&gt;more fault-tolerant&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;how-to-store-snapraidcontent-on-multiple-drives&#34;&gt;How to Store &lt;code&gt;snapraid.content&lt;/code&gt; on Multiple Drives
&lt;/h3&gt;&lt;p&gt;In your &lt;strong&gt;&lt;code&gt;/etc/snapraid.conf&lt;/code&gt;&lt;/strong&gt; file, define multiple content locations:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content /mnt/disk1/snapraid.content
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content /mnt/disk2/snapraid.content
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content /mnt/disk3/snapraid.content
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each entry creates a duplicate of the content file on a different disk. SnapRAID will update &lt;strong&gt;all&lt;/strong&gt; content files during a sync, keeping them identical.&lt;/p&gt;
&lt;p&gt;By distributing the content file across &lt;strong&gt;two or more drives&lt;/strong&gt;, you protect your media collection from unexpected failures. This small step ensures that if disaster strikes, &lt;strong&gt;you’ll always have a path to recovery&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; You may use the same drives for &lt;code&gt;content&lt;/code&gt; and &lt;code&gt;data&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-is-snapraid-data&#34;&gt;&lt;strong&gt;What Is SnapRAID Data?&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;In SnapRAID, &lt;strong&gt;data&lt;/strong&gt; refers to the actual files stored on your media server—movies, TV shows, music, backups, and other content. These files are located on &lt;strong&gt;data drives&lt;/strong&gt;, which are physical hard drives or storage locations that SnapRAID protects using &lt;strong&gt;parity data&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Unlike traditional RAID, SnapRAID does &lt;strong&gt;not&lt;/strong&gt; mirror or stripe data across disks. Each file exists in &lt;strong&gt;only one location&lt;/strong&gt;, and SnapRAID keeps track of which files are on which drives.&lt;/p&gt;
&lt;h3 id=&#34;why-is-it-important-to-have-data-drives-identified-in&#34;&gt;&lt;strong&gt;Why Is It Important to Have Data Drives Identified in &lt;code&gt;snapraid.conf&lt;/code&gt;?&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id=&#34;snapraid-needs-to-know-where-your-files-are&#34;&gt;SnapRAID Needs to Know Where Your Files Are
&lt;/h4&gt;&lt;p&gt;SnapRAID relies on &lt;strong&gt;parity calculations&lt;/strong&gt; to recover lost files. If you don’t tell SnapRAID which drives contain data, it cannot protect them or restore your missing files.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;/etc/snapraid.conf&lt;/code&gt;, you must define each data drive explicitly, like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data d1 /mnt/disk1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data d2 /mnt/disk2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data d3 /mnt/disk3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each &lt;code&gt;data&lt;/code&gt; entry tells SnapRAID:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Which disks hold your files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which disks need to be included in parity calculations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Where to look when checking for data integrity&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;allows-snapraid-to-detect-changes-and-prevent-corruption&#34;&gt;Allows SnapRAID to Detect Changes and Prevent Corruption
&lt;/h4&gt;&lt;p&gt;SnapRAID doesn’t automatically track file changes, you need to &lt;strong&gt;run &lt;code&gt;snapraid sync&lt;/code&gt;&lt;/strong&gt; to update parity.&lt;/p&gt;
&lt;p&gt;By listing your data drives in &lt;code&gt;snapraid.conf&lt;/code&gt;, SnapRAID knows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which files were added, modified, or deleted&lt;/li&gt;
&lt;li&gt;When to update parity data&lt;/li&gt;
&lt;li&gt;How to detect &lt;strong&gt;bit rot&lt;/strong&gt; (silent file corruption)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without these entries, SnapRAID has no way of knowing which files exist and cannot protect them.&lt;/p&gt;
&lt;h4 id=&#34;ensures-proper-data-recovery-after-a-drive-failure&#34;&gt;Ensures Proper Data Recovery After a Drive Failure
&lt;/h4&gt;&lt;p&gt;If a drive dies, SnapRAID uses the parity data to &lt;strong&gt;reconstruct lost files&lt;/strong&gt;. However, this only works if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The missing drive was listed in &lt;code&gt;snapraid.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A valid &lt;strong&gt;parity file&lt;/strong&gt; exists&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;remaining data disks&lt;/strong&gt; are intact&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you forget to list a data drive in &lt;code&gt;snapraid.conf&lt;/code&gt;, SnapRAID won’t protect it. That means if the drive fails, your files are &lt;strong&gt;permanently lost&lt;/strong&gt; because they were never included in the parity calculations.&lt;/p&gt;
&lt;h4 id=&#34;enables-flexible-storage-expansion&#34;&gt;Enables Flexible Storage Expansion
&lt;/h4&gt;&lt;p&gt;One of SnapRAID’s strengths is &lt;strong&gt;drive flexibility&lt;/strong&gt;. You can add new data disks of &lt;strong&gt;any size&lt;/strong&gt; at any time. By mounting the new drive and adding it to &lt;code&gt;snapraid.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data d4 /mnt/disk4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After running &lt;code&gt;snapraid sync&lt;/code&gt;, the new disk will be included in parity protection.&lt;/p&gt;
&lt;p&gt;Unlike traditional RAID, you do not need to &lt;strong&gt;rebuild or reformat your entire array&lt;/strong&gt;. Just add drives as needed.&lt;/p&gt;
&lt;p&gt;Defining data drives in &lt;code&gt;snapraid.conf&lt;/code&gt; is &lt;strong&gt;critical&lt;/strong&gt; for SnapRAID to function correctly. Without these entries, SnapRAID will not know what to protect, cannot detect changes, and will not be able to restore lost files.&lt;/p&gt;
&lt;p&gt;If you care about keeping your media safe, &lt;strong&gt;make sure every data drive is listed in &lt;code&gt;snapraid.conf&lt;/code&gt;&lt;/strong&gt; and remember to run &lt;code&gt;snapraid sync&lt;/code&gt; regularly.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;installing-snapraid&#34;&gt;Installing SnapRAID
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re using &lt;strong&gt;Debian/Ubuntu&lt;/strong&gt;, installing MergerFS is simple. SnapRAID is available in the official package repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install snapraid -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To verify that SnapRAID is installed, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;snapraid status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command should return:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Self test...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;No configuration file found at &lt;span class=&#34;s1&#34;&gt;&amp;#39;/etc/snapraid.conf&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;configuring-snapraid&#34;&gt;Configuring SnapRAID
&lt;/h2&gt;&lt;h3 id=&#34;planning-your-snapraid-setup&#34;&gt;Planning Your SnapRAID Setup
&lt;/h3&gt;&lt;p&gt;Before configuring SnapRAID, you need to plan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How many data disks?&lt;/strong&gt; SnapRAID protects your data by storing parity on a separate drive, so you’ll need at least one data disk and one parity disk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How much parity?&lt;/strong&gt; One parity disk protects against one drive failure, two parity disks protect against two failures, and so on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Which drives hold parity and content?&lt;/strong&gt; The parity disk should have enough free space for the parity data, while your content should be spread across multiple data drives for better redundancy and organization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;creating-the-snapraid-configuration-file&#34;&gt;Creating the SnapRAID Configuration File
&lt;/h3&gt;&lt;p&gt;The main configuration file for SnapRAID is &lt;strong&gt;&lt;code&gt;/etc/snapraid.conf&lt;/code&gt;&lt;/strong&gt;. Open it in a text editor:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/snapraid.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A basic configuration for three data disks and one parity disk looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Parity file - stored on the largest disk or a dedicated parity drive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;parity /mnt/disk3/snapraid.parity  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Content files - store metadata; should be on multiple drives for redundancy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content /mnt/disk1/snapraid.content  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content /mnt/disk2/snapraid.content  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Data drives - these contain actual files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data d1 /mnt/disk1  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data d2 /mnt/disk2  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data d3 /mnt/disk3  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; You can see that both disk 1 and disk2 are use for &lt;code&gt;content&lt;/code&gt; and &lt;code&gt;data&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;key-points-to-consider&#34;&gt;Key Points to Consider
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Parity Drive&lt;/strong&gt;: Should be the largest or have enough space for parity data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Content Files&lt;/strong&gt;: Should be placed on multiple drives for redundancy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Drives&lt;/strong&gt;: List each drive that stores actual files.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;additional-snapraid-options&#34;&gt;Additional SnapRAID Options
&lt;/h3&gt;&lt;p&gt;For better protection and logging, add:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Define the block size used for parity calculations (default is 256K)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;block_size &lt;span class=&#34;m&#34;&gt;256&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Auto-save changes to the content file before syncing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;autosave &lt;span class=&#34;m&#34;&gt;300&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Enable scrub (data integrity check) with a limit on recovered errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scrub_percent &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scrub_recover &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save and exit the file (&lt;code&gt;CTRL + X&lt;/code&gt;, then &lt;code&gt;Y&lt;/code&gt;, then &lt;code&gt;Enter&lt;/code&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;running-snapraid-for-the-first-time&#34;&gt;Running SnapRAID for the First Time
&lt;/h2&gt;&lt;h3 id=&#34;step-1-perform-an-initial-sync&#34;&gt;Step 1: Perform an Initial Sync
&lt;/h3&gt;&lt;p&gt;The first time you run SnapRAID, you need to create the initial parity information. Run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo snapraid sync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This process can take a &lt;strong&gt;long time&lt;/strong&gt; (hours to days), depending on the size of your data. Once completed, SnapRAID will have recorded parity data, allowing you to recover files if a drive fails.&lt;/p&gt;
&lt;h3 id=&#34;step-2-verify-data-integrity&#34;&gt;Step 2: Verify Data Integrity
&lt;/h3&gt;&lt;p&gt;SnapRAID doesn’t automatically detect changes, so you need to check for issues periodically:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo snapraid check
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command compares stored parity data with the actual files to detect corruption.&lt;/p&gt;
&lt;h3 id=&#34;step-3-scrubbing-for-bit-rot&#34;&gt;Step 3: Scrubbing for Bit Rot
&lt;/h3&gt;&lt;p&gt;Over time, files can become corrupted due to &lt;strong&gt;bit rot&lt;/strong&gt;. SnapRAID can &lt;strong&gt;scrub&lt;/strong&gt; files to detect and correct errors. Run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo snapraid scrub -p &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-p 10&lt;/code&gt; limits scrubbing to 10% of files, reducing disk wear.&lt;/li&gt;
&lt;li&gt;Scrubbing should be run periodically to catch issues before they become serious.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;step-4-recovering-a-lost-drive&#34;&gt;Step 4: Recovering a Lost Drive
&lt;/h3&gt;&lt;p&gt;If a drive fails, &lt;strong&gt;don’t panic&lt;/strong&gt;! SnapRAID can restore its data. First, replace the failed drive with a new one and mount it in the same location. Then run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo snapraid fix
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SnapRAID will reconstruct the missing data using the parity drive.&lt;/p&gt;
&lt;h3 id=&#34;automating-snapraid-maintenance&#34;&gt;Automating SnapRAID Maintenance
&lt;/h3&gt;&lt;p&gt;To keep your system safe, schedule SnapRAID syncs and scrubs automatically. Open the &lt;strong&gt;crontab&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the following lines:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0 3 * * * /usr/bin/snapraid sync
0 4 * * * /usr/bin/snapraid scrub -p 10
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sync runs daily at 3 AM&lt;/strong&gt; to update parity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scrub runs at 4 AM&lt;/strong&gt; to check for silent corruption.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Save and exit (&lt;code&gt;CTRL + X&lt;/code&gt;, then &lt;code&gt;Y&lt;/code&gt;, then &lt;code&gt;Enter&lt;/code&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-mergerfs-and-snapraid-make-the-perfect-combo&#34;&gt;Why MergerFS and SnapRAID Make the Perfect Combo
&lt;/h2&gt;&lt;p&gt;By combining &lt;strong&gt;MergerFS and SnapRAID&lt;/strong&gt;, you get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simple storage management&lt;/strong&gt; – All your drives show up as one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible disk usage&lt;/strong&gt; – Mix and match drives of different sizes without hassle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data redundancy&lt;/strong&gt; – SnapRAID safeguards your data against disk failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Low resource usage&lt;/strong&gt; – No constant disk mirroring like traditional RAID.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This setup is &lt;strong&gt;perfect for media servers&lt;/strong&gt;, where most of the data is read-only. If a drive fails, you can easily restore it without losing everything.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;Setting up &lt;strong&gt;SnapRAID with MergerFS&lt;/strong&gt; is a game-changer for media storage. It keeps your files organized, accessible, and protected.&lt;/p&gt;
&lt;p&gt;Now that you know how to get it up and running, it’s time to &lt;strong&gt;safeguard your media collection!&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - MergerFS the Best Way to Combine Drives for Your Home Media Server</title>
        <link>https://diymediaserver.com/post/master-the-basics-mergerfs-the-best-way-to-combine-drives-for-your-home-media-server/</link>
        <pubDate>Sun, 02 Feb 2025 07:23:12 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-mergerfs-the-best-way-to-combine-drives-for-your-home-media-server/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-mergerfs-the-best-way-to-combine-drives-for-your-home-media-server/mergerfs2.webp" alt="Featured image of post Master the Basics - MergerFS the Best Way to Combine Drives for Your Home Media Server" /&gt;&lt;p&gt;What if You Could Combine Multiple Drives into One?
If you’re like me, you buy hard drives whenever you find the best price per terabyte. Over time, this leads to a mix of different-sized drives, making storage management a nightmare. Your media files end up scattered across multiple disks, and figuring out where everything is stored becomes a hassle. Wouldn’t it be great if all your drives worked together as one seamless storage pool? That’s exactly what MergerFS does.&lt;/p&gt;
&lt;p&gt;MergerFS is a game-changer for home media server users who want flexibility and simplicity. It lets you combine multiple drives into a single virtual drive without the complexity of RAID setups or the risk of losing all your data if a drive fails. The best part? It integrates perfectly with tools like Sonarr, Radarr, and Jellyfin.&lt;/p&gt;
&lt;p&gt;In this guide, I’ll explain how MergerFS works, walk you through the best configuration options, and show you how to install it on your media server. By the end, you’ll have a streamlined storage pool that maximizes your available space and keeps your files organized.&lt;/p&gt;
&lt;p&gt;Examples of how this can happen:&lt;/p&gt;
&lt;p&gt;When you find great deals on random drive sizes like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seagate BarraCuda 8TB Internal Hard Drive&lt;/li&gt;
&lt;li&gt;Western Digital 14TB Internal Hard Drive&lt;/li&gt;
&lt;li&gt;Toshiba N300 12TB Internal Hard Drive&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;what-is-mergerfs-and-why-do-you-need-it&#34;&gt;&lt;strong&gt;What is MergerFS and Why Do You Need It?&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;MergerFS is a &lt;strong&gt;union filesystem&lt;/strong&gt; for Linux that lets you combine multiple storage devices into a single mount point. Instead of managing separate drives, you get to access all your files from one unified location. Unlike traditional RAID setups, MergerFS is:&lt;/p&gt;
&lt;p&gt;✅ &lt;strong&gt;Flexible&lt;/strong&gt; – You can add or remove drives anytime without having to rebuild an array.&lt;br&gt;
✅ &lt;strong&gt;Safe&lt;/strong&gt; – If a drive fails, you don’t lose all your data (unlike RAID 0).&lt;br&gt;
✅ &lt;strong&gt;Simple&lt;/strong&gt; – Works with standard filesystems like ext4, XFS, and Btrfs.&lt;br&gt;
✅ &lt;strong&gt;Transparent&lt;/strong&gt; – You don’t need any special tools to access your data if you decide to remove a drive.&lt;/p&gt;
&lt;h3 id=&#34;how-it-works&#34;&gt;&lt;strong&gt;How It Works&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Think of MergerFS as a &lt;strong&gt;smart directory manager&lt;/strong&gt;. It doesn’t move your files around or create duplicates. Instead, it shows you a &lt;strong&gt;virtual filesystem&lt;/strong&gt; where all your drives appear as one.&lt;/p&gt;
&lt;p&gt;For example, if you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/mnt/disk1/Movies/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mnt/disk2/Movies/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mnt/disk3/Movies/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MergerFS lets you access everything under:&lt;br&gt;
&lt;code&gt;/mnt/storage/Movies/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, apps like &lt;strong&gt;Jellyfin or Sonarr&lt;/strong&gt; only need to look in &lt;strong&gt;one place&lt;/strong&gt;, and they don’t care where the actual files reside!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;how-to-install-mergerfs-on-your-linux-server&#34;&gt;&lt;strong&gt;How to Install MergerFS on Your Linux Server&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;MergerFS is available for most Linux distributions. Here’s how to install it on &lt;strong&gt;Debian-based systems (Ubuntu, Proxmox, etc.) and Arch Linux&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;install-on-ubuntudebian&#34;&gt;&lt;strong&gt;Install on Ubuntu/Debian&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;First, update your package list and install MergerFS:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install mergerfs -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;verify-installation&#34;&gt;&lt;strong&gt;Verify Installation&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Once installed, check the version to confirm it&amp;rsquo;s working:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mergerfs -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;best-mergerfs-configuration-for-a-home-media-server&#34;&gt;&lt;strong&gt;Best MergerFS Configuration for a Home Media Server&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Setting up MergerFS correctly ensures &lt;strong&gt;efficient file placement&lt;/strong&gt; and &lt;strong&gt;seamless operation&lt;/strong&gt; with media apps. Below is my recommended setup that balances performance and flexibility.&lt;/p&gt;
&lt;h3 id=&#34;step-1-mount-your-drives&#34;&gt;&lt;strong&gt;Step 1: Mount Your Drives&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Before configuring MergerFS, make sure your drives are mounted. You can list available drives using:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsblk -o NAME,FSTYPE,MOUNTPOINT,SIZE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example, if your drives are &lt;code&gt;/dev/sdb1&lt;/code&gt; and &lt;code&gt;/dev/sdc1&lt;/code&gt;, create mount points:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /mnt/disk1 /mnt/disk2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then mount them manually (replace &lt;code&gt;ext4&lt;/code&gt; with your actual filesystem type):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -t ext4 /dev/sdb1 /mnt/disk1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -t ext4 /dev/sdc1 /mnt/disk2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-2-create-a-mergerfs-pool&#34;&gt;&lt;strong&gt;Step 2: Create a MergerFS Pool&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Now, create a new directory for your MergerFS mount:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /mnt/storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then mount the drives using MergerFS:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mergerfs -o defaults,allow_other,use_ino,cache.files&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;off,dropcacheonclose&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;true,minfreespace&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;50G,category.create&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mfs /mnt/disk* /mnt/storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;understanding-the-options&#34;&gt;&lt;strong&gt;Understanding the Options&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Let’s break down the key options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;allow_other&lt;/code&gt; → Allows other users (like Jellyfin, Sonarr) to access the files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;use_ino&lt;/code&gt; → Helps avoid issues with file system operations.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cache.files=off&lt;/code&gt; → Prevents problems with cached files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dropcacheonclose=true&lt;/code&gt; → Ensures proper file updates.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category.create=mfs&lt;/code&gt; → Distributes new files across the drives evenly.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minfreespace=50G&lt;/code&gt; → Stop writing to the disk when there is less than 50GB of free space.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;step-3-make-the-mergerfs-mount-permanent&#34;&gt;&lt;strong&gt;Step 3: Make the MergerFS Mount Permanent&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Edit your &lt;code&gt;/etc/fstab&lt;/code&gt; file to ensure the pool mounts at boot:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add this line at the bottom (adjust paths as needed):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/mnt/disk* /media/Storage fuse.mergerfs direct_io,defaults,allow_other,noforget,dropcacheonclose=true,category.create=mfs,minfreespace=50G,fsname=storage 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Save and exit (&lt;code&gt;CTRL+X&lt;/code&gt;, then &lt;code&gt;Y&lt;/code&gt; and &lt;code&gt;ENTER&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Finally, reload the fstab configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;optimizing-mergerfs-for-media-servers&#34;&gt;&lt;strong&gt;Optimizing MergerFS for Media Servers&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Now that MergerFS is running, let’s optimize it for media handling.&lt;/p&gt;
&lt;h3 id=&#34;best&#34;&gt;&lt;strong&gt;Best &lt;code&gt;category.create&lt;/code&gt; Policy&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;category.create&lt;/code&gt; option determines &lt;strong&gt;where new files are placed&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mfs&lt;/code&gt; (Most Free Space)&lt;/strong&gt; → Best for evenly spreading files across drives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;epmfs&lt;/code&gt; (Existing Path, Most Free Space)&lt;/strong&gt; → Ideal if you want files grouped together.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;lus&lt;/code&gt; (Least Used Space)&lt;/strong&gt; → Can improve performance by filling up one drive at a time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For media servers, &lt;strong&gt;&lt;code&gt;mfs&lt;/code&gt;&lt;/strong&gt; is usually the best choice because it balances space usage.&lt;/p&gt;
&lt;h3 id=&#34;handling-deleted-files&#34;&gt;&lt;strong&gt;Handling Deleted Files&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;When you delete a file from a MergerFS pool, it &lt;strong&gt;only removes it from the original drive&lt;/strong&gt;. If a file appears to still exist, try refreshing the filesystem cache:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sync &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /proc/sys/vm/drop_caches
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;why-mergerfs-is-perfect-for-home-media-servers&#34;&gt;&lt;strong&gt;Why MergerFS is Perfect for Home Media Servers&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;MergerFS is &lt;strong&gt;the ideal solution&lt;/strong&gt; for combining multiple drives into a single storage pool. It’s flexible, easy to set up, and plays perfectly with apps like Jellyfin, Sonarr, and Radarr.&lt;/p&gt;
&lt;h3 id=&#34;key-benefits&#34;&gt;&lt;strong&gt;Key Benefits:&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;✅ &lt;strong&gt;Easy Setup&lt;/strong&gt; – No complicated RAID configurations.&lt;br&gt;
✅ &lt;strong&gt;No Data Loss Worries&lt;/strong&gt; – Each drive is independent, so no risk of losing everything if one fails.&lt;br&gt;
✅ &lt;strong&gt;Flexible Expansion&lt;/strong&gt; – Add or remove drives whenever you need.&lt;br&gt;
✅ &lt;strong&gt;Built for Media Servers&lt;/strong&gt; – Works seamlessly with Jellyfin, Proxmox, and Docker.&lt;/p&gt;
&lt;p&gt;If you’re tired of juggling individual disks, &lt;strong&gt;MergerFS is the solution&lt;/strong&gt;. Install it, set it up right, and enjoy a streamlined, organized media library.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Choosing the Right NAS Solution OpenMediaVault vs UNRAID vs TrueNAS Core vs TrueNAS Scale vs DIY</title>
        <link>https://diymediaserver.com/post/choosing-the-right-nas-solution-openmediavault-vs-unraid-vs-truenas-core-vs-truenas-scale-vs-diy/</link>
        <pubDate>Fri, 31 Jan 2025 07:24:52 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/choosing-the-right-nas-solution-openmediavault-vs-unraid-vs-truenas-core-vs-truenas-scale-vs-diy/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/choosing-the-right-nas-solution-openmediavault-vs-unraid-vs-truenas-core-vs-truenas-scale-vs-diy/softwarenas2.webp" alt="Featured image of post Choosing the Right NAS Solution OpenMediaVault vs UNRAID vs TrueNAS Core vs TrueNAS Scale vs DIY" /&gt;&lt;p&gt;Network Attached Storage (NAS) solutions are essential for home users, media enthusiasts, and businesses looking to store, manage, and protect data. With numerous software NAS options available, choosing the right one depends on various factors such as ease of use, expandability, redundancy, and budget.&lt;/p&gt;
&lt;p&gt;This article compares 5 of the most common software NAS solutions: OpenMediaVault, UNRAID, TrueNAS Core, TrueNAS Scale, and building your own custom NAS. I will be outlining the pros and cons of each to help you make an informed decision.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-openmediavault-omv&#34;&gt;1. OpenMediaVault (OMV)
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.openmediavault.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;b&gt;OpenMediaVault&lt;/b&gt;&lt;/a&gt; (OMV) is a Debian-based operating system that will transform standard hardware into a powerful and easy-to-manage NAS solution. It provides a web-based interface for managing storage, users, and network services, making it accessible even for those with limited technical expertise. OMV supports various file-sharing protocols, including SMB, NFS, and FTP, allowing seamless integration with multiple devices and operating systems. It also includes built-in monitoring tools, automated backup options, and RAID management, making it a solid choice for home users and small offices looking for reliable network storage.&lt;/p&gt;
&lt;p&gt;One of OMV’s greatest strengths is its extensibility. Users can enhance functionality by utilizing plugins, including Docker support for running containerized applications, rsync for automated backups, and various security enhancements. While it offers a straightforward setup, OMV is best suited for users who prefer a stable and controlled environment, as heavy customizations outside of its official updates can sometimes lead to stability issues.&lt;/p&gt;
&lt;h3 id=&#34;pros&#34;&gt;&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Free and Open Source&lt;/strong&gt; – No licensing fees.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Debian-based&lt;/strong&gt; – Supports additional Debian packages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easy to Use&lt;/strong&gt; – Web-based GUI for setup and management.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extensible&lt;/strong&gt; – Various plugins available to expand functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Supports Various File Systems&lt;/strong&gt; – Including EXT4, XFS, and Btrfs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker and Virtualization Support&lt;/strong&gt; – Can run containers for additional services.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons&#34;&gt;&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limited Enterprise Features&lt;/strong&gt; – Lacks some high-end features for business environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Customization&lt;/strong&gt; – Can cause stability issues, plugins can conflict with each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community Support&lt;/strong&gt; – Official support is limited to forums and community contributions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not as Polished as Other Solutions&lt;/strong&gt; – Interface and updates can occasionally cause issues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;notes&#34;&gt;Notes:
&lt;/h3&gt;&lt;p&gt;I used OpenMediaVault (OMV) for several years, but in my experience, it doesn’t handle customizations or updates outside of its official release very well. Once you start making modifications beyond its intended setup, its stability comes into question, making it frustrating to maintain and use.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-unraid&#34;&gt;2. UNRAID
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://unraid.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;b&gt;Unraid&lt;/b&gt;&lt;/a&gt; is a powerful operating system that combines NAS functionality, application hosting, and hardware virtualization into a single, flexible solution. It installs on a USB flash drive and runs in RAM, ensuring minimal system overhead while maintaining persistent configurations. With a modern Linux kernel and broad hardware compatibility, Unraid can operate on nearly any 64-bit x86 system, making it an excellent choice for home and enterprise users.&lt;/p&gt;
&lt;p&gt;Managing Unraid is simple through its intuitive web interface, offering easy setup with sensible defaults while allowing advanced customization. Its three core functions—network-attached storage, Docker-based application hosting, and virtual machine management—enable users to store, serve, and run various workloads efficiently. Whether you need a media server, a personal cloud, or a virtualization platform, Unraid provides the tools to maximize your hardware’s potential.&lt;/p&gt;
&lt;h3 id=&#34;pros-1&#34;&gt;&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flexible Storage Pooling&lt;/strong&gt; – Mix and match drives of different sizes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Parity Instead of RAID&lt;/strong&gt; – Allows easy drive replacement and expansion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker and Virtual Machine Support&lt;/strong&gt; – Excellent for running applications like Jellyfin, Sonarr, Radarr, or even VMs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intuitive Web Interface&lt;/strong&gt; – User-friendly and feature-rich.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Efficient Use of Storage&lt;/strong&gt; – Only requires one or two parity disks, maximizing usable storage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons-1&#34;&gt;&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Paid License&lt;/strong&gt; – Costs range from $49 to $109 depending on the number of drives.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subscription&lt;/strong&gt; – Need to pay an annual subscription or opt for the $249 Lifetime License&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limited Enterprise Features&lt;/strong&gt; – Primarily designed for home and media users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Single-Written Disk at a Time&lt;/strong&gt; – Slower write speeds compared to RAID arrays. However, This can be overcome by using a cache disk.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;notes-1&#34;&gt;Notes:
&lt;/h3&gt;&lt;p&gt;The cost of UNRAID has always been a major deterrent for me, preventing me from even considering it. When they recently switched to a subscription-based pricing model, it confirmed that UNRAID wasn’t the right fit for me. That said, many users love UNRAID and swear by its ease of use and flexibility.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re looking for a user-friendly NAS solution that seamlessly integrates Docker and virtual machine support, UNRAID is definitely worth exploring. They offer a 30-day free trial, so you can test its features and see if it meets your needs before committing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-truenas-core&#34;&gt;3. TrueNAS Core
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.truenas.com/truenas-core/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;b&gt;TrueNAS Core&lt;/b&gt;&lt;/a&gt; is a powerful, open-source NAS operating system built on FreeBSD and powered by the ZFS file system. Formerly known as FreeNAS, it is designed to provide high reliability, data integrity, and advanced storage management for home and enterprise users. ZFS ensures robust data protection with features like snapshots, checksums, and automatic self-healing, making TrueNAS Core one of the most secure NAS solutions. It supports a wide range of storage protocols, including SMB, NFS, iSCSI, and AFP, allowing seamless file sharing across different platforms.&lt;/p&gt;
&lt;p&gt;In addition to its strong storage capabilities, TrueNAS Core includes a web-based management interface that simplifies configuration while offering deep customization options for power users. It also supports plugins and jails, enabling users to run applications like Jellyfin, Sonarr, Radarr, and backup solutions directly on their NAS. While TrueNAS Core requires more hardware resources than some alternatives—especially ECC RAM for optimal ZFS performance—TrueNAS Core remains a top choice for those who prioritize the integrity of their data, enterprise-grade features, and long-term reliability in their NAS setup.&lt;/p&gt;
&lt;h3 id=&#34;pros-2&#34;&gt;&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ZFS File System&lt;/strong&gt; – Superior data integrity, snapshots, and compression.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enterprise-Grade Features&lt;/strong&gt; – Supports iSCSI, SMB, and NFS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web-Based Management&lt;/strong&gt; – Comprehensive interface for configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Free and Open Source&lt;/strong&gt; – No licensing costs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Virtualization Support&lt;/strong&gt; – Can run Virtual Machines and Jails.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons-2&#34;&gt;&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hardware Demanding&lt;/strong&gt; – Requires ECC RAM and more resources than other NAS solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ZFS Pools&lt;/strong&gt; - Make adding new drives slowly overtime inefficient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;BSD-Based&lt;/strong&gt; – Not as user-friendly as Linux-based solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt; – ZFS and FreeBSD require more technical knowledge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not as Flexible with Storage Expansion&lt;/strong&gt; – Traditional ZFS pools require planning.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;notes-2&#34;&gt;Notes:
&lt;/h3&gt;&lt;p&gt;If I could afford to purchase the majority of my storage upfront and had a system that supported ECC memory, TrueNAS Core or Scale would be an easy choice. However, buying six to eight large hard drives at once is not financially feasible. Even with an unlimited budget, I still don’t think I would choose TrueNAS Core over TrueNAS Scale. The added flexibility, Linux compatibility, and containerization support in Scale make it a more appealing choice for my needs.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-truenas-scale&#34;&gt;4. TrueNAS Scale
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.truenas.com/truenas-scale/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;b&gt;TrueNAS Scale&lt;/b&gt;&lt;/a&gt; is an open-source NAS operating system based on Debian Linux, designed to offer high scalability, containerization, and virtualization capabilities. Unlike its FreeBSD-based counterpart, TrueNAS Core, Scale is built for users who need a more flexible and modern approach to storage management. It retains the powerful ZFS file system, ensuring data integrity, snapshots, and self-healing while adding native support for Kubernetes, Docker, and virtual machines. This makes TrueNAS Scale an excellent choice for users who want a NAS solution that can double as an application server or a lightweight hypervisor.&lt;/p&gt;
&lt;p&gt;The web-based management interface provides an intuitive way to configure storage, networking, and applications, making it accessible to beginners and advanced users. With its Linux foundation, TrueNAS Scale supports a range of hardware and software integrations, allowing users to build highly adaptable storage solutions for home labs, media servers, or enterprise deployments. Whether you need a high-availability clustered storage system or a powerful yet easy-to-use NAS with cloud-native capabilities, TrueNAS Scale offers the flexibility to scale with your needs.&lt;/p&gt;
&lt;h3 id=&#34;pros-3&#34;&gt;&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linux-Based&lt;/strong&gt; – Offers better hardware and software compatibility for many users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ZFS Support&lt;/strong&gt; – Provides excellent data protection and redundancy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enterprise-Ready&lt;/strong&gt; – Ideal for business use with robust redundancy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Supports Kubernetes &amp;amp; Docker&lt;/strong&gt; – Excellent for running containers and microservices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt; – Designed for clustered storage and high availability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons-3&#34;&gt;&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Still Developing&lt;/strong&gt; – Some features are newer compared to TrueNAS Core.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hardware Demands&lt;/strong&gt; – Requires ECC RAM and strong CPU/memory resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ZFS Pools&lt;/strong&gt; - Make adding new drives slowly overtime inefficient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt; – More challenging for beginners to configure compared to OMV or UNRAID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not as Flexible for Storage Expansion&lt;/strong&gt; – ZFS limitations on adding drives to existing pools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;notes-3&#34;&gt;Notes:
&lt;/h3&gt;&lt;p&gt;Again, If I could afford to purchase the majority of my storage upfront and had a system that supported ECC memory, TrueNAS Core or Scale would be an easy choice. However, buying six to eight large hard drives at once is not financially feasible. I would pick TrueNAS Scale over Core because of the added flexibility, Linux compatibility, and containerization support make it a more appealing choice for my needs. But, the upfront cost keeps me away.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-build-your-own-nas-diy-solution&#34;&gt;5. Build Your Own NAS (DIY Solution)
&lt;/h2&gt;&lt;p&gt;Building your own NAS (DIY NAS) is the ultimate solution for users who want complete control over their hardware, software, and storage configuration. Unlike pre-built NAS operating systems like TrueNAS, Unraid, or OpenMediaVault, a DIY NAS allows you to choose your preferred operating system. Whether it is Ubuntu Server, Debian, Arch Linux, or a custom FreeBSD setup. This flexibility lets you optimize for performance, power efficiency, or specialized use cases such as media streaming, cloud backups, or enterprise-grade storage. With the ability to configure your own RAID arrays, file systems like MergerFS, ZFS, or Btrfs, and network protocols, a DIY NAS offers endless possibilities tailored to your specific needs.&lt;/p&gt;
&lt;p&gt;However, building a NAS from scratch comes with added complexity and requires a solid understanding of Linux, networking, and storage management. Unlike turnkey solutions with web-based management interfaces, a DIY NAS often relies on command-line tools and manual configuration. While this approach demands more effort, it provides unparalleled customization, cost savings, and the ability to repurpose existing hardware. Whether you need a simple home file server or a high-performance storage array for virtualization and containers, a DIY NAS empowers you to build a system that fits your exact requirements without the limitations of proprietary software.&lt;/p&gt;
&lt;h3 id=&#34;pros-4&#34;&gt;&lt;strong&gt;Pros:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Completely Customizable&lt;/strong&gt; – Choose any OS, hardware, and software setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No Licensing Fees&lt;/strong&gt; – Can be built entirely with free open-source software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maximum Control&lt;/strong&gt; – Can implement advanced RAID, MergerFS, ZFS, or Btrfs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Best for Power Users&lt;/strong&gt; – Ideal for those comfortable with Linux and storage systems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons-4&#34;&gt;&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Steeper Learning Curve&lt;/strong&gt; – Requires significant technical knowledge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No Web UI by Default&lt;/strong&gt; – Unless using software like Webmin, OpenMediaVault, or Cockpit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;More Maintenance&lt;/strong&gt; – Requires manual updates, security patches, and troubleshooting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No Official Support&lt;/strong&gt; – Rely on community forums and personal expertise.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;notes-4&#34;&gt;Notes:
&lt;/h3&gt;&lt;p&gt;You might have guessed that this is the option I chose for my media server NAS. In my setup, I didn’t see the need for redundancy in my media storage since my priority was maximizing capacity rather than mirroring data. Instead, I monitor my disks closely and replace them when I notice bad blocks. If I ever experience a catastrophic drive failure, it’s not a major issue. I can re-rip my missing movies or shows as needed.&lt;/p&gt;
&lt;p&gt;For critical data like family photos and important documents, I take a different approach. These files are backed up locally and in the cloud, ensuring they remain safe. This setup allows me to strike a balance between cost efficiency and data protection, prioritizing redundancy only where it truly matters.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;conclusion-which-nas-solution-is-best-for-you&#34;&gt;Conclusion: Which NAS Solution is Best for You?
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For Beginners &amp;amp; Home Users:&lt;/strong&gt; &lt;strong&gt;OpenMediaVault&lt;/strong&gt; or &lt;strong&gt;UNRAID&lt;/strong&gt; (for easy setup and flexibility).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For Media Enthusiasts &amp;amp; Virtualization:&lt;/strong&gt; &lt;strong&gt;UNRAID&lt;/strong&gt; (for Docker and VM support).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For Enterprise &amp;amp; Data Integrity:&lt;/strong&gt; &lt;strong&gt;TrueNAS Core&lt;/strong&gt; (ZFS, redundancy, and enterprise features).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For Advanced Users &amp;amp; Tinkerers:&lt;/strong&gt; &lt;strong&gt;DIY NAS&lt;/strong&gt; (for maximum control and customization).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For a Balance Between Features &amp;amp; Performance:&lt;/strong&gt; &lt;strong&gt;TrueNAS Scale&lt;/strong&gt; (best mix of flexibility and enterprise capabilities).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready to build the perfect NAS for your needs? Explore the options, assess your priorities, and choose the solution that best fits your storage, virtualization, and application requirements. Whether you prefer a turnkey system or a fully customized setup, there is a solution that can help you store, protect, and manage your data efficiently. Get started today and take control of your storage.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - The 10 Most Important Linux Commands and How to Use Them</title>
        <link>https://diymediaserver.com/post/master-the-basics-the-10-most-important-linux-commands-and-how-to-use-them/</link>
        <pubDate>Sun, 26 Jan 2025 07:34:05 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-the-10-most-important-linux-commands-and-how-to-use-them/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-the-10-most-important-linux-commands-and-how-to-use-them/linux_commands2.webp" alt="Featured image of post Master the Basics - The 10 Most Important Linux Commands and How to Use Them" /&gt;&lt;p&gt;If you’ve just installed Linux on your new server to host your locally stored media, you’re probably staring at a command prompt like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;john@mediaserver:~$&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A blinking cursor and no idea where to start—if you’re new to Linux, the terminal can feel like an intimidating black box. With cryptic commands, strange symbols, and endless possibilities, it’s easy to feel overwhelmed. But here’s the good news: mastering Linux isn’t about memorizing hundreds of commands. It’s about learning the essentials that give you the confidence to understand and control your system.&lt;/p&gt;
&lt;p&gt;Think of it like learning a new language. You don’t need to know every word in the dictionary to start speaking; you just need the most useful words and phrases. In the same way, a few key Linux commands will unlock the power to navigate, manage, and troubleshoot your system like a pro.&lt;/p&gt;
&lt;p&gt;In this post, we’ll break down 10 of the most important Linux commands—what they do, why they matter, and how to use them. By the end, you’ll have a solid foundation to tackle whatever the terminal throws at you. Let’s dive in.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-ls--list-directory-contents&#34;&gt;1. &lt;code&gt;ls&lt;/code&gt; – List Directory Contents
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;ls&lt;/code&gt; command is one of the first Linux commands every user should learn. It allows you to see the contents of a directory—essentially, it’s the Linux version of peeking inside a folder in a graphical file manager. Whether you’re looking for a specific file, checking for hidden files, or trying to understand the structure of your directories, &lt;code&gt;ls&lt;/code&gt; is your go-to tool.&lt;/p&gt;
&lt;p&gt;Here’s why it’s important:&lt;/p&gt;
&lt;h3 id=&#34;basic-usage&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;Typing &lt;code&gt;ls&lt;/code&gt; in the terminal will list the files and folders in your current working directory.&lt;/p&gt;
&lt;h3 id=&#34;useful-options&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ls -l&lt;/code&gt;&lt;/strong&gt;: Shows detailed information, such as file permissions, ownership, size, and last modification date.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ls -a&lt;/code&gt;&lt;/strong&gt;: Includes hidden files and directories (those starting with a dot, like &lt;code&gt;.config&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ls -h&lt;/code&gt;&lt;/strong&gt;: Outputs file sizes in a human-readable format (e.g., KB, MB, GB).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;practical-examples&#34;&gt;Practical Examples:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;View a directory’s structure:&lt;/strong&gt;&lt;br&gt;
If you’re organizing your media, you’ll often need to see what’s in a directory. For example, running &lt;code&gt;ls media/Movies&lt;/code&gt; shows all the files in your Movies folder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identify hidden files:&lt;/strong&gt;&lt;br&gt;
Hidden files often contain configuration settings. Use &lt;code&gt;ls -a&lt;/code&gt; to reveal them when troubleshooting or customizing software.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check file details:&lt;/strong&gt;&lt;br&gt;
When permissions or sizes matter (e.g., checking if a script is executable or whether a file is too large), &lt;code&gt;ls -lh&lt;/code&gt; provides all the details in one readable output.&lt;/p&gt;
&lt;h3 id=&#34;why-it-matters&#34;&gt;Why It Matters:
&lt;/h3&gt;&lt;p&gt;Knowing what’s in your directories is the first step to managing your Linux system effectively. The &lt;code&gt;ls&lt;/code&gt; command helps you understand your environment, locate files, and stay organized.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-cd--change-directory&#34;&gt;2. &lt;code&gt;cd&lt;/code&gt; – Change Directory
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;cd&lt;/code&gt; command is your key to navigating the Linux file system. It stands for &amp;ldquo;change directory,&amp;rdquo; as the name suggests, and it allows you to move between folders in your system. Think of it like double-clicking a folder in a graphical interface but using the power and speed of the command line.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-1&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;cd &amp;lt;directory&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Moves you into the specified directory.&lt;/p&gt;
&lt;p&gt;For example, if you want to move to the &amp;ldquo;Movies&amp;rdquo; folder in your media directory, you’d type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /media/Movies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;useful-shortcuts&#34;&gt;Useful Shortcuts:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Home Directory:&lt;/strong&gt; &lt;code&gt;cd&lt;/code&gt; by itself takes you back to your home directory, no matter where you are.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parent Directory:&lt;/strong&gt; &lt;code&gt;cd ..&lt;/code&gt; moves you one level up in the file hierarchy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Root Directory:&lt;/strong&gt; &lt;code&gt;cd /&lt;/code&gt; takes you to the root directory (the base of your file system).&lt;/p&gt;
&lt;h3 id=&#34;practical-examples-1&#34;&gt;Practical Examples:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Move into a specific directory:&lt;/strong&gt;&lt;br&gt;
To access your &lt;code&gt;media&lt;/code&gt; folder from any directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Navigate multiple levels at once:&lt;/strong&gt;&lt;br&gt;
To jump directly to a subdirectory without going step by step:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /media/Shows
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;To move up one level in the hierarchy:&lt;/strong&gt;
If you’re in &lt;code&gt;/media/Shows&lt;/code&gt; and want to go back to the &lt;code&gt;/media&lt;/code&gt; folder:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;why-it-matters-1&#34;&gt;Why It Matters:
&lt;/h3&gt;&lt;p&gt;Efficient navigation is crucial when working in the Linux terminal. The &lt;code&gt;cd&lt;/code&gt; command enables you to quickly reach the directory you need, whether you&amp;rsquo;re accessing files, running scripts, or modifying system configurations. Knowing how to use both relative and absolute paths ensures you can move around your system seamlessly.&lt;/p&gt;
&lt;h3 id=&#34;troubleshooting-tips&#34;&gt;Troubleshooting Tips:
&lt;/h3&gt;&lt;p&gt;If &lt;code&gt;cd&lt;/code&gt; doesn’t work, double-check the directory name. Linux file systems are &lt;strong&gt;case-sensitive&lt;/strong&gt;, so &amp;ldquo;media&amp;rdquo; and &amp;ldquo;Media&amp;rdquo; are treated as different folders.
Use the &lt;code&gt;ls&lt;/code&gt; command before &lt;code&gt;cd&lt;/code&gt; to ensure the directory exists and to see available options.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-pwd--print-working-directory&#34;&gt;3. &lt;code&gt;pwd&lt;/code&gt; – Print Working Directory
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;pwd&lt;/code&gt; command is one of the most essential Linux commands. It stands for &amp;ldquo;print working directory&amp;rdquo; and does exactly that: it tells you the full path of the directory you are currently in. This command is a constant companion when navigating the Linux file system, especially in environments with complex directory structures. Think of it as a map with a &amp;ldquo;You are here&amp;rdquo; arrow.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-2&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;Type &lt;code&gt;pwd&lt;/code&gt; in the terminal, and it will output the absolute path of your current working directory.&lt;/p&gt;
&lt;p&gt;For example, if you’re in your &lt;code&gt;Movies&lt;/code&gt; folder, running &lt;code&gt;pwd&lt;/code&gt; might return:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/media/Movies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;practical-use-cases&#34;&gt;Practical Use Cases:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Know Where You Are:&lt;/strong&gt;&lt;br&gt;
When working in nested directories or switching between multiple terminals, it’s easy to lose track of your location. &lt;code&gt;pwd&lt;/code&gt; gives you clarity, ensuring you know exactly where you are in the file system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Script Writing:&lt;/strong&gt;&lt;br&gt;
When writing scripts, you often need to confirm the current directory to set relative paths for your files. &lt;code&gt;pwd&lt;/code&gt; ensures you’re working in the correct location.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Debugging Navigation Issues:&lt;/strong&gt;&lt;br&gt;
If a file or command isn’t working as expected, &lt;code&gt;pwd&lt;/code&gt; can help verify whether you’re in the right directory to execute the task.&lt;/p&gt;
&lt;h3 id=&#34;why-its-important&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;While &lt;code&gt;pwd&lt;/code&gt; might seem like a small tool, its simplicity is its strength. Knowing your current working directory is fundamental to navigating and managing your Linux system effectively. It’s particularly useful when combined with other commands like &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;cd&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;example-workflow&#34;&gt;Example Workflow:
&lt;/h3&gt;&lt;p&gt;Here’s a quick scenario where &lt;code&gt;pwd&lt;/code&gt; proves its worth:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You log into a remote server via SSH and are unsure of your starting directory. Run &lt;code&gt;pwd&lt;/code&gt; to confirm your location.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After changing directories several times using &lt;code&gt;cd&lt;/code&gt;, run &lt;code&gt;pwd&lt;/code&gt; again to ensure you’re where you need to be before performing actions like copying or deleting files.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;tips-for-using-pwd&#34;&gt;Tips for Using &lt;code&gt;pwd&lt;/code&gt;:
&lt;/h3&gt;&lt;p&gt;Combine it with other commands in scripts to dynamically record or confirm the directory path. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;You are currently in &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use it to verify paths when creating symbolic links or setting environment variables.&lt;/p&gt;
&lt;p&gt;In Linux, knowing your current location in the file system is half the battle, and &lt;code&gt;pwd&lt;/code&gt; is the trusty compass that keeps you oriented. Whether you’re a beginner or an experienced user, this simple command is one you’ll use constantly.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-mkdir--make-directory&#34;&gt;4. &lt;code&gt;mkdir&lt;/code&gt; – Make Directory
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;mkdir&lt;/code&gt; command is your go-to tool for creating new directories (folders) in Linux. Whether you’re organizing media files or creating new locations for backups, &lt;code&gt;mkdir&lt;/code&gt; is simple, efficient, and essential for maintaining a tidy file system.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-3&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;The simplest form of the command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir &amp;lt;directory-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates a directory in your current location.&lt;/p&gt;
&lt;p&gt;For example, running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;creates a new folder named &amp;lsquo;media&amp;rsquo; in the directory you’re currently in.&lt;/p&gt;
&lt;h3 id=&#34;practical-use-cases-1&#34;&gt;Practical Use Cases:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Organizing Media:&lt;/strong&gt;&lt;br&gt;
When starting a new media storage structure, you can quickly create folders for Movies, Shows, and Music:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p /media/&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;Movies,Shows,Music&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates the &lt;code&gt;media&lt;/code&gt; folder (if it does not already exist), and the Movies, Shows, and Music subfolders inside it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setting Up Temporary Locations:&lt;/strong&gt;&lt;br&gt;
When testing or running scripts, you might need a dedicated folder for temporary files:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir temp_files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;useful-options-1&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-p&lt;/code&gt; (Parent):&lt;/strong&gt; Creates parent directories as needed, avoiding errors if parts of the path don’t already exist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-v&lt;/code&gt; (Verbose):&lt;/strong&gt; Outputs confirmation messages as directories are created, useful for understanding what’s happening in complex operations.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -pv /media/&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;Movies,Shows,Music&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Outputs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir: created directory &lt;span class=&#34;s1&#34;&gt;&amp;#39;media&amp;#39;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir: created directory &lt;span class=&#34;s1&#34;&gt;&amp;#39;media/Movies&amp;#39;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir: created directory &lt;span class=&#34;s1&#34;&gt;&amp;#39;media/Shows&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir: created directory &lt;span class=&#34;s1&#34;&gt;&amp;#39;media/Music&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;troubleshooting-tips-1&#34;&gt;Troubleshooting Tips:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If &lt;code&gt;mkdir&lt;/code&gt; gives you a &amp;ldquo;Permission denied&amp;rdquo; error, it means you don’t have the rights to create a folder in that location. Use &lt;code&gt;sudo mkdir&lt;/code&gt; to create directories in restricted areas, like system folders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Double-check the directory name for typos—Linux file systems are &lt;strong&gt;case-sensitive&lt;/strong&gt;, so &amp;ldquo;media&amp;rdquo; and &amp;ldquo;Media&amp;rdquo; are not the same.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;why-its-important-1&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;Creating directories is one of the most fundamental tasks in organizing and managing your Linux environment. Whether setting up a personal media server, deploying software, or scripting automated tasks, &lt;code&gt;mkdir&lt;/code&gt; is a tool you will rely on constantly. Its flexibility with options like &lt;code&gt;-p&lt;/code&gt; makes it invaluable for creating complex folder structures in seconds.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;mkdir&lt;/code&gt; command isn’t just about creating folders—it’s about bringing structure and order to your Linux system. With a bit of creativity and practice, it becomes a cornerstone of efficient file management.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-rm--remove-files-or-directories&#34;&gt;5. &lt;code&gt;rm&lt;/code&gt; – Remove Files or Directories
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;rm&lt;/code&gt; command is a powerful tool for deleting files and directories in Linux. It stands for &amp;ldquo;remove&amp;rdquo; and is essential for keeping your system clean by getting rid of unwanted files, temporary data, or old backups. However, with great power comes great responsibility—&lt;code&gt;rm&lt;/code&gt; can permanently delete data without confirmation, so it’s crucial to use it carefully.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-4&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;To remove a file:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm &amp;lt;file-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm old_document.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This deletes the &lt;code&gt;old_document.txt&lt;/code&gt; file from your current directory.&lt;/p&gt;
&lt;h3 id=&#34;deleting-multiple-files&#34;&gt;Deleting Multiple Files:
&lt;/h3&gt;&lt;p&gt;You can remove several files in one command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm file1.txt file2.txt file3.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;removing-directories&#34;&gt;Removing Directories:
&lt;/h3&gt;&lt;p&gt;By default, &lt;code&gt;rm&lt;/code&gt; only removes files. To delete directories, you’ll need to use specific options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;rm -r&lt;/code&gt; (Recursive):&lt;/strong&gt; Removes a directory and all its contents (files and subdirectories).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r folder_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;rm -rf&lt;/code&gt; (Recursive + Force):&lt;/strong&gt; Deletes everything in a directory without asking for confirmation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf /path/to/directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Be very careful with this command—it’s often referred to as the &amp;ldquo;nuclear option&amp;rdquo; because it can wipe out data irreversibly.&lt;/p&gt;
&lt;h3 id=&#34;practical-use-cases-2&#34;&gt;Practical Use Cases:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Delete Temporary Files:&lt;/strong&gt;&lt;br&gt;
Clean up temporary or cache files after troubleshooting or testing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r /tmp/my_temp_files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Delete Media You No Longer Want/Need:&lt;/strong&gt;&lt;br&gt;
Remove unneeded files to free up disk space:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r /media/Movie/Movie_I_No_Longer_Need
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;useful-options-2&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;-i (Interactive):&lt;/strong&gt; Asks for confirmation before deleting each file, reducing the risk of accidental deletion:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -i important_file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-v&lt;/code&gt; (Verbose):&lt;/strong&gt; Shows details of what’s being deleted:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rv /path/to/directory  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-f&lt;/code&gt; (Force):&lt;/strong&gt; Ignores warnings and deletes files or directories without asking for confirmation. Use with caution.&lt;/p&gt;
&lt;h3 id=&#34;safety-tips-for-using-rm&#34;&gt;Safety Tips for Using &lt;code&gt;rm&lt;/code&gt;:
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Double-Check Paths:&lt;/strong&gt; Before running &lt;code&gt;rm&lt;/code&gt;, confirm the path to avoid unintended deletions. If you are not careful, you can sometimes delete more than you intended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avoid &lt;code&gt;sudo&lt;/code&gt; Unless Necessary:&lt;/strong&gt; Running &lt;code&gt;rm&lt;/code&gt; as a superuser (&lt;code&gt;sudo&lt;/code&gt;) can delete system-critical files. Use it sparingly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simulate with &lt;code&gt;ls&lt;/code&gt;:&lt;/strong&gt; Use &lt;code&gt;ls&lt;/code&gt; to preview the files you’re about to delete:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /path/to/directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;why-its-important-2&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;rm&lt;/code&gt; command is a cornerstone of Linux file management. It ensures that your system doesn’t get cluttered with unnecessary files, helping you maintain an organized and efficient environment. However, because deletions are irreversible by default, understanding and respecting its power is crucial.&lt;/p&gt;
&lt;h3 id=&#34;example-workflow-1&#34;&gt;Example Workflow:
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Delete a Single File:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm Movie_I_Hate.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;Remove a Directory with Files:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r ~/Downloads/temp_folder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;strong&gt;Clean All &lt;code&gt;.tmp&lt;/code&gt; Files in a Directory:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm *.tmp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;6-cp--copy-files-and-directories&#34;&gt;6. &lt;code&gt;cp&lt;/code&gt; – Copy Files and Directories
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;cp&lt;/code&gt; command in Linux is used to copy files and directories from one location to another. It’s one of the most versatile and commonly used commands, whether you’re creating backups, duplicating files for edits, or moving content between directories. With a range of options to enhance its functionality, &lt;code&gt;cp&lt;/code&gt; is a powerful tool for efficient file management.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-5&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Copy a File:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp &amp;lt;source-file&amp;gt; &amp;lt;destination&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp config.conf backup_config.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This copies &lt;code&gt;config.conf&lt;/code&gt; to a new file named &lt;code&gt;backup_config.conf&lt;/code&gt; in the current directory.&lt;/p&gt;
&lt;h3 id=&#34;copying-multiple-files&#34;&gt;Copying Multiple Files:
&lt;/h3&gt;&lt;p&gt;To copy multiple files into a directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp file1.txt file2.txt /path/to/destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;copying-directories&#34;&gt;Copying Directories:
&lt;/h3&gt;&lt;p&gt;By default, &lt;code&gt;cp&lt;/code&gt; doesn’t copy directories unless you include the recursive &lt;code&gt;-r&lt;/code&gt; option:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Copy an Entire Directory:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp -r /source/directory /destination/directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates a duplicate of the directory and all its contents, including subdirectories and files.&lt;/p&gt;
&lt;h3 id=&#34;practical-use-cases-3&#34;&gt;Practical Use Cases:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Backup Files:&lt;/strong&gt;&lt;br&gt;
Before editing a critical file, create a backup:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp config.yaml config_backup.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Move Files to External Drives:&lt;/strong&gt;&lt;br&gt;
Copy files to another folder :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp /home/user/downloads/movie.mkv /media/Movies/Movie_Name/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;useful-options-3&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-i&lt;/code&gt; (Interactive):&lt;/strong&gt; Prompts for confirmation before overwriting existing files:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp -i file1.txt /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-v&lt;/code&gt; (Verbose):&lt;/strong&gt; Displays details of each file being copied, helpful for tracking large operations:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp -v file1.txt file2.txt /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-u&lt;/code&gt; (Update):&lt;/strong&gt; Copies files only if the source file is newer or doesn’t exist in the destination:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp -u file1.txt /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-p&lt;/code&gt; (Preserve):&lt;/strong&gt; Retains the original file’s metadata (timestamps, permissions, etc.):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp -p file1.txt /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tips-for-using-cp&#34;&gt;Tips for Using &lt;code&gt;cp&lt;/code&gt;:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Preview Before Copying:&lt;/strong&gt; Use the &lt;code&gt;ls&lt;/code&gt; command to check your source and destination paths before running &lt;code&gt;cp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avoid Overwriting:&lt;/strong&gt; Use the &lt;code&gt;-i&lt;/code&gt; option to prevent accidental overwriting of files. Alternatively, use &lt;code&gt;-n&lt;/code&gt; (no-clobber) to skip overwriting entirely.&lt;/p&gt;
&lt;h3 id=&#34;why-its-important-3&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;cp&lt;/code&gt; command is indispensable for anyone managing files in Linux. Its versatility allows you to copy everything from individual files to entire directory structures. Whether backing up critical data, reorganizing your file system, or preparing project templates, &lt;code&gt;cp&lt;/code&gt; ensures you can duplicate your work without error.&lt;/p&gt;
&lt;p&gt;Mastering the &lt;code&gt;cp&lt;/code&gt; command will add a vital tool to your Linux arsenal. One that keeps your files safe, organized, and easy to manage.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-mv--move-or-rename-files-and-directories&#34;&gt;7. &lt;code&gt;mv&lt;/code&gt; – Move or Rename Files and Directories
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;mv&lt;/code&gt; command in Linux is a dual-purpose powerhouse. It’s used to move files and directories from one location to another, but it also functions as a tool to rename them. This versatility makes &lt;code&gt;mv&lt;/code&gt; an essential command for file management, whether reorganizing directories, renaming files, or moving data to another location.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-6&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Move a File:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv &amp;lt;source-file&amp;gt; &amp;lt;destination&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv movie.mkv /media/Movies/Movie_Name/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This moves the file &lt;code&gt;movie.mkv&lt;/code&gt; to the &lt;code&gt;Movie_Name&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rename a File:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv &amp;lt;old-name&amp;gt; &amp;lt;new-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv Movie_Name.mkv Movie_Name_2022.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This renames the file &lt;code&gt;Movie_Name.mkv&lt;/code&gt; to &lt;code&gt;Movie_Name_2022.mkv&lt;/code&gt; in the current directory.&lt;/p&gt;
&lt;h3 id=&#34;moving-multiple-files&#34;&gt;Moving Multiple Files:
&lt;/h3&gt;&lt;p&gt;To move several files to a new directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv file1.txt file2.txt file3.txt /destination/directory/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;moving-directories&#34;&gt;Moving Directories:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Move an Entire Directory:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv /source/directory /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This moves the directory and its contents to the new location.&lt;/p&gt;
&lt;h3 id=&#34;useful-options-4&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-i&lt;/code&gt; (Interactive):&lt;/strong&gt; Prompts for confirmation before overwriting a file in the destination:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv -i file.txt /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-v&lt;/code&gt; (Verbose):&lt;/strong&gt; Displays the details of the files being moved or renamed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv -v file.txt /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-n&lt;/code&gt; (No-Clobber):&lt;/strong&gt; Prevents overwriting existing files in the destination:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv -n file.txt /destination/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tips-for-using-mv&#34;&gt;Tips for Using &lt;code&gt;mv&lt;/code&gt;:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Preview Before Moving:&lt;/strong&gt; Use &lt;code&gt;ls&lt;/code&gt; or &lt;code&gt;find&lt;/code&gt; to preview files before moving them to avoid mistakes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avoid Overwriting:&lt;/strong&gt; Use the &lt;code&gt;-i&lt;/code&gt; or &lt;code&gt;-n&lt;/code&gt; option to prevent accidental overwrites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be Careful with &lt;code&gt;sudo&lt;/code&gt;:&lt;/strong&gt; When moving system-critical files, running &lt;code&gt;mv&lt;/code&gt; with &lt;code&gt;sudo&lt;/code&gt; can have significant consequences if done incorrectly. Double-check your paths.&lt;/p&gt;
&lt;h3 id=&#34;why-its-important-4&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;mv&lt;/code&gt; command is indispensable for organizing your Linux system. Its ability to move and rename files in one step makes it a versatile and efficient tool. Whether you’re tidying up your home directory, reorganizing project files, or preparing data for a backup, &lt;code&gt;mv&lt;/code&gt; helps you manage your files quickly and effectively.&lt;/p&gt;
&lt;p&gt;By mastering &lt;code&gt;mv&lt;/code&gt;, you’ll gain the flexibility to manipulate files and directories seamlessly, making your Linux workflow smoother and more organized.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-chmod--change-file-permissions&#34;&gt;8. &lt;code&gt;chmod&lt;/code&gt; – Change File Permissions
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;chmod&lt;/code&gt; command is an essential tool for managing file and directory permissions in Linux. It allows you to control who can read, write, and execute files, ensuring your system is secure. And that users only have the access they need. By mastering &lt;code&gt;chmod&lt;/code&gt;, you safeguard sensitive files and enable proper collaboration across users.&lt;/p&gt;
&lt;h3 id=&#34;understanding-file-permissions&#34;&gt;Understanding File Permissions:
&lt;/h3&gt;&lt;p&gt;Before diving into &lt;code&gt;chmod&lt;/code&gt;, it’s important to understand the structure of Linux file permissions, which can be viewed using &lt;code&gt;ls -l&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr--  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; user group &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;23&lt;/span&gt; 10:00 script.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here’s what the fields mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;r&lt;/code&gt; (read):&lt;/strong&gt; Allows viewing the file’s contents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;w&lt;/code&gt; (write):&lt;/strong&gt; Allows modifying the file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x&lt;/code&gt; (execute):&lt;/strong&gt; Allows running the file as a program or script.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Permissions are grouped into three categories. In the above exaple this is how it breaks down:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Owner&lt;/strong&gt; (&lt;code&gt;rwx&lt;/code&gt;) - Full access to the file&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group&lt;/strong&gt; (&lt;code&gt;r-x&lt;/code&gt;) - Read and Execute for the members of the group&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Others&lt;/strong&gt; (&lt;code&gt;r--&lt;/code&gt;) - Everyone else can read the file&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;basic-usage-7&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Change Permissions Using Symbolic Notation:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &amp;lt;permissions&amp;gt; &amp;lt;file&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example, to give the owner execute permissions for a file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod u+x script.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here’s a breakdown of symbolic permissions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;u&lt;/code&gt; (user):&lt;/strong&gt; The file’s owner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;g&lt;/code&gt; (group):&lt;/strong&gt; Users in the file’s group.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;o&lt;/code&gt; (others):&lt;/strong&gt; All other users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;a&lt;/code&gt; (all):&lt;/strong&gt; Applies to &lt;code&gt;u&lt;/code&gt;, &lt;code&gt;g&lt;/code&gt;, and &lt;code&gt;o&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Modifiers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;+&lt;/code&gt; (add):&lt;/strong&gt; Adds a permission.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-&lt;/code&gt; (remove):&lt;/strong&gt; Removes a permission.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;=&lt;/code&gt; (set):&lt;/strong&gt; Sets a permission exactly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;Add read and write permissions for the group:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod g+rw file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remove execute permission for others:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod o-x script.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Change Permissions Using Octal Notation:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Octal values provide a shorthand for setting permissions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;4&lt;/code&gt; (read):&lt;/strong&gt; &lt;code&gt;r--&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;2&lt;/code&gt; (write):&lt;/strong&gt; &lt;code&gt;-w-&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;1&lt;/code&gt; (execute):&lt;/strong&gt; &lt;code&gt;--x&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combine these to set multiple permissions (e.g., &lt;code&gt;7 = rwx&lt;/code&gt;, &lt;code&gt;6 = rw-&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;To set permissions directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;755&lt;/span&gt; script.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This sets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Owner:&lt;/strong&gt; Read, write, execute (&lt;code&gt;7 = rwx&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group:&lt;/strong&gt; Read, execute (&lt;code&gt;5 = r-x&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Others:&lt;/strong&gt; Read, execute (&lt;code&gt;5 = r-x&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;practical-use-cases-4&#34;&gt;Practical Use Cases:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Make a Script Executable:&lt;/strong&gt;&lt;br&gt;
When creating a new script, you need to make it executable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod +x my_script.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Secure Sensitive Files:&lt;/strong&gt;&lt;br&gt;
Restrict access to a private file so only the owner can read or write it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; private_file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Allow Group Collaboration:&lt;/strong&gt;&lt;br&gt;
Grant a group read and write permissions to a shared file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod g+rw shared_file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;useful-options-5&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-R&lt;/code&gt; (Recursive):&lt;/strong&gt; Apply permissions to a directory and all its contents:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod -R &lt;span class=&#34;m&#34;&gt;755&lt;/span&gt; /path/to/directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;--reference&lt;/code&gt;:&lt;/strong&gt; Copy permissions from one file to another:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod --reference&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;source_file target_file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;example-workflow-2&#34;&gt;Example Workflow:
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check Current Permissions:&lt;/strong&gt;&lt;br&gt;
Use &lt;code&gt;ls -l&lt;/code&gt; to see the current permissions:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;Modify Permissions:&lt;/strong&gt;&lt;br&gt;
Grant read and write permissions to the owner and group, but deny all permissions to others:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;660&lt;/span&gt; file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;strong&gt;Make a Directory and Its Contents Accessible:&lt;/strong&gt;&lt;br&gt;
Ensure a web project directory is accessible to everyone:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod -R &lt;span class=&#34;m&#34;&gt;755&lt;/span&gt; /media/Movies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tips-for-using-chmod&#34;&gt;Tips for Using &lt;code&gt;chmod&lt;/code&gt;:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Test Before Automating:&lt;/strong&gt; Avoid running &lt;code&gt;chmod&lt;/code&gt; commands recursively without testing on a single file or directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avoid Over-Permissive Settings:&lt;/strong&gt; Always follow the principle of least privilege. Grant only necessary permissions. While setting permissions to &lt;code&gt;777&lt;/code&gt; might seem convenient, it can create serious security risks by giving everyone full access to your files. Instead, take the time to set appropriate permissions based on your needs. For example, I use &lt;code&gt;770&lt;/code&gt; permissions. This setup allows the owner and group full access to the files. While completely restricting access to others. With &lt;code&gt;770&lt;/code&gt;, not only is the content protected from unauthorized access, but it’s also hidden from users outside the group, enhancing both security and privacy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check Permissions Regularly:&lt;/strong&gt; Use &lt;code&gt;ls -l&lt;/code&gt; to ensure files have the correct permissions.&lt;/p&gt;
&lt;h3 id=&#34;why-its-important-5&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;File and directory permissions are at the heart of Linux security and system management. The &lt;code&gt;chmod&lt;/code&gt; command gives you precise control over access, allowing you to protect sensitive files, enable collaboration, and maintain proper functionality for applications and scripts.&lt;/p&gt;
&lt;p&gt;By mastering &lt;code&gt;chmod&lt;/code&gt;, you’ll be equipped to secure your system, manage user access, and ensure the smooth operation of your Linux environment. It’s not just a command—it’s a key to effective and secure system management.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-chown--change-file-ownership&#34;&gt;9. &lt;code&gt;chown&lt;/code&gt; – Change File Ownership
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;chown&lt;/code&gt; command in Linux allows you to change the ownership of files and directories. Ownership defines who can access, modify, or manage a file. Every file in Linux has two primary ownership attributes: the &lt;strong&gt;user&lt;/strong&gt; (owner) and the &lt;strong&gt;group&lt;/strong&gt;. By using &lt;code&gt;chown&lt;/code&gt;, you can assign files to the appropriate owner and group, which is especially critical for managing multi-user systems and ensuring security.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-8&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Change the Owner of a File:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown &amp;lt;new-owner&amp;gt; &amp;lt;file&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown kryptikwurm movie.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This sets the owner of &lt;code&gt;movie.mkv&lt;/code&gt; to the user &lt;code&gt;kryptikwurm&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Change Both Owner and Group:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown &amp;lt;new-owner&amp;gt;:&amp;lt;new-group&amp;gt; &amp;lt;file&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown kryptikwurm:media movie.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This changes the owner to &lt;code&gt;kryptikwurm&lt;/code&gt; and assigns the file to the &lt;code&gt;media&lt;/code&gt; group.&lt;/p&gt;
&lt;h3 id=&#34;changing-ownership-of-directories&#34;&gt;Changing Ownership of Directories:
&lt;/h3&gt;&lt;p&gt;To change the ownership of a directory and all its contents, use the &lt;code&gt;-R&lt;/code&gt; (recursive) option:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown -R kryptikwurm:media /media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This changes the ownership of &lt;code&gt;/media&lt;/code&gt; and everything inside it to user &lt;code&gt;kryptikwurm&lt;/code&gt; and group &lt;code&gt;media&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;useful-options-6&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-R&lt;/code&gt; (Recursive):&lt;/strong&gt; Apply ownership changes to directories and all their contents:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown -R kryptikwurm:media /media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-v&lt;/code&gt; (Verbose):&lt;/strong&gt; Displays information about what &lt;code&gt;chown&lt;/code&gt; is changing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown -v kryptikwurm:media movie.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;checking-file-ownership&#34;&gt;Checking File Ownership:
&lt;/h3&gt;&lt;p&gt;Use &lt;code&gt;ls -l&lt;/code&gt; to check ownership details of files and directories:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output shows the owner and group:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-r--r--  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; user group &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;23&lt;/span&gt; 12:00 file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, &lt;code&gt;user&lt;/code&gt; is the owner, and &lt;code&gt;group&lt;/code&gt; is the group.&lt;/p&gt;
&lt;h3 id=&#34;safety-tips-for-using-chown&#34;&gt;Safety Tips for Using &lt;code&gt;chown&lt;/code&gt;:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Be Careful with &lt;code&gt;sudo&lt;/code&gt;:&lt;/strong&gt; Always double-check the file or directory path when using &lt;code&gt;sudo&lt;/code&gt; with &lt;code&gt;chown&lt;/code&gt;, as incorrect paths can cause system-wide permission issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don’t Use Wildcards Recklessly:&lt;/strong&gt; Avoid commands like &lt;code&gt;chown -R user:group /*&lt;/code&gt; as they could affect critical system files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Preview Changes:&lt;/strong&gt; Use &lt;code&gt;ls -l&lt;/code&gt; to inspect file ownership before making changes.&lt;/p&gt;
&lt;h3 id=&#34;why-its-important-6&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;Proper ownership management is vital for system security and functionality. With &lt;code&gt;chown&lt;/code&gt;, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure only authorized users can access or modify files.&lt;/li&gt;
&lt;li&gt;Enable collaboration by assigning files to specific groups.&lt;/li&gt;
&lt;li&gt;Maintain system integrity by assigning correct ownership to configuration and system files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By mastering &lt;code&gt;chown&lt;/code&gt;, you’ll have the power to manage access and keep your Linux system secure and efficient. It’s an indispensable command for anyone managing multi-user environments or working on shared systems.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-df--display-disk-space-usage&#34;&gt;10. &lt;code&gt;df&lt;/code&gt; – Display Disk Space Usage
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;df&lt;/code&gt; command in Linux is used to display information about the available and used disk space on file systems. Short for &amp;ldquo;disk free,&amp;rdquo; &lt;code&gt;df&lt;/code&gt; provides a quick overview of your system’s storage capacity, helping you monitor and manage disk usage effectively. It’s an essential tool for system administrators and users who need to ensure there’s enough space for files, logs, and applications.&lt;/p&gt;
&lt;h3 id=&#34;basic-usage-9&#34;&gt;Basic Usage:
&lt;/h3&gt;&lt;p&gt;To display disk usage for all mounted file systems, simply type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Filesystem     1K-blocks     Used       Available  Use%   Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /dev/sda1       &lt;span class=&#34;m&#34;&gt;500000000&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;250000000&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;250000000&lt;/span&gt;   50%   /
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    tmpfs           &lt;span class=&#34;m&#34;&gt;4000000&lt;/span&gt;      &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;          &lt;span class=&#34;m&#34;&gt;4000000&lt;/span&gt;      0%   /dev/shm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;key-fields-in-the-output&#34;&gt;Key Fields in the Output:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Filesystem:&lt;/strong&gt; The name of the disk or storage device (e.g., &lt;code&gt;/dev/sda1&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1K-blocks:&lt;/strong&gt; Total storage space on the filesystem in 1KB blocks (default).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Used:&lt;/strong&gt; Disk space currently in use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Available:&lt;/strong&gt; Disk space available for use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use%:&lt;/strong&gt; The percentage of disk space in use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mounted on:&lt;/strong&gt; The directory where the filesystem is mounted.&lt;/p&gt;
&lt;h3 id=&#34;useful-options-7&#34;&gt;Useful Options:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-h&lt;/code&gt; (Human-Readable):&lt;/strong&gt; Display sizes in a more readable format (e.g., MB, GB):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Filesystem      Size  Used Avail Use% Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /dev/sda1       500G  250G  250G  50% /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;-T&lt;/code&gt; (Show Filesystem Type):&lt;/strong&gt; Include the type of filesystem (e.g., ext4, xfs):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    df -T
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Filesystem     Type     1K-blocks     Used       Available  Use%  Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /dev/sda1      ext4     &lt;span class=&#34;m&#34;&gt;500000000&lt;/span&gt;     &lt;span class=&#34;m&#34;&gt;250000000&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;250000000&lt;/span&gt;   50%  /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;practical-use-cases-5&#34;&gt;Practical Use Cases:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Monitor Disk Space on Servers:&lt;/strong&gt;&lt;br&gt;
Regularly check disk space usage to ensure critical services don’t fail due to lack of storage:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Identify Full or Nearly Full Filesystems:&lt;/strong&gt;&lt;br&gt;
Use the &lt;code&gt;Use%&lt;/code&gt; column to quickly spot filesystems nearing capacity, such as:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Filesystem      Size  Used Avail Use% Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /dev/sda1       500G  490G   10G  98% /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Check Mounted External Devices:&lt;/strong&gt;&lt;br&gt;
Verify the available space on USB drives, external hard drives, or network shares:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    df -h /media/usb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tips-for-using-df&#34;&gt;Tips for Using &lt;code&gt;df&lt;/code&gt;:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;-h&lt;/code&gt; for Human-Readable Output:&lt;/strong&gt; The default &lt;code&gt;df&lt;/code&gt; output can be hard to interpret; always use &lt;code&gt;-h&lt;/code&gt; unless you need raw block sizes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monitor Regularly:&lt;/strong&gt; Run &lt;code&gt;df&lt;/code&gt; periodically on servers or systems with limited storage to prevent unexpected failures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check Mounted Points:&lt;/strong&gt; Use &lt;code&gt;df&lt;/code&gt; to verify that external devices or network shares are mounted correctly.&lt;/p&gt;
&lt;h3 id=&#34;why-its-important-7&#34;&gt;Why It’s Important:
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;df&lt;/code&gt; command provides critical insights into your system’s disk space usage. With it, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Proactively manage storage to avoid full filesystems that could disrupt services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Diagnose performance issues caused by lack of space.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Monitor external devices and ensure sufficient capacity for backups or large data transfers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By mastering &lt;code&gt;df&lt;/code&gt;, you’ll be equipped to monitor and manage your system’s storage effectively, ensuring optimal performance and stability. It’s a simple yet powerful tool that every Linux user should have in their arsenal.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;in-conclusion&#34;&gt;In Conclusion:
&lt;/h2&gt;&lt;p&gt;Mastering Linux commands gives you the keys to fully control your system. From using &lt;code&gt;ls&lt;/code&gt; to navigate directories to &lt;code&gt;chmod&lt;/code&gt; for managing security, these commands empower you to interact with your Linux environment confidently and efficiently. By getting comfortable with these 10 essential commands, you’ll be able to manage files, troubleshoot issues, optimize performance, and keep your system secure—all from the terminal.&lt;/p&gt;
&lt;p&gt;Linux can seem intimidating at first, but with practice, these commands will become second nature. They’re more than just tools, they’re your gateway to unlocking the full potential of Linux and taking control of your system like a pro.&lt;/p&gt;
&lt;p&gt;Don’t just read about these commands—practice them! Open your terminal, try creating files, managing permissions, and searching for data. The best way to learn is by getting your hands dirty. And if you’re ready to push your skills even further, start experimenting with combining these commands to write scripts or automate tasks.&lt;/p&gt;
&lt;p&gt;Mastering Linux starts with the basics. So take that first step today. Your journey to becoming a Linux power user is just beginning.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Turn an Old Computer Into a Media Server Part 4 How to Configure Jellyfin</title>
        <link>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/</link>
        <pubDate>Mon, 20 Jan 2025 08:05:12 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/oldpc42.webp" alt="Featured image of post Turn an Old Computer Into a Media Server Part 4 How to Configure Jellyfin" /&gt;&lt;h2 id=&#34;introduction&#34;&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Awesome progress on transforming your old PC into a powerful home media server! You&amp;rsquo;ve already tackled some big steps—installing Ubuntu Server 24.04 LTS, setting up and configuring storage, getting those SMB shares ready for seamless file transfers, and even installing Jellyfin. Now it’s time to pull it all together by configuring Jellyfin and crafting your personalized streaming experience.&lt;/p&gt;
&lt;p&gt;In this post, we’ll go through everything you need to get Jellyfin up and running, from completing the setup wizard and adding your media libraries to customizing settings and testing playback. By the end, your media server will be fully operational, ready to stream movies, TV shows, music, and more to any device on your network.&lt;/p&gt;
&lt;p&gt;Ready to bring all your hard work together into a seamless streaming experience? Let’s dive in and configure Jellyfin!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;section-1-accessing-the-jellyfin-web-interface&#34;&gt;Section 1: Accessing the Jellyfin Web Interface
&lt;/h2&gt;&lt;h3 id=&#34;step-1-connect-to-jellyfin&#34;&gt;Step 1: Connect to Jellyfin
&lt;/h3&gt;&lt;p&gt;Open a web browser on a device connected to your network.&lt;/p&gt;
&lt;p&gt;Enter the server’s IP address followed by the port number &lt;code&gt;:8096&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Example:
&lt;code&gt;http://192.168.1.100:8096&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This will take you to the Jellyfin setup wizard. It should look like this:&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfinwelcome.jpg&#34;
    alt=&#34;Jellyfin Welcome Screen&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;If it is not working refer to this post: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/troubleshooting-jellyfin-server-access-issues/&#34; &gt;Troubleshooting - Jellyfin Server Access Issues&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;section-2-running-the-jellyfin-setup-wizard&#34;&gt;Section 2: Running the Jellyfin Setup Wizard
&lt;/h2&gt;&lt;h3 id=&#34;step-1-choose-your-language-and-region&#34;&gt;Step 1: Choose Your Language and Region
&lt;/h3&gt;&lt;p&gt;Select your preferred language.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_language.jpg&#34;
    alt=&#34;Jellyfin Language Screen&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;step-2-create-an-admin-account&#34;&gt;Step 2: Create an Admin Account
&lt;/h3&gt;&lt;p&gt;Creating a strong admin username and password for managing your Jellyfin server is essential for ensuring the security and integrity of your media server.&lt;/p&gt;
&lt;h4 id=&#34;tips-for-creating-a-strong-username-and-password&#34;&gt;Tips for Creating a Strong Username and Password
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Unique Credentials&lt;/strong&gt;: Avoid common usernames like “jellyfin” and passwords like “123456.”  Instead, use a unique username, and for the password use a combination of letters, numbers, and special characters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make It Long&lt;/strong&gt;: Passwords should be at least 12 characters long for maximum security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avoid Predictable Words&lt;/strong&gt;: Don’t use easily guessed information like your name, birthday, or server name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use a Password Manager&lt;/strong&gt;: If remembering complex passwords is challenging, a password manager can generate and store them securely for you.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_username.jpg&#34;
    alt=&#34;Jellyfin Username Screen&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;step-3-add-media-libraries&#34;&gt;Step 3: Add Media Libraries
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Click “Add Media Library.&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_libraries_setup.jpg&#34;
    alt=&#34;Jellyfin Library Setup Screen&#34;&gt;
&lt;/figure&gt;

&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Select the content type (Movies, TV Shows, Music, etc.).&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_libraries_type.jpg&#34;
    alt=&#34;Jellyfin Library Type Screen&#34;&gt;
&lt;/figure&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Click the &lt;code&gt;+&lt;/code&gt; next to &amp;ldquo;Folders&amp;rdquo; Browse to the folder where the media is stored (e.g., &lt;code&gt;/mnt/media/Movies&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_libraries_path.jpg&#34;
    alt=&#34;Jellyfin Library Path Screen&#34;&gt;
&lt;/figure&gt;

&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;The default setting are good to start with there is no need to change anything on this initial setup.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_libraries_movies.jpg&#34;
    alt=&#34;Jellyfin Library Options Screen&#34;&gt;
&lt;/figure&gt;

&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Repeat for &lt;code&gt;/mnt/media/Shows&lt;/code&gt; and &lt;code&gt;/mnt/media/Music&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;step-4-configure-metadata-options&#34;&gt;Step 4: Configure Metadata Options
&lt;/h3&gt;&lt;p&gt;Metadata enhances your media server experience by automatically adding details like cover art, plot summaries, cast lists, and ratings to your movies, TV shows, and music. This transforms your media library into a visually appealing and easy-to-navigate interface, making it feel like a professional streaming service.&lt;/p&gt;
&lt;p&gt;For now, accept the default settings.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_metadata.jpg&#34;
    alt=&#34;Jellyfin Metadata Screen&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;step-5-remote-access-optional&#34;&gt;Step 5: Remote Access (Optional)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Not recommended&lt;/strong&gt; but, To enable remote access, you need to configure your router to forward the Jellyfin server’s port (default is &lt;code&gt;8096&lt;/code&gt;) to the server’s internal IP address, allowing external devices to connect. For added security, consider using a VPN or enabling HTTPS with a valid SSL certificate to protect your data during remote access.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_remote.jpg&#34;
    alt=&#34;Jellyfin Remote Access Screen&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;step-6-finish-the-wizard&#34;&gt;Step 6: Finish the Wizard
&lt;/h3&gt;&lt;p&gt;Click “Finish,” and the server will start scanning media files to populate the libraries.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_done.jpg&#34;
    alt=&#34;Jellyfin Finished Screen&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;If everthing went well here your should now see the web interface with your media added.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/jellyfin_home.jpg&#34;
    alt=&#34;Jellyfin Home Screen&#34;&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id=&#34;section-3-testing-your-jellyfin-setup&#34;&gt;Section 3: Testing Your Jellyfin Setup
&lt;/h2&gt;&lt;h3 id=&#34;step-1-open-the-jellyfin-client&#34;&gt;Step 1: Open the Jellyfin Client
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To access your media from various devices the Jellyfin app or client needs to be installed on each device or you can access it from a web browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Note: Right now this is only accessible while connected to your &lt;strong&gt;Local&lt;/strong&gt; network&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jellyfin apps: Download and install apps for mobile devices, TVs, or streaming sticks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;step-2-test-playback&#34;&gt;Step 2: Test Playback
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Play a sample movie or TV show to confirm that your Jellyfin server is functioning correctly. You can do this directly from the Jellyfin home screen in your web browser. However, some browsers may encounter CODEC compatibility issues during playback. For the best results, I recommend you test your media within the official Jellyfin client app, which is optimized for a seamless streaming experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Client Apps can be downloaded from your app store or here: &lt;a class=&#34;link&#34; href=&#34;https://jellyfin.org/downloads/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jellyfin Client Downloads&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Congrats! You’ve got Jellyfin up and running with user accounts, metadata, and media libraries, all set up to deliver a seamless streaming experience. Your media server is ready to stream movies, TV shows, music, and more to any device on your network.&lt;/p&gt;
&lt;p&gt;But this is just the start! Jellyfin has a ton of features waiting to be explored—from customizing themes and adding plugins to enabling advanced settings like remote access. Take some time to fine-tune your server and see how you can make your media experience even better.&lt;/p&gt;
&lt;p&gt;Now, it’s time to kick back, grab some popcorn, and enjoy the payoff of all your hard work. Your home media server journey is just beginning.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 1 - Installing Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 2 - Storage and SMB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 3 - Installing Jellyfin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Troubleshooting - Jellyfin Server Access Issues</title>
        <link>https://diymediaserver.com/post/troubleshooting-jellyfin-server-access-issues/</link>
        <pubDate>Mon, 20 Jan 2025 07:44:15 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/troubleshooting-jellyfin-server-access-issues/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/troubleshooting-jellyfin-server-access-issues/jellyfin_troubleshoot2.webp" alt="Featured image of post Troubleshooting - Jellyfin Server Access Issues" /&gt;&lt;p&gt;Setting up a home media server with Jellyfin is exciting, until you hit a snag. One of the most common issues is not being able to access Jellyfin in your browser after entering the server’s IP address followed by &lt;code&gt;:8096&lt;/code&gt;. The good news? This is a common issue with straightforward solutions. Let’s walk through the steps to diagnose and resolve the problem.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-double-check-the-ip-address&#34;&gt;1. Double-Check the IP Address
&lt;/h3&gt;&lt;p&gt;The first step is making sure you’re entering the correct IP address for your server. An incorrect IP is a simple mistake but an easy fix.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To find the server’s IP, open a terminal on the server and run:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip a  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Look for the &lt;code&gt;inet&lt;/code&gt; address under your active network interface (like &lt;code&gt;eth0&lt;/code&gt; or &lt;code&gt;wlan0&lt;/code&gt;). It’ll look something like this: &lt;code&gt;192.168.1.100&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Double-check that you’re using this address in your browser.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-ensure-the-jellyfin-service-is-running&#34;&gt;2. Ensure the Jellyfin Service Is Running
&lt;/h3&gt;&lt;p&gt;If Jellyfin isn’t running, it won’t respond in your browser. Check the service status with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status jellyfin  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look for the line that says &lt;code&gt;Active: active (running)&lt;/code&gt;. If it isn’t running, start it manually:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start jellyfin  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To ensure Jellyfin starts automatically when your server boots, enable the service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; jellyfin  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;3-test-connectivity&#34;&gt;3. Test Connectivity
&lt;/h3&gt;&lt;p&gt;Next, confirm that your client device can reach the server. Open a terminal or command prompt on the client device and run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ping &amp;lt;server-ip&amp;gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;&amp;lt;server-ip&amp;gt;&lt;/code&gt; with your server’s address (e.g., &lt;code&gt;192.168.1.100&lt;/code&gt;). If you see replies, the connection between your devices is working.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-reboot-the-server&#34;&gt;4. Reboot the Server
&lt;/h3&gt;&lt;p&gt;Sometimes, a simple reboot can work wonders. Restarting clears temporary networking issues and restarts all services. Run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo reboot  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After the server reboots, try accessing Jellyfin again in your browser.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;5-check-browser-compatibility&#34;&gt;5. Check Browser Compatibility
&lt;/h3&gt;&lt;p&gt;Jellyfin’s web interface works best with modern browsers like Chrome, Firefox, or Edge. If you’re using an outdated or unsupported browser, try updating it or switching to one that works seamlessly with Jellyfin.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;when-all-else-fails-check-the-logs&#34;&gt;When All Else Fails: Check the Logs
&lt;/h3&gt;&lt;p&gt;If none of the above steps work, Jellyfin’s logs can be a treasure trove of information about what’s going wrong. To view the logs, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -u jellyfin  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look through the logs for any errors or warnings. These might indicate configuration issues, service failures, or other problems.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;By working through these steps one by one, you’ll likely pinpoint and fix the issue preventing you from accessing Jellyfin. A little troubleshooting can go a long way toward getting your home media server up and running.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Turn an Old Computer Into a Media Server Part 3 Installing Jellyfin and Its Dependencies</title>
        <link>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/</link>
        <pubDate>Sat, 18 Jan 2025 07:00:43 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/oldpc32.webp" alt="Featured image of post Turn an Old Computer Into a Media Server Part 3 Installing Jellyfin and Its Dependencies" /&gt;&lt;h3 id=&#34;recap-your-journey-so-far&#34;&gt;Recap: Your Journey So Far
&lt;/h3&gt;&lt;p&gt;In the previous posts, we breathed new life into your old, dusty PC by turning it into a powerful server running &lt;strong&gt;Ubuntu Server 24.04 LTS&lt;/strong&gt;. Along the way, we:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Explored why starting with an old PC is a smart choice&lt;/strong&gt;, it’s budget-friendly, eco-conscious, and perfect for beginners.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reviewed the minimum hardware requirements for running Jellyfin&lt;/strong&gt;, showing that you don’t need cutting-edge technology to build a media server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Provided step-by-step instructions for installing Ubuntu Server&lt;/strong&gt;, from creating a bootable USB drive to completing the installation process.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Added and configured storage for your media&lt;/strong&gt;, including partitioning and formatting new drives for optimal use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set up a Samba share&lt;/strong&gt;, which makes it easy to transfer files to your server from other devices on your network.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With your server prepped and ready, it’s time to bring it to life by installing &lt;strong&gt;Jellyfin&lt;/strong&gt;. In this next phase, we’ll guide you through setting up Jellyfin and its dependencies so you can begin building your very own media library. Let’s get started!&lt;/p&gt;
&lt;h3 id=&#34;what-is-jellyfin&#34;&gt;What Is Jellyfin?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Jellyfin&lt;/strong&gt; is a free, open-source media server that lets you organize, manage, and stream your media collection to any device, anywhere. Think of it as your personal Netflix, but completely under your control. Whether it’s movies, TV shows, music, or photos, Jellyfin allows you to build a centralized media hub that you can access from your phone, smart TV, computer, or even a web browser.&lt;/p&gt;
&lt;p&gt;This post will guide you step-by-step through:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preparing Your Ubuntu Server&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ensuring your server is fully updated for stability and security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installing essential tools like &lt;code&gt;curl&lt;/code&gt; for downloading and configuring software.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adding the Jellyfin Repository&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adding the official Jellyfin repository to your server so you can download the latest stable version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Explaining why repositories are important and how they keep your server software up to date.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Installing Jellyfin&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Using Ubuntu’s package manager (&lt;code&gt;apt&lt;/code&gt;) to install Jellyfin easily.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Starting and enabling the Jellyfin service so it runs automatically whenever your server starts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accessing Jellyfin for the First Time&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Verifying that Jellyfin is installed and running correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to find your server’s IP address and access Jellyfin’s web interface via a browser.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;section-1-preparing-your-server-for-jellyfin&#34;&gt;Section 1: Preparing Your Server for Jellyfin
&lt;/h2&gt;&lt;h3 id=&#34;ssh-into-your-new-server&#34;&gt;SSH Into Your New Server
&lt;/h3&gt;&lt;p&gt;Not sure how to use SSH? Refer to this post: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/&#34; &gt;Master the Basics - How to SSH Into a Linux Server&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;steps-to-connect-using-ssh&#34;&gt;Steps to Connect Using SSH
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open PowerShell on Windows&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The command for SSH:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Powershell&#34; data-lang=&#34;Powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;@&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;server-ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example From Part 1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-PowerShell&#34; data-lang=&#34;PowerShell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kryptikwurm&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;@172&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;27&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;strong&gt;Authenticate&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enter your server password when prompted. &lt;em&gt;(Don’t worry if you don’t see any characters while typing—that’s normal for security reasons.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Once logged in, you’ll have full access to your server remotely, ready to start installing Jellyfin!&lt;/p&gt;
&lt;h4 id=&#34;install-system-updates-and-curl&#34;&gt;Install System Updates and Curl
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Update the system:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;System updates are crucial because they ensure your server has the latest security patches, protecting it from vulnerabilities that could expose your data or compromise your setup. Additionally, updates improve system stability and performance, reducing the likelihood of crashes or compatibility issues with new software like Jellyfin.&lt;/p&gt;
&lt;p&gt;Commands to update the server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Install essential tools:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Curl&lt;/strong&gt; is a command-line tool to transfer data from or to a server, making it a popular choice for downloading files or interacting with APIs directly from the terminal. It&amp;rsquo;s lightweight, versatile, and supports many protocols like HTTP, HTTPS, and FTP, making it essential for tasks like adding repositories or fetching configuration files on Linux systems.&lt;/p&gt;
&lt;p&gt;Install Curl (Might already be installed, verify anyway):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install curl -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;section-2-adding-the-jellyfin-repository&#34;&gt;Section 2: Adding the Jellyfin Repository
&lt;/h2&gt;&lt;p&gt;Adding the Jellyfin repository to your server ensures you can download the &lt;strong&gt;latest stable version&lt;/strong&gt; of Jellyfin directly from its official source. This not only guarantees you up-to-date features and security fixes but also makes it easier to manage updates through Ubuntu’s package manager (&lt;code&gt;apt&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Command to add the repository (copy and paste each into the command prompt):&lt;/p&gt;
&lt;p&gt;The following command securely fetches and stores the GPG key needed to verify Jellyfin packages during installation or updates.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/jellyfin.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The following command creates a file in &lt;code&gt;/etc/apt/sources.list.d/&lt;/code&gt; to register the Jellyfin repository with Ubuntu, ensuring your system can download Jellyfin and future updates from the correct source.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb [signed-by=/usr/share/keyrings/jellyfin.gpg] https://repo.jellyfin.org/ubuntu noble main&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/jellyfin.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;sudo apt update&lt;/code&gt; doesn’t install or upgrade any software—it simply updates your system’s knowledge of available packages, ensuring you can install the latest versions. It’s a necessary step before running commands like &lt;code&gt;sudo apt install&lt;/code&gt; or &lt;code&gt;sudo apt upgrade&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If it was successful your should see this line:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repo.jellyfin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ubuntu&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;noble&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;InRelease&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;section-3-installing-jellyfin&#34;&gt;Section 3: Installing Jellyfin
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;apt&lt;/code&gt; package manager to install Jellyfin:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install jellyfin -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Enable the Jellyfin service so it starts at boot:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Start the Jellyfin service without rebooting:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Verify it is running:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;You should see output indicating the service is active and running. Look for a line like this:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Active&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;active&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;running&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;since&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/jellyfinservice.jpg&#34;
    alt=&#34;Jellyfin Service Image&#34;&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id=&#34;section-4-creating-groups-and-permissions&#34;&gt;Section 4: Creating Groups and Permissions
&lt;/h2&gt;&lt;p&gt;To allow Jellyfin to access your /mnt/media/ folder, we need to create a dedicated group, add the jellyfin user to it, and include your default user as well for convenience.&lt;/p&gt;
&lt;p&gt;To create the group:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo groupadd media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add users to the group:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -aG media jellyfin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -aG media &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;whoami&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change the group owner of the media folders:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R :media /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;section-5-accessing-jellyfin-for-the-first-time&#34;&gt;Section 5: Accessing Jellyfin for the First Time
&lt;/h2&gt;&lt;p&gt;With your server running and the IP address in hand, you can now access Jellyfin from a web browser:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open a Web Browser:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On your main computer, phone, or tablet connected to the same network as the server, open any modern browser like Chrome, Firefox, or Edge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enter the Address:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the address bar, type the following, replacing &lt;code&gt;&amp;lt;server-ip&amp;gt;&lt;/code&gt; with your server’s IP address:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;172.27.0.200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify the Jellyfin Interface Loads:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You should see the Jellyfin setup wizard screen, confirming the server is running and accessible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/jellyfinwelcome.jpg&#34;
    alt=&#34;Jellyfin Welcome Image&#34;&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What’s Next?
&lt;/h2&gt;&lt;p&gt;Once you’ve verified that Jellyfin is running and accessible, you’re ready to configure it! In the next post, we’ll walk through setting up Jellyfin, adding your media libraries, and customizing it for the best streaming experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to configure Jellyfin and start streaming? Head to Part 4 of this series to complete your setup!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 1 - Installing Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 2 - Storage and SMB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 4 - Installing Configure Jellyfin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Turn an Old Computer Into a Media Server Part 2 Adding a Storage Drive and Setting Up SMB Shares</title>
        <link>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/</link>
        <pubDate>Fri, 17 Jan 2025 07:41:16 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/oldpc22.webp" alt="Featured image of post Turn an Old Computer Into a Media Server Part 2 Adding a Storage Drive and Setting Up SMB Shares" /&gt;&lt;h3 id=&#34;recap-your-journey-so-far&#34;&gt;Recap: Your Journey So Far
&lt;/h3&gt;&lt;p&gt;In the previous post, we took your old, dusty computer and gave it a new purpose by turning it into a powerful server running &lt;strong&gt;Ubuntu Server 24.04 LTS&lt;/strong&gt;. We covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Why starting with an old PC is a smart move&lt;/strong&gt;—it’s cost-effective, beginner-friendly, and environmentally conscious.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The minimum hardware specs needed to run a Jellyfin server&lt;/strong&gt;, proving you don’t need the latest and greatest hardware to get started.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step-by-step instructions for installing Ubuntu Server&lt;/strong&gt;—from creating a bootable USB drive to completing the installation process.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With Ubuntu Server installed and ready to go, your old PC has been transformed into a dedicated server. Ready to take on its next task: hosting your own Jellyfin media library. Before we get to Jellyfin, the next step is to add storage drives and set up an SMB share. This will allow you to access your server’s media storage directly from a Windows or other Linux computer, which is essential for tasks like ripping Blu-rays and DVDs using software on a separate machine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;section-1-adding-storage-to-your-server&#34;&gt;Section 1: Adding Storage to Your Server
&lt;/h2&gt;&lt;h3 id=&#34;power-off-the-server-and-add-drives&#34;&gt;Power Off the Server and Add Drives
&lt;/h3&gt;&lt;h4 id=&#34;step-1-physically-connect-the-storage-drives-to-your-server&#34;&gt;Step 1: Physically Connect the Storage Drive(s) to Your Server
&lt;/h4&gt;&lt;p&gt;Power off command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo shutdown -h now
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For internal drives, install the drive into a free slot and connect it using SATA power and data cables.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For external drives, plug it into a USB port (powering off is not necessary).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power on the server to ensure the drive is recognized.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ssh-into-your-new-server&#34;&gt;SSH Into Your New Server
&lt;/h3&gt;&lt;p&gt;Not sure how to use SSH? Refer to this post: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/&#34; &gt;Master the Basics - How to SSH Into a Linux Server&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;steps-to-connect-using-ssh&#34;&gt;Steps to Connect Using SSH
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open PowerShell on Windows&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The command for SSH:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Powershell&#34; data-lang=&#34;Powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;@&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;server-ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example From Part 1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-PowerShell&#34; data-lang=&#34;PowerShell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kryptikwurm&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;@172&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;27&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;strong&gt;Authenticate&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enter your server password when prompted. &lt;em&gt;(Don’t worry if you don’t see any characters while typing—that’s normal for security reasons.)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;partition-and-format-the-new-drive&#34;&gt;Partition and Format the New Drive
&lt;/h3&gt;&lt;h4 id=&#34;step-2-check-if-the-drive-is-detected&#34;&gt;Step 2: Check if the Drive is Detected
&lt;/h4&gt;&lt;p&gt;Use the &lt;code&gt;lsblk&lt;/code&gt; command to list all block (storage) devices:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsblk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Identify the new drive (e.g., &lt;code&gt;/dev/sdb&lt;/code&gt; or &lt;code&gt;/dev/sdc&lt;/code&gt;) based on its size.&lt;/p&gt;
&lt;p&gt;Note the name of the device (e.g., &lt;code&gt;/dev/sdb&lt;/code&gt;), as you’ll use it in the next steps&lt;/p&gt;
&lt;p&gt;Details on how to partition and format a hard drive in Linux can be found here: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/master-the-basics-how-to-use-parted-to-create-partitions/&#34; &gt;Master the Basics - How to Use parted to Create Partitions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;step-3-creating-the-basic-folder-structure-of-your-media-library&#34;&gt;Step 3: Creating the Basic Folder Structure of Your Media Library
&lt;/h4&gt;&lt;p&gt;As explained in &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-proper-organization-helps-jellyfin-automatically-fetch-metadata-and-display-content-correctly/&#34; &gt;this post&lt;/a&gt;&lt;/strong&gt; your folder structure for Jellyfin should look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    mnt/media/
    ├── Movies/
    ├── Shows/
    └── Music/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To create these folders in the &lt;code&gt;/mnt/media&lt;/code&gt; use this command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /mnt/media/Movies /mnt/media/Shows /mnt/media/Music
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To verify this worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should look something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Music
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Shows
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The permissions of &lt;code&gt;root:root&lt;/code&gt; will not work let&amp;rsquo;s make sure your user has access to these folders.&lt;/p&gt;
&lt;p&gt;Change ownership of the folders:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R &amp;lt;username&amp;gt;:&amp;lt;username&amp;gt; /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown -R kryptikwurm:kryptikwurm /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To verify the ownership change worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should now look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; kryptikwurm kryptikwurm &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; kryptikwurm kryptikwurm &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Music
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; kryptikwurm kryptikwurm &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Shows
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now grant Read, Write, and Execute to this user:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod -R &lt;span class=&#34;m&#34;&gt;770&lt;/span&gt; /mnt/media/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To verify the permission change worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should now look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwx--- &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; kryptikwurm kryptikwurm &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwx--- &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; kryptikwurm kryptikwurm &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Music
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwx--- &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; kryptikwurm kryptikwurm &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; 13:47 Shows
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;section-2-setting-up-smb-samba-shares&#34;&gt;Section 2: Setting Up SMB (Samba) Shares
&lt;/h2&gt;&lt;h4 id=&#34;step-1-install-samba-and-nano&#34;&gt;Step 1: Install Samba and Nano
&lt;/h4&gt;&lt;p&gt;To share folders and files between your Linux server and other devices (including Windows systems), you will need Samba. Think of Samba as the bridge that connects different operating systems so they can easily exchange files.&lt;/p&gt;
&lt;p&gt;You will also need Nano, a simple and beginner-friendly text editor for Linux. It is perfect for quickly editing configuration files without fuss.&lt;/p&gt;
&lt;p&gt;To install both Samba and Nano in one step, run the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install samba nano -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command tells your server to download and install the required packages automatically. The &lt;code&gt;-y&lt;/code&gt; flag saves you a step by confirming the installation for you.&lt;/p&gt;
&lt;h4 id=&#34;step-2-configure-the-samba-share&#34;&gt;&lt;strong&gt;Step 2: Configure the Samba Share&lt;/strong&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Open the Samba configuration file for editing:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/samba/smb.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Add the following section at the end of the file to define the media share:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;[Media]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    browseable = yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    read only = no
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    guest ok = no
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    valid users = your-username&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save and exit Nano:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+O&lt;/code&gt; to save changes.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; to confirm.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+X&lt;/code&gt; to exit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I bet you are thinking ok but, what does this do? let&amp;rsquo;s break it down:&lt;/p&gt;
&lt;h4 id=&#34;media&#34;&gt;&lt;code&gt;[Media]&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;This is the name of the share. When accessing Samba from a client device, this will appear as the share&amp;rsquo;s name in the network. You can change it to something meaningful for your setup, like &lt;code&gt;[Movies]&lt;/code&gt; or &lt;code&gt;[Files]&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;path--mntmedia&#34;&gt;&lt;code&gt;path = /mnt/media&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;This specifies the directory on your server that will be shared. In this example, the folder &lt;code&gt;/mnt/media&lt;/code&gt; is being shared. Replace &lt;code&gt;/mnt/media&lt;/code&gt; with the actual path of the directory you want to share.&lt;/p&gt;
&lt;h4 id=&#34;browseable--yes&#34;&gt;&lt;code&gt;browseable = yes&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;Setting this to &lt;code&gt;yes&lt;/code&gt; allows the share to be visible when browsing the network. If set to &lt;code&gt;no&lt;/code&gt;, users would need to know the share&amp;rsquo;s name to access it manually.&lt;/p&gt;
&lt;h4 id=&#34;read-only--no&#34;&gt;&lt;code&gt;read only = no&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;This allows users to write (add, modify, or delete) files in the share. If set to &lt;code&gt;yes&lt;/code&gt;, the share would be read-only, preventing users from making changes.&lt;/p&gt;
&lt;h4 id=&#34;guest-ok--no&#34;&gt;&lt;code&gt;guest ok = no&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;This prevents unauthenticated users (guests) from accessing the share. Only users with valid credentials will be allowed access.&lt;/p&gt;
&lt;h4 id=&#34;valid-users--your-username&#34;&gt;&lt;code&gt;valid users = your-username&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;This restricts access to the share to the specified username. Replace &lt;code&gt;your-username&lt;/code&gt; with the actual username you set up on the Ubuntu server. This ensures only authorized users can access the share.&lt;/p&gt;
&lt;h4 id=&#34;step-3-create-a-samba-user&#34;&gt;Step 3: Create a Samba User
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Add your server user as a Samba user:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo smbpasswd -a your-username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Follow the prompts to create a password for the Samba user.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;step-4-restart-samba-service&#34;&gt;Step 4: Restart Samba Service
&lt;/h4&gt;&lt;p&gt;Restart the Samba service to apply the changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart smbd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;section-3-accessing-the-smb-share-from-another-device&#34;&gt;Section 3: Accessing the SMB Share from Another Device
&lt;/h3&gt;&lt;h4 id=&#34;on-windows&#34;&gt;On Windows
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Open File Explorer and type the server’s IP address in the address bar, prefixed with &lt;code&gt;\\&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;\\&lt;/span&gt;&amp;lt;server-ip&amp;gt;&lt;span class=&#34;se&#34;&gt;\&amp;lt;&lt;/span&gt;share-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example: &lt;code&gt;\\192.168.1.100\media&lt;/code&gt;&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/windows_smb.jpg&#34;
    alt=&#34;This PC Explorer&#34;&gt;
&lt;/figure&gt;

&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Enter your Samba username and password when prompted.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/windows_smb2.jpg&#34;
    alt=&#34;Windows Authenticate&#34;&gt;
&lt;/figure&gt;

&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;The shared folder should now be accessible, and you can drag and drop files into it.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/windows_smb3.jpg&#34;
    alt=&#34;The SMB shares within Windows&#34;&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;on-macos-or-linux&#34;&gt;On macOS or Linux
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open your file manager and choose “Connect to Server” (or a similar option).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter the SMB address:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;smb://&amp;lt;server-ip&amp;gt;/Media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example: &lt;code&gt;smb://192.168.1.100/Media&lt;/code&gt;.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Log in with your Samba username and password to access the share.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h3&gt;&lt;p&gt;Adding storage to your server and setting up SMB shares might seem daunting at first, but breaking it down step by step makes it totally manageable. By the end of this guide, you’ve learned how to add new drives, set up a structured media library, and share files across devices with Samba. Now, your home media server is well on its way to becoming the ultimate hub for all your digital content.&lt;/p&gt;
&lt;p&gt;Remember, this is just the beginning. Every new feature you add builds on what you’ve already accomplished. So, take a moment to celebrate—you’ve just leveled up your tech skills! Keep experimenting, keep learning, and don’t hesitate to reach out with questions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Now that your storage is ready and accessible, it’s time to bring your media server to life! Head to Part 3 of this series to install Jellyfin and start organizing your collection.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 1 - Installing Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 3 - Installing Jellyfin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 4 - Installing Configure Jellyfin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - How Proper Organization Helps Jellyfin Automatically Fetch Metadata and Display Content Correctly</title>
        <link>https://diymediaserver.com/post/how-proper-organization-helps-jellyfin-automatically-fetch-metadata-and-display-content-correctly/</link>
        <pubDate>Sun, 12 Jan 2025 09:47:56 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/how-proper-organization-helps-jellyfin-automatically-fetch-metadata-and-display-content-correctly/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-proper-organization-helps-jellyfin-automatically-fetch-metadata-and-display-content-correctly/featured.jpg" alt="Featured image of post Master the Basics - How Proper Organization Helps Jellyfin Automatically Fetch Metadata and Display Content Correctly" /&gt;&lt;h2 id=&#34;what-is-jellyfin-folder-structure-and-why-does-it-matter&#34;&gt;What Is Jellyfin Folder Structure and Why Does It Matter?
&lt;/h2&gt;&lt;p&gt;Jellyfin folder structure is the specific way you organize media files so Jellyfin can automatically fetch metadata, display posters, and group content correctly. Getting this wrong can cause blank posters, duplicate movies, and scattered TV episodes. Using the proper folder structure makes everything work automatically, no manual intervention needed.&lt;/p&gt;
&lt;p&gt;Remember: it&amp;rsquo;s almost never Jellyfin&amp;rsquo;s fault. It&amp;rsquo;s your folder structure and file naming.&lt;/p&gt;
&lt;p&gt;I know what you&amp;rsquo;re thinking, &amp;ldquo;But it worked fine in Kodi!&amp;rdquo; or &amp;ldquo;My folders make perfect sense to me!&amp;rdquo; I&amp;rsquo;ve been there too. When I migrated from Kodi to Jellyfin, I thought my organization was solid. It mostly was. But &amp;ldquo;mostly&amp;rdquo; meant duplicate movies, missing shows, and entire seasons that refused to group correctly. Once I fixed the structure and naming? Everything just worked.&lt;/p&gt;
&lt;p&gt;Jellyfin&amp;rsquo;s actually really good at automatically fetching posters, descriptions, cast info, and episode data from TMDB and TheTVDB. But it needs your help. It can&amp;rsquo;t read your mind. It reads your folder names and filenames, then matches them against online databases.&lt;/p&gt;
&lt;p&gt;This guide will show you exactly how to organize your media so Jellyfin&amp;rsquo;s metadata magic actually works.&lt;/p&gt;
&lt;h2 id=&#34;the-three-rules-that-break-everything&#34;&gt;The Three Rules That Break Everything
&lt;/h2&gt;&lt;p&gt;Before we dig in, there are about the three mistakes that cause 90% of metadata problems:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Missing release years on movies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Without the year, Jellyfin&amp;rsquo;s playing a guessing game. &amp;ldquo;The Thing&amp;rdquo; could be the 1982 classic or the 2011 prequel. Guess which one it picks? Usually the wrong one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Wrong season/episode format&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;S01E01&lt;/code&gt;, not &lt;code&gt;1x1&lt;/code&gt; or &lt;code&gt;Season 1 Episode 1&lt;/code&gt; or whatever creative variation you&amp;rsquo;ve got going on. Jellyfin expects a specific format, and anything else confuses it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Mixed content types in one library&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Movies and TV shows need separate libraries. Mix them, and you&amp;rsquo;ll get generic metadata, broken browsing, and a headache.&lt;/p&gt;
&lt;p&gt;Get these three right and most of your problems disappear.&lt;/p&gt;
&lt;h2 id=&#34;why-folder-organization-actually-matters-for-jellyfin&#34;&gt;Why Folder Organization Actually Matters for Jellyfin
&lt;/h2&gt;&lt;p&gt;I bet you have thousands of files that work fine in your file browser. So, why does Jellyfin care how they&amp;rsquo;re named?&lt;/p&gt;
&lt;p&gt;Because Jellyfin doesn&amp;rsquo;t know what your files are. It looks at folder names and filenames, then tries to match them against online metadata providers. When your media organization is correct, Jellyfin can automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Downloads posters and background art&lt;/li&gt;
&lt;li&gt;Groups TV episodes into seasons&lt;/li&gt;
&lt;li&gt;Sorts movies correctly&lt;/li&gt;
&lt;li&gt;Displays accurate titles, summaries, and cast info&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When it&amp;rsquo;s wrong? You get blank posters, duplicate movies, TV episodes listed as individual videos, and missing or mismatched metadata.&lt;/p&gt;
&lt;p&gt;That flat folder with 500 randomly-named movie files might work for you, but it&amp;rsquo;s a nightmare for automated metadata. And honestly, it&amp;rsquo;ll become a nightmare for you too once your library hits a few hundred items.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B0CM293XCL&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive: Why it fits this post: Large, reliable storage is essential for organizing and storing a well-structured media li…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;
Large, reliable storage is essential for organizing and storing a well-structured media library that Jellyfin can index and fetch metadata from accurately; however, this drive is best for single-drive or light-duty setups, not high-availability NAS arrays.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;start-with-the-right-top-level-folder-structure&#34;&gt;Start With the Right Top-Level Folder Structure
&lt;/h2&gt;&lt;p&gt;Before you worry about individual filenames, get your top-level structure right. Jellyfin works best when each media type lives in its own library.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here&amp;rsquo;s what I recommend:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/media
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── shows
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── music
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each of these folders should be added to Jellyfin as a &lt;strong&gt;separate library&lt;/strong&gt;, with the correct library type selected. Don&amp;rsquo;t mix movies and TV shows in the same library. I know it seems convenient, but it breaks everything. Mixed content gets generic metadata and kills browsing features.&lt;/p&gt;
&lt;h2 id=&#34;how-to-organize-jellyfin-library-movies&#34;&gt;How to Organize Jellyfin Library: Movies
&lt;/h2&gt;&lt;p&gt;Movies need &lt;strong&gt;one movie per folder&lt;/strong&gt;, with the movie name and release year clearly visible. That&amp;rsquo;s it. That&amp;rsquo;s the secret.&lt;/p&gt;
&lt;h3 id=&#34;the-correct-movie-folder-structure&#34;&gt;The Correct Movie Folder Structure
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/movies
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Inception (2010)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── Inception (2010).mkv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── Inception (2010).srt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── poster.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Critical rules:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One folder per movie&lt;/li&gt;
&lt;li&gt;Include the release year in parentheses&lt;/li&gt;
&lt;li&gt;Movie file name should match the folder name&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;why-years-actually-matter&#34;&gt;Why Years Actually Matter
&lt;/h3&gt;&lt;p&gt;Remember &amp;ldquo;The Thing&amp;rdquo; example? Without the year, Jellyfin picks one version, often the wrong one. &amp;ldquo;The Thing (1982)&amp;rdquo; eliminates the guesswork entirely. Same goes for &amp;ldquo;True Grit&amp;rdquo; (1969 vs 2010), &amp;ldquo;Halloween&amp;rdquo; (1978 vs 2018), and dozens of other remakes.&lt;/p&gt;
&lt;p&gt;Five seconds adding a year saves you ten minutes of manual metadata fixing later.&lt;/p&gt;
&lt;h3 id=&#34;extras-and-bonus-content&#34;&gt;Extras and Bonus Content
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;ve got deleted scenes or behind-the-scenes content, Jellyfin supports that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Inception (2010)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── Inception (2010).mkv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Extras
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── Behind the Scenes.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you open the movie in Jellyfin, you&amp;rsquo;ll see an Extras section. It&amp;rsquo;s pretty cool.&lt;/p&gt;
&lt;h3 id=&#34;what-about-deep-folder-structures&#34;&gt;What About Deep Folder Structures?
&lt;/h3&gt;&lt;p&gt;Some people organize like &lt;code&gt;/movies/Christopher Nolan/Inception/&lt;/code&gt;. It can work if everything&amp;rsquo;s named perfectly, but honestly? It adds complexity without much benefit. The &lt;a class=&#34;link&#34; href=&#34;https://jellyfin.org/docs/general/server/media/movies&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;official Jellyfin documentation&lt;/a&gt; recommends keeping movies directly under the movies root for reliability.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B00Q2Z11QE&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/define-r5-45deg.webp&#34; alt=&#34;Fractal Design Define R5: Why it fits this post: A quiet, flexible mid-tower case helps keep your homelab or media server tidy and organized, making it easie…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;Fractal Design Define R5&lt;/strong&gt;
A quiet, flexible mid-tower case helps keep your homelab or media server tidy and organized, making it easier to manage drives and maintain the folder/file structure recommended in the guide; however, it may be overkill for very small or prebuilt systems.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/42YZpnB&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445838038135512313043163&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-fractal-design-define-r5-atx-micro-atx-mid-tower%2fp%2fN82E16811352048&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;tv-show-folder-structure-for-jellyfin&#34;&gt;TV Show Folder Structure for Jellyfin
&lt;/h2&gt;&lt;p&gt;TV shows are where things get finicky. You need season folders and strict episode naming.&lt;/p&gt;
&lt;h3 id=&#34;the-correct-tv-show-structure&#34;&gt;The Correct TV Show Structure
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/shows
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Breaking Bad
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── Season 01
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   ├── Breaking Bad - S01E01.mkv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   └── Breaking Bad - S01E02.mkv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── Season 02
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        └── Breaking Bad - S02E01.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;episode-naming-rules&#34;&gt;Episode Naming Rules
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;SXXEYY&lt;/code&gt; format for episodes&lt;/li&gt;
&lt;li&gt;Always use leading zeros: &lt;code&gt;S01&lt;/code&gt;, not &lt;code&gt;S1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Episode numbers matter more than episode titles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can include episode titles if you want (&lt;code&gt;Breaking Bad - S01E01 - Pilot.mkv&lt;/code&gt;), but the &lt;code&gt;S01E01&lt;/code&gt; part is what Jellyfin actually cares about.&lt;/p&gt;
&lt;h3 id=&#34;multi-episode-files&#34;&gt;Multi-Episode Files
&lt;/h3&gt;&lt;p&gt;Got one file that contains multiple episodes? No problem:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Breaking Bad - S01E01-E02.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jellyfin understands this and will split the metadata correctly. You&amp;rsquo;ll see two episodes in the interface, both pointing to the same file.&lt;/p&gt;
&lt;h2 id=&#34;music-folder-organization&#34;&gt;Music Folder Organization
&lt;/h2&gt;&lt;p&gt;Music works differently. &lt;strong&gt;Embedded metadata matters more than filenames&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;recommended-music-structure&#34;&gt;Recommended Music Structure
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/music
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Daft Punk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── Random Access Memories
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── 01 - Give Life Back to Music.flac
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── 02 - The Game of Love.flac
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        └── 03 - Giorgio by Moroder.flac
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Artist and album folders help with browsing, but embedded tags (artist, album, track number) drive the metadata. If your music metadata is messy, use a tag editor like &lt;a class=&#34;link&#34; href=&#34;https://picard.musicbrainz.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MusicBrainz Picard&lt;/a&gt; before importing. Jellyfin can&amp;rsquo;t fix bad tags, it just displays them.&lt;/p&gt;
&lt;h2 id=&#34;adding-your-media-to-jellyfin-libraries&#34;&gt;Adding Your Media to Jellyfin Libraries
&lt;/h2&gt;&lt;p&gt;Alright, your folders are organized. Now let&amp;rsquo;s actually add them to Jellyfin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the Jellyfin dashboard&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Libraries&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Media Library&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select the correct type: Movies, TV Shows, or Music&lt;/li&gt;
&lt;li&gt;Add the matching folder path&lt;/li&gt;
&lt;li&gt;Enable metadata providers (TMDB for movies, TheTVDB for TV)&lt;/li&gt;
&lt;li&gt;Save and scan&lt;/li&gt;
&lt;/ol&gt;








  
  

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;span class=&#34;alert-icon&#34;&gt;⚠️&lt;/span&gt;
  &lt;div class=&#34;alert-content&#34;&gt;
    &lt;strong&gt;Warning:&lt;/strong&gt;
    Double-check that the library type matches the content. A movie library pointed at TV folders will never behave correctly. I&amp;rsquo;ve done this. It&amp;rsquo;s confusing as hell.
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;When the scan finishes, you should see posters appearing, episode counts looking right, and metadata filling in. If you see that, you&amp;rsquo;re golden.&lt;/p&gt;
&lt;h2 id=&#34;scan-verify-and-fix-early&#34;&gt;Scan, Verify, and Fix Early
&lt;/h2&gt;&lt;p&gt;After the first scan, don&amp;rsquo;t just assume everything worked. Spot-check a few movies and shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirm posters and summaries appear&lt;/li&gt;
&lt;li&gt;Look for duplicates or missing items&lt;/li&gt;
&lt;li&gt;Check that TV seasons are grouping correctly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I first migrated from Kodi, I assumed my structure was fine. The missing years and inconsistent episode naming caused duplicates and ignored seasons. Fixing filenames solved it way faster than any manual metadata edit would have.&lt;/p&gt;
&lt;p&gt;Catch problems early when you&amp;rsquo;ve got 50 items, not after you&amp;rsquo;ve imported 5,000.&lt;/p&gt;
&lt;h2 id=&#34;advanced-tools-and-automation&#34;&gt;Advanced Tools and Automation
&lt;/h2&gt;&lt;p&gt;For large libraries, manual renaming is painful. Tools like Filebot or Sonarr can automate proper naming using the same patterns I&amp;rsquo;ve shown here.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the thing: automation is powerful, but mistakes scale quickly. Always test changes on a small batch first. I once accidentally renamed 200 movies incorrectly because I didn&amp;rsquo;t check the pattern. Don&amp;rsquo;t be like me.&lt;/p&gt;
&lt;div class=&#34;product-box&#34; data-asin=&#34;B07YP9FBMM&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/nvidia-shield-tv-pro.jpg&#34; alt=&#34;NVIDIA SHIELD Pro: Why it fits this post: As a premium streaming client, it reliably displays organized Jellyfin libraries and supports advanced playback fea…&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/div&gt;

  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;div class=&#34;product-box-description&#34;&gt;
      &lt;strong&gt;NVIDIA SHIELD Pro&lt;/strong&gt;
&lt;strong&gt;Nice to have, not required.&lt;/strong&gt;
Why it fits this post: As a premium streaming client, it reliably displays organized Jellyfin libraries and supports advanced playback features, but it&amp;rsquo;s not required if you already have a capable streaming device.
    &lt;/div&gt;

  
    
    &lt;div class=&#34;product-meta-row&#34;&gt;
        &lt;div class=&#34;product-price&#34;&gt;
          &lt;strong&gt;Amazon Price:&lt;/strong&gt;
          &lt;span class=&#34;price-loading&#34;&gt;Loading...&lt;/span&gt;
          &lt;span class=&#34;price-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&#34;product-availability&#34;&gt;
          &lt;strong&gt;Availability:&lt;/strong&gt;
          &lt;span class=&#34;availability-loading&#34;&gt;Checking...&lt;/span&gt;
          &lt;span class=&#34;availability-value&#34; style=&#34;display:none;&#34;&gt;&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;

  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4gZhtU2&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458311262821776245415890&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-nvidia-shield-tv-pro-digital-media-streamer%2fp%2fN82E16815351017&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;

  &lt;div class=&#34;product-affiliate-disclaimer&#34;&gt;
    &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;troubleshooting-common-jellyfin-organization-issues&#34;&gt;Troubleshooting Common Jellyfin Organization Issues
&lt;/h2&gt;&lt;h3 id=&#34;jellyfin-shows-blank-posters&#34;&gt;Jellyfin Shows Blank Posters
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Check the folder and filename format&lt;/li&gt;
&lt;li&gt;Add the release year for movies&lt;/li&gt;
&lt;li&gt;Refresh metadata after fixing names (right-click the item, Refresh Metadata)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;movies-appear-twice&#34;&gt;Movies Appear Twice
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Same movie exists in multiple folders&lt;/li&gt;
&lt;li&gt;Different naming variations creating duplicate matches (like &amp;ldquo;Inception (2010)&amp;rdquo; and &amp;ldquo;Inception&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tv-episodes-not-grouped-into-seasons&#34;&gt;TV Episodes Not Grouped Into Seasons
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Episode names missing &lt;code&gt;SXXEYY&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;Season folders incorrectly named or missing&lt;/li&gt;
&lt;li&gt;Episodes placed at the show root instead of season folders&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This one drove me nuts for a week before I realized I had episodes sitting directly in the show folder instead of in Season folders.&lt;/p&gt;
&lt;h3 id=&#34;music-albums-mixed-or-incorrect&#34;&gt;Music Albums Mixed or Incorrect
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Embedded tags are wrong or missing&lt;/li&gt;
&lt;li&gt;Fix tags with a music tagger before rescanning&lt;/li&gt;
&lt;li&gt;Jellyfin can&amp;rsquo;t guess music metadata from filenames alone&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;library-scans-but-nothing-appears&#34;&gt;Library Scans but Nothing Appears
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Wrong library type selected (movies scanning TV content)&lt;/li&gt;
&lt;li&gt;Pointing to the wrong folder path&lt;/li&gt;
&lt;li&gt;File permissions preventing Jellyfin from accessing the files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check the Jellyfin logs if you&amp;rsquo;re stuck. They&amp;rsquo;ll usually tell you exactly what&amp;rsquo;s wrong.&lt;/p&gt;
&lt;h2 id=&#34;get-your-jellyfin-folder-structure-right-once&#34;&gt;Get Your Jellyfin Folder Structure Right Once
&lt;/h2&gt;&lt;p&gt;Proper Jellyfin folder structure is the foundation of a great Jellyfin experience. When your folders and filenames follow these patterns, metadata works automatically. Posters appear, seasons group correctly, and your library becomes something you actually enjoy browsing instead of something that makes you want to throw your server out a window.&lt;/p&gt;
&lt;p&gt;Take the time to organize Jellyfin library correctly once. It&amp;rsquo;ll save you countless hours of manual fixes later and make Jellyfin feel polished instead of frustrating.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re just starting out, organize first, then scan. Your future self will thank you. And if you&amp;rsquo;ve already got a messy library? Yeah, it&amp;rsquo;s painful to fix, but it&amp;rsquo;s worth it. I promise.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - How to Use Fdisk to Create Partitions Format Them and Add a Mount Point</title>
        <link>https://diymediaserver.com/post/master-the-basics-how-to-use-fdisk-to-create-partitions-format-them-and-add-a-mount-point-to-fstab/</link>
        <pubDate>Sun, 12 Jan 2025 08:34:30 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/master-the-basics-how-to-use-fdisk-to-create-partitions-format-them-and-add-a-mount-point-to-fstab/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/master-the-basics-how-to-use-fdisk-to-create-partitions-format-them-and-add-a-mount-point-to-fstab/fdisk_fstab2.webp" alt="Featured image of post Master the Basics - How to Use Fdisk to Create Partitions Format Them and Add a Mount Point" /&gt;&lt;p&gt;So, you bought that multi-terabyte hard drive and want to add it to your server, but you’re not quite sure where to start. Don’t worry—I’ve got you covered with an easy-to-follow guide.&lt;/p&gt;
&lt;p&gt;Setting up storage on Linux can be intimidating, especially when you’re dealing with tools like &lt;code&gt;fdisk&lt;/code&gt; and &lt;code&gt;fstab&lt;/code&gt;. But it’s not as complicated as it seems. By the end of this guide, you’ll know how to use &lt;code&gt;fdisk&lt;/code&gt; to create partitions, format them, and set them up to automatically mount at boot using &lt;code&gt;fstab&lt;/code&gt;. Let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-power-of-partitions-and-why-they-matter&#34;&gt;The Power of Partitions (and Why They Matter)
&lt;/h2&gt;&lt;p&gt;Think of your hard drive as a giant, empty filing cabinet. Without partitions, your system doesn’t know how to organize or access all that space. Partitions break your drive into smaller sections, each with a specific purpose—whether it’s for storing data, running programs, or setting up backups, partitions keep everything running smoothly.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;fdisk&lt;/code&gt;, you can easily create and manage these partitions. It’s a powerful tool that comes with almost every Linux distribution. In this guide, I’ll walk you through each step, whether you’re setting up a brand-new storage drive or reorganizing an existing one.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-by-step-guide-to-using-fdisk-formatting-partitions-and-configuring-fstab&#34;&gt;Step-by-Step Guide to Using &lt;code&gt;fdisk&lt;/code&gt;, Formatting Partitions, and Configuring &lt;code&gt;fstab&lt;/code&gt;
&lt;/h2&gt;&lt;h3 id=&#34;step-1-identify-the-target-disk&#34;&gt;Step 1: Identify the Target Disk
&lt;/h3&gt;&lt;p&gt;Before creating partitions, you need to identify which drive you’re working with. Use the &lt;code&gt;lsblk&lt;/code&gt; command to list all available disks and partitions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsblk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will display something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sda      8:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   500G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda1   8:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   1M    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda2   8:2    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   2G    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part /boot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─sda3   8:3    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   498G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part /
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sdb      8:16   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   12.7T &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, &lt;code&gt;sda&lt;/code&gt; is your main disk, and &lt;code&gt;sdb&lt;/code&gt; is an empty 14TB drive. For this tutorial, we’ll work with &lt;code&gt;sdb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Caution:&lt;/strong&gt; Double-check the disk name to avoid accidentally overwriting important data!&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;step-2-launch-fdisk&#34;&gt;Step 2: Launch &lt;code&gt;fdisk&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Run the following command to open &lt;code&gt;fdisk&lt;/code&gt; for your target disk:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo fdisk /dev/sdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You’ll see a prompt like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Command (m for help):
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Type &lt;code&gt;m&lt;/code&gt; to view the available commands.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;step-3-create-a-new-partition&#34;&gt;Step 3: Create a New Partition
&lt;/h3&gt;&lt;h4 id=&#34;1-delete-old-partitions-optional&#34;&gt;1. Delete Old Partitions (Optional)
&lt;/h4&gt;&lt;p&gt;If the disk has existing partitions you want to remove, type &lt;code&gt;d&lt;/code&gt; and follow the prompts to delete them.&lt;/p&gt;
&lt;h4 id=&#34;2-create-a-new-partition&#34;&gt;2. Create a New Partition
&lt;/h4&gt;&lt;p&gt;To create a new partition, type &lt;code&gt;n&lt;/code&gt; and press &lt;strong&gt;Enter&lt;/strong&gt;. &lt;code&gt;fdisk&lt;/code&gt; will ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Partition type:&lt;/strong&gt; Choose &lt;code&gt;p&lt;/code&gt; for primary or &lt;code&gt;e&lt;/code&gt; for extended (choose &lt;code&gt;p&lt;/code&gt; for most use cases).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Partition number:&lt;/strong&gt; Press &lt;strong&gt;Enter&lt;/strong&gt; to accept the default (usually 1).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;First sector:&lt;/strong&gt; Press &lt;strong&gt;Enter&lt;/strong&gt; to accept the default (start of the disk).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Last sector:&lt;/strong&gt; Press &lt;strong&gt;Enter&lt;/strong&gt; to use the entire disk or specify a size (e.g., &lt;code&gt;+100G&lt;/code&gt; for 100GB).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After completing this, you’ll see the new partition listed.&lt;/p&gt;
&lt;h4 id=&#34;3-write-changes-to-disk&#34;&gt;3. Write Changes to Disk
&lt;/h4&gt;&lt;p&gt;Type &lt;code&gt;w&lt;/code&gt; to save the changes and exit &lt;code&gt;fdisk&lt;/code&gt;. This writes the partition table to the disk.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;step-4-format-the-partition&#34;&gt;Step 4: Format the Partition
&lt;/h3&gt;&lt;p&gt;Now that you’ve created the partition, it’s time to format it with a filesystem. A common choice is &lt;code&gt;ext4&lt;/code&gt;. However, for a media server that hosts several large files, I recommend XFS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkfs.xfs /dev/sdb1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command formats the first partition (&lt;code&gt;/dev/sdb1&lt;/code&gt;) on the &lt;code&gt;sdb&lt;/code&gt; disk with the &lt;code&gt;XFS&lt;/code&gt; filesystem. Replace &lt;code&gt;xfs&lt;/code&gt; with your preferred filesystem (e.g., &lt;code&gt;ext4&lt;/code&gt; or &lt;code&gt;btrfs&lt;/code&gt;) if needed.&lt;/p&gt;
&lt;p&gt;Running &lt;code&gt;lsblk&lt;/code&gt; again should look simmalar to this if everything worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sda      8:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   500G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda1   8:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   1M    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda2   8:2    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   2G    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part /boot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─sda3   8:3    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   498G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part /
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sdb      8:16   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   12.7T &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─sda1   8:17   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   12.7T &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;step-5-create-a-mount-point&#34;&gt;Step 5: Create a Mount Point
&lt;/h3&gt;&lt;p&gt;A mount point is where your system will access the partition. For example, if you want to use it for storing media files, you might create a directory like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;-p&lt;/code&gt; flag ensures the command creates the directory, even if parent directories don’t exist.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;step-6-mount-the-partition-temporary-test&#34;&gt;Step 6: Mount the Partition (Temporary Test)
&lt;/h3&gt;&lt;p&gt;Before configuring &lt;code&gt;fstab&lt;/code&gt;, test mounting the partition:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount /dev/sdb1 /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify the mount by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see &lt;code&gt;/dev/sdb1&lt;/code&gt; listed with &lt;code&gt;/mnt/media&lt;/code&gt; as its mount point.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;step-7-add-the-partition-to-fstab&#34;&gt;Step 7: Add the Partition to &lt;code&gt;fstab&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;To ensure the partition mounts automatically at boot, add it to the &lt;code&gt;/etc/fstab&lt;/code&gt; file. Start by retrieving the partition’s UUID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo blkid /dev/sdb1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You’ll see output like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/dev/sdb1: UUID=&amp;#34;1234-5678-90AB-CDEF&amp;#34; TYPE=&amp;#34;xfs&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copy the UUID and open the &lt;code&gt;fstab&lt;/code&gt; file for editing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the following line at the end of the file:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;UUID=1234-5678-90AB-CDEF /mnt/media xfs defaults 0 2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here’s what the options mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UUID=1234-5678-90AB-CDEF&lt;/strong&gt;: Unique identifier for the partition.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/mnt/media&lt;/strong&gt;: Mount point.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;xfs&lt;/strong&gt;: Filesystem type.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;defaults&lt;/strong&gt;: Standard mount options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;0 2&lt;/strong&gt;: Dump and fsck options (usually safe to leave as-is).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Save the file and exit.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;step-8-test-the-fstab-configuration&#34;&gt;Step 8: Test the &lt;code&gt;fstab&lt;/code&gt; Configuration
&lt;/h3&gt;&lt;p&gt;To verify your changes, unmount the partition and remount all entries in &lt;code&gt;fstab&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo umount /mnt/media
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If no errors appear, your configuration is correct.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Wrapping It All Up
Congrats! You’ve successfully created a partition, formatted it, and set it up to mount automatically using fstab. Whether you’re adding a new drive to your home media server or managing existing storage, these steps will be your go-to guide.&lt;/p&gt;
&lt;p&gt;Just remember—mistakes happen. Always double-check your disk names and back up important data before making any changes. With a bit of practice, managing partitions and mount points will become second nature.&lt;/p&gt;
&lt;p&gt;Ready to level up? Put these skills to use by setting up dedicated partitions for media storage, backups, or even Docker containers. The possibilities are endless.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Master the Basics - How to SSH Into a Linux Server</title>
        <link>https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/</link>
        <pubDate>Sun, 12 Jan 2025 07:33:02 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/SSH2.webp" alt="Featured image of post Master the Basics - How to SSH Into a Linux Server" /&gt;&lt;p&gt;Do you need to keep a monitor and keyboard connected to your server? Nope. SSH lets you access your server’s command prompt directly from your Windows, Mac, or Linux computer. You’ve probably heard about SSH in tech forums or tutorials—it&amp;rsquo;s a powerful tool that allows you to control your server from anywhere on your local network.&lt;/p&gt;
&lt;p&gt;But before we dive in, there’s one crucial rule to remember: &lt;strong&gt;Do not expose your SSH connection to the internet&lt;/strong&gt; unless you’re absolutely sure of what you’re doing and have a solid reason for it.&lt;/p&gt;
&lt;p&gt;So, what exactly is SSH, and how can you use it? Let’s break it down step by step.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-is-ssh-and-why-should-you-care&#34;&gt;What Is SSH, and Why Should You Care?
&lt;/h2&gt;&lt;p&gt;SSH stands for &lt;strong&gt;Secure Shell&lt;/strong&gt;, a protocol that allows you to securely access and manage a server over a network. Imagine being able to control your server from your laptop while sitting on the couch—no monitor or keyboard required. That’s the power of SSH.&lt;/p&gt;
&lt;p&gt;With SSH, you can run commands, transfer files, and troubleshoot issues without ever touching your server physically. It’s a game-changer when setting up a media server or managing other home-based projects.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-you-shouldnt-expose-ssh-to-the-internet&#34;&gt;Why You Shouldn’t Expose SSH to the Internet
&lt;/h2&gt;&lt;p&gt;Before we get into the details, let’s talk about a crucial security concern. Exposing your SSH server to the internet can be risky. Bots and hackers are constantly scanning for open SSH ports. If they find yours, they’ll try to brute-force their way in by guessing your username and password.&lt;/p&gt;
&lt;p&gt;Here’s why it’s safer to keep SSH local:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reduced Risk&lt;/strong&gt;: When SSH is only accessible on your local network, only devices connected to your home network can attempt to access the server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Peace of Mind&lt;/strong&gt;: You won’t have to worry about configuring firewalls or securing your server against online threats.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;: No need for complicated setups like VPNs, PKI certificates, or port forwarding.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keeping your SSH access local keeps things simple and secure. Let’s move on to setting it up.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-by-step-guide-to-ssh-into-your-linux-server&#34;&gt;Step-by-Step Guide to SSH into Your Linux Server
&lt;/h2&gt;&lt;h3 id=&#34;1-check-your-servers-ip-address&#34;&gt;1. Check Your Server’s IP Address
&lt;/h3&gt;&lt;p&gt;Before you can SSH into your server, you need its local IP address. You can find this by logging into the server directly and running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip addr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look for the section labeled &lt;code&gt;inet&lt;/code&gt;. The number will look something like &lt;code&gt;192.168.x.x&lt;/code&gt;. That’s your server’s IP address.&lt;/p&gt;
&lt;p&gt;Example:
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/ipaddress.jpg&#34;
    alt=&#34;Old computer to Server&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-install-an-ssh-client-on-your-computer&#34;&gt;2. &lt;strong&gt;Install an SSH Client on Your Computer&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;: Use the built-in PowerShell tool or download a program like &lt;a class=&#34;link&#34; href=&#34;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PuTTY&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mac/Linux&lt;/strong&gt;: Your terminal already has an SSH client installed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;3-connect-to-the-server-via-ssh-via-powershell&#34;&gt;3. &lt;strong&gt;Connect to the Server via SSH via PowerShell&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Press the Start button on your keyboard and type PowerShell - Click the icon that says Windows PowerShell.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-ssh-into-a-linux-server/powershell.jpg&#34;
    alt=&#34;PowerShell in the Start Menu&#34;&gt;
&lt;/figure&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh username@192.168.x.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;username&lt;/code&gt; with your Linux user account and &lt;code&gt;192.168.x.x&lt;/code&gt; with your server’s IP address.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh john@192.168.1.100
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;4-enter-your-password&#34;&gt;4. &lt;strong&gt;Enter Your Password&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;After you hit enter, the server will ask for your password. Type it in carefully (you won’t see the characters as you type for security reasons) and press enter.&lt;/p&gt;
&lt;p&gt;If the connection is successful, you’ll see a prompt that looks something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;KryptikWurm@mediaserver:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Congrats! You’re now remotely connected to your server.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;5-troubleshooting-common-issues&#34;&gt;5. &lt;strong&gt;Troubleshooting Common Issues&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“Connection Refused”&lt;/strong&gt;: Make sure the SSH service is running on your server. Run:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  sudo systemctl start ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“Permission Denied”&lt;/strong&gt;: Double-check your username and password.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Can’t Find IP&lt;/strong&gt;: Ensure your server and computer are on the same local network.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Keep It Local, Keep It Safe
SSH is an incredibly powerful tool, but with great power comes great responsibility. Keeping your SSH access local minimizes security risks while still giving you all the perks of remote server management.&lt;/p&gt;
&lt;p&gt;So, open up your terminal, connect to your server, and start navigating the world of Linux like a pro. Just remember, safety third!&lt;/p&gt;
&lt;p&gt;Ready to Level Up?
Now that you’ve nailed the basics, you’re well on your way to mastering your home media server. Keep learning, keep experimenting, and don’t be afraid to take on new challenges. You’ve got this!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Turn an Old Computer Into a Media Server Part 1 Hardware and Installing Linux</title>
        <link>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/</link>
        <pubDate>Fri, 10 Jan 2025 09:07:02 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/oldpc2.webp" alt="Featured image of post Turn an Old Computer Into a Media Server Part 1 Hardware and Installing Linux" /&gt;&lt;p&gt;Do you have an old computer collecting dust in the closet—the one you kept around thinking it might be useful someday? Well, today is the day it finally gets its moment to shine. Instead of dropping hundreds (or even thousands) on brand-new hardware, you can turn that old machine into a fully functional media server. It’s a great way to explore the world of home media servers without spending a lot of money.&lt;/p&gt;
&lt;p&gt;The best part? It doesn’t take much to get started. With just a little effort and some free software, you’ll be streaming your favorite movies, TV shows, and music right from that old computer. Let’s go through what you’ll need and how to get your server up and running in no time.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-start-with-an-old-computer&#34;&gt;Why Start With an Old Computer?
&lt;/h2&gt;&lt;p&gt;When getting into home media servers, there’s one golden rule: &lt;strong&gt;Start small and upgrade later&lt;/strong&gt;. A common mistake is jumping straight into expensive, custom-built setups, only to realize it’s more than they bargained for. Using an old computer is a low-risk way to learn the basics and see if this hobby is right for you.&lt;/p&gt;
&lt;p&gt;Think of it like using training wheels. You can learn how to install software, organize your media, and troubleshoot issues—all without worrying about wasting money on high-end hardware. Plus, it’s eco-friendly. Instead of throwing out that old PC, you’re giving it a new purpose.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;minimum-specifications-what-does-your-old-computer-need&#34;&gt;Minimum Specifications: What Does Your Old Computer Need?
&lt;/h2&gt;&lt;p&gt;To run a basic Ubuntu-based Jellyfin server, you don’t need the latest gaming rig or high-end processors. Both Ubuntu Server and Jellyfin are lightweight and versatile, so your old machine can likely handle it. Here’s the &lt;strong&gt;bare minimum you’ll need&lt;/strong&gt; to get started:&lt;/p&gt;
&lt;h3 id=&#34;bare-minimum-hardware-requirements&#34;&gt;Bare Minimum Hardware Requirements:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Processor (CPU):&lt;/strong&gt; Intel Core i3 2nd Gen or AMD equivalent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 4 GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; At least 100 GB of free space (more if you plan to store lots of media locally).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Operating System:&lt;/strong&gt; Ubuntu Server 24.04 LTS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;USB Stick:&lt;/strong&gt; 32 GB for the OS installation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network:&lt;/strong&gt; An Ethernet connection (wired or Wi-Fi)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This setup is more than enough to get started with Jellyfin. As your media library grows or if you want to add more features, you can always upgrade later.&lt;/p&gt;
&lt;h3 id=&#34;best-experience-recommended-hardware&#34;&gt;Best Experience Recommended Hardware
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Processor:&lt;/strong&gt; No change&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 8 GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OS Storage:&lt;/strong&gt; 200 GB of SSD storage
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;ssd.webp&#34; alt=&#34;Kingston 240GB SSD&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Kingston 240GB SSD&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/40c5wUs&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445837450814897347578176&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fkingston-ssdnow-v300-series-240gb%2fp%2fN82E16820721114%3fitem%3d9SIAADF7AW7508&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Media Storage:&lt;/strong&gt; 8 TB or more depending on the size of your media collection
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network:&lt;/strong&gt; Wired ethernet connection is best&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your computer meets these requirements, you’re ready to go. If it doesn’t, you might still be able to make it work with a few tweaks, especially if you don’t need heavy-duty transcoding (converting video files on the fly). Transcoding will be covered in a later post.&lt;/p&gt;
&lt;h3 id=&#34;proof-old-computers-will-work&#34;&gt;Proof Old Computers Will Work
&lt;/h3&gt;&lt;p&gt;To show you that this can absolutely be done using old hardware, I’m going to build a media server with the following components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Processor:&lt;/strong&gt; i5-2500k – This CPU was released back in 2011.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 16 GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OS Storage:&lt;/strong&gt; 500 GB SSD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Media Storage:&lt;/strong&gt; Two 2 TB Hard Drives&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Video Card:&lt;/strong&gt; NVIDIA 750ti (Only needed for the installation)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that you’ve found an old computer suitable for this project, it’s time to turn it into a fully functional media server by installing &lt;strong&gt;Ubuntu Server 24.04 LTS&lt;/strong&gt;. This version of Ubuntu is designed for robust, secure, and efficient server performance—even on older hardware. Let’s dive into the installation process and bring your old computer back to life as a high-performing media server.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And yes, you could use Debian or pretty much any other Linux distro for this. I chose Ubuntu because it’s popular, well-documented, and widely supported.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;installing-ubuntu-server-2404-lts&#34;&gt;Installing Ubuntu Server 24.04 LTS
&lt;/h2&gt;&lt;p&gt;Now it is time for the fun part: Bringing your media server to life. Follow these steps to get Ubuntu 24.04 installed and running:&lt;/p&gt;
&lt;h3 id=&#34;1-prepare-your-old-computer-and-thumb-drive&#34;&gt;1. &lt;strong&gt;Prepare Your Old Computer and Thumb Drive&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Find a monitor, keyboard, and mouse to temporarily hook up for the setup.&lt;/li&gt;
&lt;li&gt;Download the Ubuntu Server 24.04 LTS ISO file from &lt;a class=&#34;link&#34; href=&#34;https://ubuntu.com/download/server&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ubuntu.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Use a tool like &lt;a class=&#34;link&#34; href=&#34;https://rufus.ie/en/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rufus&lt;/a&gt; (on Windows) or &lt;a class=&#34;link&#34; href=&#34;https://etcher.balena.io/#download-etcher&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Etcher&lt;/a&gt; (on macOS/Linux) to create a bootable USB drive with the ISO.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-use-rufus-to-create-a-bootable-thumb-drive&#34;&gt;2. Use Rufus to Create a Bootable Thumb Drive
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Download the portable version of Rufus
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/rufus_download.jpg&#34;
    alt=&#34;Rufus Download&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Rufus
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/rufus_interface.jpg&#34;
    alt=&#34;Rufus Interface&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press SELECT to select the Ubuntu Server ISO you just downloaded and press START
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/rufus_ISO.jpg&#34;
    alt=&#34;Rufus Select ISO&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select write in DD Image mode when prompted
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/rufus_dd_mode.jpg&#34;
    alt=&#34;Rufus DD Mode&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press OK to format you USB stick&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;This will erase everything on the drive&lt;/strong&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/rufus_format.jpg&#34;
    alt=&#34;Rufus Format Warning&#34;&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You should now have a bootable USB Stick with Ubuntu Server on it.&lt;/p&gt;
&lt;h3 id=&#34;3-boot-from-usb&#34;&gt;3. Boot from USB
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Insert the bootable USB into the computer you’re installing Ubuntu on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power on the computer and enter the BIOS/UEFI settings (usually by pressing &lt;strong&gt;F2&lt;/strong&gt;, &lt;strong&gt;F12&lt;/strong&gt;, &lt;strong&gt;Del&lt;/strong&gt;, or &lt;strong&gt;Esc&lt;/strong&gt; during boot).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure the boot order places USB before the hard drive. This way if a USB is detected it will boot off of it first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save and exit the BIOS settings. Your system will reboot and load the Ubuntu Server installer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-begin-the-installation&#34;&gt;4. Begin the Installation
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GNU Grub Menu - When prompted press enter
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_grub_install.jpg&#34;
    alt=&#34;Ubuntu Grub Menu&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select your default language
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_language_install.jpg&#34;
    alt=&#34;Ubuntu Select Language&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select your keyboard layout
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_keyboard_install.jpg&#34;
    alt=&#34;Ubuntu Select Keyboard Layout&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose the type of installation - Select Ubuntu Server (minimized) and Search for third-party drivers
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_type_install.jpg&#34;
    alt=&#34;Ubuntu Install Type&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Network Config - Because this is a server, we need to set a static IP (one that doesn&amp;rsquo;t change) Tab up to the location that lists the network device name (yours will be different) and press enter
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_network1_install.jpg&#34;
    alt=&#34;Ubuntu Configure Network&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You will now see this menu - Select Edit IPv4 and press enter
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_network2_install.jpg&#34;
    alt=&#34;Ubuntu Network Type&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Manual from the menu and press enter
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_network3_install.jpg&#34;
    alt=&#34;Ubuntu Network Manual&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My network config will be different than yours. Chances are your network is on the 192.168.0.0/24 or 192.168.1.0/24 network. If you don&amp;rsquo;t know what your network is, you can open PowerShell on your Windows system and run this command:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Powershell&#34; data-lang=&#34;Powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ipconfig&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the ipconfig command will give you everything need for the IPv4 config page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;However, something that will be different is how the subnets are displayed. On windows you will likely see 255.255.255.0 for Linux you will need to your IP address but change the last number to a 0 and add /24 like this:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.0.0/24
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;or
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.1.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_network4_install.jpg&#34;
    alt=&#34;Ubuntu Network Config&#34;&gt;
&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Proxy Config - Leave this blank unless you know you are using a proxy.
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_proxy_install.jpg&#34;
    alt=&#34;Ubuntu Select Proxy&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Guided Storage Configuration - For this initial setup leave everything default. I&amp;rsquo;ll cover a more advanced storage layout in another post.
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_storage_install.jpg&#34;
    alt=&#34;Ubuntu Storage Config&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Storage Config Summary
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_storage2_install.jpg&#34;
    alt=&#34;Ubuntu Storage Summary&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm Destructive Action - This will wipe everything from the selected drive.
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_storage3_install.jpg&#34;
    alt=&#34;Ubuntu Destruction Warning&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Profile Configuration&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Your name - This is not the username. I tend to make my username and name field match.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your server name - What do you want to call your server?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pick a username - I use what is in the Your name block.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Password - Please make this a strong password.
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_user_install.jpg&#34;
    alt=&#34;Ubuntu User Info&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade to Ubuntu Pro - Skip for now
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_pro_install.jpg&#34;
    alt=&#34;Ubuntu Upgrade to Pro?&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSH Config - Make sure to select Install OpenSSH server
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_ssh_install.jpg&#34;
    alt=&#34;Ubuntu SSH Install&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Third-party drivers - If you have any to install you can do so from here.
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_3rd_install.jpg&#34;
    alt=&#34;Ubuntu Third-party Drivers&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Featured Server Snaps - Leave all of these blank
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_snaps_install.jpg&#34;
    alt=&#34;Ubuntu Select snaps&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The installation will only take a few minutes. Once completed, remove the USB stick and reboot the system.
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-1-hardware-and-installing-linux/ubuntu_reboot_install.jpg&#34;
    alt=&#34;Ubuntu Server Install Reboot&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Login - Verify you can log in with the username and password you set during installation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the server - Use this command to install any updates. I recommend doing this about once a week to make sure your server stays up to date on any security patches.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Reboot - From the command line&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Some of you may have a keen eye and can see that I&amp;rsquo;m installing this on a VM and not my i5-2500k. This was so I could capture the screenshots above. I&amp;rsquo;ll install Ubuntu on my physical computer and use it going forward.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Congratulations you have set up an Ubuntu server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to bring your media server to life? Head to Part 2 to install Jellyfin and be one step closer to streaming your favorite content.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-2-adding-a-storage-drive-and-setting-up-smb-shares/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 2 - Storage and SMB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-3-installing-jellyfin-and-its-dependencies/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 3 - Installing Jellyfin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/turn-an-old-computer-into-a-media-server-part-4-how-to-configure-jellyfin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Turn an Old Computer into a Media Server PART 4 - Installing Configure Jellyfin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Stop Winging It - Use Obsidian to Master Your Server and Network Notes</title>
        <link>https://diymediaserver.com/post/stop-winging-it-use-obsidian-to-master-your-server-and-network-notes/</link>
        <pubDate>Sat, 04 Jan 2025 07:22:27 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/stop-winging-it-use-obsidian-to-master-your-server-and-network-notes/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/stop-winging-it-use-obsidian-to-master-your-server-and-network-notes/obsidian_main2.webp" alt="Featured image of post Stop Winging It - Use Obsidian to Master Your Server and Network Notes" /&gt;&lt;p&gt;Ever feel like the more you dive into self-hosting and home labs, the more overwhelming it gets? Managing Proxmox, Docker, Jellyfin, and the ARR suite can get complicated fast, and it’s all too easy for crucial details to slip through the cracks. That’s where Obsidian comes in. Think of it as your personal command center for all the notes, ideas, and guides you need to keep this complex hobby organized.&lt;/p&gt;
&lt;p&gt;Honestly, I wish I had started using it sooner. For years, I worked on my home server setup without documenting anything. Now, I’m stuck retracing my steps, trying to remember how I configured certain things or fixed specific issues. It’s been frustrating, and I’ve learned the hard way just how valuable well-organized notes can be.&lt;/p&gt;
&lt;p&gt;Let’s take a look at how Obsidian can save you from that same frustration and help you level up your home server documentation.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-documenting-your-journey-matters&#34;&gt;Why Documenting Your Journey Matters
&lt;/h2&gt;&lt;p&gt;Building a home server isn’t a one-time project—it’s an ongoing adventure. From setting up your first Proxmox server to fine-tuning your backup and notification automation, there’s a ton to learn and even more to remember. Documenting your progress helps you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remember what you did&lt;/strong&gt;: That one-off command that fixed Docker or your NFS share? It’s easy to forget unless you write it down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Save time later&lt;/strong&gt;: When it’s time to upgrade hardware or troubleshoot an issue months down the line, having notes handy can save you hours of Googling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learn from your mistakes&lt;/strong&gt;: Keeping track of what worked and what didn’t helps you refine your setup and avoid repeating frustrating mistakes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wish I had started documenting my setup from day one. It would’ve saved me so much time now that I’m trying to piece together commands, configurations, and solutions I figured out years ago. It might feel unnecessary to write things down as you go, but trust me—your future self will thank you.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-i-like-obsidian&#34;&gt;Why I Like Obsidian
&lt;/h2&gt;&lt;p&gt;Here’s why Obsidian is my go-to for documenting my home server setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Everything in One Place&lt;/strong&gt;: With Obsidian, I can keep all my notes, commands, and guides in one central spot, avoiding the chaos of scattered files and sticky notes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linked Notes&lt;/strong&gt;: I love how Obsidian lets me link notes together—like connecting my “Docker Setup” note to my “Sonarr Configuration.” It makes it easy to see how everything ties together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt;: Obsidian uses Markdown, which is lightweight and easy to write, organize, and export without needing extra tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Personal Knowledge Base&lt;/strong&gt;: Over time, my Obsidian Vault has turned into a custom knowledge base tailored specifically to my home server, full of everything I’ve learned and documented.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Offline Access&lt;/strong&gt;: If I accidentally break my internet connection while messing around with my server, no problem—Obsidian works entirely offline. And if I sync my Vault with OneDrive or Google Drive, I can access my notes on any computer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Visual Representation of Notes&lt;/strong&gt;: Obsidian’s graph view maps out how all my notes are connected, giving me a visual overview of my documentation and helping me see the bigger picture.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These features have been game-changers for me. If I had started using Obsidian sooner, I would’ve saved myself a ton of frustration and made my home server journey a lot smoother.&lt;/p&gt;
&lt;p&gt;Here’s what my graph view looks like after just 2 months:&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/stop-winging-it-use-obsidian-to-master-your-server-and-network-notes/obsidian_graph.jpg&#34;
    alt=&#34;Obsidian Graph View&#34;&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id=&#34;getting-started-with-obsidian&#34;&gt;Getting Started with Obsidian
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://obsidian.md/download&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Obsidian Download Link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here’s how I use Obsidian to document my home server setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Vault&lt;/strong&gt;: In Obsidian, a Vault is where all your notes are stored. I made one just for my home server setup and named it something fun like “Home Data Center.”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organize with Categories&lt;/strong&gt;: I set up folders or tags for key topics like “Proxmox,” “Docker,” “Jellyfin,” and “Usenet.” It keeps everything organized from the start.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Document as You Go&lt;/strong&gt;: Whenever I solve a problem, set up a new tool, or try something new, I write it down. I also include screenshots or links to helpful guides for future reference.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Link Related Notes&lt;/strong&gt;: If I have a note on “Radarr Setup,” I link it to my “Docker Compose” note so I can easily see how they’re connected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add a Daily Log&lt;/strong&gt;: Using Obsidian’s Daily Notes feature, I keep a journal of my progress. I jot down what I worked on, what I learned, and any issues I ran into.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The best part about Obsidian is how flexible it is. Whether you like writing detailed guides or just quick bullet points, it’s the perfect space to organize your thoughts and make sense of everything.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;practical-examples-of-using-obsidian&#34;&gt;Practical Examples of Using Obsidian
&lt;/h2&gt;&lt;p&gt;Here’s how I use Obsidian to take my home server setup to the next level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proxmox Setup Notes&lt;/strong&gt;: I keep a step-by-step guide for setting up virtual machines, complete with commands, screenshots, and links to the official documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Troubleshooting Logs&lt;/strong&gt;: Whenever I run into errors—like Sonarr not connecting to SABnzbd—I document the issue and how I fixed it. This saves me from having to troubleshoot the same problem twice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wish Lists&lt;/strong&gt;: I keep a running list of features I want to add, like a VPN or reverse proxy, along with links to guides on how to implement them. (Bonus points if they link to diymediaserver.com! 😉)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Personal Wiki&lt;/strong&gt;: Over time, my Obsidian Vault has evolved into a custom knowledge base for my home server setup. As I add more services or tweak configurations, my notes grow with me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These examples have saved me so much time and frustration. If you’re building or maintaining a home server, Obsidian is a game-changer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;stick-with-it&#34;&gt;Stick With It
&lt;/h2&gt;&lt;p&gt;If there’s one lesson I’ve learned the hard way, it’s that good documentation is priceless. Trying to piece together my home server setup from memory has been nothing but frustrating and time-consuming. But you don’t have to go through the same hassle.&lt;/p&gt;
&lt;p&gt;Start documenting your journey now with Obsidian. Spending just a few minutes jotting down what you’ve done can save you hours—or even days—of effort down the road. Plus, you’ll have a record of your progress to look back on with a sense of accomplishment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don’t put off documentation—your future self will thank you. Download Obsidian today and start building your second brain for your media server adventure!&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Kodi vs Plex vs Jellyfin vs Emby the Ultimate Media Playback Software Showdown</title>
        <link>https://diymediaserver.com/post/kodi-vs-plex-vs-jellyfin-vs-emby-the-ultimate-media-playback-software-showdown/</link>
        <pubDate>Fri, 03 Jan 2025 06:21:40 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/kodi-vs-plex-vs-jellyfin-vs-emby-the-ultimate-media-playback-software-showdown/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/kodi-vs-plex-vs-jellyfin-vs-emby-the-ultimate-media-playback-software-showdown/bestsoftware_main2.webp" alt="Featured image of post Kodi vs Plex vs Jellyfin vs Emby the Ultimate Media Playback Software Showdown" /&gt;&lt;p&gt;Imagine this: You’ve spent hours setting up the perfect home media server. Your movies, TV shows, and music are all neatly organized and ready to go. But now you’re faced with a big question: What software should you use to actually enjoy all that content? Kodi, Plex, Jellyfin, and Emby are some of the most popular options—but which one is right for you?&lt;/p&gt;
&lt;p&gt;I’ve been there, and after trying them all, I landed on a hybrid approach that works great for me. I use Kodi as my media player because I love how customizable the interface is. It lets me see exactly what I want—no clutter, no nonsense. But I also pair Kodi with the Jellyfin plug-in, which gives me all the backend perks of Jellyfin, like media syncing and watched status tracking across all my devices. This combo gives me the best of both worlds.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-basics-what-do-these-programs-do&#34;&gt;The Basics: What Do These Programs Do?
&lt;/h2&gt;&lt;p&gt;Kodi, Plex, Jellyfin, and Emby all have the same core purpose: to organize, play, and stream your media library. But even though they share this goal, each one offers a unique mix of features, philosophies, and user experiences.&lt;/p&gt;
&lt;p&gt;Some prioritize ease of use, while others focus on customization. Some lock premium features behind a paywall, while others are completely free and open-source. Let’s take a closer look at how they compare and why I chose my own setup.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;feature-comparison-at-a-glance&#34;&gt;Feature Comparison: At a Glance
&lt;/h2&gt;&lt;p&gt;Here’s a quick comparison table to show how Kodi, Plex, Jellyfin, and Emby stack up against each other:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Kodi&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Plex&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Jellyfin&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Emby&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Free&lt;/td&gt;
          &lt;td&gt;Free (Premium for advanced features)&lt;/td&gt;
          &lt;td&gt;Free&lt;/td&gt;
          &lt;td&gt;Free (Premium for advanced features)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;No&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;No&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Offline Playback&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;Yes (with premium)&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;Yes (with premium)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Live TV/DVR Support&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Yes (via add-ons)&lt;/td&gt;
          &lt;td&gt;Yes (with premium)&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;Yes (with premium)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Streaming Outside Home&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Limited&lt;/td&gt;
          &lt;td&gt;Yes (with premium)&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;Yes (with premium)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Very High&lt;/td&gt;
          &lt;td&gt;Limited&lt;/td&gt;
          &lt;td&gt;Moderate&lt;/td&gt;
          &lt;td&gt;Moderate&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Ease of Setup&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Moderate (more technical)&lt;/td&gt;
          &lt;td&gt;Easy&lt;/td&gt;
          &lt;td&gt;Moderate&lt;/td&gt;
          &lt;td&gt;Moderate&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Client Support&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Wide range of devices supported&lt;/td&gt;
          &lt;td&gt;Wide range of devices supported&lt;/td&gt;
          &lt;td&gt;Growing list of supported devices&lt;/td&gt;
          &lt;td&gt;Wide range of devices supported&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;why-i-chose-kodi--jellyfin&#34;&gt;Why I Chose Kodi + Jellyfin
&lt;/h2&gt;&lt;p&gt;After experimenting with each of these programs, I ultimately chose &lt;strong&gt;Kodi as my front-end media player&lt;/strong&gt; for one main reason: its customization.&lt;/p&gt;
&lt;p&gt;Kodi lets me tailor the viewing experience exactly to my liking. There are no recommended shows I don’t care about, no ads, and no unnecessary features cluttering up the interface. Everything is clean, simple, and set up exactly how I want it. If you like having full control over your media experience, Kodi is hard to beat.&lt;/p&gt;
&lt;p&gt;But Kodi does have its limitations. It doesn’t handle watched status syncing, streaming to multiple devices, or media transcoding on its own. That’s where &lt;strong&gt;Jellyfin&lt;/strong&gt; comes in. By running Jellyfin as my backend server and using the &lt;strong&gt;Jellyfin plug-in for Kodi&lt;/strong&gt;, I get the best of both worlds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Watched Status Syncing&lt;/strong&gt;: I can start watching a movie in the living room and pick up exactly where I left off in the bedroom. Everything stays synced across all my devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Media Syncing Across Devices&lt;/strong&gt;: My entire media library is organized and accessible on every device throughout my home.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remote Streaming&lt;/strong&gt;: Jellyfin lets me stream my content outside of my home network without paying for a subscription.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Media Transcoding&lt;/strong&gt;: If a device can’t play a certain file format, Jellyfin transcodes it on the fly. This keeps my media compatible with all my devices without the hassle of manually converting files.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This combination gives me Kodi&amp;rsquo;s unmatched customization with Jellyfin&amp;rsquo;s powerful syncing, streaming, and transcoding features. It’s a perfect setup that offers complete control without sacrificing functionality. I’ll be posting a detailed guide on how to set this up soon.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-pros-and-cons-of-each-platform&#34;&gt;The Pros and Cons of Each Platform
&lt;/h2&gt;&lt;h3 id=&#34;kodi-the-customizers-dream&#34;&gt;Kodi: The Customizer’s Dream
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unmatched Customization&lt;/strong&gt;: Kodi’s open-source nature lets you customize nearly every aspect of the interface. You can choose from hundreds of skins, build custom menus, and install add-ons to expand its functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wide Device Support&lt;/strong&gt;: Kodi runs on just about anything—Windows, macOS, Linux, Android, Raspberry Pi, and more. It’s a great way to repurpose older devices as media players.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Offline Playback&lt;/strong&gt;: Unlike streaming-focused platforms, Kodi is built for local playback. As long as your media is stored locally or on a network share, Kodi can play it without any issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Free and Open Source&lt;/strong&gt;: Every feature is free, and its open-source community keeps the platform constantly evolving and improving.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Steep Learning Curve&lt;/strong&gt;: All that customization comes with complexity. If you’re new to Kodi, figuring out add-ons, optimizing playback, or setting up network shares can be a bit challenging.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limited Remote Streaming&lt;/strong&gt;: Kodi isn’t designed for streaming outside your home network. While there are plugins and workarounds, they’re not as user-friendly as solutions from Plex or Jellyfin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lacks Backend Features&lt;/strong&gt;: Kodi doesn’t natively sync watched status or manage media libraries across devices. But when paired with a server like Jellyfin or a service like Trakt, you can get these features working seamlessly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;: Those who love to tinker, customize, and build a personalized interface for local playback. If you enjoy full control over your media experience, Kodi is the way to go.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://kodi.tv/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kodi Download Link&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;plex-the-streaming-superstar&#34;&gt;Plex: The Streaming Superstar
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;: Plex is hands down the most beginner-friendly option. It’s easy to set up and automatically organizes your media with rich metadata like cover art, descriptions, and even trailers—all with minimal effort.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remote Access&lt;/strong&gt;: Plex makes streaming outside your home network a breeze. Whether you’re at work or on the go, you can access your entire library on any supported device.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Friend Sharing&lt;/strong&gt;: Want to share your media with friends or family? Plex lets you do that easily, with options to control who sees what.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wide Device Support&lt;/strong&gt;: Plex is available on almost every platform, including smart TVs, gaming consoles, and mobile devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Premium Features&lt;/strong&gt;: With a Plex Pass subscription, you get extras like offline downloads, hardware transcoding, and live TV/DVR support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Paywall for Premium Features&lt;/strong&gt;: Some of Plex’s best features—like offline playback and advanced transcoding—require a paid Plex Pass subscription.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limited Customization&lt;/strong&gt;: While Plex’s interface is polished and user-friendly, it doesn’t offer the deep customization options that Kodi provides.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Closed Source&lt;/strong&gt;: Plex is proprietary software, meaning you’re reliant on the company for updates, support, and feature development.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;: Those who prioritize ease of use, remote streaming, and a polished experience—and don’t mind paying for premium features.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.plex.tv/media-server-downloads/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Plex Download Link&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;jellyfin-the-open-source-hero&#34;&gt;Jellyfin: The Open-Source Hero
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Completely Free&lt;/strong&gt;: Jellyfin is 100% free and open-source, offering features like remote streaming, live TV support, and watched status syncing—all without subscriptions or paywalls.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Privacy-Focused&lt;/strong&gt;: Unlike Plex, Jellyfin doesn’t rely on external servers or track your usage. Your data stays on your server, giving you full control over your media and privacy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Server-Client Architecture&lt;/strong&gt;: Jellyfin uses a centralized server to manage your media library, while client apps—including third-party options like Kodi—connect to the server for playback.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transcoding Capabilities&lt;/strong&gt;: Jellyfin handles on-the-fly transcoding, ensuring compatibility across various devices and formats without needing to manually convert files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Active Community Development&lt;/strong&gt;: As an open-source project, Jellyfin is constantly evolving thanks to a dedicated community of developers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setup Complexity&lt;/strong&gt;: Although not as complex as Kodi, Jellyfin does require some technical knowledge to set up a server and configure client devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Growing Ecosystem&lt;/strong&gt;: Jellyfin’s client apps are still catching up to the polish and platform support of Plex. While it runs on most major devices, some features can be limited depending on the app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not as Polished&lt;/strong&gt;: Since Jellyfin is community-driven, its interface isn’t as sleek or refined as Plex or Emby.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;: Those who value open-source software, privacy, and getting premium features for free—and don’t mind a bit of extra setup to get things running smoothly.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://jellyfin.org/downloads/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jellyfin Download Link&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;emby-the-middle-ground&#34;&gt;Emby: The Middle Ground
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Balanced Feature Set&lt;/strong&gt;: Emby offers a good mix of ease of use and flexibility. It’s not as customizable as Kodi or as straightforward as Plex, but it strikes a nice balance between the two.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remote Streaming&lt;/strong&gt;: Just like Plex and Jellyfin, Emby lets you stream your media outside your home network, although this feature requires a paid subscription.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Live TV/DVR Support&lt;/strong&gt;: Emby shines when it comes to live TV and DVR functionality, offering robust tools for recording and managing live broadcasts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wide Device Support&lt;/strong&gt;: Emby is available on most major platforms, including smart TVs, gaming consoles, and mobile devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Premium Features&lt;/strong&gt;: With an Emby Premiere subscription, you get access to features like hardware transcoding, offline downloads, and live TV—similar to what Plex Pass offers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subscription Costs&lt;/strong&gt;: Many of Emby’s standout features, like remote streaming and advanced transcoding, are locked behind the Emby Premiere paywall.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not Open Source&lt;/strong&gt;: Although Emby started as an open-source project, it has since gone closed-source, meaning the company now controls development and support.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Less Community Development&lt;/strong&gt;: Unlike Jellyfin, Emby doesn’t benefit from open-source community contributions, so updates and new features depend entirely on its developers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;: Those looking for a middle ground between Kodi’s customization and Plex’s polished interface—and who don’t mind paying for advanced features.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://emby.media/download.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Emby Download Link&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;which-one-should-you-choose&#34;&gt;Which One Should You Choose?
&lt;/h2&gt;&lt;p&gt;The best media playback software depends on what matters most to you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choose Kodi&lt;/strong&gt; if you love customization and want complete control over your interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choose Plex&lt;/strong&gt; if you want a polished, user-friendly experience and don’t mind paying for premium features.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choose Jellyfin&lt;/strong&gt; if you value open-source software and want advanced features for free.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choose Emby&lt;/strong&gt; if you’re looking for a middle ground between Plex’s polish and Jellyfin’s open-source flexibility.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For me, the combination of &lt;strong&gt;Kodi and Jellyfin&lt;/strong&gt; is the ultimate setup. Jellyfin manages the backend—syncing media, tracking watched status, and enabling remote streaming—while Kodi provides a beautiful, fully customizable front-end experience.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;All of these platforms are excellent choices, each with unique strengths to fit different needs. Whether you prioritize ease of use, customization, or cost, there’s an option that’ll work for you. I recommend experimenting with them, or even mixing and matching like I did, to find the perfect setup for your media server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to build your ideal media setup? Jump in, explore, and make it your own—your movies and shows will thank you!&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>The Best Devices to Play Your Locally Stored Media with Kodi Plex Jellyfin or Emby</title>
        <link>https://diymediaserver.com/post/best-devices-to-play-your-locally-stored-media/</link>
        <pubDate>Wed, 01 Jan 2025 06:36:03 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/best-devices-to-play-your-locally-stored-media/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/best-devices-to-play-your-locally-stored-media/bestdevices_main2.webp" alt="Featured image of post The Best Devices to Play Your Locally Stored Media with Kodi Plex Jellyfin or Emby" /&gt;&lt;p&gt;Have you ever downloaded a movie or ripped your favorite Blu-ray, only to wonder how to enjoy it on your TV or tablet? With media server software like Kodi and Jellyfin, your locally stored media collection can be transformed into a Netflix-like experience. But there is a catch: you need a device to bring your media to life.  
 
The good news? There are many options for every budget. Whether you’re looking for a living room powerhouse or something portable, chances are there’s a device perfect for you. Let’s look at the best ones to get you streaming your media like a pro.  &lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-android-tv-devices-simple-and-affordable&#34;&gt;1. &lt;strong&gt;Android TV Devices: Simple and Affordable&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;If you want something dead easy to set up and that is budget-friendly, Android TV boxes like the &lt;strong&gt;NVIDIA Shield TV&lt;/strong&gt; or &lt;strong&gt;Chromecast with Google TV&lt;/strong&gt; are great choices.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why they work&lt;/strong&gt;: These devices run Android, making them compatible with both Kodi and Jellyfin apps right out of the box. There is no complicated installation process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: The NVIDIA Shield is surprisingly powerful, handling 4K HDR and even AI upscaling. Chromecast with Google TV is great for HD and 4K on a tighter budget.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bonus&lt;/strong&gt;: Both are capable of handling other streaming apps like Netflix and YouTube, so they double as an all-in-one entertainment device. Additionally, they both offer casting from your laptop, phone, or tablet.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/nvidia-shield-tv-pro.jpg&#34; alt=&#34;NVIDIA SHIELD Pro&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;NVIDIA SHIELD Pro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The NVIDIA SHIELD is my go-to device. It is easy to use and just works.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/4gZhtU2&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458311262821776245415890&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fblack-nvidia-shield-tv-pro-digital-media-streamer%2fp%2fN82E16815351017&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/google-chromecast.jpg&#34; alt=&#34;Google Chromecast&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;&lt;strong&gt;Google Chromecast&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a great runner up if you can&amp;rsquo;t find the Shield as a goo price.&lt;/p&gt;
&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/49XqdrH&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.445835868735687821985046&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fp%2f0ZK-0594-00043%3fitem%3d9SIA17PKE85960&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id=&#34;2-raspberry-pi-for-those-who-love-to-tinker&#34;&gt;2. &lt;strong&gt;Raspberry Pi: For Those Who Love To Tinker&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;For DIY enthusiasts, the &lt;strong&gt;Raspberry Pi&lt;/strong&gt; is a solid option for running Kodi.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why it’s cool&lt;/strong&gt;: It’s cheap, customizable, and fun to set up. You can install &lt;strong&gt;LibreELEC&lt;/strong&gt; (a lightweight Kodi-based operating system) or run Jellyfin through Docker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: The latest Raspberry Pi 4 can play 1080p and 4K content, though it’s best with wired Ethernet for smoother streaming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who it’s for&lt;/strong&gt;: If you enjoy tinkering and want a hands-on project, this is a great option. Plus, you’ll learn a lot about media servers along the way.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/raspberry-pi-4.png&#34; alt=&#34;RaspberryPi 4GB&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;RaspberryPi 4GB&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3ZXTKg7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458396018814776121390&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fraspberry-pi-4-model-b%2fp%2f3D0-004G-00002%3fitem%3d9SIA2W0JYV5920&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id=&#34;3-amazon-fire-tv-a-budget-friendly-option&#34;&gt;3. &lt;strong&gt;Amazon Fire TV: A Budget-Friendly Option&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Amazon’s &lt;strong&gt;Fire TV Stick 4K&lt;/strong&gt; and &lt;strong&gt;Fire TV Cube&lt;/strong&gt; are popular choices for those who are more budget-conscious.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why they shine&lt;/strong&gt;: Both devices support Kodi installation and Jellyfin via sideloading or the app store (depending on region).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: These devices handle 4K content well and integrate easily with Alexa voice controls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limitations&lt;/strong&gt;: You may need to sideload apps like Kodi if they are not yet available in your region, but there are guides for how to accomplish this.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/amazonfire-stick.jpg&#34; alt=&#34;Amazon Fire TV Stick 4K&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Amazon Fire TV Stick 4K&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3BGhbTl&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/amazonfire-cube.jpg&#34; alt=&#34;Amazon Fire TV Cube&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Amazon Fire TV Cube&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3BQwrgl&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id=&#34;4-dedicated-htpcs-home-theater-pcs-the-hardcore-solution&#34;&gt;4. &lt;strong&gt;Dedicated HTPCs (Home Theater PCs): The Hardcore Solution&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;For the most hardcore home media experience, nothing beats a dedicated &lt;strong&gt;Home Theater PC (HTPC)&lt;/strong&gt;. This could be a prebuilt mini PC, an old desktop repurposed for media playback, or a fully decked-out custom PC.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why they’re unmatched&lt;/strong&gt;: With an HTPC, you have a full Windows or Linux PC hooked up to your TV and have all of the benefits that come with it. Because of their superior hardware specifications, they are much faster and provide a good user experience. HTPCs You also get better hardware for decoding high-quality files like Blu-ray rips or 4K HDR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable&lt;/strong&gt;: Whether you want Windows, Linux, or even a lightweight option like &lt;a class=&#34;link&#34; href=&#34;https://libreelec.tv/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;LibreELEC&lt;/strong&gt;&lt;/a&gt;, you’re in control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drawbacks&lt;/strong&gt;: This is the priciest and most space-consuming option, but it’s worth it if you want the best.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;5-game-consoles-dual-purpose-media-players&#34;&gt;5. &lt;strong&gt;Game Consoles: Dual-Purpose Media Players&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Already own a gaming console? Good news—you might not need anything else!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xbox&lt;/strong&gt;: Xbox consoles support the Jellyfin app natively. You can also use Kodi on some models with a bit of effort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PlayStation&lt;/strong&gt;: While Jellyfin doesn’t have native support yet, you can use the web app via the PS browser.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why it’s great&lt;/strong&gt;: These devices are already plugged in and configured to use your TV they also support streaming in HD or 4K. It’s a simple solution if you’re a gamer.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;6-smartphones-and-tablets-portable-media-champs&#34;&gt;6. &lt;strong&gt;Smartphones and Tablets: Portable Media Champs&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Don’t forget about your handheld devices. Jellyfin and Kodi have apps for &lt;strong&gt;Android&lt;/strong&gt; and &lt;strong&gt;iOS&lt;/strong&gt;, letting you stream your library on the go.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why they work&lt;/strong&gt;: Perfect for on-the-go viewing or casting to a bigger screen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Features&lt;/strong&gt;: You can download files for offline playback or stream directly from your server over Wi-Fi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best use case&lt;/strong&gt;: These devices are great secondary players when not in front of your main TV.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;7-smart-tvs-built-in-convenience&#34;&gt;7. &lt;strong&gt;Smart TVs: Built-In Convenience&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;If you own a smart TV, check to see if Kodi or Jellyfin has a native app in the app store. &lt;strong&gt;Samsung&lt;/strong&gt; and &lt;strong&gt;LG&lt;/strong&gt; TVs, for example, can run Jellyfin via their web browsers or dedicated apps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why it’s convenient&lt;/strong&gt;: No extra devices, no extra remotes—everything’s already on your TV.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limitations&lt;/strong&gt;: Older TV models may struggle with newer codecs like H.265, so it’s worth checking your specs.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;final-thoughts-pick-your-perfect-device&#34;&gt;Final Thoughts: Pick Your Perfect Device
&lt;/h3&gt;&lt;p&gt;No matter your budget or tech skills, there’s a device that will fit your needs for playing locally stored media on Kodi or Jellyfin. From the powerful NVIDIA Shield to the flexible Raspberry Pi, each option offers unique perks. The key is matching the device to your lifestyle and media setup.&lt;/p&gt;
&lt;p&gt;So what are you waiting for? Grab the remote or a screwdriver and start enjoying your media on the big screen. Your perfect streaming setup is just a few steps away!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to dive in? Start small with an affordable Fire Stick, or go big with a custom HTPC. The choice is yours—your media, your way.&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to Rip DVDs and Blu Rays for Your Home Media Server</title>
        <link>https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/</link>
        <pubDate>Sat, 28 Dec 2024 07:11:39 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/rip_media.webp" alt="Featured image of post How to Rip DVDs and Blu Rays for Your Home Media Server" /&gt;&lt;p&gt;When you rip your DVDs and Blu-Rays, you can store all your media in one centralized location. No more digging through stacks of discs to find your favorite movie or TV show—you can browse your entire collection digitally from any device connected to your media server. This makes it easy to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Search Quickly&lt;/strong&gt;: Use metadata like titles, genres, and cast to find movies in seconds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organize Effectively&lt;/strong&gt;: Group content by genre, director, year, or any custom structure that suits your style.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stream to Multiple Devices&lt;/strong&gt;: With media server tools like Jellyfin or Plex, you can access your library on smart TVs, laptops, tablets, and smartphones anywhere in your home—or even remotely.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Physical DVDs and Blu-Rays wear out over time. Discs can get scratched, warped, or lost, putting your movie and show collection at risk. Ripping your discs lets you create digital backups, so you can enjoy your collection for years without worrying about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scratched Discs&lt;/strong&gt;: No more frustration when a favorite movie freezes or skips.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage Challenges&lt;/strong&gt;: Free up space and avoid clutter by getting rid of bulky disc cases and shelves.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Discontinued Titles&lt;/strong&gt;: Preserve rare or out-of-print movies that might be impossible to replace.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-process-is-simpler-than-you-think&#34;&gt;The Process is Simpler Than You Think
&lt;/h2&gt;&lt;p&gt;If ripping DVDs and Blu-Rays sounds intimidating, don’t worry—you’re not alone. Many people think it’s overly technical or requires advanced computer skills, but with the right tools, it’s surprisingly straightforward.&lt;/p&gt;
&lt;p&gt;Today’s software solutions are built for simplicity, often requiring just a few clicks to get started. Tools like &lt;strong&gt;MakeMKV&lt;/strong&gt; and &lt;strong&gt;HandBrake&lt;/strong&gt; are user-friendly, with intuitive interfaces that guide you step by step. You don’t need to be a tech expert—if you can install software and follow basic instructions, you’re good to go.&lt;/p&gt;
&lt;p&gt;I’ll walk you through everything you need, from choosing the right hardware and software to organizing and storing your ripped files. And if you run into any challenges, don’t worry—I’ve got tips and troubleshooting advice to help you out. This is a learning process, and with a bit of patience and practice, you’ll feel confident in no time.&lt;/p&gt;
&lt;p&gt;By the end of this guide, you’ll see that ripping your DVDs and Blu-Rays is not only doable but also incredibly rewarding. You’ll have a digital library you can enjoy whenever and wherever you want—no more dealing with physical discs. So take it one step at a time, and let’s get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-youll-need&#34;&gt;What You&amp;rsquo;ll Need
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hardware Requirements&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;A DVD/Blu-Ray drive (internal or external).
&lt;ul&gt;
&lt;li&gt;OWC Mercury Pro 16X Blu-ray&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A computer with sufficient storage space for the ripped files.
&lt;ul&gt;
&lt;li&gt;DVDs about 10GB of free space&lt;/li&gt;
&lt;li&gt;Blu-Ray 1080p about 40GB of free space&lt;/li&gt;
&lt;li&gt;Blu-Ray 4k UHD about 100GB of free space&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Optional: Large external / internal hard drives, or NAS for additional storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;product-box&#34;&gt;
  &lt;div class=&#34;product-box-image&#34;&gt;
    &lt;img src=&#34;https://diymediaserver.com/images/products/seagate24tb.jpg&#34; alt=&#34;Seagate Barracuda 24TB Internal Hard Drive&#34; loading=&#34;lazy&#34;&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-content&#34;&gt;
    &lt;p&gt;&lt;strong&gt;Seagate Barracuda 24TB Internal Hard Drive&lt;/strong&gt;&lt;/p&gt;
    &lt;p class=&#34;product-affiliate-disclaimer&#34;&gt;
      &lt;small&gt;&lt;em&gt;Contains affiliate links. I may earn a commission at no cost to you.&lt;/em&gt;&lt;/small&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&#34;product-box-links&#34;&gt;
    
      &lt;a href=&#34;https://amzn.to/3HCqnL7&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Amazon&lt;/a&gt;
    
    
      &lt;a href=&#34;https://click.linksynergy.com/link?id=plNXx%2aS0a%2a8&amp;amp;offerid=1786142.4458313996485731902134011&amp;amp;type=2&amp;amp;murl=https%3a%2f%2fwww.newegg.com%2fseagate-barracuda-st24000dm001-24tb-for-daily-computing-7200-rpm%2fp%2fN82E16822185109&#34; class=&#34;affiliate-button&#34; target=&#34;_blank&#34; rel=&#34;noopener nofollow sponsored&#34;&gt;Newegg&lt;/a&gt;
    
    
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://diymediaserver.com/post/how-to-install-sonarr-in-docker/&#34; &gt;How to Install Sonarr in Docker&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;Software Options&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.makemkv.com/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MakeMKV&lt;/a&gt;: MakeMKV is a simple yet powerful tool for ripping Blu-rays into MKV files. It’s available for both Windows and macOS and focuses on doing one thing really well—no unnecessary features, just straightforward ripping.  While MakeMKV technically offers a free 30-day beta trial, there’s a catch: you can either download the latest version each month or use the updated beta key posted in the forums to keep it active. This effectively lets you use the software for free indefinitely. Even though it’s labeled as “beta,” MakeMKV has been in beta for years and shows no signs of changing. For now, there’s no reason to pay for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://handbrake.fr/downloads.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HandBrake&lt;/a&gt;: When you use MakeMKV to rip a Blu-Ray, it creates an MKV file that’s an exact copy of the movie as it exists on the disc—which often means a file size of 20 to 30GB or more. To make these files smaller and easier to manage, you can use HandBrake to compress them without noticeably losing quality. This step isn’t mandatory, but storing, playing, and streaming such large files can be inefficient and waste resources if smaller, high-quality versions will do the job just as well.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-1-rip-your-dvd--blu-ray-with-makemkv&#34;&gt;Step 1: Rip your DVD / Blu-Ray With MakeMKV
&lt;/h2&gt;&lt;p&gt;First things first—you’ll need to rip your Blu-Ray to get a digital copy of the movie. MakeMKV is perfect for this because it focuses on one thing: creating a full-size 1080p or 4K MKV file from your Blu-Ray disc. Once the movie is ripped, you’ll have an MKV file that you can shrink, convert, or modify as needed. You can also watch it as-is, but compressing it later is a good idea to save space.&lt;/p&gt;
&lt;p&gt;Here’s how to rip your Blu-Ray:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Insert the DVD or Blu-Ray disc into your Blu-Ray drive.&lt;/li&gt;
&lt;li&gt;Open MakeMKV. After a few moments, you’ll see a large DVD or Blu-ray drive icon appear on the screen.&lt;/li&gt;
&lt;li&gt;Click the icon to begin scanning the titles on your disc.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/makemkv.png&#34;
    alt=&#34;MakeMKV&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;After MakeMKV scans the disc, you’ll see a list of titles on the left. This list includes everything on the disc, like the main movie, special features, deleted scenes, and other extras. If you only want the main movie, look for the largest track—usually around 20–30GB. Select the track(s) you want and leave out the rest. It might take a bit of trial and error to identify the right one, but the largest track is almost always the main movie.&lt;/p&gt;
&lt;p&gt;On the right-hand side of the window, choose the folder where you want to save the MKV file. Make sure to pick a hard drive with plenty of space. Although the &lt;strong&gt;Info&lt;/strong&gt; section shows an estimated file size, it’s smart to have at least 20GB of extra space available. Once everything is set, click the &lt;strong&gt;Make MKV&lt;/strong&gt; button (the one with the green arrow) to start the ripping process.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/makemkv2.png&#34;
    alt=&#34;MakeMKV Titles&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;MakeMKV will take about 20 to 30 minutes to rip your movie, depending on your drive speed and the size of the movie. You’ll see a green progress bar showing how far along it is. If you need to stop the rip for any reason, just click the orange stop icon to cancel the process.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/makemkv3.png&#34;
    alt=&#34;MakeMKV Process&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Once the rip is complete, MakeMKV will show a pop-up confirming that it’s finished. You can safely eject the disc and, if needed, insert another one to start a new rip.&lt;/p&gt;
&lt;p&gt;At this point, if you’re eager to watch your movie, you can open the MKV file with a media player like VLC, Plex, Kodi, or any other app that supports MKV files. If you’re not worried about saving hard drive space, you’re good to go!&lt;/p&gt;
&lt;p&gt;However, if you want a cleaner, more organized, and space-efficient media library, the next step is to compress the file. We’ll cover that in the next section.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-2-compress-your-rip-to-a-manageable-size-with-handbrake&#34;&gt;Step 2: Compress Your Rip to a Manageable Size with HandBrake
&lt;/h2&gt;&lt;p&gt;To compress your freshly ripped MKV file, open &lt;strong&gt;HandBrake&lt;/strong&gt; and select &lt;strong&gt;File&lt;/strong&gt; if you’re working on a single video. If you’ve got multiple rips to convert, you can choose &lt;strong&gt;Folder (Batch Scan)&lt;/strong&gt; to scan several files at once. Don’t worry—this step only scans the files and gathers details about them, so it’s safe to select an entire folder containing all your rips. You’ll be able to decide how to convert each file individually later.&lt;/p&gt;
&lt;p&gt;For this example, I’m going to keep it simple and &lt;strong&gt;drag and drop&lt;/strong&gt; my new MKV file directly into HandBrake.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/handbrake.png&#34;
    alt=&#34;Handbrake&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Next you will need to select the quality.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/handbrake2.png&#34;
    alt=&#34;Handbrake Quality&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;choosing-the-right-quality-settings-in-handbrake&#34;&gt;Choosing the Right Quality Settings in HandBrake
&lt;/h3&gt;&lt;p&gt;Now comes the tricky part: selecting the right quality settings for video compression. HandBrake offers a variety of presets that make it easier to balance video quality and file size. The best preset depends on how much detail you want to keep for each movie. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For a visually stunning movie like &lt;em&gt;Transformers: Rise of the Beasts&lt;/em&gt;, you’ll want to preserve every detail of the robot battles and special effects.&lt;/li&gt;
&lt;li&gt;On the other hand, compressing &lt;em&gt;Monty Python and the Holy Grail&lt;/em&gt; won’t lose much since it’s a low-budget comedy, and the humor doesn’t rely on high visual fidelity—those jokes are funny at any resolution!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With that in mind, here are three compression options tailored to different needs:&lt;/p&gt;
&lt;h4 id=&#34;1-ultra-high-quality-uhd-4k&#34;&gt;1. Ultra High Quality, UHD (4K)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Movies with detailed special effects, breathtaking visuals, or films where 4K resolution is crucial to the viewing experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recommended Preset:&lt;/strong&gt; &lt;em&gt;Super HQ 2160p60 4K HEVC Surround&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;This preset keeps the full 4K UHD resolution while compressing the file, significantly reducing its size without any noticeable loss in quality. It’s perfect for action-packed blockbusters, visually rich films, or nature documentaries where every detail counts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio Tip:&lt;/strong&gt; To maintain the original high-quality audio, go to the &lt;strong&gt;Audio&lt;/strong&gt; tab and change the codec from &amp;ldquo;AAC&amp;rdquo; to &amp;ldquo;DTS Passthru,&amp;rdquo; &amp;ldquo;TrueHD Passthru,&amp;rdquo; or &amp;ldquo;AC3 Passthru,&amp;rdquo; depending on the source audio format. This keeps the audio as crisp and immersive as it was on the original disc.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&#34;2-high-quality-high-resolution-1080p&#34;&gt;2. High Quality, High Resolution (1080p)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Movies with detailed special effects, beautiful visuals, or films you want to keep looking sharp.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recommended Preset:&lt;/strong&gt; &lt;em&gt;Super HQ 1080p30 Surround&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;This preset keeps the full 1080p resolution while significantly reducing the file size without sacrificing much quality. It’s ideal for visually rich movies where you want to maintain detail without the massive file size of a full rip.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio Tip:&lt;/strong&gt; To preserve the original audio quality, go to the &lt;strong&gt;Audio&lt;/strong&gt; tab and change the codec from “AAC” to “DTS Passthru” or “AC3 Passthru,” depending on the disc’s original audio format.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&#34;3-high-quality-lower-resolution-720p&#34;&gt;3. High Quality, Lower Resolution (720p)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Movies where visuals aren’t as crucial or older films that don’t really benefit from high-definition resolution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recommended Preset:&lt;/strong&gt; &lt;em&gt;Super HQ 720p30 Surround&lt;/em&gt; or &lt;em&gt;HQ 720p30 Surround&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Dropping from 1080p to 720p may sound like a big downgrade, but the difference is often barely noticeable—especially with a high-quality preset that uses minimal compression.&lt;/li&gt;
&lt;li&gt;This is a great option for comedies, older movies, or films where you’re not worried about preserving every tiny detail. A well-compressed 720p file can look better than an overly compressed 1080p version.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&#34;4-low-quality-lower-resolution-720p-or-below&#34;&gt;4. Low Quality, Lower Resolution (720p or Below)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Movies where saving space is the priority, and video quality isn’t a big concern.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recommended Preset:&lt;/strong&gt; &lt;em&gt;Very Fast 720p30&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;This setting drastically reduces file size, making it perfect for your “guilty pleasure” collection or movies you’re not worried about keeping in high quality. It’s the go-to choice when you need to maximize storage space.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;what-to-consider&#34;&gt;What to Consider
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visual Importance:&lt;/strong&gt; If the movie relies heavily on visuals (like sci-fi or action films), choose a higher-quality preset to preserve detail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage Needs:&lt;/strong&gt; For comedies, older films, or “background” movies, opting for lower resolution or quality presets can save a lot of hard drive space.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case-by-Case Flexibility:&lt;/strong&gt; The best part is you don’t have to use a one-size-fits-all approach. You can adjust the quality settings for each movie based on how much you value its visuals versus how much storage space you want to save.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using these presets helps you find the right balance between quality and storage, so your media library looks great without wasting space.&lt;/p&gt;
&lt;p&gt;For most people, the basic presets will work just fine, delivering a good mix of quality and file size. But if you’re comfortable with advanced settings and want more control, you can tweak options in the &lt;strong&gt;Video&lt;/strong&gt;, &lt;strong&gt;Audio&lt;/strong&gt;, and &lt;strong&gt;Subtitles&lt;/strong&gt; tabs.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Video Tab:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;If the preset’s video quality isn’t high enough, adjust the &lt;strong&gt;RF (Rate Factor)&lt;/strong&gt; to a lower value. The default is usually &lt;strong&gt;18&lt;/strong&gt;, but lowering it to &lt;strong&gt;16&lt;/strong&gt; increases quality (at the cost of a larger file size).&lt;/li&gt;
&lt;li&gt;Change the &lt;strong&gt;Framerate&lt;/strong&gt; setting from &amp;ldquo;30&amp;rdquo; to &lt;strong&gt;&amp;ldquo;Same as Source&amp;rdquo;&lt;/strong&gt; to match the original framerate of your rip for smoother playback.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don’t hesitate to experiment with these settings to find the perfect balance of quality and file size for your needs!&lt;/p&gt;
&lt;h3 id=&#34;choosing-the-right-container-mp4-vs-mkv&#34;&gt;Choosing the Right Container: MP4 vs. MKV
&lt;/h3&gt;&lt;p&gt;Under the &lt;strong&gt;&amp;ldquo;Container&amp;rdquo;&lt;/strong&gt; setting, you’ll need to choose between &lt;strong&gt;MP4&lt;/strong&gt; and &lt;strong&gt;MKV&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MKV&lt;/strong&gt; is more flexible and feature-rich, supporting multiple audio tracks, subtitles, and slightly higher video quality. It’s a great choice for media servers and modern devices that support MKV playback.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MP4&lt;/strong&gt; is more universally compatible, especially with mobile devices like iPhones and iPads, as well as older hardware.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose &lt;strong&gt;MKV&lt;/strong&gt; if you want maximum flexibility and quality, or &lt;strong&gt;MP4&lt;/strong&gt; if you need broader compatibility across different devices.&lt;/p&gt;
&lt;p&gt;To decide, check the device you plan to use for playback (There is a table at the bottom of this post with the pros and cons of each ):&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://diymediaserver.com/post/how-to-rip-dvds-and-blu-rays-for-your-home-media-server/handbrake3.png&#34;
    alt=&#34;Handbrake Output&#34;&gt;
&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;If your device supports MKV, choose &lt;strong&gt;MKV&lt;/strong&gt; to take advantage of its features and superior quality.&lt;/li&gt;
&lt;li&gt;If MKV isn’t supported, go with &lt;strong&gt;MP4&lt;/strong&gt; for maximum compatibility across different devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pick the format that best fits your needs.&lt;/p&gt;
&lt;p&gt;When you’re ready, click the green &lt;strong&gt;Start Encode&lt;/strong&gt; button to begin the conversion. If you’re working with multiple rips, click &lt;strong&gt;Add to Queue&lt;/strong&gt; after setting up the current video, then move on to the next title. Once you’ve configured presets for all your movies, click the green &lt;strong&gt;Start Queue&lt;/strong&gt; button to process them all at once. This batch processing feature is a huge time-saver if you have several files to convert.&lt;/p&gt;
&lt;p&gt;Once your files are done converting, you’ll notice they’re significantly smaller—how much smaller depends on the settings you chose. Make sure to play the converted files to check the quality. If everything looks good, you can safely delete the original rips to free up storage space. Your movies are now ready to be added to your media library, and you can start enjoying your collection!&lt;/p&gt;
&lt;h3 id=&#34;comparison-table-mp4-vs-mkv&#34;&gt;Comparison Table: MP4 vs. MKV
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;MP4&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;MKV&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;File Size&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Smaller, typically used for compressed files.&lt;/td&gt;
          &lt;td&gt;Larger, especially when storing lossless, uncompressed rips.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Quality&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Often compressed, which may result in some loss of quality.&lt;/td&gt;
          &lt;td&gt;Supports lossless storage, retaining the full quality of video, audio, and subtitles.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Audio Tracks&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Limited support for multiple audio tracks.&lt;/td&gt;
          &lt;td&gt;Fully supports multiple audio tracks (e.g., different languages, commentary tracks).&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Subtitle Support&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Limited; embedding multiple subtitle tracks can be tricky.&lt;/td&gt;
          &lt;td&gt;Excellent support for multiple subtitle tracks, including soft (toggleable) subtitles.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Compatibility&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Universally supported across most devices and platforms, including older hardware.&lt;/td&gt;
          &lt;td&gt;Widely supported on modern media players, but not always natively compatible with older devices.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Advanced Features&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Basic; lacks advanced features like chapter markers and high-end audio codecs.&lt;/td&gt;
          &lt;td&gt;Supports advanced features like chapters, menus, and high-resolution audio formats (e.g., DTS-HD, Dolby Atmos).&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Great for simple playback on most devices without any special configurations.&lt;/td&gt;
          &lt;td&gt;More feature-rich but may require specific software (e.g., Jellyfin, VLC, or Plex) for optimal playback.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Compression&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Ideal for compressed files when storage space is limited.&lt;/td&gt;
          &lt;td&gt;Best for lossless files or preserving full-quality rips of DVDs/Blu-Rays.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Future-Proofing&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Sufficient for standard-definition or compressed high-definition video.&lt;/td&gt;
          &lt;td&gt;Better suited for high-resolution formats (e.g., 4K UHD) and high-quality audio codecs.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Recommended Use Case&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;For smaller, portable files or when compatibility with older devices is required.&lt;/td&gt;
          &lt;td&gt;For archiving DVDs/Blu-Rays or building a high-quality media library.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        </item>
        <item>
        <title>Building Your Own Legal Media Collection</title>
        <link>https://diymediaserver.com/post/building-your-own-legal-media-collection/</link>
        <pubDate>Wed, 25 Dec 2024 06:51:55 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/building-your-own-legal-media-collection/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/building-your-own-legal-media-collection/legal_library.webp" alt="Featured image of post Building Your Own Legal Media Collection" /&gt;&lt;p&gt;Building a home media server lets you create your own personal Netflix, but it’s important to stay within legal boundaries when adding shows and movies. Sure, you might be tempted to don your pirate hat and sail the high seas for content, but it’s crucial to understand the risks that come with that choice.&lt;/p&gt;
&lt;h2 id=&#34;legal-implications-of-pirating-media&#34;&gt;Legal Implications of Pirating Media
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Civil Lawsuits:&lt;/strong&gt; Copyright holders can sue individuals or entities that illegally distribute their content. These lawsuits often result in hefty financial penalties.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Criminal Charges:&lt;/strong&gt; In serious cases—especially those involving large-scale piracy or financial gain—criminal charges can be filed, leading to significant fines and even jail time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Statutory Damages:&lt;/strong&gt; Under U.S. copyright law, penalties for infringement can range from $750 to $30,000 per work. If the court finds the violation was willful, that amount can shoot up to $150,000 per work.&lt;/p&gt;
&lt;h4 id=&#34;examples-of-fines-and-penalties&#34;&gt;Examples of Fines and Penalties
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Recording Industry Association of America (RIAA) Lawsuits:&lt;/strong&gt; In the mid-2000s, the RIAA filed thousands of lawsuits against people who illegally downloaded music through peer-to-peer networks. Settlements often ranged from a few thousand to several thousand dollars per person.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Movie Studios and Copyright Groups:&lt;/strong&gt; Like the RIAA, movie studios and copyright enforcement groups have gone after individuals and piracy websites. Settlement amounts vary but typically cover lost revenue and legal fees.&lt;/p&gt;
&lt;h3 id=&#34;high-profile-case-examples&#34;&gt;High-Profile Case Examples:
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;BMG v. Cox Communications:&lt;/strong&gt; In this landmark case, Cox Communications was found liable for copyright infringement by its users, resulting in a $25 million judgment in favor of BMG.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Capitol Records v. Thomas-Rasset:&lt;/strong&gt; Jammie Thomas-Rasset was fined $222,000 for downloading and sharing 24 songs on Kazaa. After multiple appeals, the fine amount fluctuated but served as a cautionary tale about the high cost of piracy.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;legal-methods-to-add-content-to-your-media-server&#34;&gt;Legal Methods to Add Content to Your Media Server
&lt;/h2&gt;&lt;h3 id=&#34;digital-marketplaces&#34;&gt;Digital Marketplaces
&lt;/h3&gt;&lt;p&gt;Buy or rent movies and shows from platforms like &lt;strong&gt;Amazon Prime Video, Google Play Movies,&lt;/strong&gt; and &lt;strong&gt;iTunes.&lt;/strong&gt; Some allow offline downloads, but they’re typically DRM-protected, meaning you can’t easily move them to your media server. Always check the terms of service for DRM-free options.&lt;/p&gt;
&lt;h3 id=&#34;physical-media-dvds-and-blu-rays&#34;&gt;Physical Media (DVDs and Blu-rays)
&lt;/h3&gt;&lt;p&gt;Buying physical DVDs and Blu-rays is a straightforward way to legally obtain content. You can use tools like &lt;strong&gt;MakeMKV&lt;/strong&gt; and &lt;strong&gt;HandBrake&lt;/strong&gt; to rip and compress them for your media server. This is generally legal for personal use, but be sure to check your local laws to stay compliant.&lt;/p&gt;
&lt;h3 id=&#34;public-domain-and-creative-commons&#34;&gt;Public Domain and Creative Commons
&lt;/h3&gt;&lt;p&gt;Some movies and TV shows are in the public domain, meaning they’re free to use without permission. Websites like &lt;strong&gt;Public Domain Movies&lt;/strong&gt; and the &lt;strong&gt;Internet Archive&lt;/strong&gt; offer these films. Additionally, some creators release their work under &lt;strong&gt;Creative Commons licenses,&lt;/strong&gt; allowing free legal distribution under specific conditions.&lt;/p&gt;
&lt;h3 id=&#34;special-offers-and-bundles&#34;&gt;Special Offers and Bundles
&lt;/h3&gt;&lt;p&gt;Look for deals on digital marketplaces. Services like &lt;strong&gt;Humble Bundle&lt;/strong&gt; sometimes offer digital movies and documentaries at pay-what-you-want prices, making it a cost-effective way to legally acquire content.&lt;/p&gt;
&lt;h3 id=&#34;free-streaming-services&#34;&gt;Free Streaming Services
&lt;/h3&gt;&lt;p&gt;Platforms like &lt;strong&gt;Pluto TV, Tubi,&lt;/strong&gt; and &lt;strong&gt;Crackle&lt;/strong&gt; offer free, ad-supported streaming. Although they typically don’t allow downloads, they’re a legal and free way to enjoy content. Some services offer temporary downloads for offline viewing.&lt;/p&gt;
&lt;h3 id=&#34;library-services&#34;&gt;Library Services
&lt;/h3&gt;&lt;p&gt;Platforms like &lt;strong&gt;Hoopla&lt;/strong&gt; and &lt;strong&gt;Kanopy&lt;/strong&gt; partner with local libraries to provide free streaming of movies and TV shows. You’ll need a library card from a participating library. Although you can’t download files directly to your server, these services expand your legal viewing options for free.&lt;/p&gt;
&lt;h3 id=&#34;second-hand-used-media&#34;&gt;Second-Hand (Used) Media
&lt;/h3&gt;&lt;p&gt;Buying used DVDs and Blu-rays is a cost-effective and legal way to grow your collection. Here are some great places to find second-hand media:&lt;/p&gt;
&lt;h4 id=&#34;local-thrift-stores-and-garage-sales&#34;&gt;Local Thrift Stores and Garage Sales
&lt;/h4&gt;&lt;p&gt;These are goldmines for finding DVDs and Blu-rays at low prices. You might even come across rare or out-of-print titles. Just make sure to check the discs for scratches before buying.&lt;/p&gt;
&lt;h4 id=&#34;online-marketplaces&#34;&gt;Online Marketplaces
&lt;/h4&gt;&lt;p&gt;Websites like &lt;strong&gt;eBay, Craigslist,&lt;/strong&gt; and &lt;strong&gt;Facebook Marketplace&lt;/strong&gt; are great for buying used media. You can often find large collections at reasonable prices. Make sure to check seller ratings and reviews for reliability.&lt;/p&gt;
&lt;h4 id=&#34;used-bookstores-and-media-shops&#34;&gt;Used Bookstores and Media Shops
&lt;/h4&gt;&lt;p&gt;Many used bookstores also sell DVDs and Blu-rays, often inspecting them for quality. Specialty shops focusing on used media also provide peace of mind by guaranteeing that the discs are in working order.&lt;/p&gt;
&lt;h4 id=&#34;library-sales&#34;&gt;Library Sales
&lt;/h4&gt;&lt;p&gt;Sometimes libraries sell off older DVDs and Blu-rays to make room for new inventory. These sales are great for finding cheap movies while supporting your local library.&lt;/p&gt;
&lt;h3 id=&#34;tips-for-buying-second-hand-media&#34;&gt;Tips for Buying Second-Hand Media
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inspect Before Buying:&lt;/strong&gt; Check the disc for scratches or defects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for Completeness:&lt;/strong&gt; Make sure the original case, cover art, and inserts are included if they matter to you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be Patient:&lt;/strong&gt; Finding specific movies can take time, so check regularly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Negotiate:&lt;/strong&gt; Especially at garage sales or on online platforms, negotiating can save you even more money.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you’ve bought your second-hand media, you can rip the content using &lt;strong&gt;MakeMKV&lt;/strong&gt; and compress it with &lt;strong&gt;HandBrake&lt;/strong&gt; if needed. This gives you a legal, personal collection for your media server.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;best-practices&#34;&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Always Check the License:&lt;/strong&gt; Make sure any digital content is either DRM-free or that you’re allowed to convert it for personal use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stay Informed:&lt;/strong&gt; Copyright laws vary by country and can change, so stay up to date on what’s legal in your area.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support Creators:&lt;/strong&gt; Buying content directly from creators or through official channels ensures they get compensated, helping to sustain the industry and encourage more great content.&lt;/p&gt;
&lt;p&gt;By following these guidelines, you can build an impressive and legal collection for your home media server. Remember, the goal isn’t just to gather a massive library—it’s about curating and organizing your collection, discovering new favorites, and revisiting classics while respecting copyright laws and supporting the creators you love.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Embark on the Ultimate Home Media Journey</title>
        <link>https://diymediaserver.com/post/embark-on-the-ultimate-home-media-journey/</link>
        <pubDate>Fri, 20 Dec 2024 06:10:50 -0700</pubDate>
        
        <guid>https://diymediaserver.com/post/embark-on-the-ultimate-home-media-journey/</guid>
        <description>&lt;img src="https://diymediaserver.com/post/embark-on-the-ultimate-home-media-journey/diybuild.webp" alt="Featured image of post Embark on the Ultimate Home Media Journey" /&gt;&lt;p&gt;Are you tired of scrolling through endless streaming services only to find that your favorite show has disappeared? Or maybe you’re concerned about privacy and how these platforms handle your data? If you’ve ever dreamed of having a personalized entertainment hub where all your media lives in one place—accessible anytime without the prying eyes of subscription services—then you’re in the right spot.&lt;/p&gt;
&lt;p&gt;Whether you’re a seasoned tech enthusiast or just curious about getting started, my mission is to guide you through the process with ease. We’ll dive into setting up and fine-tuning your home media server, transforming the way you store, access, and enjoy your digital media library.&lt;/p&gt;
&lt;h2 id=&#34;what-is-a-home-media-server&#34;&gt;&lt;strong&gt;What is a Home Media Server?&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;A home media server is a dedicated computer or Network Attached Storage (NAS) device that stores all your digital media—movies, music, photos, and more. It acts as a central hub on your home network, letting you organize, stream, and share your media across multiple devices. Unlike streaming services that host content on remote servers, a home media server gives you complete control over your collection, allowing offline access, no subscription fees, and the freedom to customize your setup however you like.&lt;/p&gt;
&lt;h3 id=&#34;why-set-up-a-home-media-server&#34;&gt;Why Set Up a Home Media Server?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Centralized Storage:&lt;/strong&gt; Keep all your media in one place instead of having files scattered across different devices like phones, laptops, and external drives. This makes it much easier to organize, access, and back up your content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stream Anywhere in Your Home:&lt;/strong&gt; With a home media server, you can stream your content to any device on your network, from smart TVs and smartphones to tablets and computers. You’re not limited by the file formats supported by popular streaming services since you can transcode (convert) files to work with any device.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customization and Control:&lt;/strong&gt; You decide how your media is organized, displayed, and accessed. Set up user profiles, parental controls, and more. Plus, you’re not subject to the changing catalogs or restrictions of streaming platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cost-Effective:&lt;/strong&gt; After the initial setup (which can vary depending on your choices), running a home media server is extremely cost-effective. There are no monthly fees unless you choose to pay for specific premium services or apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Offline Access:&lt;/strong&gt; Because your content is stored locally, you can access your media even when the internet is down. Your entertainment is always at your fingertips.&lt;/p&gt;
&lt;p&gt;Building a home media server can be as simple or as complex as you want. Whether you’re repurposing an old computer or Raspberry Pi with external hard drives or setting up a dedicated NAS with advanced media management software, the journey is rewarding and a great way to learn more about networking, Linux, and digital media management.&lt;/p&gt;
&lt;h2 id=&#34;my-mission-making-home-media-servers-accessible&#34;&gt;&lt;strong&gt;My Mission: Making Home Media Servers Accessible&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Over the past 15 years, I’ve gained a lot of knowledge on this topic, and my goal is to share that experience in a way that’s easy to understand and follow. From picking the right hardware to choosing the best software for your needs, I’ll provide step-by-step guides, useful tips, and my best practices to help you build a media server that meets your expectations.&lt;/p&gt;
&lt;p&gt;Are my methods the only or absolute best way to do things? Maybe not—but they work, and the beauty of building your own media server is that you can tailor everything to fit your unique needs.&lt;/p&gt;
&lt;h3 id=&#34;easy-to-read-easy-to-understand&#34;&gt;&lt;strong&gt;Easy to Read, Easy to Understand&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;I’ll break down complex technical concepts into easy-to-digest bits. I’ll translate jargon into plain English, ensuring everything is clear, concise, and practical. Whether it’s understanding the basics of networking or diving into the specifics of media server software, I’ll make sure the information is accessible and straightforward.&lt;/p&gt;
&lt;h3 id=&#34;flattening-the-learning-curve&#34;&gt;&lt;strong&gt;Flattening the Learning Curve&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;I still remember my first attempt at setting up a home media server—the steep learning curve almost made me quit. But don’t worry. I’ve been through all the challenges, and my goal is to make your journey much smoother. By breaking the process into clear, logical steps and addressing common questions upfront, I want to give you the confidence to tackle this project successfully.&lt;/p&gt;
&lt;h3 id=&#34;lets-get-started&#34;&gt;&lt;strong&gt;Let’s Get Started!&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;In upcoming posts, we’ll cover everything from setting up a home media server using platforms like &lt;strong&gt;Linux, Proxmox,&lt;/strong&gt; and &lt;strong&gt;Docker&lt;/strong&gt; to optimizing your setup with apps like &lt;strong&gt;Jellyfin&lt;/strong&gt; for media management and &lt;strong&gt;Kodi&lt;/strong&gt; for playback. We’ll dive into using the &lt;strong&gt;Arr suite&lt;/strong&gt; for automated media management, how &lt;strong&gt;MergerFS&lt;/strong&gt; can simplify your storage strategy, and the benefits of &lt;strong&gt;Usenet&lt;/strong&gt; for content acquisition.&lt;/p&gt;
&lt;p&gt;This journey is about taking control of your digital media experience, protecting your privacy, and enjoying the satisfaction of a DIY tech project. Whether you’re aiming for a simple setup to stream your movie collection or a sophisticated server with all the bells and whistles, I’m here to guide you every step of the way.&lt;/p&gt;
&lt;p&gt;Stay tuned, and let’s embark on this exciting adventure together!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>About Me</title>
        <link>https://diymediaserver.com/about/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://diymediaserver.com/about/</guid>
        <description>&lt;p&gt;So you want out of Big Streaming and their constant price increases? Good. You’re in the right place.&lt;/p&gt;
&lt;p&gt;I’m Steve - online, you’ll find me as KryptikWurm, and I’ve been building, breaking, and rebuilding home media servers since before most people knew what Kodi, Jellyfin, and Plex were. This blog is the cheat sheet I wish I had when I started. No fluff. Just real-world homelab advice from someone who’s been in the trenches.&lt;/p&gt;
&lt;p&gt;It all started in 2010. Cable TV sucked. Streaming was a mess. I wanted a clean setup where my media actually worked for me. So I built it. Then I rebuilt it. Then dockerized it. Then Proxmoxed LXC&amp;rsquo;d it. Then dockerized it again. And now? It runs like a dream (mostly).&lt;/p&gt;
&lt;p&gt;This site exists so you don’t have to make the same mistakes I did. Or at least not all of them.&lt;/p&gt;
&lt;h2 id=&#34;what-this-blogs-really-about&#34;&gt;What This Blog’s Really About
&lt;/h2&gt;&lt;p&gt;DIYMediaServer is your blueprint for ditching the noise and building a home media empire that’s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Private&lt;/li&gt;
&lt;li&gt;Powerful&lt;/li&gt;
&lt;li&gt;Fully under your control&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I cover everything from the essentials to the edge cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxmox and virtualized media stacks&lt;/li&gt;
&lt;li&gt;Docker, containers, and self-hosted apps&lt;/li&gt;
&lt;li&gt;Plex, Jellyfin, and the full Arr suite&lt;/li&gt;
&lt;li&gt;Usenet, torrents, and automation&lt;/li&gt;
&lt;li&gt;Storage strategies with MergerFS, SnapRAID, and ZFS&lt;/li&gt;
&lt;li&gt;Networking, VPNs, and remote access, without selling your soul to Google&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’ve ever screamed at Snap for breaking your stack or sat through a 3AM “why won’t Sonarr start” panic, welcome. You’ve found your people.&lt;/p&gt;
&lt;h2 id=&#34;my-philosophy&#34;&gt;My Philosophy
&lt;/h2&gt;&lt;p&gt;Keep It Simple, Stupid.&lt;/p&gt;
&lt;p&gt;You don’t need enterprise gear or 12 certs to run a killer setup. You need the right tools, some guidance, and a system that makes sense for your life.&lt;/p&gt;
&lt;p&gt;I’m not here to sell you on “one right way.” I’m here to help you find your way and ensure you don’t throw a perfectly good computer out the window in the process.&lt;/p&gt;
&lt;h2 id=&#34;why-i-built-this&#34;&gt;Why I Built This
&lt;/h2&gt;&lt;p&gt;Because I spent way too many hours piecing together forums, Reddit rants, and YouTube half-truths. I wanted a place that cut through the noise. A place that teaches real solutions, not just dry how-tos. This is that place.&lt;/p&gt;
&lt;p&gt;Whether you’re setting up your first NAS or refining your 12-container media stack, my goal is simple: Help you take control, avoid landmines, and enjoy the ride.&lt;/p&gt;
&lt;p&gt;Join the Mission
Got a better way to run Sonarr in Docker? Want to nerd out about BTRFS vs. ZFS? Cool. This site isn’t just me on a soapbox—it’s a community of digital tinkerers who actually use their setups and aren’t afraid to break stuff along the way.&lt;/p&gt;
&lt;p&gt;Let’s build smarter. Let’s build together.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Archives</title>
        <link>https://diymediaserver.com/archives/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://diymediaserver.com/archives/</guid>
        <description></description>
        </item>
        <item>
        <title>Search</title>
        <link>https://diymediaserver.com/page/search/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://diymediaserver.com/page/search/</guid>
        <description></description>
        </item>
        
    </channel>
</rss>
