<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.bankai-tech.com/blog</id>
    <title>Bankai-Tech Docs Blog</title>
    <updated>2026-03-04T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.bankai-tech.com/blog"/>
    <subtitle>Bankai-Tech Docs Blog</subtitle>
    <icon>https://docs.bankai-tech.com/img/favcon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Welcome to the Bankai-Tech Blog]]></title>
        <id>https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog</id>
        <link href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog"/>
        <updated>2026-03-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Welcome to the official Bankai-Tech blog! This is where I'll be sharing news, tutorials, deep-dives, and thoughts on all things self-hosting, Docker, and homelab infrastructure.]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the official Bankai-Tech blog! This is where I'll be sharing news, tutorials, deep-dives, and thoughts on all things self-hosting, Docker, and homelab infrastructure.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-start-a-blog">Why Start a Blog?<a href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog#why-start-a-blog" class="hash-link" aria-label="Direct link to Why Start a Blog?" title="Direct link to Why Start a Blog?" translate="no">​</a></h2>
<p>After years of documenting various self-hosting solutions and Docker configurations, I realized that some content doesn't quite fit the documentation format. Sometimes you want to:</p>
<ul>
<li class=""><strong>Share thoughts and opinions</strong> on new tools and technologies</li>
<li class=""><strong>Discuss trends</strong> in the self-hosting community</li>
<li class=""><strong>Provide quick tips</strong> that don't warrant a full tutorial</li>
<li class=""><strong>Announce updates</strong> to the documentation site</li>
<li class=""><strong>Document my homelab journey</strong> and lessons learned</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-expect">What to Expect<a href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog#what-to-expect" class="hash-link" aria-label="Direct link to What to Expect" title="Direct link to What to Expect" translate="no">​</a></h2>
<p>Here's what you can look forward to in future posts:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="technical-deep-dives">Technical Deep-Dives<a href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog#technical-deep-dives" class="hash-link" aria-label="Direct link to Technical Deep-Dives" title="Direct link to Technical Deep-Dives" translate="no">​</a></h3>
<p>Detailed explorations of specific technologies, comparing different approaches, and sharing real-world experiences running services in production.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-tips--tricks">Quick Tips &amp; Tricks<a href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog#quick-tips--tricks" class="hash-link" aria-label="Direct link to Quick Tips &amp; Tricks" title="Direct link to Quick Tips &amp; Tricks" translate="no">​</a></h3>
<p>Short, actionable tips that can improve your homelab setup without requiring a full tutorial read.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="news--updates">News &amp; Updates<a href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog#news--updates" class="hash-link" aria-label="Direct link to News &amp; Updates" title="Direct link to News &amp; Updates" translate="no">​</a></h3>
<p>Announcements about new documentation, major updates to tools we cover, and community news.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="homelab-stories">Homelab Stories<a href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog#homelab-stories" class="hash-link" aria-label="Direct link to Homelab Stories" title="Direct link to Homelab Stories" translate="no">​</a></h3>
<p>Real experiences from running a homelab - the wins, the fails, and everything in between.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-community">Join the Community<a href="https://docs.bankai-tech.com/blog/welcome-to-bankai-tech-blog#join-the-community" class="hash-link" aria-label="Direct link to Join the Community" title="Direct link to Join the Community" translate="no">​</a></h2>
<p>If you're interested in self-hosting and homelabs, make sure to:</p>
<ul>
<li class="">Join our <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord server</a> for real-time discussions</li>
<li class="">Check out the <a class="" href="https://docs.bankai-tech.com/Docker/Introduction">documentation</a> for detailed tutorials</li>
<li class="">Consider <a href="https://buymeacoffee.com/BankaiTech" target="_blank" rel="noopener noreferrer" class="">buying me a beer</a> if you find this content helpful</li>
</ul>
<p>Thanks for reading, and stay tuned for more content!</p>
<hr>
<p><em>What topics would you like to see covered? Drop a message in Discord!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="announcements" term="announcements"/>
        <category label="homelab" term="homelab"/>
        <category label="self-hosting" term="self-hosting"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Docker Compose Best Practices for 2026]]></title>
        <id>https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026</id>
        <link href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026"/>
        <updated>2026-02-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[After running dozens of Docker containers across multiple servers, I've compiled my top best practices for writing maintainable, secure, and efficient Docker Compose files.]]></summary>
        <content type="html"><![CDATA[<p>After running dozens of Docker containers across multiple servers, I've compiled my top best practices for writing maintainable, secure, and efficient Docker Compose files.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-always-pin-your-image-versions">1. Always Pin Your Image Versions<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#1-always-pin-your-image-versions" class="hash-link" aria-label="Direct link to 1. Always Pin Your Image Versions" title="Direct link to 1. Always Pin Your Image Versions" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># ❌ Don't do this</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">postgres</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> postgres</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># ✅ Do this instead</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">postgres</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> postgres</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">16.2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">alpine</span><br></div></code></pre></div></div>
<p>Using <code>latest</code> might seem convenient, but it can lead to unexpected breaking changes when images update. Always pin to specific versions and update intentionally.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-use-environment-files">2. Use Environment Files<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#2-use-environment-files" class="hash-link" aria-label="Direct link to 2. Use Environment Files" title="Direct link to 2. Use Environment Files" translate="no">​</a></h2>
<p>Keep your secrets and configuration out of your compose files:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> myapp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">1.0.0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">env_file</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> .env</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> .env.local</span><br></div></code></pre></div></div>
<p>Create a <code>.env.example</code> file to document required variables:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># .env.example</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">DATABASE_URL</span><span class="token operator">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">REDIS_URL</span><span class="token operator">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">SECRET_KEY</span><span class="token operator">=</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-implement-health-checks">3. Implement Health Checks<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#3-implement-health-checks" class="hash-link" aria-label="Direct link to 3. Implement Health Checks" title="Direct link to 3. Implement Health Checks" translate="no">​</a></h2>
<p>Don't assume your container is healthy just because it started:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">1.25</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">alpine</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">healthcheck</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">test</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"CMD"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"curl"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"-f"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://localhost"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">interval</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 30s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">timeout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 10s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">retries</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">start_period</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 40s</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-set-resource-limits">4. Set Resource Limits<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#4-set-resource-limits" class="hash-link" aria-label="Direct link to 4. Set Resource Limits" title="Direct link to 4. Set Resource Limits" translate="no">​</a></h2>
<p>Prevent runaway containers from consuming all available resources:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> myapp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">1.0.0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">deploy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">limits</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">cpus</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'2.0'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 2G</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">reservations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">cpus</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'0.5'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 512M</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-use-named-volumes-for-persistent-data">5. Use Named Volumes for Persistent Data<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#5-use-named-volumes-for-persistent-data" class="hash-link" aria-label="Direct link to 5. Use Named Volumes for Persistent Data" title="Direct link to 5. Use Named Volumes for Persistent Data" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">database</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> postgres</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">16.2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">alpine</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> postgres_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/var/lib/postgresql/data</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">postgres_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> myapp_postgres_data</span><br></div></code></pre></div></div>
<p>Named volumes are easier to manage, backup, and migrate than bind mounts for database storage.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-organize-with-networks">6. Organize with Networks<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#6-organize-with-networks" class="hash-link" aria-label="Direct link to 6. Organize with Networks" title="Direct link to 6. Organize with Networks" translate="no">​</a></h2>
<p>Separate your services into logical networks:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">frontend</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> backend</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">database</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> backend</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">frontend</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  backend</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<p>This limits which services can communicate with each other, improving security.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-use-depends-on-with-conditions">7. Use Depends On with Conditions<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#7-use-depends-on-with-conditions" class="hash-link" aria-label="Direct link to 7. Use Depends On with Conditions" title="Direct link to 7. Use Depends On with Conditions" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">depends_on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">database</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">condition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> service_healthy</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">condition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> service_started</span><br></div></code></pre></div></div>
<p>This ensures your services start in the correct order and wait for dependencies to be ready.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wrapping-up">Wrapping Up<a href="https://docs.bankai-tech.com/blog/docker-compose-best-practices-2026#wrapping-up" class="hash-link" aria-label="Direct link to Wrapping Up" title="Direct link to Wrapping Up" translate="no">​</a></h2>
<p>These practices have saved me countless hours of debugging and made my homelab much more reliable. Start implementing them one at a time, and you'll notice the difference.</p>
<p>Have your own best practices? Share them in our <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</p>
<hr>
<p><em>Next up: A deep dive into Docker networking and troubleshooting common issues.</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="docker" term="docker"/>
        <category label="best-practices" term="best-practices"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[5 Quick Docker Troubleshooting Commands You Should Know]]></title>
        <id>https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting</id>
        <link href="https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting"/>
        <updated>2026-02-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Here are five Docker commands that have saved me hours of debugging time. Bookmark this one!]]></summary>
        <content type="html"><![CDATA[<p>Here are five Docker commands that have saved me hours of debugging time. Bookmark this one!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-follow-container-logs-with-timestamps">1. Follow Container Logs with Timestamps<a href="https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting#1-follow-container-logs-with-timestamps" class="hash-link" aria-label="Direct link to 1. Follow Container Logs with Timestamps" title="Direct link to 1. Follow Container Logs with Timestamps" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> logs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--timestamps</span><span class="token plain"> container_name</span><br></div></code></pre></div></div>
<p>The <code>-f</code> flag follows the log output (like <code>tail -f</code>), and <code>--timestamps</code> adds timestamps to each line. Essential for correlating events across multiple containers.</p>
<p><strong>Pro tip:</strong> Limit output with <code>--tail</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> logs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--tail</span><span class="token plain"> </span><span class="token number">100</span><span class="token plain"> container_name</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-get-a-shell-in-a-running-container">2. Get a Shell in a Running Container<a href="https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting#2-get-a-shell-in-a-running-container" class="hash-link" aria-label="Direct link to 2. Get a Shell in a Running Container" title="Direct link to 2. Get a Shell in a Running Container" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-it</span><span class="token plain"> container_name /bin/sh</span><br></div></code></pre></div></div>
<p>If <code>/bin/sh</code> doesn't work (minimal containers), try <code>/bin/bash</code> or <code>ash</code>. This lets you poke around inside the container to debug issues.</p>
<p>For containers that don't have a shell at all:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--pid</span><span class="token operator">=</span><span class="token plain">container:container_name </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--net</span><span class="token operator">=</span><span class="token plain">container:container_name alpine </span><span class="token function" style="color:rgb(80, 250, 123)">sh</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-inspect-container-details">3. Inspect Container Details<a href="https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting#3-inspect-container-details" class="hash-link" aria-label="Direct link to 3. Inspect Container Details" title="Direct link to 3. Inspect Container Details" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> inspect container_name </span><span class="token operator">|</span><span class="token plain"> jq </span><span class="token string" style="color:rgb(255, 121, 198)">'.[0].NetworkSettings.Networks'</span><br></div></code></pre></div></div>
<p>Combined with <code>jq</code>, you can extract exactly what you need. Common queries:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get IP address</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> inspect </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'</span><span class="token plain"> container_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get mounted volumes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> inspect </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{{range .Mounts}}{{.Source}} -&gt; {{.Destination}}{{"\n"}}{{end}}'</span><span class="token plain"> container_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get environment variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> inspect </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{{range .Config.Env}}{{println .}}{{end}}'</span><span class="token plain"> container_name</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-check-resource-usage">4. Check Resource Usage<a href="https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting#4-check-resource-usage" class="hash-link" aria-label="Direct link to 4. Check Resource Usage" title="Direct link to 4. Check Resource Usage" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> stats --no-stream</span><br></div></code></pre></div></div>
<p>Shows CPU, memory, network, and disk I/O for all running containers. The <code>--no-stream</code> flag gives you a snapshot instead of real-time updates.</p>
<p>For a specific container with more details:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> stats container_name</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-clean-up-docker-system">5. Clean Up Docker System<a href="https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting#5-clean-up-docker-system" class="hash-link" aria-label="Direct link to 5. Clean Up Docker System" title="Direct link to 5. Clean Up Docker System" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Remove unused containers, networks, images, and optionally volumes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> system prune </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-a</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># See what's using disk space</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> system </span><span class="token function" style="color:rgb(80, 250, 123)">df</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Nuclear option - reclaim ALL space (careful!)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> system prune </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-a</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--volumes</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>The <code>--volumes</code> flag will remove named volumes not used by any container. Make sure you have backups!</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bonus-docker-compose-specific">Bonus: Docker Compose Specific<a href="https://docs.bankai-tech.com/blog/quick-tips-docker-troubleshooting#bonus-docker-compose-specific" class="hash-link" aria-label="Direct link to Bonus: Docker Compose Specific" title="Direct link to Bonus: Docker Compose Specific" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Rebuild a single service without cache</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose build --no-cache service_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># View logs for all services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose logs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Restart a single service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose restart service_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># See running containers in a compose project</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose </span><span class="token function" style="color:rgb(80, 250, 123)">ps</span><br></div></code></pre></div></div>
<hr>
<p>What are your go-to Docker troubleshooting commands? Share them in <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="docker" term="docker"/>
        <category label="quick-tips" term="quick-tips"/>
        <category label="troubleshooting" term="troubleshooting"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Why I Chose Proxmox: From Single Host to Proper Virtualization]]></title>
        <id>https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026</id>
        <link href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026"/>
        <updated>2026-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Before Proxmox, all my services ran on a single host with no isolation. One bad update could take down everything. Here's why I chose Proxmox and how virtualization transformed my homelab.]]></summary>
        <content type="html"><![CDATA[<p>Before Proxmox, all my services ran on a single host with no isolation. One bad update could take down everything. Here's why I chose Proxmox and how virtualization transformed my homelab.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-everything-on-one-host">The Problem: Everything on One Host<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#the-problem-everything-on-one-host" class="hash-link" aria-label="Direct link to The Problem: Everything on One Host" title="Direct link to The Problem: Everything on One Host" translate="no">​</a></h2>
<p>My original setup was simple but fragile:</p>
<ul>
<li class="">Docker containers running directly on the host OS</li>
<li class="">No isolation between services</li>
<li class="">One kernel panic = entire homelab down</li>
<li class="">Updates were terrifying</li>
<li class="">No easy way to snapshot or rollback</li>
</ul>
<p>It worked, but it wasn't sustainable.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-virtualization">Why Virtualization?<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#why-virtualization" class="hash-link" aria-label="Direct link to Why Virtualization?" title="Direct link to Why Virtualization?" translate="no">​</a></h2>
<p>Moving to a hypervisor provides:</p>
<ul>
<li class=""><strong>Isolation</strong> - Problems in one VM don't affect others</li>
<li class=""><strong>Snapshots</strong> - Test changes safely, rollback instantly</li>
<li class=""><strong>Resource management</strong> - Allocate CPU/RAM per workload</li>
<li class=""><strong>Flexibility</strong> - Run different OSes side by side</li>
<li class=""><strong>Better backups</strong> - Backup entire VMs easily</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="options-i-considered">Options I Considered<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#options-i-considered" class="hash-link" aria-label="Direct link to Options I Considered" title="Direct link to Options I Considered" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vmware-esxi">VMware ESXi<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#vmware-esxi" class="hash-link" aria-label="Direct link to VMware ESXi" title="Direct link to VMware ESXi" translate="no">​</a></h3>
<p>The enterprise standard, but in 2023 Broadcom acquired VMware and discontinued the free ESXi hypervisor. Even before that, the free tier had limitations that made it less appealing for homelabs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="proxmox-ve">Proxmox VE<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#proxmox-ve" class="hash-link" aria-label="Direct link to Proxmox VE" title="Direct link to Proxmox VE" translate="no">​</a></h3>
<p>Open source, free, and actively developed. Supports both VMs and LXC containers. This is what I went with.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-options">Other Options<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#other-options" class="hash-link" aria-label="Direct link to Other Options" title="Direct link to Other Options" translate="no">​</a></h3>
<ul>
<li class=""><strong>Hyper-V</strong> - Windows-only, still need a Windows license</li>
<li class=""><strong>XCP-ng</strong> - Solid option, but smaller community</li>
<li class=""><strong>Unraid</strong> - Great for storage-focused builds</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-proxmox-won">Why Proxmox Won<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#why-proxmox-won" class="hash-link" aria-label="Direct link to Why Proxmox Won" title="Direct link to Why Proxmox Won" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-its-truly-free-and-open-source">1. It's Truly Free (and Open Source)<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#1-its-truly-free-and-open-source" class="hash-link" aria-label="Direct link to 1. It's Truly Free (and Open Source)" title="Direct link to 1. It's Truly Free (and Open Source)" translate="no">​</a></h3>
<p>Proxmox VE is free to use without artificial limitations. The paid subscription gets you enterprise support and access to the stable repository, but the free tier is fully functional.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-built-in-container-support">2. Built-in Container Support<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#2-built-in-container-support" class="hash-link" aria-label="Direct link to 2. Built-in Container Support" title="Direct link to 2. Built-in Container Support" translate="no">​</a></h3>
<p>Proxmox supports both VMs and LXC containers out of the box. Running lightweight services in containers instead of full VMs saves significant resources.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a container from template</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">pct create </span><span class="token number">100</span><span class="token plain"> local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-hostname</span><span class="token plain"> mycontainer </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-memory</span><span class="token plain"> </span><span class="token number">2048</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-cores</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-rootfs</span><span class="token plain"> local-lvm:8</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-web-based-management">3. Web-Based Management<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#3-web-based-management" class="hash-link" aria-label="Direct link to 3. Web-Based Management" title="Direct link to 3. Web-Based Management" translate="no">​</a></h3>
<p>The Proxmox web UI is modern and capable. No need for special client software—just a browser.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-excellent-zfs-integration">4. Excellent ZFS Integration<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#4-excellent-zfs-integration" class="hash-link" aria-label="Direct link to 4. Excellent ZFS Integration" title="Direct link to 4. Excellent ZFS Integration" translate="no">​</a></h3>
<p>Native ZFS support means I can create pools, snapshots, and replications directly from the UI.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-clustering-is-free">5. Clustering is Free<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#5-clustering-is-free" class="hash-link" aria-label="Direct link to 5. Clustering is Free" title="Direct link to 5. Clustering is Free" translate="no">​</a></h3>
<p>Want to cluster multiple nodes? It's included. No additional licensing required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-setup-now">My Setup Now<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#my-setup-now" class="hash-link" aria-label="Direct link to My Setup Now" title="Direct link to My Setup Now" translate="no">​</a></h2>
<p>After migrating to Proxmox:</p>
<ul>
<li class=""><strong>Separate VMs</strong> for different workloads (media, networking, development)</li>
<li class=""><strong>LXC containers</strong> for lightweight services</li>
<li class=""><strong>Snapshots before updates</strong> - no more fear</li>
<li class=""><strong>Easy backups</strong> to NAS storage</li>
<li class=""><strong>GPU passthrough</strong> to a dedicated VM</li>
</ul>
<p>The difference is night and day. I can experiment freely knowing I can roll back in seconds.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://docs.bankai-tech.com/blog/why-i-chose-proxmox-homelab-2026#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>If you're still running everything on bare metal, consider making the switch. Check out my <a class="" href="https://docs.bankai-tech.com/Proxmox/Introduction">Proxmox installation guide</a> for a step-by-step walkthrough.</p>
<hr>
<p><em>Still running everything on a single host? Made the switch to virtualization? Share your experience on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="proxmox" term="proxmox"/>
        <category label="virtualization" term="virtualization"/>
        <category label="homelab" term="homelab"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Homelab Year in Review: 2025]]></title>
        <id>https://docs.bankai-tech.com/blog/homelab-year-in-review-2025</id>
        <link href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025"/>
        <updated>2025-12-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[As we wrap up 2025, I wanted to reflect on the changes to my homelab setup, what worked, what didn't, and plans for the new year.]]></summary>
        <content type="html"><![CDATA[<p>As we wrap up 2025, I wanted to reflect on the changes to my homelab setup, what worked, what didn't, and plans for the new year.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-numbers">The Numbers<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#the-numbers" class="hash-link" aria-label="Direct link to The Numbers" title="Direct link to The Numbers" translate="no">​</a></h2>
<p>Let's start with some stats from this year:</p>
<ul>
<li class=""><strong>40+</strong> containers running daily</li>
<li class=""><strong>99.7%</strong> uptime (excluding planned maintenance)</li>
<li class=""><strong>150TB</strong> of data managed</li>
<li class=""><strong>3</strong> major outages (all self-inflicted 😅)</li>
<li class=""><strong>0</strong> security incidents</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="major-additions">Major Additions<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#major-additions" class="hash-link" aria-label="Direct link to Major Additions" title="Direct link to Major Additions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="jellyfin-migration">Jellyfin Migration<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#jellyfin-migration" class="hash-link" aria-label="Direct link to Jellyfin Migration" title="Direct link to Jellyfin Migration" translate="no">​</a></h3>
<p>Finally made the switch from Plex to Jellyfin. The reasons:</p>
<ol>
<li class="">No account required for local streaming</li>
<li class="">Hardware transcoding works great without a subscription</li>
<li class="">Open source = no surprise feature removals</li>
<li class="">Active community development</li>
</ol>
<p>The migration was smoother than expected. All my users adjusted within a week.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="arr-stack-overhaul">Arr Stack Overhaul<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#arr-stack-overhaul" class="hash-link" aria-label="Direct link to Arr Stack Overhaul" title="Direct link to Arr Stack Overhaul" translate="no">​</a></h3>
<p>Rebuilt my entire Arr stack from scratch using the <a class="" href="https://docs.bankai-tech.com/Examples/Arr%20Suite/Docs/Full%20Stack/docker-compose">full stack guide</a>. Key improvements:</p>
<ul>
<li class="">Moved to hardlinks for storage efficiency</li>
<li class="">Implemented proper folder structure</li>
<li class="">Set up cross-seed for ratio maintenance</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-upgrade">Network Upgrade<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#network-upgrade" class="hash-link" aria-label="Direct link to Network Upgrade" title="Direct link to Network Upgrade" translate="no">​</a></h3>
<p>Upgraded my network infrastructure:</p>
<ul>
<li class="">Replaced my aging Netgear Router with a UDM Pro paired with some Unifi APs</li>
<li class="">Added 10GbE between Gateway | NVR | Switch</li>
<li class="">Implemented proper VLANs (finally!)</li>
<li class="">Upgraded Internet plan to 2GB/1GB Fiber Optic</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-didnt-work">What Didn't Work<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#what-didnt-work" class="hash-link" aria-label="Direct link to What Didn't Work" title="Direct link to What Didn't Work" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="automated-everything">Automated Everything<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#automated-everything" class="hash-link" aria-label="Direct link to Automated Everything" title="Direct link to Automated Everything" translate="no">​</a></h3>
<p>Tried to automate too much, too fast. Spent more time fixing automation than it would have taken to just do things manually. Lesson learned: automate incrementally.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lessons-learned">Lessons Learned<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#lessons-learned" class="hash-link" aria-label="Direct link to Lessons Learned" title="Direct link to Lessons Learned" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Backups are mandatory</strong> - Lost the majority of our family pictures when a drive failed. Now running syncthing backup strategy to all owned PCs/Laptops for multiple backups.</p>
</li>
<li class="">
<p><strong>Document as you go</strong> - Future you will thank present you.</p>
</li>
<li class="">
<p><strong>Start simple</strong> - The fancy solution isn't always the right solution.</p>
</li>
<li class="">
<p><strong>The community is helpful</strong> - Don't be afraid to ask questions. Everyone was a beginner once.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plans-for-2026">Plans for 2026<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#plans-for-2026" class="hash-link" aria-label="Direct link to Plans for 2026" title="Direct link to Plans for 2026" translate="no">​</a></h2>
<p>Here's what's on the roadmap:</p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Set up proper monitoring with Grafana/Prometheus</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Implement GitOps for configuration management</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Build a dedicated backup server</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Write more documentation and blog posts!</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thank-you">Thank You<a href="https://docs.bankai-tech.com/blog/homelab-year-in-review-2025#thank-you" class="hash-link" aria-label="Direct link to Thank You" title="Direct link to Thank You" translate="no">​</a></h2>
<p>Thanks to everyone who's used this documentation, joined the Discord, or just stopped by. Building this community has been one of the highlights of my year.</p>
<p>Here's to more uptime, fewer 3 AM debugging sessions, and continued learning in 2026!</p>
<hr>
<p><em>What were your homelab highlights of 2025? Share them in the <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="homelab" term="homelab"/>
        <category label="year-review" term="year-review"/>
        <category label="personal" term="personal"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[MariaDB in Docker: Maintenance and Updates]]></title>
        <id>https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide</id>
        <link href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide"/>
        <updated>2025-11-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Running MariaDB in Docker is easy, but maintaining it properly requires some knowledge. Here's how to update, backup, and troubleshoot your MariaDB containers.]]></summary>
        <content type="html"><![CDATA[<p>Running MariaDB in Docker is easy, but maintaining it properly requires some knowledge. Here's how to update, backup, and troubleshoot your MariaDB containers.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-mariadb">Why MariaDB?<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#why-mariadb" class="hash-link" aria-label="Direct link to Why MariaDB?" title="Direct link to Why MariaDB?" translate="no">​</a></h2>
<p>MariaDB is the community-developed fork of MySQL, offering:</p>
<ul>
<li class=""><strong>Open source</strong> - Truly free, no licensing concerns</li>
<li class=""><strong>MySQL compatible</strong> - Drop-in replacement</li>
<li class=""><strong>Active development</strong> - Regular security updates</li>
<li class=""><strong>Performance</strong> - Often faster than MySQL</li>
<li class=""><strong>Docker ready</strong> - Official images available</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-docker-setup">Basic Docker Setup<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#basic-docker-setup" class="hash-link" aria-label="Direct link to Basic Docker Setup" title="Direct link to Basic Docker Setup" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">mariadb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> mariadb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">10.11</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_ROOT_PASSWORD=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_ROOT_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_DATABASE=myapp</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_USER=myuser</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_PASSWORD=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> mariadb_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/var/lib/mysql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3306:3306"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  mariadb_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="backup-strategies">Backup Strategies<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#backup-strategies" class="hash-link" aria-label="Direct link to Backup Strategies" title="Direct link to Backup Strategies" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1-mysqldump">Method 1: mysqldump<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#method-1-mysqldump" class="hash-link" aria-label="Direct link to Method 1: mysqldump" title="Direct link to Method 1: mysqldump" translate="no">​</a></h3>
<p>Best for small/medium databases:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Backup</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> mariadb mysqldump </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root -p</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${DB_ROOT_PASSWORD}</span><span class="token plain"> --all-databases </span><span class="token operator">&gt;</span><span class="token plain"> backup.sql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Single database</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> mariadb mysqldump </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root -p</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${DB_ROOT_PASSWORD}</span><span class="token plain"> mydatabase </span><span class="token operator">&gt;</span><span class="token plain"> mydatabase.sql</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2-volume-backup">Method 2: Volume Backup<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#method-2-volume-backup" class="hash-link" aria-label="Direct link to Method 2: Volume Backup" title="Direct link to Method 2: Volume Backup" translate="no">​</a></h3>
<p>Best for large databases:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Stop container first!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> stop mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Backup volume</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> mariadb_data:/data:ro </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token variable builtin class-name" style="color:rgb(189, 147, 249);font-style:italic">pwd</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token plain">:/backup </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  alpine </span><span class="token function" style="color:rgb(80, 250, 123)">tar</span><span class="token plain"> czf /backup/mariadb-data.tar.gz /data</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Restart</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> start mariadb</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3-automated-backups">Method 3: Automated Backups<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#method-3-automated-backups" class="hash-link" aria-label="Direct link to Method 3: Automated Backups" title="Direct link to Method 3: Automated Backups" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">mariadb-backup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> databack/mysql</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">backup</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> mariadb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">backup</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DB_SERVER=mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DB_USER=root</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DB_PASS=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_ROOT_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DB_DUMP_TARGET=/backup</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DB_DUMP_FREQ=1440  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Daily</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DB_DUMP_BEGIN=0300 </span><span class="token comment" style="color:rgb(98, 114, 164)"># 3 AM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ./backups</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/backup</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">depends_on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> mariadb</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-mariadb">Updating MariaDB<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#updating-mariadb" class="hash-link" aria-label="Direct link to Updating MariaDB" title="Direct link to Updating MariaDB" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="minor-updates-1011x">Minor Updates (10.11.x)<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#minor-updates-1011x" class="hash-link" aria-label="Direct link to Minor Updates (10.11.x)" title="Direct link to Minor Updates (10.11.x)" translate="no">​</a></h3>
<p>Safe and usually painless:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Update image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose pull mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Recreate container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> mariadb</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="major-updates-10x--11x">Major Updates (10.x → 11.x)<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#major-updates-10x--11x" class="hash-link" aria-label="Direct link to Major Updates (10.x → 11.x)" title="Direct link to Major Updates (10.x → 11.x)" translate="no">​</a></h3>
<p><strong>Always backup first!</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># 1. Backup everything</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> mariadb mysqldump </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> --all-databases </span><span class="token operator">&gt;</span><span class="token plain"> pre-upgrade.sql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 2. Stop container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose stop mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 3. Update compose file version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># image: mariadb:10.11  →  image: mariadb:11.2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 4. Start new version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 5. Run upgrade script</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> mariadb mysql_upgrade </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mysql_upgrade-explained">mysql_upgrade Explained<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#mysql_upgrade-explained" class="hash-link" aria-label="Direct link to mysql_upgrade Explained" title="Direct link to mysql_upgrade Explained" translate="no">​</a></h3>
<p>After major version upgrades, run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-it</span><span class="token plain"> mariadb mysql_upgrade </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><br></div></code></pre></div></div>
<p>This:</p>
<ul>
<li class="">Upgrades system tables</li>
<li class="">Checks all tables</li>
<li class="">Fixes compatibility issues</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="restoring-from-backup">Restoring from Backup<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#restoring-from-backup" class="hash-link" aria-label="Direct link to Restoring from Backup" title="Direct link to Restoring from Backup" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-mysqldump">From mysqldump<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#from-mysqldump" class="hash-link" aria-label="Direct link to From mysqldump" title="Direct link to From mysqldump" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Restore all databases</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-i</span><span class="token plain"> mariadb mysql </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root -p</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${DB_ROOT_PASSWORD}</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain"> backup.sql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Restore single database</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-i</span><span class="token plain"> mariadb mysql </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root -p</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${DB_ROOT_PASSWORD}</span><span class="token plain"> mydatabase </span><span class="token operator">&lt;</span><span class="token plain"> mydatabase.sql</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-volume-backup">From Volume Backup<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#from-volume-backup" class="hash-link" aria-label="Direct link to From Volume Backup" title="Direct link to From Volume Backup" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Stop container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> stop mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Remove old volume</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> volume </span><span class="token function" style="color:rgb(80, 250, 123)">rm</span><span class="token plain"> mariadb_data</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Restore volume</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> mariadb_data:/data </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token variable builtin class-name" style="color:rgb(189, 147, 249);font-style:italic">pwd</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token plain">:/backup </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  alpine </span><span class="token function" style="color:rgb(80, 250, 123)">tar</span><span class="token plain"> xzf /backup/mariadb-data.tar.gz </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-C</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Start container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> start mariadb</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-tuning">Performance Tuning<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#performance-tuning" class="hash-link" aria-label="Direct link to Performance Tuning" title="Direct link to Performance Tuning" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-tuning">Basic Tuning<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#basic-tuning" class="hash-link" aria-label="Direct link to Basic Tuning" title="Direct link to Basic Tuning" translate="no">​</a></h3>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">custom.cnf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token section punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token section section-name selector" style="color:rgb(255, 121, 198)">mysqld</span><span class="token section punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key attr-name" style="color:rgb(241, 250, 140)">innodb_buffer_pool_size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">1G</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key attr-name" style="color:rgb(241, 250, 140)">innodb_log_file_size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">256M</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key attr-name" style="color:rgb(241, 250, 140)">innodb_flush_log_at_trx_commit</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key attr-name" style="color:rgb(241, 250, 140)">max_connections</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">200</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key attr-name" style="color:rgb(241, 250, 140)">query_cache_size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key attr-name" style="color:rgb(241, 250, 140)">query_cache_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">0</span><br></div></code></pre></div></div>
<p>Mount config file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ./custom.cnf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/etc/mysql/conf.d/custom.cnf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ro</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring">Monitoring<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#monitoring" class="hash-link" aria-label="Direct link to Monitoring" title="Direct link to Monitoring" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Check status</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> mariadb mysqladmin </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> status</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Show processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> mariadb mysqladmin </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> processlist</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Interactive monitor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-it</span><span class="token plain"> mariadb mysql </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-e</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SHOW FULL PROCESSLIST;"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-issues">Common Issues<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#common-issues" class="hash-link" aria-label="Direct link to Common Issues" title="Direct link to Common Issues" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="container-wont-start">Container Won't Start<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#container-wont-start" class="hash-link" aria-label="Direct link to Container Won't Start" title="Direct link to Container Won't Start" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Check logs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> logs mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Common: permissions issue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> mariadb_data:/data alpine </span><span class="token function" style="color:rgb(80, 250, 123)">chown</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-R</span><span class="token plain"> </span><span class="token number">999</span><span class="token plain">:999 /data</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cant-connect">Can't Connect<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#cant-connect" class="hash-link" aria-label="Direct link to Can't Connect" title="Direct link to Can't Connect" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Check if running</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ps</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test connection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> mariadb mysqladmin </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ping</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="forgot-root-password">Forgot Root Password<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#forgot-root-password" class="hash-link" aria-label="Direct link to Forgot Root Password" title="Direct link to Forgot Root Password" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Stop container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> stop mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Start with skip-grant-tables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> mariadb_data:/var/lib/mysql </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  mariadb:10.11 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --skip-grant-tables </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--user</span><span class="token operator">=</span><span class="token plain">mysql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># In another terminal, reset password</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-it</span><span class="token plain"> container_id mysql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># mysql&gt; FLUSH PRIVILEGES;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># mysql&gt; ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="health-checks">Health Checks<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#health-checks" class="hash-link" aria-label="Direct link to Health Checks" title="Direct link to Health Checks" translate="no">​</a></h2>
<p>Add to compose:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">mariadb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">healthcheck</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">test</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"CMD"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"mysqladmin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ping"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"-h"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"localhost"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"-u"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"root"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"-p${DB_ROOT_PASSWORD}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">interval</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 30s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">timeout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 10s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">retries</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">3</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/mariadb-docker-maintenance-guide#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/MariaDB/Docs/Updating">MariaDB Update Guide</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Nextcloud/Docs/Installation/Complete">Nextcloud Database Setup</a></li>
</ul>
<hr>
<p><em>Database tips to share? Post them on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="mariadb" term="mariadb"/>
        <category label="docker" term="docker"/>
        <category label="database" term="database"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Windows & Office Activation: Setting Up a Local KMS Server]]></title>
        <id>https://docs.bankai-tech.com/blog/windows-activation-local-kms-server</id>
        <link href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server"/>
        <updated>2025-11-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Running Windows VMs in your homelab? Here's how to set up a local KMS (Key Management Service) server for activation. This is completely legal for testing and development purposes with volume license keys.]]></summary>
        <content type="html"><![CDATA[<p>Running Windows VMs in your homelab? Here's how to set up a local KMS (Key Management Service) server for activation. This is completely legal for testing and development purposes with volume license keys.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kms">What is KMS?<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#what-is-kms" class="hash-link" aria-label="Direct link to What is KMS?" title="Direct link to What is KMS?" translate="no">​</a></h2>
<p>Key Management Service (KMS) is Microsoft's volume activation technology used by enterprises. Instead of each machine calling Microsoft, they call a local KMS server.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="important-legal-notes">Important Legal Notes<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#important-legal-notes" class="hash-link" aria-label="Direct link to Important Legal Notes" title="Direct link to Important Legal Notes" translate="no">​</a></h3>
<ul>
<li class="">KMS is intended for volume licensing customers</li>
<li class="">Using this for personal/testing in your homelab is a gray area</li>
<li class="">Never use this for production systems you don't have licenses for</li>
<li class="">Consider Microsoft 365 Developer Program for legitimate free licenses</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-a-kms-server">Setting Up a KMS Server<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#setting-up-a-kms-server" class="hash-link" aria-label="Direct link to Setting Up a KMS Server" title="Direct link to Setting Up a KMS Server" translate="no">​</a></h2>
<p>We'll use vlmcsd, an open-source KMS emulator:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">kms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> mikolatero/vlmcsd</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> kms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">server</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1688:1688"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div></code></pre></div></div>
<p>Start it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><br></div></code></pre></div></div>
<p>Your KMS server is now running on port 1688.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="activating-windows">Activating Windows<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#activating-windows" class="hash-link" aria-label="Direct link to Activating Windows" title="Direct link to Activating Windows" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-set-kms-server">Step 1: Set KMS Server<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#step-1-set-kms-server" class="hash-link" aria-label="Direct link to Step 1: Set KMS Server" title="Direct link to Step 1: Set KMS Server" translate="no">​</a></h3>
<p>Open Command Prompt as Administrator:</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">slmgr /skms YOUR-KMS-SERVER-IP</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-install-generic-volume-license-key">Step 2: Install Generic Volume License Key<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#step-2-install-generic-volume-license-key" class="hash-link" aria-label="Direct link to Step 2: Install Generic Volume License Key" title="Direct link to Step 2: Install Generic Volume License Key" translate="no">​</a></h3>
<p>Use Microsoft's official GVLK keys:</p>
<p><strong>Windows 11/10 Pro:</strong></p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX</span><br></div></code></pre></div></div>
<p><strong>Windows 11/10 Enterprise:</strong></p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43</span><br></div></code></pre></div></div>
<p><strong>Windows Server 2022 Standard:</strong></p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">slmgr /ipk VDYBN-27WPP-V4HQT-9VMD4-VMK7H</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-activate">Step 3: Activate<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#step-3-activate" class="hash-link" aria-label="Direct link to Step 3: Activate" title="Direct link to Step 3: Activate" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">slmgr /ato</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-activation">Verify Activation<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#verify-activation" class="hash-link" aria-label="Direct link to Verify Activation" title="Direct link to Verify Activation" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">slmgr /xpr</span><br></div></code></pre></div></div>
<p>Should show "The machine is permanently activated" (or 180 days for volume).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="activating-microsoft-office">Activating Microsoft Office<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#activating-microsoft-office" class="hash-link" aria-label="Direct link to Activating Microsoft Office" title="Direct link to Activating Microsoft Office" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-navigate-to-office-directory">Step 1: Navigate to Office Directory<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#step-1-navigate-to-office-directory" class="hash-link" aria-label="Direct link to Step 1: Navigate to Office Directory" title="Direct link to Step 1: Navigate to Office Directory" translate="no">​</a></h3>
<p>For Office 2021/2019:</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cd "C:\Program Files\Microsoft Office\Office16"</span><br></div></code></pre></div></div>
<p>Or for 32-bit on 64-bit Windows:</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cd "C:\Program Files (x86)\Microsoft Office\Office16"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-set-kms-server">Step 2: Set KMS Server<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#step-2-set-kms-server" class="hash-link" aria-label="Direct link to Step 2: Set KMS Server" title="Direct link to Step 2: Set KMS Server" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cscript ospp.vbs /sethst:YOUR-KMS-SERVER-IP</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">cscript ospp.vbs /setprt:1688</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-activate-1">Step 3: Activate<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#step-3-activate-1" class="hash-link" aria-label="Direct link to Step 3: Activate" title="Direct link to Step 3: Activate" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cscript ospp.vbs /act</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-status">Verify Status<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#verify-status" class="hash-link" aria-label="Direct link to Verify Status" title="Direct link to Verify Status" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cscript ospp.vbs /dstatus</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="office-gvlk-keys">Office GVLK Keys<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#office-gvlk-keys" class="hash-link" aria-label="Direct link to Office GVLK Keys" title="Direct link to Office GVLK Keys" translate="no">​</a></h2>
<p><strong>Office 2021 Pro Plus:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">FXYTK-NJJ8C-GB6DW-3DYQT-6F7TH</span><br></div></code></pre></div></div>
<p><strong>Office 2019 Pro Plus:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrading-windows-editions">Upgrading Windows Editions<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#upgrading-windows-editions" class="hash-link" aria-label="Direct link to Upgrading Windows Editions" title="Direct link to Upgrading Windows Editions" translate="no">​</a></h2>
<p>Did you know you can upgrade Windows editions with just a key?</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-home-to-pro">From Home to Pro<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#from-home-to-pro" class="hash-link" aria-label="Direct link to From Home to Pro" title="Direct link to From Home to Pro" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Check current edition</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">DISM /Online /Get-CurrentEdition</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Change product key to upgrade</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">changepk.exe /productkey W269N-WFGWX-YVC9B-4J6C9-T83GX</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Then activate via KMS</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">slmgr /ato</span><br></div></code></pre></div></div>
<p>No reinstall needed!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-0xc004f074">Error 0xC004F074<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#error-0xc004f074" class="hash-link" aria-label="Direct link to Error 0xC004F074" title="Direct link to Error 0xC004F074" translate="no">​</a></h3>
<p>"The Software Licensing Service reported that the computer could not be activated."</p>
<ul>
<li class="">Verify KMS server is reachable: <code>telnet KMS-IP 1688</code></li>
<li class="">Check firewall allows port 1688</li>
<li class="">Verify correct GVLK is installed</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-0x8007232b">Error 0x8007232B<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#error-0x8007232b" class="hash-link" aria-label="Direct link to Error 0x8007232B" title="Direct link to Error 0x8007232B" translate="no">​</a></h3>
<p>"DNS name does not exist."</p>
<ul>
<li class="">Ensure you set KMS server IP, not hostname</li>
<li class="">Use <code>/skms</code> to set server address manually</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="office-wont-activate">Office Won't Activate<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#office-wont-activate" class="hash-link" aria-label="Direct link to Office Won't Activate" title="Direct link to Office Won't Activate" translate="no">​</a></h3>
<ul>
<li class="">Verify you're using Volume License version, not Retail</li>
<li class="">Check ospp.vbs path is correct</li>
<li class="">Run Command Prompt as Administrator</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="alternative-microsoft-365-developer-program">Alternative: Microsoft 365 Developer Program<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#alternative-microsoft-365-developer-program" class="hash-link" aria-label="Direct link to Alternative: Microsoft 365 Developer Program" title="Direct link to Alternative: Microsoft 365 Developer Program" translate="no">​</a></h2>
<p>For legitimate free access:</p>
<ol>
<li class="">Sign up at <a href="https://developer.microsoft.com/microsoft-365/dev-program" target="_blank" rel="noopener noreferrer" class="">developer.microsoft.com</a></li>
<li class="">Get 90-day renewable subscription</li>
<li class="">Includes Windows, Office, and more</li>
<li class="">Perfect for development/testing</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/windows-activation-local-kms-server#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/MS%20Windows/Local%20KMS/Docs/KMS%20Server">KMS Server Setup</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/MS%20Windows/Local%20KMS/Docs/Activating%20Windows">Activating Windows</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/MS%20Windows/Local%20KMS/Docs/Activating%20Office">Activating Office</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/MS%20Windows/Local%20KMS/Docs/Upgrading%20Windows%20Edition">Upgrading Windows Edition</a></li>
</ul>
<hr>
<p><em>Running Windows in your homelab? Share your setup on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="windows" term="windows"/>
        <category label="kms" term="kms"/>
        <category label="activation" term="activation"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Complete Arr Stack: Automating Your Media Library]]></title>
        <id>https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation</id>
        <link href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation"/>
        <updated>2025-11-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Arr suite has revolutionized home media management. Radarr, Sonarr, Lidarr, and friends work together to automatically find, download, and organize your media. Here's how to set up the complete stack.]]></summary>
        <content type="html"><![CDATA[<p>The Arr suite has revolutionized home media management. Radarr, Sonarr, Lidarr, and friends work together to automatically find, download, and organize your media. Here's how to set up the complete stack.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-in-the-arr-suite">What's in the Arr Suite?<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#whats-in-the-arr-suite" class="hash-link" aria-label="Direct link to What's in the Arr Suite?" title="Direct link to What's in the Arr Suite?" translate="no">​</a></h2>
<p>The "Arr" applications handle different media types:</p>
<table><thead><tr><th>Application</th><th>Purpose</th></tr></thead><tbody><tr><td><strong>Radarr</strong></td><td>Movies</td></tr><tr><td><strong>Sonarr</strong></td><td>TV Shows</td></tr><tr><td><strong>Lidarr</strong></td><td>Music</td></tr><tr><td><strong>Bookshelf</strong></td><td>Books/Audiobooks</td></tr><tr><td><strong>Prowlarr</strong></td><td>Indexer management</td></tr><tr><td><strong>Seerr</strong></td><td>Request management</td></tr><tr><td><strong>qBittorrent</strong></td><td>Download client</td></tr><tr><td><strong>JFA-Go</strong></td><td>Jellyfin account management</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-media-flow">The Media Flow<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#the-media-flow" class="hash-link" aria-label="Direct link to The Media Flow" title="Direct link to The Media Flow" translate="no">​</a></h2>
<p>Here's how everything connects:</p>
<!-- -->
<ol>
<li class="">User requests media through Seerr</li>
<li class="">Request goes to Radarr/Sonarr</li>
<li class="">Arr app queries indexers via Prowlarr</li>
<li class="">Best release is sent to qBittorrent</li>
<li class="">Completed download is imported and renamed</li>
<li class="">Jellyfin picks up the new media</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-compose-setup">Docker Compose Setup<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#docker-compose-setup" class="hash-link" aria-label="Direct link to Docker Compose Setup" title="Direct link to Docker Compose Setup" translate="no">​</a></h2>
<p>Here's a simplified version of our full stack:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">radarr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> lscr.io/linuxserver/radarr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> radarr</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PUID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PGID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> radarr_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"7878:7878"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">sonarr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> lscr.io/linuxserver/sonarr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> sonarr</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PUID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PGID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> sonarr_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8989:8989"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">prowlarr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> lscr.io/linuxserver/prowlarr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> prowlarr</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PUID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PGID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> prowlarr_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"9696:9696"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">seerr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ghcr.io/seerr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">team/seerr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> seerr</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">init</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> seerr_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/app/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"5055:5055"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">healthcheck</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">test</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> wget </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">no</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">verbose </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">tries=1 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">spider http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//localhost</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">5055/api/v1/status </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> exit 1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">start_period</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 20s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">timeout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 3s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">interval</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 15s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">retries</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">qbittorrent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> lscr.io/linuxserver/qbittorrent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> qbittorrent</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PUID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PGID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> WEBUI_PORT=8080</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> qbit_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /data/downloads</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data/downloads</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8080:8080"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">radarr_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">sonarr_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">prowlarr_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">seerr_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  qbit_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="critical-folder-structure">Critical: Folder Structure<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#critical-folder-structure" class="hash-link" aria-label="Direct link to Critical: Folder Structure" title="Direct link to Critical: Folder Structure" translate="no">​</a></h2>
<p>This is where most people go wrong. Use a unified structure:</p>
<div class="treeContainer_O5o2"><h3 class="treeTitle_tvqP">/data</h3><div class="treeContent_aVsc"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:0px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">downloads</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:20px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">torrents</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:40px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">movies</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:40px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">tv</span></span></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:20px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">usenet</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:40px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">movies</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:40px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">tv</span></span></div></div></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:0px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">media</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:20px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">movies</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:20px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">tv</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:20px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">music</span></span></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:0px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">recycle</span></span><span class="nodeBadge_ZmCq">For deleted files</span></div></div></div></div>
<p><strong>Why this matters</strong>: When Radarr/Sonarr imports a download, it can create a <strong>hardlink</strong> instead of copying. Same file, two paths, instant import with zero disk space used.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vpn-integration">VPN Integration<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#vpn-integration" class="hash-link" aria-label="Direct link to VPN Integration" title="Direct link to VPN Integration" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Always use a VPN with torrenting applications! Check out our <a class="" href="https://docs.bankai-tech.com/Examples/VPN/Introduction">VPN setup guide</a>.</p></div></div>
<p>Use the <code>binhex/qbittorrentvpn</code> image for built-in VPN:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">qbittorrent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> binhex/arch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">qbittorrentvpn</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> VPN_ENABLED=yes</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> VPN_PROV=custom</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> VPN_CLIENT=openvpn</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quality-profiles">Quality Profiles<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#quality-profiles" class="hash-link" aria-label="Direct link to Quality Profiles" title="Direct link to Quality Profiles" translate="no">​</a></h2>
<p>Configure quality profiles in Radarr/Sonarr:</p>
<p><strong>Recommended for movies:</strong></p>
<ul>
<li class="">Minimum: 5GB</li>
<li class="">Preferred: 10-15GB</li>
<li class="">Maximum: 40GB</li>
<li class="">Format: Bluray-2160p &gt; Bluray-1080p &gt; WEB-DL</li>
</ul>
<p><strong>Recommended for TV:</strong></p>
<ul>
<li class="">Minimum: 1GB per episode</li>
<li class="">Preferred: 2-4GB per episode</li>
<li class="">Format: HDTV-2160p &gt; Bluray-1080p &gt; WEB-DL</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recyclarr-for-automation">Recyclarr for Automation<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#recyclarr-for-automation" class="hash-link" aria-label="Direct link to Recyclarr for Automation" title="Direct link to Recyclarr for Automation" translate="no">​</a></h2>
<p>Use Recyclarr to sync quality profiles from TRaSH Guides:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> recyclarr_config:/config ghcr.io/recyclarr/recyclarr </span><span class="token function" style="color:rgb(80, 250, 123)">sync</span><br></div></code></pre></div></div>
<p>This keeps your profiles up-to-date with community best practices.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flaresolverr-for-cloudflare">Flaresolverr for Cloudflare<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#flaresolverr-for-cloudflare" class="hash-link" aria-label="Direct link to Flaresolverr for Cloudflare" title="Direct link to Flaresolverr for Cloudflare" translate="no">​</a></h2>
<p>Some indexers use Cloudflare protection. Add Flaresolverr:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">flaresolverr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ghcr.io/flaresolverr/flaresolverr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> flaresolverr</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8191:8191"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div></code></pre></div></div>
<p>Configure in Prowlarr under Settings → Indexers → Add (FlareSolverr).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/complete-arr-stack-media-automation#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<p>For the complete production-ready setup:</p>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Arr%20Suite/Docs/Full%20Stack/docker-compose">Full Stack Docker Compose</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Arr%20Suite/Docs/Radarr/docker-compose">Radarr Configuration</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Torrent%20Clients/Introduction">VPN Setup with qBittorrent</a></li>
</ul>
<hr>
<p><em>What does your Arr stack look like? Share your setup on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="arr-suite" term="arr-suite"/>
        <category label="automation" term="automation"/>
        <category label="media-server" term="media-server"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nginx Reverse Proxy: Securing Your Homelab with SSL]]></title>
        <id>https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab</id>
        <link href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab"/>
        <updated>2025-10-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Running multiple services on your homelab? A reverse proxy is essential for clean URLs, SSL certificates, and proper security. Here's how to set up Nginx as your gateway to everything.]]></summary>
        <content type="html"><![CDATA[<p>Running multiple services on your homelab? A reverse proxy is essential for clean URLs, SSL certificates, and proper security. Here's how to set up Nginx as your gateway to everything.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-a-reverse-proxy-do">What Does a Reverse Proxy Do?<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#what-does-a-reverse-proxy-do" class="hash-link" aria-label="Direct link to What Does a Reverse Proxy Do?" title="Direct link to What Does a Reverse Proxy Do?" translate="no">​</a></h2>
<p>Instead of accessing services by port numbers:</p>
<ul>
<li class=""><code>http://192.168.1.100:8096</code> (Jellyfin)</li>
<li class=""><code>http://192.168.1.100:8989</code> (Sonarr)</li>
<li class=""><code>http://192.168.1.100:7878</code> (Radarr)</li>
</ul>
<p>You get clean URLs with SSL:</p>
<ul>
<li class=""><code>https://jellyfin.home.yourdomain.com</code></li>
<li class=""><code>https://sonarr.home.yourdomain.com</code></li>
<li class=""><code>https://radarr.home.yourdomain.com</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits">Benefits:<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#benefits" class="hash-link" aria-label="Direct link to Benefits:" title="Direct link to Benefits:" translate="no">​</a></h3>
<ul>
<li class=""><strong>SSL everywhere</strong> - Encrypt all traffic</li>
<li class=""><strong>Single entry point</strong> - One port to expose (443)</li>
<li class=""><strong>Subdomain routing</strong> - Clean URLs for each service</li>
<li class=""><strong>Load balancing</strong> - Distribute traffic (for HA setups)</li>
<li class=""><strong>Caching</strong> - Improve performance for static content</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-architecture">Network Architecture<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#network-architecture" class="hash-link" aria-label="Direct link to Network Architecture" title="Direct link to Network Architecture" translate="no">​</a></h2>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-nginx-on-ubuntu">Installing Nginx on Ubuntu<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#installing-nginx-on-ubuntu" class="hash-link" aria-label="Direct link to Installing Nginx on Ubuntu" title="Direct link to Installing Nginx on Ubuntu" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install Nginx</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> update</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-y</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Enable and start</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> systemctl </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">enable</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> systemctl start nginx</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Verify</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> nginx </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-t</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-configuration-structure">Basic Configuration Structure<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#basic-configuration-structure" class="hash-link" aria-label="Direct link to Basic Configuration Structure" title="Direct link to Basic Configuration Structure" translate="no">​</a></h2>
<p>Nginx configuration files:</p>
<div class="treeContainer_O5o2"><h3 class="treeTitle_tvqP">/etc/nginx/</h3><div class="treeContent_aVsc"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:0px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">nginx.conf</span></span><span class="nodeBadge_ZmCq">Main config</span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:0px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">sites-available</span></span><span class="nodeBadge_ZmCq">Available site configs</span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:20px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">default</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:20px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">jellyfin.conf</span></span></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:0px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">sites-enabled</span></span><span class="nodeBadge_ZmCq">Symlinks to active sites</span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:20px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">jellyfin.conf</span></span><span class="nodeBadge_ZmCq">→ ../sites-available/jellyfin.conf</span></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:0px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">conf.d</span></span><span class="nodeBadge_ZmCq">Additional configs</span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:0px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">snippets</span></span><span class="nodeBadge_ZmCq">Reusable config snippets</span></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ssl-with-certbot-lets-encrypt">SSL with Certbot (Let's Encrypt)<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#ssl-with-certbot-lets-encrypt" class="hash-link" aria-label="Direct link to SSL with Certbot (Let's Encrypt)" title="Direct link to SSL with Certbot (Let's Encrypt)" translate="no">​</a></h2>
<p>First, install Certbot:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-y</span><span class="token plain"> certbot python3-certbot-nginx</span><br></div></code></pre></div></div>
<p>Get certificates for your domains:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> certbot </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--nginx</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> jellyfin.yourdomain.com</span><br></div></code></pre></div></div>
<p>Certbot will:</p>
<ol>
<li class="">Validate domain ownership</li>
<li class="">Generate certificates</li>
<li class="">Configure Nginx automatically</li>
<li class="">Set up auto-renewal</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reverse-proxy-configuration">Reverse Proxy Configuration<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#reverse-proxy-configuration" class="hash-link" aria-label="Direct link to Reverse Proxy Configuration" title="Direct link to Reverse Proxy Configuration" translate="no">​</a></h2>
<p>Here's a template for any service:</p>
<div class="language-nginx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/nginx/sites-available/service.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-nginx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">server</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">listen</span><span class="token directive"> </span><span class="token directive number">80</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">server_name</span><span class="token directive"> service.yourdomain.com</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token directive"> </span><span class="token directive number">301</span><span class="token directive"> https://</span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$server_name</span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$request_uri</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">server</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">listen</span><span class="token directive"> </span><span class="token directive number">443</span><span class="token directive"> ssl http2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">server_name</span><span class="token directive"> service.yourdomain.com</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># SSL certificates (managed by Certbot)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ssl_certificate</span><span class="token directive"> /etc/letsencrypt/live/service.yourdomain.com/fullchain.pem</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ssl_certificate_key</span><span class="token directive"> /etc/letsencrypt/live/service.yourdomain.com/privkey.pem</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># SSL settings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ssl_protocols</span><span class="token directive"> TLSv1.2 TLSv1.3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ssl_ciphers</span><span class="token directive"> ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ssl_prefer_server_ciphers</span><span class="token directive"> </span><span class="token directive boolean">off</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Security headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">add_header</span><span class="token directive"> X-Frame-Options </span><span class="token directive string" style="color:rgb(255, 121, 198)">"SAMEORIGIN"</span><span class="token directive"> always</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">add_header</span><span class="token directive"> X-Content-Type-Options </span><span class="token directive string" style="color:rgb(255, 121, 198)">"nosniff"</span><span class="token directive"> always</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">add_header</span><span class="token directive"> X-XSS-Protection </span><span class="token directive string" style="color:rgb(255, 121, 198)">"1; mode=block"</span><span class="token directive"> always</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token directive"> /</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_pass</span><span class="token directive"> http://127.0.0.1:8096</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Internal service port</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_http_version</span><span class="token directive"> 1.1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Host </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$host</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> X-Real-IP </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$remote_addr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> X-Forwarded-For </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$proxy_add_x_forwarded_for</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> X-Forwarded-Proto </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$scheme</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Upgrade </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$http_upgrade</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Connection </span><span class="token directive string" style="color:rgb(255, 121, 198)">"upgrade"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Enable the site:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ln</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-s</span><span class="token plain"> /etc/nginx/sites-available/service.conf /etc/nginx/sites-enabled/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> nginx </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-t</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> systemctl reload nginx</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="jellyfin-specific-configuration">Jellyfin Specific Configuration<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#jellyfin-specific-configuration" class="hash-link" aria-label="Direct link to Jellyfin Specific Configuration" title="Direct link to Jellyfin Specific Configuration" translate="no">​</a></h2>
<p>Jellyfin needs WebSocket support for live transcoding:</p>
<div class="language-nginx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/nginx/sites-available/jellyfin.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-nginx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">server</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">listen</span><span class="token directive"> </span><span class="token directive number">443</span><span class="token directive"> ssl http2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">server_name</span><span class="token directive"> jellyfin.yourdomain.com</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ssl_certificate</span><span class="token directive"> /etc/letsencrypt/live/jellyfin.yourdomain.com/fullchain.pem</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ssl_certificate_key</span><span class="token directive"> /etc/letsencrypt/live/jellyfin.yourdomain.com/privkey.pem</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Large file uploads for libraries</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">client_max_body_size</span><span class="token directive"> </span><span class="token directive number">20M</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token directive"> /</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_pass</span><span class="token directive"> http://127.0.0.1:8096</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Host </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$host</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> X-Real-IP </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$remote_addr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> X-Forwarded-For </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$proxy_add_x_forwarded_for</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> X-Forwarded-Proto </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$scheme</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># WebSocket support</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_http_version</span><span class="token directive"> 1.1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Upgrade </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$http_upgrade</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Connection </span><span class="token directive string" style="color:rgb(255, 121, 198)">"upgrade"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token directive"> /socket</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_pass</span><span class="token directive"> http://127.0.0.1:8096</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_http_version</span><span class="token directive"> 1.1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Upgrade </span><span class="token directive variable" style="color:rgb(189, 147, 249);font-style:italic">$http_upgrade</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">proxy_set_header</span><span class="token directive"> Connection </span><span class="token directive string" style="color:rgb(255, 121, 198)">"upgrade"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloudflare-integration">Cloudflare Integration<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#cloudflare-integration" class="hash-link" aria-label="Direct link to Cloudflare Integration" title="Direct link to Cloudflare Integration" translate="no">​</a></h2>
<p>If using Cloudflare for DNS:</p>
<ol>
<li class="">Set SSL mode to "Full (Strict)"</li>
<li class="">Add Cloudflare real IP restoration:</li>
</ol>
<div class="language-nginx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-nginx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># /etc/nginx/conf.d/cloudflare.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">set_real_ip_from</span><span class="token directive"> 103.21.244.0/22</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">set_real_ip_from</span><span class="token directive"> 103.22.200.0/22</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># ... add all Cloudflare IP ranges</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token directive keyword" style="color:rgb(189, 147, 249);font-style:italic">real_ip_header</span><span class="token directive"> CF-Connecting-IP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="502-bad-gateway">502 Bad Gateway<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#502-bad-gateway" class="hash-link" aria-label="Direct link to 502 Bad Gateway" title="Direct link to 502 Bad Gateway" translate="no">​</a></h3>
<ul>
<li class="">Check if backend service is running</li>
<li class="">Verify <code>proxy_pass</code> URL is correct</li>
<li class="">Check firewall rules</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ssl-certificate-issues">SSL Certificate Issues<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#ssl-certificate-issues" class="hash-link" aria-label="Direct link to SSL Certificate Issues" title="Direct link to SSL Certificate Issues" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> certbot renew --dry-run</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="view-access-logs">View Access Logs<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#view-access-logs" class="hash-link" aria-label="Direct link to View Access Logs" title="Direct link to View Access Logs" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> /var/log/nginx/access.log</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/nginx-reverse-proxy-ssl-homelab#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Reverse%20Proxy/Docs/Nginx/Installing%20Nginx">Complete Nginx Documentation</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Reverse%20Proxy/Docs/Certbot/Cloudflare/">Certbot with Cloudflare</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Reverse%20Proxies/Introduction">Example Nginx Configs</a></li>
</ul>
<hr>
<p><em>Running a different reverse proxy? Share your setup on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="nginx" term="nginx"/>
        <category label="reverse-proxy" term="reverse-proxy"/>
        <category label="ssl" term="ssl"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Jellyfin: The Free Plex Alternative You've Been Looking For]]></title>
        <id>https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server</id>
        <link href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server"/>
        <updated>2025-10-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[If you're tired of Plex's subscription model, account requirements, and feature removals, Jellyfin might be your perfect media server. Here's why I made the switch and how you can too.]]></summary>
        <content type="html"><![CDATA[<p>If you're tired of Plex's subscription model, account requirements, and feature removals, Jellyfin might be your perfect media server. Here's why I made the switch and how you can too.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-jellyfin">Why Jellyfin?<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#why-jellyfin" class="hash-link" aria-label="Direct link to Why Jellyfin?" title="Direct link to Why Jellyfin?" translate="no">​</a></h2>
<p>After years of Plex, several changes pushed me to explore alternatives:</p>
<ul>
<li class=""><strong>No account required</strong> - Works entirely locally</li>
<li class=""><strong>Free hardware transcoding</strong> - No Plex Pass needed</li>
<li class=""><strong>Truly open source</strong> - GPL licensed, community driven</li>
<li class=""><strong>No phone-home</strong> - Your server, your rules</li>
<li class=""><strong>Active development</strong> - Regular updates and improvements</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="jellyfin-vs-plex-vs-emby">Jellyfin vs Plex vs Emby<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#jellyfin-vs-plex-vs-emby" class="hash-link" aria-label="Direct link to Jellyfin vs Plex vs Emby" title="Direct link to Jellyfin vs Plex vs Emby" translate="no">​</a></h2>
<table><thead><tr><th>Feature</th><th>Jellyfin</th><th>Plex</th><th>Emby</th></tr></thead><tbody><tr><td>Price</td><td>Free</td><td>Freemium</td><td>Freemium</td></tr><tr><td>Account Required</td><td>No</td><td>Yes</td><td>Yes</td></tr><tr><td>Hardware Transcoding</td><td>Free</td><td>Plex Pass</td><td>Premiere</td></tr><tr><td>Local-only Option</td><td>Yes</td><td>Limited</td><td>Limited</td></tr><tr><td>Skip Intro</td><td>Plugin</td><td>Plex Pass</td><td>Premiere</td></tr><tr><td>Open Source</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>Mobile Apps</td><td>Free</td><td>Free/Paid</td><td>Free/Paid</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-installation">Docker Installation<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#docker-installation" class="hash-link" aria-label="Direct link to Docker Installation" title="Direct link to Docker Installation" translate="no">​</a></h2>
<p>Here's a production-ready compose file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">jellyfin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> jellyfin/jellyfin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> jellyfin</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PUID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PGID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> jellyfin_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> jellyfin_cache</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/cache</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /path/to/media/movies</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data/movies</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ro</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /path/to/media/tv</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data/tv</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ro</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /path/to/media/music</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data/music</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ro</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8096:8096"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">devices</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /dev/dri</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/dev/dri </span><span class="token comment" style="color:rgb(98, 114, 164)"># For Intel QuickSync</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">jellyfin_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  jellyfin_cache</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hardware-transcoding">Hardware Transcoding<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#hardware-transcoding" class="hash-link" aria-label="Direct link to Hardware Transcoding" title="Direct link to Hardware Transcoding" translate="no">​</a></h3>
<p>For Intel QuickSync (most common):</p>
<ol>
<li class="">Ensure your user has access to render group:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">usermod</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-aG</span><span class="token plain"> render </span><span class="token environment constant" style="color:rgb(189, 147, 249)">$USER</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">
<p>The <code>/dev/dri</code> device mapping in compose handles the rest</p>
</li>
<li class="">
<p>In Jellyfin Dashboard → Playback → Transcoding:</p>
<ul>
<li class="">Select "Intel QuickSync (QSV)"</li>
<li class="">Enable hardware decoding for supported codecs</li>
</ul>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="folder-structure">Folder Structure<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#folder-structure" class="hash-link" aria-label="Direct link to Folder Structure" title="Direct link to Folder Structure" translate="no">​</a></h2>
<p>Organize your media properly:</p>
<div class="treeContainer_O5o2"><h3 class="treeTitle_tvqP">media/</h3><div class="treeContent_aVsc"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:0px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">movies</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:20px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Movie Name (2024)</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:40px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Movie Name (2024).mkv</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:40px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Movie Name (2024).srt</span></span></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:20px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Another Movie (2023)</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:40px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Another Movie (2023).mp4</span></span></div></div></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:0px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">tv</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:20px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Show Name (2020)</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:40px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Season 01</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:60px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Show Name - S01E01 - Episode Title.mkv</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:60px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Show Name - S01E02 - Episode Title.mkv</span></span></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:40px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Season 02</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:60px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Show Name - S02E01 - Episode Title.mkv</span></span></div></div></div></div></div></div></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:0px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">music</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:20px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Artist</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA hasChildren_A_rI" style="padding-left:40px" role="button" tabindex="0"><span class="expandIcon_qtYl">▼</span><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">Album (Year)</span></span></div><div class="nodeChildren_ulR6"><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:60px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">01 - Track Name.flac</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:60px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">02 - Track Name.flac</span></span></div></div><div class="treeNode_HY25"><div class="nodeContent_COuA" style="padding-left:60px"><span class="nodeIcon_LKCk"><span></span><span class="nodeLabel_KPgt">cover.jpg</span></span></div></div></div></div></div></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tinymediamanager-integration">TinyMediaManager Integration<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#tinymediamanager-integration" class="hash-link" aria-label="Direct link to TinyMediaManager Integration" title="Direct link to TinyMediaManager Integration" translate="no">​</a></h2>
<p>For the best metadata management, use <strong>TinyMediaManager</strong>:</p>
<ol>
<li class="">Point TMM at your media folders</li>
<li class="">Scrape metadata from TMDB/TVDB</li>
<li class="">Download artwork and NFO files</li>
<li class=""><strong>Then</strong> add to Jellyfin</li>
</ol>
<p>The workflow is: <strong>TMM First, Then Jellyfin</strong></p>
<p>This gives you:</p>
<ul>
<li class="">Better metadata accuracy</li>
<li class="">More artwork options</li>
<li class="">Bulk editing capabilities</li>
<li class="">NFO files for backup/portability</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plugins-worth-installing">Plugins Worth Installing<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#plugins-worth-installing" class="hash-link" aria-label="Direct link to Plugins Worth Installing" title="Direct link to Plugins Worth Installing" translate="no">​</a></h2>
<p>From the official repository:</p>
<ul>
<li class=""><strong>Intro Skipper</strong> - Auto-skip intros (like Plex Pass)</li>
<li class=""><strong>Open Subtitles</strong> - Auto-download subtitles</li>
<li class=""><strong>Playback Reporting</strong> - Track your watch history</li>
<li class=""><strong>TMDb Box Sets</strong> - Better collection handling</li>
<li class=""><strong>ConfusedPolarBear.Plugin.Intro</strong> - Chapter generation</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="client-apps">Client Apps<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#client-apps" class="hash-link" aria-label="Direct link to Client Apps" title="Direct link to Client Apps" translate="no">​</a></h2>
<p>Jellyfin has clients for everything:</p>
<ul>
<li class=""><strong>Web</strong> - Built-in, works great</li>
<li class=""><strong>Android/iOS</strong> - Official apps</li>
<li class=""><strong>Android TV</strong> - Native app</li>
<li class=""><strong>Roku</strong> - Native app</li>
<li class=""><strong>Kodi</strong> - Jellyfin for Kodi plugin</li>
<li class=""><strong>Desktop</strong> - Jellyfin Media Player</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-from-plex">Migration from Plex<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#migration-from-plex" class="hash-link" aria-label="Direct link to Migration from Plex" title="Direct link to Migration from Plex" translate="no">​</a></h2>
<p>If you're coming from Plex:</p>
<ol>
<li class="">Export your watch history (there are community scripts)</li>
<li class="">Set up Jellyfin with the same library structure</li>
<li class="">Import watch history to Jellyfin</li>
<li class="">Update your DNS/reverse proxy</li>
<li class="">Install clients on your devices</li>
</ol>
<p>The hardest part is updating all your devices, but it's worth it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-setup">My Setup<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#my-setup" class="hash-link" aria-label="Direct link to My Setup" title="Direct link to My Setup" translate="no">​</a></h2>
<p>Currently running:</p>
<ul>
<li class="">Jellyfin in Docker behind Nginx reverse proxy</li>
<li class="">NVIDIA NVENC for transcoding</li>
<li class="">100TB+ library with movies, TV, and music</li>
<li class="">Arr stack for automated acquisition</li>
<li class="">TinyMediaManager for metadata</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/jellyfin-plex-alternative-media-server#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<p>For complete setup guides:</p>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Jellyfin/Docs/Installation/Docker%20Install">Jellyfin Docker Installation</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Jellyfin/Docs/TinyMediaManager%20Integration">TinyMediaManager Integration</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Arr%20Suite/Introduction">Arr Stack Setup</a></li>
</ul>
<hr>
<p><em>Made the switch to Jellyfin? Share your experience on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="jellyfin" term="jellyfin"/>
        <category label="media-server" term="media-server"/>
        <category label="self-hosting" term="self-hosting"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tailscale: Access Your Homelab from Anywhere]]></title>
        <id>https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access</id>
        <link href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access"/>
        <updated>2025-09-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Want to access your homelab from anywhere without exposing ports to the internet? Tailscale creates a secure mesh VPN that "just works." Here's why it's become essential for homelabbers.]]></summary>
        <content type="html"><![CDATA[<p>Want to access your homelab from anywhere without exposing ports to the internet? Tailscale creates a secure mesh VPN that "just works." Here's why it's become essential for homelabbers.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-tailscale">What is Tailscale?<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#what-is-tailscale" class="hash-link" aria-label="Direct link to What is Tailscale?" title="Direct link to What is Tailscale?" translate="no">​</a></h2>
<p>Tailscale is a mesh VPN built on WireGuard that:</p>
<ul>
<li class=""><strong>Requires zero configuration</strong> - No port forwarding needed</li>
<li class=""><strong>Punches through NAT</strong> - Works behind any router</li>
<li class=""><strong>Encrypts everything</strong> - WireGuard-based security</li>
<li class=""><strong>Creates a mesh</strong> - Devices connect directly</li>
<li class=""><strong>Free for personal use</strong> - Up to 100 devices</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How It Works<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<!-- -->
<ol>
<li class="">Devices register with Tailscale's coordination server</li>
<li class="">Coordination server helps devices find each other</li>
<li class="">Actual traffic flows directly between devices (peer-to-peer)</li>
<li class="">All traffic is encrypted with WireGuard</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="on-ubuntudebian">On Ubuntu/Debian<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#on-ubuntudebian" class="hash-link" aria-label="Direct link to On Ubuntu/Debian" title="Direct link to On Ubuntu/Debian" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Add Tailscale repository</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-fsSL</span><span class="token plain"> https://tailscale.com/install.sh </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Start Tailscale</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> tailscale up</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Follow the authentication URL</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="on-docker">On Docker<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#on-docker" class="hash-link" aria-label="Direct link to On Docker" title="Direct link to On Docker" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">tailscale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> tailscale/tailscale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> tailscale</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">hostname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> docker</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">host</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TS_AUTHKEY=tskey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">auth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">xxxxx  </span><span class="token comment" style="color:rgb(98, 114, 164)"># From Tailscale admin console</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TS_STATE_DIR=/var/lib/tailscale</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TS_EXTRA_ARGS=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">advertise</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">exit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">node </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">advertise</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">routes=192.168.1.0/24</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> tailscale_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/var/lib/tailscale</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /dev/net/tun</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/dev/net/tun</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">cap_add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> NET_ADMIN</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> SYS_MODULE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  tailscale_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="subnet-router-access-entire-network">Subnet Router (Access Entire Network)<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#subnet-router-access-entire-network" class="hash-link" aria-label="Direct link to Subnet Router (Access Entire Network)" title="Direct link to Subnet Router (Access Entire Network)" translate="no">​</a></h2>
<p>The killer feature for homelabs: <strong>subnet routing</strong>. Access your entire LAN through Tailscale.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># On your homelab server</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> tailscale up --advertise-routes</span><span class="token operator">=</span><span class="token number">192.168</span><span class="token plain">.1.0/24 --accept-routes</span><br></div></code></pre></div></div>
<p>Then in the Tailscale admin console:</p>
<ol>
<li class="">Go to Machines</li>
<li class="">Find your server</li>
<li class="">Enable the route under "Subnets"</li>
</ol>
<p>Now your phone can access <code>192.168.1.100:7878</code> (Radarr) from anywhere!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="exit-node-route-all-traffic">Exit Node (Route All Traffic)<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#exit-node-route-all-traffic" class="hash-link" aria-label="Direct link to Exit Node (Route All Traffic)" title="Direct link to Exit Node (Route All Traffic)" translate="no">​</a></h2>
<p>Use your homelab as a VPN exit point:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> tailscale up --advertise-exit-node</span><br></div></code></pre></div></div>
<p>Enable in admin console, then on your mobile device:</p>
<ol>
<li class="">Open Tailscale</li>
<li class="">Select your homelab as exit node</li>
<li class="">All traffic now routes through home</li>
</ol>
<p>Great for:</p>
<ul>
<li class="">Accessing geo-restricted content</li>
<li class="">Secure browsing on public WiFi</li>
<li class="">Appearing to be "at home"</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="magicdns">MagicDNS<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#magicdns" class="hash-link" aria-label="Direct link to MagicDNS" title="Direct link to MagicDNS" translate="no">​</a></h2>
<p>Tailscale provides automatic DNS for all your devices:</p>
<ul>
<li class=""><code>homelab.tail12345.ts.net</code></li>
<li class=""><code>laptop.tail12345.ts.net</code></li>
<li class=""><code>phone.tail12345.ts.net</code></li>
</ul>
<p>Enable in admin console under DNS settings.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="funnel-public-endpoints">Funnel (Public Endpoints)<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#funnel-public-endpoints" class="hash-link" aria-label="Direct link to Funnel (Public Endpoints)" title="Direct link to Funnel (Public Endpoints)" translate="no">​</a></h2>
<p>Need to expose a service publicly without port forwarding?</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Share a local service publicly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">tailscale funnel </span><span class="token number">443</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--bg</span><br></div></code></pre></div></div>
<p>Your service becomes available at <code>https://machine-name.tail12345.ts.net</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="acls-access-control">ACLs (Access Control)<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#acls-access-control" class="hash-link" aria-label="Direct link to ACLs (Access Control)" title="Direct link to ACLs (Access Control)" translate="no">​</a></h2>
<p>Control who can access what:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"acls"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Family can access Jellyfin</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token property">"action"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"accept"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"users"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"family"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"ports"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"homelab:8096"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Only admin can access management interfaces</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token property">"action"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"accept"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"users"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"admin@example.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"ports"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"homelab:*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tailscale-vs-traditional-vpn">Tailscale vs Traditional VPN<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#tailscale-vs-traditional-vpn" class="hash-link" aria-label="Direct link to Tailscale vs Traditional VPN" title="Direct link to Tailscale vs Traditional VPN" translate="no">​</a></h2>
<table><thead><tr><th>Feature</th><th>Tailscale</th><th>Traditional VPN</th></tr></thead><tbody><tr><td>Port forwarding</td><td>Not needed</td><td>Required</td></tr><tr><td>Configuration</td><td>Minimal</td><td>Complex</td></tr><tr><td>NAT traversal</td><td>Automatic</td><td>Manual/Limited</td></tr><tr><td>Multi-site</td><td>Easy</td><td>Complex</td></tr><tr><td>Mesh networking</td><td>Built-in</td><td>Extra setup</td></tr><tr><td>Authentication</td><td>SSO/2FA</td><td>Certificates</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-tailscale-setup">My Tailscale Setup<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#my-tailscale-setup" class="hash-link" aria-label="Direct link to My Tailscale Setup" title="Direct link to My Tailscale Setup" translate="no">​</a></h2>
<p>Currently running:</p>
<ul>
<li class=""><strong>Homelab server</strong> - Subnet router + exit node</li>
<li class=""><strong>Work laptop</strong> - Client</li>
<li class=""><strong>Phone</strong> - Client with exit node for travel</li>
<li class=""><strong>Parents' house</strong> - Subnet router (remote support!)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-use-cases">Common Use Cases<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#common-use-cases" class="hash-link" aria-label="Direct link to Common Use Cases" title="Direct link to Common Use Cases" translate="no">​</a></h2>
<ol>
<li class=""><strong>Access Plex/Jellyfin remotely</strong> - No port forwarding</li>
<li class=""><strong>SSH to home server</strong> - Secure connection anywhere</li>
<li class=""><strong>Access home network cameras</strong> - Private surveillance</li>
<li class=""><strong>Remote support</strong> - Help family without TeamViewer</li>
<li class=""><strong>Development</strong> - Access home dev environment from anywhere</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/tailscale-mesh-vpn-homelab-access#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<p>For the complete guide:</p>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Tailscale/Introduction">Tailscale Full Documentation</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Introduction">Networking Fundamentals</a></li>
</ul>
<hr>
<p><em>Using Tailscale differently? Share your setup on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="tailscale" term="tailscale"/>
        <category label="vpn" term="vpn"/>
        <category label="networking" term="networking"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Secure Torrenting: qBittorrent with VPN Kill Switch]]></title>
        <id>https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent</id>
        <link href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent"/>
        <updated>2025-09-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[If you're using torrents, protecting your privacy is essential. Here's how to set up qBittorrent with a built-in VPN and kill switch using Docker.]]></summary>
        <content type="html"><![CDATA[<p>If you're using torrents, protecting your privacy is essential. Here's how to set up qBittorrent with a built-in VPN and kill switch using Docker.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-vpn-for-torrents">Why VPN for Torrents?<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#why-vpn-for-torrents" class="hash-link" aria-label="Direct link to Why VPN for Torrents?" title="Direct link to Why VPN for Torrents?" translate="no">​</a></h2>
<p>When torrenting:</p>
<ul>
<li class="">Your IP is visible to everyone in the swarm</li>
<li class="">Your ISP can see your traffic</li>
<li class="">Copyright trolls actively monitor popular torrents</li>
</ul>
<p>A VPN:</p>
<ul>
<li class="">Hides your real IP</li>
<li class="">Encrypts traffic from ISP</li>
<li class="">Provides deniability</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-kill-switch-problem">The Kill Switch Problem<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#the-kill-switch-problem" class="hash-link" aria-label="Direct link to The Kill Switch Problem" title="Direct link to The Kill Switch Problem" translate="no">​</a></h2>
<p>A regular VPN connection can drop without warning. If that happens, qBittorrent continues downloading with your real IP exposed.</p>
<p><strong>Solution</strong>: Use a container that won't allow any traffic without VPN.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="qbittorrent--vpn-docker-setup">qBittorrent + VPN Docker Setup<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#qbittorrent--vpn-docker-setup" class="hash-link" aria-label="Direct link to qBittorrent + VPN Docker Setup" title="Direct link to qBittorrent + VPN Docker Setup" translate="no">​</a></h2>
<p>We use binhex's image which integrates OpenVPN/WireGuard:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">qbittorrent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> binhex/arch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">qbittorrentvpn</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> qbittorrent</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">cap_add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> NET_ADMIN</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> VPN_ENABLED=yes</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> VPN_PROV=custom</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> VPN_CLIENT=openvpn</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ENABLE_PRIVOXY=no</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> LAN_NETWORK=192.168.1.0/24</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> NAME_SERVERS=1.1.1.1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">8.8.8.8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PUID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PGID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> WEBUI_PORT=8080</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> UMASK=022</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> qbit_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /path/to/downloads</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data/downloads</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /path/to/vpn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config/openvpn  </span><span class="token comment" style="color:rgb(98, 114, 164)"># VPN config files</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8080:8080"</span><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Web UI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"6881:6881"</span><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Torrent port (optional)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"6881:6881/udp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">sysctls</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> net.ipv4.conf.all.src_valid_mark=1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  qbit_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vpn-provider-setup">VPN Provider Setup<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#vpn-provider-setup" class="hash-link" aria-label="Direct link to VPN Provider Setup" title="Direct link to VPN Provider Setup" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nordvpn">NordVPN<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#nordvpn" class="hash-link" aria-label="Direct link to NordVPN" title="Direct link to NordVPN" translate="no">​</a></h3>
<ol>
<li class="">Download OpenVPN config from NordVPN</li>
<li class="">Place <code>.ovpn</code> file in <code>/config/openvpn/</code></li>
<li class="">Create credentials file:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">credentials.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">your_username</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">your_password</span><br></div></code></pre></div></div>
<ol start="4">
<li class="">Update the <code>.ovpn</code> file to reference credentials:</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">auth-user-pass /config/openvpn/credentials.conf</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="protonvpn">ProtonVPN<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#protonvpn" class="hash-link" aria-label="Direct link to ProtonVPN" title="Direct link to ProtonVPN" translate="no">​</a></h3>
<ol>
<li class="">Download OpenVPN config from account dashboard</li>
<li class="">Note: Use OpenVPN credentials, not account password</li>
<li class="">Same process as NordVPN</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verifying-the-kill-switch">Verifying the Kill Switch<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#verifying-the-kill-switch" class="hash-link" aria-label="Direct link to Verifying the Kill Switch" title="Direct link to Verifying the Kill Switch" translate="no">​</a></h2>
<p>Test that the kill switch works:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get container's external IP</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> qbittorrent </span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-s</span><span class="token plain"> https://ipinfo.io/ip</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Stop VPN inside container (simulating failure)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> qbittorrent </span><span class="token function" style="color:rgb(80, 250, 123)">pkill</span><span class="token plain"> openvpn</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Try to get IP again - should fail</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> qbittorrent </span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-s</span><span class="token plain"> --max-time </span><span class="token number">5</span><span class="token plain"> https://ipinfo.io/ip</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># No response = kill switch working!</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dns-leak-testing">DNS Leak Testing<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#dns-leak-testing" class="hash-link" aria-label="Direct link to DNS Leak Testing" title="Direct link to DNS Leak Testing" translate="no">​</a></h2>
<p>Even with VPN, DNS requests can leak. Test with:</p>
<ol>
<li class="">Go to <code>https://dnsleaktest.com</code> from the container:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> qbittorrent </span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-s</span><span class="token plain"> https://dnsleaktest.com/</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">
<p>Or check in qBittorrent's web UI if it shows your location</p>
</li>
<li class="">
<p>Use our <a class="" href="https://docs.bankai-tech.com/Examples/VPN/Docs/Testing/dnsleaktest">DNS Leak Testing guide</a></p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="port-forwarding">Port Forwarding<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#port-forwarding" class="hash-link" aria-label="Direct link to Port Forwarding" title="Direct link to Port Forwarding" translate="no">​</a></h2>
<p>Some VPN providers support port forwarding for better speeds:</p>
<ul>
<li class=""><strong>Mullvad</strong> - Dynamically assigned ports</li>
<li class=""><strong>AirVPN</strong> - Manual port selection</li>
<li class=""><strong>Private Internet Access</strong> - Port in app settings</li>
</ul>
<p>Configure in qBittorrent:</p>
<ol>
<li class="">Settings → Connection</li>
<li class="">Set "Listening Port" to your forwarded port</li>
<li class="">Disable "Use UPnP / NAT-PMP"</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="arr-stack-integration">Arr Stack Integration<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#arr-stack-integration" class="hash-link" aria-label="Direct link to Arr Stack Integration" title="Direct link to Arr Stack Integration" translate="no">​</a></h2>
<p>Connect qBittorrent to Radarr/Sonarr:</p>
<ol>
<li class="">In Radarr: Settings → Download Clients → Add</li>
<li class="">Select qBittorrent</li>
<li class="">Host: <code>qbittorrent</code> (container name) or <code>192.168.1.x</code></li>
<li class="">Port: <code>8080</code></li>
<li class="">Username/Password from qBittorrent settings</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="category-setup">Category Setup<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#category-setup" class="hash-link" aria-label="Direct link to Category Setup" title="Direct link to Category Setup" translate="no">​</a></h3>
<p>Create categories in qBittorrent:</p>
<ul>
<li class=""><code>movies</code> for Radarr</li>
<li class=""><code>tv</code> for Sonarr</li>
<li class=""><code>music</code> for Lidarr</li>
</ul>
<p>Set save paths:</p>
<ul>
<li class=""><code>/data/downloads/torrents/movies</code></li>
<li class=""><code>/data/downloads/torrents/tv</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vpn-wont-connect">VPN won't connect<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#vpn-wont-connect" class="hash-link" aria-label="Direct link to VPN won't connect" title="Direct link to VPN won't connect" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> logs qbittorrent </span><span class="token operator file-descriptor important">2</span><span class="token operator">&gt;</span><span class="token file-descriptor important">&amp;1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-i</span><span class="token plain"> vpn</span><br></div></code></pre></div></div>
<p>Check credentials and config file paths.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-ui-not-accessible">Web UI not accessible<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#web-ui-not-accessible" class="hash-link" aria-label="Direct link to Web UI not accessible" title="Direct link to Web UI not accessible" translate="no">​</a></h3>
<p>Verify <code>LAN_NETWORK</code> matches your actual network.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="slow-speeds">Slow speeds<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#slow-speeds" class="hash-link" aria-label="Direct link to Slow speeds" title="Direct link to Slow speeds" translate="no">​</a></h3>
<ul>
<li class="">Try different VPN servers</li>
<li class="">Enable port forwarding if available</li>
<li class="">Check if ISP throttles VPN traffic</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-setup">My Setup<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#my-setup" class="hash-link" aria-label="Direct link to My Setup" title="Direct link to My Setup" translate="no">​</a></h2>
<p>Currently using:</p>
<ul>
<li class="">Proton VPN</li>
<li class="">OpenVPN protocol</li>
<li class="">Port forwarding disabled</li>
<li class="">Connected to Radarr, Sonarr, Lidarr</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/secure-torrenting-vpn-qbittorrent#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Torrent%20Clients/qBittorrent/Docs/docker-vpn">qBittorrent VPN Deep Dive</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/VPN/Docs/Firewall/Linux%20Firewall">VPN Firewall Rules</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Arr%20Suite/Introduction">Arr Stack Setup</a></li>
</ul>
<hr>
<p><em>What VPN do you use for torrenting? Share on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="torrents" term="torrents"/>
        <category label="vpn" term="vpn"/>
        <category label="security" term="security"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Self-Hosted Cloud Storage: Complete Nextcloud Setup Guide]]></title>
        <id>https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide</id>
        <link href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide"/>
        <updated>2025-09-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tired of paying for Google Drive or Dropbox? Want full control over your data? Nextcloud is the answer. This post covers everything you need to know about deploying your own cloud storage platform.]]></summary>
        <content type="html"><![CDATA[<p>Tired of paying for Google Drive or Dropbox? Want full control over your data? Nextcloud is the answer. This post covers everything you need to know about deploying your own cloud storage platform.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-nextcloud">What is Nextcloud?<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#what-is-nextcloud" class="hash-link" aria-label="Direct link to What is Nextcloud?" title="Direct link to What is Nextcloud?" translate="no">​</a></h2>
<p>Nextcloud is a self-hosted productivity platform that provides:</p>
<ul>
<li class=""><strong>File storage and sync</strong> - Like Dropbox, but yours</li>
<li class=""><strong>Calendar and contacts</strong> - Replace Google Calendar</li>
<li class=""><strong>Collaborative editing</strong> - With Collabora or OnlyOffice</li>
<li class=""><strong>Photo management</strong> - With the Memories app</li>
<li class=""><strong>Video calls</strong> - Built-in Talk functionality</li>
<li class=""><strong>And much more</strong> - Through a vast app ecosystem</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choosing-your-installation-method">Choosing Your Installation Method<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#choosing-your-installation-method" class="hash-link" aria-label="Direct link to Choosing Your Installation Method" title="Direct link to Choosing Your Installation Method" translate="no">​</a></h2>
<p>We support multiple installation approaches:</p>
<table><thead><tr><th>Method</th><th>Best For</th><th>Complexity</th></tr></thead><tbody><tr><td>Docker (Complete)</td><td>Full features, easy updates</td><td>Medium</td></tr><tr><td>Docker (Minimum)</td><td>Quick start, basic features</td><td>Low</td></tr><tr><td>Snap</td><td>Raspberry Pi, simplicity</td><td>Low</td></tr><tr><td>Manual</td><td>Maximum control</td><td>High</td></tr></tbody></table>
<p>For most homelabbers, <strong>Docker (Complete)</strong> is the sweet spot.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-complete-docker-stack">The Complete Docker Stack<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#the-complete-docker-stack" class="hash-link" aria-label="Direct link to The Complete Docker Stack" title="Direct link to The Complete Docker Stack" translate="no">​</a></h2>
<p>Our recommended setup includes:</p>
<ul>
<li class=""><strong>Nextcloud</strong> - The main application</li>
<li class=""><strong>MariaDB</strong> - Database backend</li>
<li class=""><strong>Redis</strong> - Caching for performance</li>
<li class=""><strong>Collabora</strong> - Document editing</li>
<li class=""><strong>Cron</strong> - Background job processing</li>
</ul>
<p>Here's a simplified version of the compose file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">nextcloud</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> nextcloud</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">production</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> nextcloud</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">depends_on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> redis</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8080:80"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_HOST=mariadb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_DATABASE=nextcloud</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_USER=nextcloud</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_PASSWORD=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> REDIS_HOST=redis</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> nextcloud_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/var/www/html</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">mariadb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> mariadb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">10.11</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> nextcloud</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">db</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_ROOT_PASSWORD=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_ROOT_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_DATABASE=nextcloud</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_USER=nextcloud</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> MYSQL_PASSWORD=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> mariadb_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/var/lib/mysql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">alpine</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> nextcloud</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">redis</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">nextcloud_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  mariadb_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-optimization">Performance Optimization<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#performance-optimization" class="hash-link" aria-label="Direct link to Performance Optimization" title="Direct link to Performance Optimization" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-redis-caching">Enable Redis Caching<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#enable-redis-caching" class="hash-link" aria-label="Direct link to Enable Redis Caching" title="Direct link to Enable Redis Caching" translate="no">​</a></h3>
<p>Add to your Nextcloud config.php:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">'memcache.local' =&gt; '\OC\Memcache\APCu',</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">'memcache.distributed' =&gt; '\OC\Memcache\Redis',</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">'memcache.locking' =&gt; '\OC\Memcache\Redis',</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">'redis' =&gt; [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    'host' =&gt; 'redis',</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    'port' =&gt; 6379,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">],</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="background-jobs">Background Jobs<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#background-jobs" class="hash-link" aria-label="Direct link to Background Jobs" title="Direct link to Background Jobs" translate="no">​</a></h3>
<p>Ensure cron is running properly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> www-data nextcloud php cron.php</span><br></div></code></pre></div></div>
<p>Or use our dedicated cron container in the full stack.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="photo-management-with-memories">Photo Management with Memories<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#photo-management-with-memories" class="hash-link" aria-label="Direct link to Photo Management with Memories" title="Direct link to Photo Management with Memories" translate="no">​</a></h2>
<p>The Memories app transforms Nextcloud into a Google Photos alternative:</p>
<ol>
<li class="">Install Memories from the app store</li>
<li class="">Install go-vod for video transcoding</li>
<li class="">Configure the preview generator</li>
<li class="">Run initial indexing</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> www-data nextcloud php occ memories:index</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="backup-strategy">Backup Strategy<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#backup-strategy" class="hash-link" aria-label="Direct link to Backup Strategy" title="Direct link to Backup Strategy" translate="no">​</a></h2>
<p><strong>Critical</strong>: Always back up both your files AND your database!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Database backup</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> nextcloud-db mysqldump </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> root -p</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${DB_ROOT_PASSWORD}</span><span class="token plain"> nextcloud </span><span class="token operator">&gt;</span><span class="token plain"> backup.sql</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Volume backup</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> nextcloud_data:/data </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-v</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token variable builtin class-name" style="color:rgb(189, 147, 249);font-style:italic">pwd</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token plain">:/backup alpine </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">tar</span><span class="token plain"> czf /backup/nextcloud-files.tar.gz /data</span><br></div></code></pre></div></div>
<p>Check out our <a class="" href="https://docs.bankai-tech.com/Nextcloud/Docs/Backup">comprehensive backup guide</a> for automated solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-issues-and-solutions">Common Issues and Solutions<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#common-issues-and-solutions" class="hash-link" aria-label="Direct link to Common Issues and Solutions" title="Direct link to Common Issues and Solutions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="maintenance-mode-loops">"Maintenance mode" loops<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#maintenance-mode-loops" class="hash-link" aria-label="Direct link to &quot;Maintenance mode&quot; loops" title="Direct link to &quot;Maintenance mode&quot; loops" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> www-data nextcloud php occ maintenance:mode </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--off</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="slow-initial-page-loads">Slow initial page loads<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#slow-initial-page-loads" class="hash-link" aria-label="Direct link to Slow initial page loads" title="Direct link to Slow initial page loads" translate="no">​</a></h3>
<p>Enable APCu and Redis caching, run cron consistently.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upload-size-limits">Upload size limits<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#upload-size-limits" class="hash-link" aria-label="Direct link to Upload size limits" title="Direct link to Upload size limits" translate="no">​</a></h3>
<p>Configure PHP limits in your environment:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PHP_UPLOAD_LIMIT=16G</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/self-hosted-cloud-nextcloud-complete-guide#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<p>For complete, production-ready configurations:</p>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Nextcloud/Docs/Installation/Complete">Complete Installation Guide</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Nextcloud/Docs/Installation/Collabora">Collabora Office Setup</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Nextcloud/Docs/Troubleshooting/Nextcloud">Troubleshooting Guide</a></li>
</ul>
<hr>
<p><em>Self-hosting your data is a journey. Join us on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a> to share your experiences!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="nextcloud" term="nextcloud"/>
        <category label="self-hosting" term="self-hosting"/>
        <category label="cloud-storage" term="cloud-storage"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[NFS vs SMB: Choosing the Right Network Storage Protocol]]></title>
        <id>https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage</id>
        <link href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage"/>
        <updated>2025-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Sharing storage across your homelab network? The two main protocols are NFS and SMB (CIFS). Here's when to use each and how to set them up.]]></summary>
        <content type="html"><![CDATA[<p>Sharing storage across your homelab network? The two main protocols are NFS and SMB (CIFS). Here's when to use each and how to set them up.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-comparison">Quick Comparison<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#quick-comparison" class="hash-link" aria-label="Direct link to Quick Comparison" title="Direct link to Quick Comparison" translate="no">​</a></h2>
<table><thead><tr><th>Feature</th><th>NFS</th><th>SMB/CIFS</th></tr></thead><tbody><tr><td>Best for</td><td>Linux clients</td><td>Windows/mixed</td></tr><tr><td>Performance</td><td>Higher</td><td>Good</td></tr><tr><td>Setup complexity</td><td>Medium</td><td>Low</td></tr><tr><td>Windows support</td><td>Limited</td><td>Native</td></tr><tr><td>Linux support</td><td>Native</td><td>Good</td></tr><tr><td>macOS support</td><td>Good</td><td>Good</td></tr><tr><td>Authentication</td><td>UID/GID</td><td>User/password</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-nfs">When to Use NFS<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#when-to-use-nfs" class="hash-link" aria-label="Direct link to When to Use NFS" title="Direct link to When to Use NFS" translate="no">​</a></h2>
<p>Choose NFS when:</p>
<ul>
<li class="">All clients are Linux</li>
<li class="">Performance is critical</li>
<li class="">Docker containers need shared storage</li>
<li class="">Proxmox/KVM shared storage</li>
<li class="">Simple permission model works</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-smb">When to Use SMB<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#when-to-use-smb" class="hash-link" aria-label="Direct link to When to Use SMB" title="Direct link to When to Use SMB" translate="no">​</a></h2>
<p>Choose SMB when:</p>
<ul>
<li class="">Windows clients exist</li>
<li class="">Mixed environment (Windows + Linux + Mac)</li>
<li class="">User-based permissions needed</li>
<li class="">Media streaming to TVs/devices</li>
<li class="">Samba AD integration required</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nfs-setup-server">NFS Setup (Server)<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#nfs-setup-server" class="hash-link" aria-label="Direct link to NFS Setup (Server)" title="Direct link to NFS Setup (Server)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-nfs-server">Install NFS Server<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#install-nfs-server" class="hash-link" aria-label="Direct link to Install NFS Server" title="Direct link to Install NFS Server" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> nfs-kernel-server</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-export">Create Export<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#create-export" class="hash-link" aria-label="Direct link to Create Export" title="Direct link to Create Export" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> /srv/nfs/media</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">chown</span><span class="token plain"> nobody:nogroup /srv/nfs/media</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-exports">Configure Exports<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#configure-exports" class="hash-link" aria-label="Direct link to Configure Exports" title="Direct link to Configure Exports" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/exports</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">/srv/nfs/media    </span><span class="token number">192.168</span><span class="token plain">.1.0/24</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">rw,sync,no_subtree_check,no_root_squash</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>Options explained:</p>
<ul>
<li class=""><code>rw</code> - Read/write access</li>
<li class=""><code>sync</code> - Write to disk before confirming</li>
<li class=""><code>no_subtree_check</code> - Improves reliability</li>
<li class=""><code>no_root_squash</code> - Allow root access (use carefully!)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="apply-and-start">Apply and Start<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#apply-and-start" class="hash-link" aria-label="Direct link to Apply and Start" title="Direct link to Apply and Start" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> exportfs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-a</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> systemctl restart nfs-kernel-server</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nfs-client-setup">NFS Client Setup<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#nfs-client-setup" class="hash-link" aria-label="Direct link to NFS Client Setup" title="Direct link to NFS Client Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install client</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> nfs-common</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create mount point</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> /mnt/media</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Mount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mount</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-t</span><span class="token plain"> nfs server-ip:/srv/nfs/media /mnt/media</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Verify</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">df</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-h</span><span class="token plain"> /mnt/media</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="persistent-mount-fstab">Persistent Mount (fstab)<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#persistent-mount-fstab" class="hash-link" aria-label="Direct link to Persistent Mount (fstab)" title="Direct link to Persistent Mount (fstab)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/fstab</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">server-ip:/srv/nfs/media  /mnt/media  nfs  defaults,_netdev  </span><span class="token number">0</span><span class="token plain">  </span><span class="token number">0</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-usage">Docker Usage<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#docker-usage" class="hash-link" aria-label="Direct link to Docker Usage" title="Direct link to Docker Usage" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">jellyfin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> nfs_media</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/media</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">nfs_media</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">driver</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> local</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">driver_opts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> nfs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> addr=192.168.1.100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">rw</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">nfsvers=4</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">device</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">":/srv/nfs/media"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="smb-setup-server">SMB Setup (Server)<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#smb-setup-server" class="hash-link" aria-label="Direct link to SMB Setup (Server)" title="Direct link to SMB Setup (Server)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-samba">Install Samba<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#install-samba" class="hash-link" aria-label="Direct link to Install Samba" title="Direct link to Install Samba" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> samba</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-share-directory">Create Share Directory<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#create-share-directory" class="hash-link" aria-label="Direct link to Create Share Directory" title="Direct link to Create Share Directory" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> /srv/samba/media</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">chown</span><span class="token plain"> nobody:nogroup /srv/samba/media</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">chmod</span><span class="token plain"> </span><span class="token number">2775</span><span class="token plain"> /srv/samba/media</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-samba">Configure Samba<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#configure-samba" class="hash-link" aria-label="Direct link to Configure Samba" title="Direct link to Configure Samba" translate="no">​</a></h3>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/samba/smb.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token section punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token section section-name selector" style="color:rgb(255, 121, 198)">media</span><span class="token section punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">path</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">/srv/samba/media</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">browseable</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">yes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">read only</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">no</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">guest ok</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">no</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">valid users</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">@sambashare</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">create mask</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">0664</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">directory mask</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">0775</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-samba-user">Create Samba User<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#create-samba-user" class="hash-link" aria-label="Direct link to Create Samba User" title="Direct link to Create Samba User" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Add system user to samba group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">usermod</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-aG</span><span class="token plain"> sambashare your-username</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Set Samba password</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> smbpasswd </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-a</span><span class="token plain"> your-username</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="restart-samba">Restart Samba<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#restart-samba" class="hash-link" aria-label="Direct link to Restart Samba" title="Direct link to Restart Samba" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> systemctl restart smbd</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> systemctl restart nmbd</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="smb-client-setup">SMB Client Setup<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#smb-client-setup" class="hash-link" aria-label="Direct link to SMB Client Setup" title="Direct link to SMB Client Setup" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="linux">Linux<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#linux" class="hash-link" aria-label="Direct link to Linux" title="Direct link to Linux" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install client</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> cifs-utils</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Mount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mount</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-t</span><span class="token plain"> cifs //server-ip/media /mnt/media </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">username</span><span class="token operator">=</span><span class="token plain">your-username</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Persistent with credentials file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"username=your-username"</span><span class="token plain"> </span><span class="token operator">&gt;</span><span class="token plain"> ~/.smbcredentials</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"password=your-password"</span><span class="token plain"> </span><span class="token operator">&gt;&gt;</span><span class="token plain"> ~/.smbcredentials</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">chmod</span><span class="token plain"> </span><span class="token number">600</span><span class="token plain"> ~/.smbcredentials</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/fstab</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">//server-ip/media  /mnt/media  cifs  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">credentials</span><span class="token operator">=</span><span class="token plain">/home/user/.smbcredentials,_netdev  </span><span class="token number">0</span><span class="token plain">  </span><span class="token number">0</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="windows">Windows<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#windows" class="hash-link" aria-label="Direct link to Windows" title="Direct link to Windows" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Map network drive</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">net use M: \\server-ip\media </span><span class="token operator">/</span><span class="token plain">user:your-username</span><br></div></code></pre></div></div>
<p>Or via File Explorer: <code>\\server-ip\media</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="macos">macOS<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#macos" class="hash-link" aria-label="Direct link to macOS" title="Direct link to macOS" translate="no">​</a></h3>
<p>Finder → Go → Connect to Server → <code>smb://server-ip/media</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-tips">Performance Tips<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#performance-tips" class="hash-link" aria-label="Direct link to Performance Tips" title="Direct link to Performance Tips" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nfs-tuning">NFS Tuning<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#nfs-tuning" class="hash-link" aria-label="Direct link to NFS Tuning" title="Direct link to NFS Tuning" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/fstab</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Optimized NFS mount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">server:/share  /mnt/share  nfs  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">rsize</span><span class="token operator">=</span><span class="token number">1048576</span><span class="token plain">,wsize</span><span class="token operator">=</span><span class="token number">1048576</span><span class="token plain">,hard,intr,_netdev  </span><span class="token number">0</span><span class="token plain">  </span><span class="token number">0</span><br></div></code></pre></div></div>
<ul>
<li class=""><code>rsize/wsize</code> - Larger buffer sizes</li>
<li class=""><code>hard</code> - Retry indefinitely on failure</li>
<li class=""><code>intr</code> - Allow interrupt</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="smb-tuning">SMB Tuning<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#smb-tuning" class="hash-link" aria-label="Direct link to SMB Tuning" title="Direct link to SMB Tuning" translate="no">​</a></h3>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/samba/smb.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token section punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token section section-name selector" style="color:rgb(255, 121, 198)">global</span><span class="token section punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">socket options</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">TCP_NODELAY IPTOS_LOWDELAY</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">read raw</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">yes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">write raw</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">yes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">   </span><span class="token key attr-name" style="color:rgb(241, 250, 140)">max xmit</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token value attr-value">65535</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sshfs-alternative">SSHFS Alternative<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#sshfs-alternative" class="hash-link" aria-label="Direct link to SSHFS Alternative" title="Direct link to SSHFS Alternative" translate="no">​</a></h2>
<p>For quick, secure mounts:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> sshfs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Mount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">sshfs user@server:/path /mnt/sshfs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Unmount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">fusermount </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-u</span><span class="token plain"> /mnt/sshfs</span><br></div></code></pre></div></div>
<p>Pros: Encrypted, works through firewalls
Cons: Slower, requires SSH access</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-setup">My Setup<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#my-setup" class="hash-link" aria-label="Direct link to My Setup" title="Direct link to My Setup" translate="no">​</a></h2>
<p>Current storage shares:</p>
<ul>
<li class=""><strong>NFS</strong> - Proxmox VM disks, Docker volumes</li>
<li class=""><strong>SMB</strong> - Media library for TVs/clients</li>
<li class=""><strong>SSHFS</strong> - Quick access during development</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/nfs-vs-smb-homelab-storage#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/NFS">NFS Configuration</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/CIFS-SMB">CIFS/SMB Configuration</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/SSHFS">SSHFS Setup</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/mergerfs">MergerFS Pool</a></li>
</ul>
<hr>
<p><em>What's your storage protocol of choice? Share on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="storage" term="storage"/>
        <category label="networking" term="networking"/>
        <category label="nfs" term="nfs"/>
        <category label="smb" term="smb"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[UniFi Network: Professional Networking for Your Homelab]]></title>
        <id>https://docs.bankai-tech.com/blog/unifi-network-homelab-setup</id>
        <link href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup"/>
        <updated>2025-08-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Ubiquiti's UniFi line brings enterprise networking features to homelab budgets. Here's why I switched to UniFi and how to get started with the UniFi Controller.]]></summary>
        <content type="html"><![CDATA[<p>Ubiquiti's UniFi line brings enterprise networking features to homelab budgets. Here's why I switched to UniFi and how to get started with the UniFi Controller.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-unifi">Why UniFi?<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#why-unifi" class="hash-link" aria-label="Direct link to Why UniFi?" title="Direct link to Why UniFi?" translate="no">​</a></h2>
<p>After years of consumer routers, I switched to UniFi for:</p>
<ul>
<li class=""><strong>Unified management</strong> - Single interface for all devices</li>
<li class=""><strong>VLAN support</strong> - Proper network segmentation</li>
<li class=""><strong>Enterprise features</strong> - IDS/IPS, traffic analysis, captive portals</li>
<li class=""><strong>Scalability</strong> - Start small, grow without replacing hardware</li>
<li class=""><strong>No subscription</strong> - One-time hardware cost (mostly)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="unifi-vs-consumer-routers">UniFi vs Consumer Routers<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#unifi-vs-consumer-routers" class="hash-link" aria-label="Direct link to UniFi vs Consumer Routers" title="Direct link to UniFi vs Consumer Routers" translate="no">​</a></h2>
<table><thead><tr><th>Feature</th><th>UniFi</th><th>Consumer Router</th></tr></thead><tbody><tr><td>VLANs</td><td>Yes</td><td>Rarely</td></tr><tr><td>Management</td><td>Centralized</td><td>Per-device</td></tr><tr><td>Firmware Updates</td><td>Controlled</td><td>Forced</td></tr><tr><td>Expandability</td><td>Modular</td><td>Replace all</td></tr><tr><td>Traffic Analytics</td><td>Detailed</td><td>Basic</td></tr><tr><td>Price</td><td>Higher upfront</td><td>Lower upfront</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="unifi-product-lines">UniFi Product Lines<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#unifi-product-lines" class="hash-link" aria-label="Direct link to UniFi Product Lines" title="Direct link to UniFi Product Lines" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="networksecurity">Network/Security<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#networksecurity" class="hash-link" aria-label="Direct link to Network/Security" title="Direct link to Network/Security" translate="no">​</a></h3>
<ul>
<li class=""><strong>Dream Machine</strong> - All-in-one router + controller</li>
<li class=""><strong>Security Gateway</strong> - Dedicated router/firewall</li>
<li class=""><strong>Switches</strong> - Managed switches with PoE options</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="wireless">Wireless<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#wireless" class="hash-link" aria-label="Direct link to Wireless" title="Direct link to Wireless" translate="no">​</a></h3>
<ul>
<li class=""><strong>Access Points</strong> - Various models for different needs</li>
<li class=""><strong>In-Wall APs</strong> - Combine AP + switch ports</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-recommendations">My Recommendations<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#my-recommendations" class="hash-link" aria-label="Direct link to My Recommendations" title="Direct link to My Recommendations" translate="no">​</a></h3>
<p><strong>Starter setup:</strong></p>
<ul>
<li class="">UDM SE (Dream Machine Special Edition)</li>
<li class="">1-2 U6 Pro access points</li>
<li class="">USW-24-PoE switch</li>
</ul>
<p><strong>Budget conscious:</strong></p>
<ul>
<li class="">USG (Security Gateway)</li>
<li class="">USW-Lite-8-PoE</li>
<li class="">U6 Lite access point</li>
<li class="">Self-hosted controller</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-unifi-controller">Installing UniFi Controller<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#installing-unifi-controller" class="hash-link" aria-label="Direct link to Installing UniFi Controller" title="Direct link to Installing UniFi Controller" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If you have a UDM gateway (Dream Machine, UDM SE, UDM Pro, etc.), the controller is built-in—no self-hosted installation needed. The steps below are for setups using standalone devices like the USG, switches, and access points without a Dream Machine.</p></div></div>
<p>You don't need Ubiquiti hardware to run the controller. Self-host it for free!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-glennrs-scripts-recommended">Using GlennR's Scripts (Recommended)<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#using-glennrs-scripts-recommended" class="hash-link" aria-label="Direct link to Using GlennR's Scripts (Recommended)" title="Direct link to Using GlennR's Scripts (Recommended)" translate="no">​</a></h3>
<p>The easiest installation method:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># One-liner installation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">rm</span><span class="token plain"> unifi-latest.sh </span><span class="token operator">&amp;&gt;</span><span class="token plain"> /dev/null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">wget</span><span class="token plain"> https://get.glennr.nl/unifi/install/install_latest/unifi-latest.sh </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">bash</span><span class="token plain"> unifi-latest.sh</span><br></div></code></pre></div></div>
<p>The script handles:</p>
<ul>
<li class="">MongoDB installation</li>
<li class="">Java version management</li>
<li class="">Dependencies</li>
<li class="">Firewall rules</li>
<li class="">Systemd service</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-alternative">Docker Alternative<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#docker-alternative" class="hash-link" aria-label="Direct link to Docker Alternative" title="Direct link to Docker Alternative" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">unifi-controller</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> lscr.io/linuxserver/unifi</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">controller</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unifi</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">controller</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PUID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> PGID=1000</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> unifi_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3478:3478/udp"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(98, 114, 164)"># STUN</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"10001:10001/udp"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Device discovery</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8080:8080"</span><span class="token plain">       </span><span class="token comment" style="color:rgb(98, 114, 164)"># Device communication</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8443:8443"</span><span class="token plain">       </span><span class="token comment" style="color:rgb(98, 114, 164)"># Web UI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"6789:6789"</span><span class="token plain">       </span><span class="token comment" style="color:rgb(98, 114, 164)"># Mobile speedtest</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  unifi_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initial-setup">Initial Setup<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#initial-setup" class="hash-link" aria-label="Direct link to Initial Setup" title="Direct link to Initial Setup" translate="no">​</a></h2>
<ol>
<li class="">Access controller at <code>https://YOUR-IP:8443</code></li>
<li class="">Create admin account</li>
<li class="">Set up site name and country</li>
<li class="">Adopt devices (they find the controller automatically)</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="adopting-devices">Adopting Devices<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#adopting-devices" class="hash-link" aria-label="Direct link to Adopting Devices" title="Direct link to Adopting Devices" translate="no">​</a></h3>
<p>Devices on the same L2 network find the controller automatically. For remote adoption:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># SSH into UniFi device</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">ssh</span><span class="token plain"> ubnt@device-ip</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Set inform URL</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">set-inform http://controller-ip:8080/inform</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vlan-configuration">VLAN Configuration<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#vlan-configuration" class="hash-link" aria-label="Direct link to VLAN Configuration" title="Direct link to VLAN Configuration" translate="no">​</a></h2>
<p>UniFi makes VLANs easy:</p>
<ol>
<li class=""><strong>Settings → Networks → Create New</strong></li>
<li class="">Set VLAN ID</li>
<li class="">Configure DHCP range</li>
<li class="">Apply to switch ports</li>
<li class="">Create corresponding SSID with VLAN tag</li>
</ol>
<p>Example VLANs:</p>
<ul>
<li class="">VLAN 1: Management (default)</li>
<li class="">VLAN 10: Trusted devices</li>
<li class="">VLAN 20: IoT devices</li>
<li class="">VLAN 30: Guest network</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="firewall-rules">Firewall Rules<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#firewall-rules" class="hash-link" aria-label="Direct link to Firewall Rules" title="Direct link to Firewall Rules" translate="no">​</a></h2>
<p>Isolate your IoT devices:</p>
<p><strong>Settings → Firewall &amp; Security → Create Rule</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Name: Block IoT to LAN</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Type: LAN In</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Source: IoT Network</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Destination: All Networks except IoT</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Action: Drop</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="traffic-analytics">Traffic Analytics<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#traffic-analytics" class="hash-link" aria-label="Direct link to Traffic Analytics" title="Direct link to Traffic Analytics" translate="no">​</a></h2>
<p>UniFi provides detailed traffic analysis:</p>
<ul>
<li class="">Application identification</li>
<li class="">Bandwidth usage per device</li>
<li class="">Historical data</li>
<li class="">Top clients/applications</li>
</ul>
<p>Enable Deep Packet Inspection for full details (has performance impact).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tips-from-experience">Tips from Experience<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#tips-from-experience" class="hash-link" aria-label="Direct link to Tips from Experience" title="Direct link to Tips from Experience" translate="no">​</a></h2>
<ol>
<li class=""><strong>Backup your controller</strong> - Export site backups regularly</li>
<li class=""><strong>Stable releases only</strong> - Avoid beta firmware for critical infrastructure</li>
<li class=""><strong>Plan your VLANs</strong> - Changing later is painful</li>
<li class=""><strong>PoE budget</strong> - Calculate total PoE needs before buying switch</li>
<li class=""><strong>Hardwired backhaul</strong> - Wi-Fi mesh is good, Ethernet is better</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/unifi-network-homelab-setup#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Ubiquiti/Docs/Access%20Points/Unifi%20Controller%20Server">UniFi Controller Installation</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Introduction">Network Configuration Basics</a></li>
</ul>
<hr>
<p><em>What networking gear are you running? Share your setup on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="ubiquiti" term="ubiquiti"/>
        <category label="unifi" term="unifi"/>
        <category label="networking" term="networking"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[MergerFS: Combine Multiple Drives into One Pool]]></title>
        <id>https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab</id>
        <link href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab"/>
        <updated>2025-08-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Have a bunch of different-sized drives? Want to use them as one big storage pool without RAID complexity? MergerFS is the answer. Here's how to pool your drives while maintaining flexibility.]]></summary>
        <content type="html"><![CDATA[<p>Have a bunch of different-sized drives? Want to use them as one big storage pool without RAID complexity? MergerFS is the answer. Here's how to pool your drives while maintaining flexibility.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-mergerfs">What is MergerFS?<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#what-is-mergerfs" class="hash-link" aria-label="Direct link to What is MergerFS?" title="Direct link to What is MergerFS?" translate="no">​</a></h2>
<p>MergerFS is a union filesystem that:</p>
<ul>
<li class=""><strong>Combines multiple drives</strong> into a single mount point</li>
<li class=""><strong>No reformatting required</strong> - Use existing filesystems</li>
<li class=""><strong>No redundancy overhead</strong> - Full capacity available</li>
<li class=""><strong>Drive independence</strong> - Each drive remains accessible individually</li>
<li class=""><strong>Flexible policies</strong> - Choose how files are distributed</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mergerfs-vs-raid-vs-zfs">MergerFS vs RAID vs ZFS<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#mergerfs-vs-raid-vs-zfs" class="hash-link" aria-label="Direct link to MergerFS vs RAID vs ZFS" title="Direct link to MergerFS vs RAID vs ZFS" translate="no">​</a></h2>
<table><thead><tr><th>Feature</th><th>MergerFS</th><th>RAID</th><th>ZFS</th></tr></thead><tbody><tr><td>Mixed drive sizes</td><td>✅</td><td>❌</td><td>⚠️</td></tr><tr><td>No parity overhead</td><td>✅</td><td>❌</td><td>❌</td></tr><tr><td>Drive independence</td><td>✅</td><td>❌</td><td>❌</td></tr><tr><td>Redundancy</td><td>❌*</td><td>✅</td><td>✅</td></tr><tr><td>Performance</td><td>Good</td><td>Great</td><td>Great</td></tr><tr><td>Complexity</td><td>Low</td><td>Medium</td><td>High</td></tr></tbody></table>
<p>*Use SnapRAID alongside MergerFS for parity protection!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Ubuntu/Debian</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> mergerfs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Or latest from GitHub</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">wget</span><span class="token plain"> https://github.com/trapexit/mergerfs/releases/download/2.38.0/mergerfs_2.38.0.ubuntu-focal_amd64.deb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> dpkg </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-i</span><span class="token plain"> mergerfs_2.38.0.ubuntu-focal_amd64.deb</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-setup">Basic Setup<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#basic-setup" class="hash-link" aria-label="Direct link to Basic Setup" title="Direct link to Basic Setup" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prepare-your-drives">Prepare Your Drives<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#prepare-your-drives" class="hash-link" aria-label="Direct link to Prepare Your Drives" title="Direct link to Prepare Your Drives" translate="no">​</a></h3>
<p>Assuming drives at <code>/mnt/disk1</code>, <code>/mnt/disk2</code>, <code>/mnt/disk3</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create mount point for pool</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> /mnt/storage</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Mount drives (add to fstab for persistence)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mount</span><span class="token plain"> /dev/sdb1 /mnt/disk1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mount</span><span class="token plain"> /dev/sdc1 /mnt/disk2</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">mount</span><span class="token plain"> /dev/sdd1 /mnt/disk3</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-mergerfs-pool">Create MergerFS Pool<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#create-mergerfs-pool" class="hash-link" aria-label="Direct link to Create MergerFS Pool" title="Direct link to Create MergerFS Pool" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Basic merge</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> mergerfs /mnt/disk1:/mnt/disk2:/mnt/disk3 /mnt/storage</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># With recommended options</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> mergerfs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> defaults,allow_other,use_ino,cache.files</span><span class="token operator">=</span><span class="token plain">off,moveonenospc</span><span class="token operator">=</span><span class="token plain">true,category.create</span><span class="token operator">=</span><span class="token plain">mfs,dropcacheonclose</span><span class="token operator">=</span><span class="token plain">true,minfreespace</span><span class="token operator">=</span><span class="token plain">50G,fsname</span><span class="token operator">=</span><span class="token plain">mergerfs /mnt/disk*:/mnt/storage</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="persistent-mount-fstab">Persistent Mount (fstab)<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#persistent-mount-fstab" class="hash-link" aria-label="Direct link to Persistent Mount (fstab)" title="Direct link to Persistent Mount (fstab)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/etc/fstab</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Individual drives</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/dev/sdb1 /mnt/disk1 ext4 defaults </span><span class="token number">0</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/dev/sdc1 /mnt/disk2 ext4 defaults </span><span class="token number">0</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/dev/sdd1 /mnt/disk3 ext4 defaults </span><span class="token number">0</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># MergerFS pool</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/mnt/disk* /mnt/storage fuse.mergerfs defaults,allow_other,use_ino,cache.files</span><span class="token operator">=</span><span class="token plain">off,moveonenospc</span><span class="token operator">=</span><span class="token plain">true,category.create</span><span class="token operator">=</span><span class="token plain">mfs,dropcacheonclose</span><span class="token operator">=</span><span class="token plain">true,minfreespace</span><span class="token operator">=</span><span class="token plain">50G,fsname</span><span class="token operator">=</span><span class="token plain">mergerfs </span><span class="token number">0</span><span class="token plain"> </span><span class="token number">0</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-options-explained">Key Options Explained<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#key-options-explained" class="hash-link" aria-label="Direct link to Key Options Explained" title="Direct link to Key Options Explained" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="categorycreate-file-placement-policy">category.create (File Placement Policy)<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#categorycreate-file-placement-policy" class="hash-link" aria-label="Direct link to category.create (File Placement Policy)" title="Direct link to category.create (File Placement Policy)" translate="no">​</a></h3>
<table><thead><tr><th>Policy</th><th>Description</th></tr></thead><tbody><tr><td><code>mfs</code></td><td>Most free space - New files go to drive with most room</td></tr><tr><td><code>lfs</code></td><td>Least free space - Fill drives evenly</td></tr><tr><td><code>epmfs</code></td><td>Existing path, most free space - Keep files together</td></tr><tr><td><code>rand</code></td><td>Random placement</td></tr><tr><td><code>ff</code></td><td>First found - Fill drives sequentially</td></tr></tbody></table>
<p>For media libraries: <code>mfs</code> or <code>epmfs</code>
For general use: <code>mfs</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="minfreespace">minfreespace<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#minfreespace" class="hash-link" aria-label="Direct link to minfreespace" title="Direct link to minfreespace" translate="no">​</a></h3>
<p>Stop writing to a drive when it has less than specified free space:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">minfreespace=50G  # Leave 50GB free on each drive</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="moveonenospc">moveonenospc<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#moveonenospc" class="hash-link" aria-label="Direct link to moveonenospc" title="Direct link to moveonenospc" translate="no">​</a></h3>
<p>If a drive fills up during a write, move the file to another drive:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">moveonenospc=true</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-with-docker">Use with Docker<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#use-with-docker" class="hash-link" aria-label="Direct link to Use with Docker" title="Direct link to Use with Docker" translate="no">​</a></h2>
<p>Perfect for media stacks!</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">jellyfin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> jellyfin/jellyfin</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /mnt/storage/media</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/media</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ro</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">radarr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> lscr.io/linuxserver/radarr</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /mnt/storage/media/movies</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/movies</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /mnt/storage/downloads</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/downloads</span><br></div></code></pre></div></div>
<p>All containers see one unified <code>/mnt/storage</code> path.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring-pool-status">Monitoring Pool Status<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#monitoring-pool-status" class="hash-link" aria-label="Direct link to Monitoring Pool Status" title="Direct link to Monitoring Pool Status" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Check pool status</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">df</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-h</span><span class="token plain"> /mnt/storage</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># See individual drive usage</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">df</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-h</span><span class="token plain"> /mnt/disk*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Find which drive a file is on</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">getfattr </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> user.mergerfs.fullpath /mnt/storage/somefile</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-new-drives">Adding New Drives<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#adding-new-drives" class="hash-link" aria-label="Direct link to Adding New Drives" title="Direct link to Adding New Drives" translate="no">​</a></h2>
<ol>
<li class="">Format and mount new drive</li>
<li class="">Add to mergerfs mount options</li>
<li class="">Remount or restart</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Add /mnt/disk4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">umount</span><span class="token plain"> /mnt/storage</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> mergerfs /mnt/disk*:/mnt/storage </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tips-from-experience">Tips from Experience<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#tips-from-experience" class="hash-link" aria-label="Direct link to Tips from Experience" title="Direct link to Tips from Experience" translate="no">​</a></h2>
<ol>
<li class=""><strong>Label your drives</strong> - Use <code>/dev/disk/by-id/</code> in fstab</li>
<li class=""><strong>Test failover</strong> - Unplug a drive, verify others work</li>
<li class=""><strong>Monitor health</strong> - Use Scrutiny or smartd</li>
<li class=""><strong>Regular SnapRAID sync</strong> - Cron job daily</li>
<li class=""><strong>Backup critical data</strong> - SnapRAID isn't instant recovery</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-storage-setup">My Storage Setup<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#my-storage-setup" class="hash-link" aria-label="Direct link to My Storage Setup" title="Direct link to My Storage Setup" translate="no">​</a></h2>
<p>Current configuration:</p>
<ul>
<li class="">3 x 26TB drives in MergerFS pool</li>
<li class="">1 x 24TB drive in MergerFS pool</li>
<li class="">1 x 22TB drive in MergerFS pool</li>
<li class="">1 x 18TB drive in MergerFS pool</li>
<li class="">minfreespace: 500GB (per drive)</li>
<li class="">Used for Jellyfin media library (Without Parity)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/mergerfs-jbod-storage-homelab#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/mergerfs">MergerFS Documentation</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/Introduction">Storage Options Comparison</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/NFS">NFS Shares</a></li>
</ul>
<hr>
<p><em>How do you organize your storage? Share your setup on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="storage" term="storage"/>
        <category label="mergerfs" term="mergerfs"/>
        <category label="homelab" term="homelab"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Scrutiny: Monitor Your Hard Drives Before They Fail]]></title>
        <id>https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab</id>
        <link href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab"/>
        <updated>2025-08-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hard drives fail. It's not a matter of if, but when. Scrutiny helps you predict failures before they happen by monitoring SMART data across all your drives. Here's how to set it up.]]></summary>
        <content type="html"><![CDATA[<p>Hard drives fail. It's not a matter of if, but when. Scrutiny helps you predict failures before they happen by monitoring SMART data across all your drives. Here's how to set it up.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-smart">What is SMART?<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#what-is-smart" class="hash-link" aria-label="Direct link to What is SMART?" title="Direct link to What is SMART?" translate="no">​</a></h2>
<p>Self-Monitoring, Analysis, and Reporting Technology (SMART) is built into most storage devices. It tracks:</p>
<ul>
<li class=""><strong>Reallocated Sectors</strong> - Bad blocks moved to spare area</li>
<li class=""><strong>Spin Retry Count</strong> - Failed spin-up attempts</li>
<li class=""><strong>Current Pending Sectors</strong> - Unstable sectors waiting to be remapped</li>
<li class=""><strong>Temperature</strong> - Operating temperature</li>
<li class=""><strong>Power On Hours</strong> - Total running time</li>
<li class="">And many more...</li>
</ul>
<p>When these metrics go bad, your drive is telling you it's dying.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-scrutiny">Why Scrutiny?<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#why-scrutiny" class="hash-link" aria-label="Direct link to Why Scrutiny?" title="Direct link to Why Scrutiny?" translate="no">​</a></h2>
<p>Scrutiny provides:</p>
<ul>
<li class=""><strong>Web dashboard</strong> - Visual overview of all drives</li>
<li class=""><strong>Historical data</strong> - Track trends over time (via InfluxDB)</li>
<li class=""><strong>Alerting</strong> - Get notified before failures</li>
<li class=""><strong>Multi-server</strong> - Monitor drives across multiple machines</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-setup">Docker Setup<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#docker-setup" class="hash-link" aria-label="Direct link to Docker Setup" title="Direct link to Docker Setup" translate="no">​</a></h2>
<p>Here's a complete stack with InfluxDB for history:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">scrutiny</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ghcr.io/analogj/scrutiny</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">master</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">omnibus</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> scrutiny</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">cap_add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> SYS_RAWIO</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8080:8080"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8086:8086"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># InfluxDB</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> scrutiny_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/opt/scrutiny/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> scrutiny_influxdb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/opt/scrutiny/influxdb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /run/udev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/run/udev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ro</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">devices</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /dev/sda</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /dev/sdb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /dev/sdc</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add all your drives</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">scrutiny_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  scrutiny_influxdb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="finding-your-drives">Finding Your Drives<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#finding-your-drives" class="hash-link" aria-label="Direct link to Finding Your Drives" title="Direct link to Finding Your Drives" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># List all block devices</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">lsblk</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get detailed drive info</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fdisk</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-l</span><br></div></code></pre></div></div>
<p>Add each drive to the <code>devices</code> section.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="distributed-setup-multiple-servers">Distributed Setup (Multiple Servers)<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#distributed-setup-multiple-servers" class="hash-link" aria-label="Direct link to Distributed Setup (Multiple Servers)" title="Direct link to Distributed Setup (Multiple Servers)" translate="no">​</a></h2>
<p>For monitoring drives across multiple machines:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hub-central-server">Hub (Central Server)<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#hub-central-server" class="hash-link" aria-label="Direct link to Hub (Central Server)" title="Direct link to Hub (Central Server)" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml (hub)</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">scrutiny-web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ghcr.io/analogj/scrutiny</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">master</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">web</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> scrutiny</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">web</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8080:8080"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> scrutiny_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/opt/scrutiny/config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">influxdb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> influxdb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">2.1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> scrutiny</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">influxdb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8086:8086"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> influxdb_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/var/lib/influxdb2</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">scrutiny_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  influxdb_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="collector-each-server-with-drives">Collector (Each Server with Drives)<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#collector-each-server-with-drives" class="hash-link" aria-label="Direct link to Collector (Each Server with Drives)" title="Direct link to Collector (Each Server with Drives)" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml (collector)</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">scrutiny-collector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ghcr.io/analogj/scrutiny</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">master</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">collector</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> scrutiny</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">collector</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">cap_add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> SYS_RAWIO</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> COLLECTOR_API_ENDPOINT=http</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//hub</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">ip</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /run/udev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/run/udev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ro</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">devices</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /dev/sda</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> /dev/sdb</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-dashboard">Understanding the Dashboard<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#understanding-the-dashboard" class="hash-link" aria-label="Direct link to Understanding the Dashboard" title="Direct link to Understanding the Dashboard" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="drive-health-status">Drive Health Status<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#drive-health-status" class="hash-link" aria-label="Direct link to Drive Health Status" title="Direct link to Drive Health Status" translate="no">​</a></h3>
<ul>
<li class="">🟢 <strong>Passed</strong> - All metrics healthy</li>
<li class="">🟡 <strong>Warning</strong> - Some metrics outside normal range</li>
<li class="">🔴 <strong>Failed</strong> - Critical issues detected</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-metrics-to-watch">Key Metrics to Watch<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#key-metrics-to-watch" class="hash-link" aria-label="Direct link to Key Metrics to Watch" title="Direct link to Key Metrics to Watch" translate="no">​</a></h3>
<table><thead><tr><th>Metric</th><th>Warning Signs</th></tr></thead><tbody><tr><td>Reallocated Sectors</td><td>Any non-zero value</td></tr><tr><td>Pending Sectors</td><td>Any non-zero value</td></tr><tr><td>Uncorrectable Errors</td><td>Any increase</td></tr><tr><td>Spin Retry Count</td><td>Values &gt; 0</td></tr><tr><td>Temperature</td><td>Above 50°C sustained</td></tr><tr><td>Power On Hours</td><td>Reference for age</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="attribute-thresholds">Attribute Thresholds<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#attribute-thresholds" class="hash-link" aria-label="Direct link to Attribute Thresholds" title="Direct link to Attribute Thresholds" translate="no">​</a></h3>
<p>Scrutiny uses thresholds from various sources:</p>
<ul>
<li class="">Backblaze failure data</li>
<li class="">Manufacturer specifications</li>
<li class="">Community research</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="alerting-setup">Alerting Setup<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#alerting-setup" class="hash-link" aria-label="Direct link to Alerting Setup" title="Direct link to Alerting Setup" translate="no">​</a></h2>
<p>Configure notifications in <code>/opt/scrutiny/config/scrutiny.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">notify</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">urls</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> discord</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//webhook_id/token</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> smtp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">pass@smtp.gmail.com</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">587/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">?</span><span class="token plain">fromAddress=alerts@example.com</span><span class="token important">&amp;toAddresses=you@example.com</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> pushover</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//user_key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">api_token</span><br></div></code></pre></div></div>
<p>Supported services:</p>
<ul>
<li class="">Discord, Slack, Teams</li>
<li class="">Email (SMTP)</li>
<li class="">Pushover, Gotify, Ntfy</li>
<li class="">Webhook (generic)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="backup-strategy-based-on-smart">Backup Strategy Based on SMART<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#backup-strategy-based-on-smart" class="hash-link" aria-label="Direct link to Backup Strategy Based on SMART" title="Direct link to Backup Strategy Based on SMART" translate="no">​</a></h2>
<p>Use SMART data to prioritize backups:</p>
<ol>
<li class=""><strong>Green drives</strong> - Normal backup schedule</li>
<li class=""><strong>Yellow drives</strong> - Increase backup frequency</li>
<li class=""><strong>Red drives</strong> - Immediate backup, plan replacement</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-example">Real World Example<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#real-world-example" class="hash-link" aria-label="Direct link to Real World Example" title="Direct link to Real World Example" translate="no">​</a></h2>
<p>Last year, Scrutiny warned me about rising reallocated sectors on a 4-year-old drive. Over 2 weeks:</p>
<ul>
<li class="">Week 1: 2 reallocated sectors (warning)</li>
<li class="">Week 2: 47 reallocated sectors (critical)</li>
</ul>
<p>I replaced the drive before any data loss. Without monitoring, I would have lost data.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="drives-that-fail-silently">Drives That Fail Silently<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#drives-that-fail-silently" class="hash-link" aria-label="Direct link to Drives That Fail Silently" title="Direct link to Drives That Fail Silently" translate="no">​</a></h2>
<p>Some failure modes aren't caught by SMART:</p>
<ul>
<li class="">Firmware bugs</li>
<li class="">Controller failures</li>
<li class="">Cable/connection issues</li>
</ul>
<p>Always maintain backups regardless of SMART status!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/scrutiny-hard-drive-monitoring-homelab#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/HDD%20Tools/Docs/scrutiny">Scrutiny Full Setup Guide</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Networking/Storage/Introduction">Storage Documentation</a></li>
</ul>
<hr>
<p><em>What storage monitoring tools do you use? Share on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="storage" term="storage"/>
        <category label="monitoring" term="monitoring"/>
        <category label="homelab" term="homelab"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Getting Started with Docker: A Homelab Beginner's Guide]]></title>
        <id>https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab</id>
        <link href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab"/>
        <updated>2025-08-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Docker has become the backbone of modern homelabs. If you're new to containerization or looking to level up your homelab game, this guide will help you understand why Docker matters and how to get started.]]></summary>
        <content type="html"><![CDATA[<p>Docker has become the backbone of modern homelabs. If you're new to containerization or looking to level up your homelab game, this guide will help you understand why Docker matters and how to get started.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-docker-for-your-homelab">Why Docker for Your Homelab?<a href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab#why-docker-for-your-homelab" class="hash-link" aria-label="Direct link to Why Docker for Your Homelab?" title="Direct link to Why Docker for Your Homelab?" translate="no">​</a></h2>
<p>Traditional software installation involves dependencies, configuration files scattered across your system, and the dreaded "it works on my machine" problem. Docker solves all of this by packaging applications with everything they need.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-for-homelabbers">Benefits for Homelabbers<a href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab#benefits-for-homelabbers" class="hash-link" aria-label="Direct link to Benefits for Homelabbers" title="Direct link to Benefits for Homelabbers" translate="no">​</a></h3>
<ul>
<li class=""><strong>Isolation</strong>: Each container runs independently</li>
<li class=""><strong>Portability</strong>: Move your entire stack between machines easily</li>
<li class=""><strong>Version Control</strong>: Roll back to previous versions instantly</li>
<li class=""><strong>Resource Efficiency</strong>: Containers share the host OS kernel</li>
<li class=""><strong>Reproducibility</strong>: Define your entire infrastructure as code</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-docker-on-ubuntu">Installing Docker on Ubuntu<a href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab#installing-docker-on-ubuntu" class="hash-link" aria-label="Direct link to Installing Docker on Ubuntu" title="Direct link to Installing Docker on Ubuntu" translate="no">​</a></h2>
<p>First, let's get Docker Engine installed. Run these commands:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Update package index</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> update</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Install prerequisites</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-y</span><span class="token plain"> ca-certificates </span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> gnupg lsb-release</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add Docker's official GPG key</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-m</span><span class="token plain"> 0755 </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> /etc/apt/keyrings</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-fsSL</span><span class="token plain"> https://download.docker.com/linux/ubuntu/gpg </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> gpg </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--dearmor</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> /etc/apt/keyrings/docker.gpg</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">chmod</span><span class="token plain"> a+r /etc/apt/keyrings/docker.gpg</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Set up the repository</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"deb [arch=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">dpkg --print-architecture</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)"> signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">lsb_release </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-cs</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)"> stable"</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">tee</span><span class="token plain"> /etc/apt/sources.list.d/docker.list </span><span class="token operator">&gt;</span><span class="token plain"> /dev/null</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Install Docker Engine</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> update</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-y</span><span class="token plain"> docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</span><br></div></code></pre></div></div>
<p>Verify the installation:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose version</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-first-docker-compose-stack">Your First Docker Compose Stack<a href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab#your-first-docker-compose-stack" class="hash-link" aria-label="Direct link to Your First Docker Compose Stack" title="Direct link to Your First Docker Compose Stack" translate="no">​</a></h2>
<p>Here's a simple stack to get you started - a documentation site similar to what you're reading now:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">docs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> squidfunk/mkdocs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">material</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8000:8000"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ./docs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/docs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> serve </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">dev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">addr=0.0.0.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">8000</span><br></div></code></pre></div></div>
<p>Run it with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><br></div></code></pre></div></div>
<p>Visit <code>http://localhost:8000</code> and you've got a running documentation site!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="essential-docker-commands">Essential Docker Commands<a href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab#essential-docker-commands" class="hash-link" aria-label="Direct link to Essential Docker Commands" title="Direct link to Essential Docker Commands" translate="no">​</a></h2>
<p>Here are the commands you'll use daily:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># View running containers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ps</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># View all containers (including stopped)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ps</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-a</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># View container logs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> logs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> container_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Stop a container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> stop container_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Remove a container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">rm</span><span class="token plain"> container_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Clean up unused resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> system prune </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-a</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-mistakes-to-avoid">Common Mistakes to Avoid<a href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab#common-mistakes-to-avoid" class="hash-link" aria-label="Direct link to Common Mistakes to Avoid" title="Direct link to Common Mistakes to Avoid" translate="no">​</a></h2>
<ol>
<li class=""><strong>Using <code>latest</code> tag in production</strong> - Always pin specific versions</li>
<li class=""><strong>Storing data in containers</strong> - Use volumes for persistence</li>
<li class=""><strong>Running as root</strong> - Use non-root users when possible</li>
<li class=""><strong>Ignoring resource limits</strong> - Set memory and CPU constraints</li>
<li class=""><strong>Not backing up volumes</strong> - Your data lives in volumes, back them up!</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next?<a href="https://docs.bankai-tech.com/blog/getting-started-with-docker-homelab#whats-next" class="hash-link" aria-label="Direct link to What's Next?" title="Direct link to What's Next?" translate="no">​</a></h2>
<p>Once you're comfortable with the basics, check out our complete guides:</p>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Docker/Introduction">Docker Installation Guide</a> - Comprehensive setup</li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Docker/Docs/Helpful%20Commands">Docker Profiles</a> - Advanced deployment patterns</li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Arr%20Suite/Introduction">Full Arr Stack</a> - Complete media automation</li>
</ul>
<hr>
<p><em>Questions? Join our <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a> community!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="docker" term="docker"/>
        <category label="beginners" term="beginners"/>
        <category label="homelab" term="homelab"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Node-RED: Visual Automation for Your Homelab]]></title>
        <id>https://docs.bankai-tech.com/blog/node-red-homelab-automation</id>
        <link href="https://docs.bankai-tech.com/blog/node-red-homelab-automation"/>
        <updated>2025-08-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Node-RED is a flow-based programming tool that lets you wire together APIs, services, and devices with a visual interface. Perfect for homelab automation without writing code. Here's how to get started.]]></summary>
        <content type="html"><![CDATA[<p>Node-RED is a flow-based programming tool that lets you wire together APIs, services, and devices with a visual interface. Perfect for homelab automation without writing code. Here's how to get started.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-node-red">What is Node-RED?<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#what-is-node-red" class="hash-link" aria-label="Direct link to What is Node-RED?" title="Direct link to What is Node-RED?" translate="no">​</a></h2>
<p>Node-RED is:</p>
<ul>
<li class=""><strong>Visual programming</strong> - Drag, drop, and connect nodes</li>
<li class=""><strong>Event-driven</strong> - React to events in real-time</li>
<li class=""><strong>Highly extensible</strong> - Thousands of community nodes</li>
<li class=""><strong>Lightweight</strong> - Runs on a Raspberry Pi</li>
</ul>
<p>Common homelab uses:</p>
<ul>
<li class="">Home automation triggers</li>
<li class="">API integrations</li>
<li class="">Data transformations</li>
<li class="">Alert notifications</li>
<li class="">Scheduled tasks</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-installation">Docker Installation<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#docker-installation" class="hash-link" aria-label="Direct link to Docker Installation" title="Direct link to Docker Installation" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">node-red</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> nodered/node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">red</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">red</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> TZ=America/New_York</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1880:1880"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> node_red_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/data</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  node_red_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<p>Access at <code>http://your-server:1880</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-first-flow">Your First Flow<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#your-first-flow" class="hash-link" aria-label="Direct link to Your First Flow" title="Direct link to Your First Flow" translate="no">​</a></h2>
<p>Let's create a simple HTTP endpoint that returns system info:</p>
<ol>
<li class=""><strong>Drag an <code>http in</code> node</strong> - Set method to GET, URL to <code>/status</code></li>
<li class=""><strong>Drag an <code>exec</code> node</strong> - Command: <code>uptime</code></li>
<li class=""><strong>Drag a <code>template</code> node</strong> - Format the response</li>
<li class=""><strong>Drag an <code>http response</code> node</strong> - Send the response</li>
</ol>
<p>Connect them: http in → exec → template → http response</p>
<p>Deploy and visit <code>http://your-server:1880/status</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="essential-nodes">Essential Nodes<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#essential-nodes" class="hash-link" aria-label="Direct link to Essential Nodes" title="Direct link to Essential Nodes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-in">Built-in<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#built-in" class="hash-link" aria-label="Direct link to Built-in" title="Direct link to Built-in" translate="no">​</a></h3>
<table><thead><tr><th>Node</th><th>Purpose</th></tr></thead><tbody><tr><td>inject</td><td>Trigger flows manually or on schedule</td></tr><tr><td>debug</td><td>View message data</td></tr><tr><td>function</td><td>JavaScript code</td></tr><tr><td>change</td><td>Modify message properties</td></tr><tr><td>switch</td><td>Conditional routing</td></tr><tr><td>http request</td><td>Make HTTP calls</td></tr><tr><td>exec</td><td>Run shell commands</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-must-haves">Community Must-Haves<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#community-must-haves" class="hash-link" aria-label="Direct link to Community Must-Haves" title="Direct link to Community Must-Haves" translate="no">​</a></h3>
<p>Install via Menu → Manage Palette:</p>
<ul>
<li class=""><strong>node-red-contrib-home-assistant</strong> - Home Assistant integration</li>
<li class=""><strong>node-red-node-discord</strong> - Discord messaging</li>
<li class=""><strong>node-red-contrib-influxdb</strong> - Metrics storage</li>
<li class=""><strong>node-red-contrib-telegrambot</strong> - Telegram notifications</li>
<li class=""><strong>node-red-dashboard</strong> - Create web dashboards</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-examples">Practical Examples<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#practical-examples" class="hash-link" aria-label="Direct link to Practical Examples" title="Direct link to Practical Examples" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-1-discord-notifications-for-container-health">Example 1: Discord Notifications for Container Health<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#example-1-discord-notifications-for-container-health" class="hash-link" aria-label="Direct link to Example 1: Discord Notifications for Container Health" title="Direct link to Example 1: Discord Notifications for Container Health" translate="no">​</a></h3>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"exec-docker"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"exec"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"command"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"docker ps --filter health=unhealthy --format '{{.Names}}'"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"addpay"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"check-output"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"switch"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"property"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"payload"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"rules"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"t"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"nempty"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"discord-notify"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"discord-send"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"channel"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"YOUR_CHANNEL_ID"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></div></code></pre></div></div>
<p>Schedule with inject node → Every 5 minutes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-2-daily-backup-reminder">Example 2: Daily Backup Reminder<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#example-2-daily-backup-reminder" class="hash-link" aria-label="Direct link to Example 2: Daily Backup Reminder" title="Direct link to Example 2: Daily Backup Reminder" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Function node - Check if backup ran today</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> fs </span><span class="token operator">=</span><span class="token plain"> global</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'fs'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> lastBackup </span><span class="token operator">=</span><span class="token plain"> fs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">statSync</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/backups/latest'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">mtime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> today </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hoursSince </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">today </span><span class="token operator">-</span><span class="token plain"> lastBackup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> </span><span class="token number">1000</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> </span><span class="token number">60</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> </span><span class="token number">60</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hoursSince </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token number">24</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">payload </span><span class="token operator">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">⚠️ Backup is </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">Math</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation function" style="color:rgb(80, 250, 123)">round</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string interpolation">hoursSince</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)"> hours old!</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-3-api-data-transformation">Example 3: API Data Transformation<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#example-3-api-data-transformation" class="hash-link" aria-label="Direct link to Example 3: API Data Transformation" title="Direct link to Example 3: API Data Transformation" translate="no">​</a></h3>
<p>Pull data from one API, transform, send to another:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">[inject (cron)] → [http request (source)] → [function (transform)] → [http request (destination)]</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboard-creation">Dashboard Creation<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#dashboard-creation" class="hash-link" aria-label="Direct link to Dashboard Creation" title="Direct link to Dashboard Creation" translate="no">​</a></h2>
<p>Install <code>node-red-dashboard</code> for instant web UIs:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Within Node-RED</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Menu → Manage Palette → Install → node-red-dashboard</span><br></div></code></pre></div></div>
<p>Add dashboard nodes:</p>
<ul>
<li class=""><code>ui_gauge</code> - Display metrics</li>
<li class=""><code>ui_chart</code> - Line/bar charts</li>
<li class=""><code>ui_button</code> - Trigger actions</li>
<li class=""><code>ui_text</code> - Display text</li>
<li class=""><code>ui_switch</code> - Toggle controls</li>
</ul>
<p>Access dashboard at <code>http://your-server:1880/ui</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="environment-variables">Environment Variables<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#environment-variables" class="hash-link" aria-label="Direct link to Environment Variables" title="Direct link to Environment Variables" translate="no">​</a></h2>
<p>Secure credentials with environment variables:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DISCORD_WEBHOOK=https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//discord.com/api/webhooks/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> API_KEY=your</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">secret</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">key</span><br></div></code></pre></div></div>
<p>Access in function nodes:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> webhook </span><span class="token operator">=</span><span class="token plain"> env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"DISCORD_WEBHOOK"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flow-importexport">Flow Import/Export<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#flow-importexport" class="hash-link" aria-label="Direct link to Flow Import/Export" title="Direct link to Flow Import/Export" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="export">Export<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#export" class="hash-link" aria-label="Direct link to Export" title="Direct link to Export" translate="no">​</a></h3>
<ol>
<li class="">Select nodes</li>
<li class="">Ctrl+E (or Menu → Export)</li>
<li class="">Copy JSON or download file</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="import">Import<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#import" class="hash-link" aria-label="Direct link to Import" title="Direct link to Import" translate="no">​</a></h3>
<ol>
<li class="">Ctrl+I (or Menu → Import)</li>
<li class="">Paste JSON or upload file</li>
<li class="">Click Import</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tips-from-experience">Tips from Experience<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#tips-from-experience" class="hash-link" aria-label="Direct link to Tips from Experience" title="Direct link to Tips from Experience" translate="no">​</a></h2>
<ol>
<li class=""><strong>Name your nodes</strong> - Future you will thank you</li>
<li class=""><strong>Use link nodes</strong> - Clean up complex flows</li>
<li class=""><strong>Comment everything</strong> - Add comment nodes explaining logic</li>
<li class=""><strong>Separate concerns</strong> - One flow per function</li>
<li class=""><strong>Backup flows</strong> - Export regularly to Git</li>
<li class=""><strong>Use context</strong> - Store data between messages</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<p>⚠️ Node-RED has no authentication by default!</p>
<p>Add to <code>settings.js</code>:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token literal-property property">adminAuth</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"credentials"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">users</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token literal-property property">username</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"admin"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token literal-property property">password</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$2b$08$..."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// bcrypt hash</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token literal-property property">permissions</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Generate hash:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">node</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-e</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"console.log(require('bcryptjs').hashSync('your-password', 8));"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/node-red-homelab-automation#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Node-RED/Introduction">Node-RED Introduction</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Examples/Node-RED/Docs/Flows/">Example Flows</a></li>
</ul>
<hr>
<p><em>What automations have you built with Node-RED? Share on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="node-red" term="node-red"/>
        <category label="automation" term="automation"/>
        <category label="homelab" term="homelab"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Build Your Own AI Discord Bot with GPT]]></title>
        <id>https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial</id>
        <link href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial"/>
        <updated>2025-07-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Want your own AI assistant in Discord? Here's how to build a bot powered by OpenAI's GPT that can answer questions, have conversations, and help your server members.]]></summary>
        <content type="html"><![CDATA[<p>Want your own AI assistant in Discord? Here's how to build a bot powered by OpenAI's GPT that can answer questions, have conversations, and help your server members.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-were-building">What We're Building<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#what-were-building" class="hash-link" aria-label="Direct link to What We're Building" title="Direct link to What We're Building" translate="no">​</a></h2>
<p>A Discord bot that:</p>
<ul>
<li class="">Responds to mentions and messages</li>
<li class="">Uses GPT-3.5 Turbo for responses</li>
<li class="">Maintains conversation context</li>
<li class="">Can be customized with personality prompts</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ul>
<li class="">Discord account and server</li>
<li class="">OpenAI API key (pay-as-you-go)</li>
<li class="">Node.js 18+ or Python 3.9+</li>
<li class="">Basic coding knowledge</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-discord-application">Setting Up Discord Application<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#setting-up-discord-application" class="hash-link" aria-label="Direct link to Setting Up Discord Application" title="Direct link to Setting Up Discord Application" translate="no">​</a></h2>
<ol>
<li class="">Go to <a href="https://discord.com/developers/applications" target="_blank" rel="noopener noreferrer" class="">Discord Developer Portal</a></li>
<li class="">Click "New Application"</li>
<li class="">Name your bot and create</li>
<li class="">Go to "Bot" section</li>
<li class="">Click "Add Bot"</li>
<li class="">Copy the token (keep secret!)</li>
<li class="">Enable required intents:<!-- -->
<ul>
<li class="">Message Content Intent</li>
<li class="">Server Members Intent</li>
</ul>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-openai-api-key">Getting OpenAI API Key<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#getting-openai-api-key" class="hash-link" aria-label="Direct link to Getting OpenAI API Key" title="Direct link to Getting OpenAI API Key" translate="no">​</a></h2>
<ol>
<li class="">Go to <a href="https://platform.openai.com/" target="_blank" rel="noopener noreferrer" class="">OpenAI Platform</a></li>
<li class="">Create account or sign in</li>
<li class="">Navigate to API Keys</li>
<li class="">Create new secret key</li>
<li class="">Add credits to your account</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-bot-code">The Bot Code<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#the-bot-code" class="hash-link" aria-label="Direct link to The Bot Code" title="Direct link to The Bot Code" translate="no">​</a></h2>
<p>Here's a Node.js implementation:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">index.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> Client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> GatewayIntentBits </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'discord.js'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> OpenAI </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">require</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'openai'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> client </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">intents</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    GatewayIntentBits</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Guilds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    GatewayIntentBits</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">GuildMessages</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    GatewayIntentBits</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">MessageContent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> openai </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">OpenAI</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">apiKey</span><span class="token operator">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">OPENAI_API_KEY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Conversation history per channel</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> conversations </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">SYSTEM_PROMPT</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">You are a helpful assistant in a Discord server. </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token template-string string" style="color:rgb(255, 121, 198)">You're friendly, knowledgeable about technology, and can help with coding questions.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token template-string string" style="color:rgb(255, 121, 198)">Keep responses concise but informative. Use Discord markdown formatting.</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'messageCreate'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Ignore bots and messages without mention</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">bot</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">mentions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">has</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Remove the mention from the message</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> userMessage </span><span class="token operator">=</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">content</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">replace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">&lt;@</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">client</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation">user</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">&gt;</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">trim</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token plain">userMessage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'How can I help you?'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Get or create conversation history</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> history </span><span class="token operator">=</span><span class="token plain"> conversations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">channel</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Add user message to history</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  history</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">role</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'user'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token operator">:</span><span class="token plain"> userMessage </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Keep last 10 messages for context</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">history</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    history </span><span class="token operator">=</span><span class="token plain"> history</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">channel</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">sendTyping</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> completion </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> openai</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">chat</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">completions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">create</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token literal-property property">model</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'gpt-3.5-turbo'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token literal-property property">messages</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">role</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'system'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">SYSTEM_PROMPT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token operator">...</span><span class="token plain">history</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token literal-property property">max_tokens</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">500</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> reply </span><span class="token operator">=</span><span class="token plain"> completion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">choices</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Add assistant response to history</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    history</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">role</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'assistant'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">content</span><span class="token operator">:</span><span class="token plain"> reply </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    conversations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">channel</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> history</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Handle long responses</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token number">2000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunks </span><span class="token operator">=</span><span class="token plain"> reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">match</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token regex regex-delimiter">/</span><span class="token regex regex-source language-regex char-set class-name">.</span><span class="token regex regex-source language-regex quantifier number">{1,2000}</span><span class="token regex regex-delimiter">/</span><span class="token regex regex-flags">g</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunk </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">of</span><span class="token plain"> chunks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">chunk</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'OpenAI Error:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Sorry, I encountered an error. Please try again.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">once</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'ready'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  console</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">Logged in as </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">client</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation">user</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation">tag</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">login</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">process</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">DISCORD_TOKEN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="package-configuration">Package Configuration<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#package-configuration" class="hash-link" aria-label="Direct link to Package Configuration" title="Direct link to Package Configuration" translate="no">​</a></h2>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">package.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"discord-gpt-bot"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.0.0"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"main"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"index.js"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"dependencies"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"discord.js"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"^14.14.1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"openai"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"^4.24.1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="environment-variables">Environment Variables<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#environment-variables" class="hash-link" aria-label="Direct link to Environment Variables" title="Direct link to Environment Variables" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">.env</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">DISCORD_TOKEN</span><span class="token operator">=</span><span class="token plain">your_discord_bot_token</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">OPENAI_API_KEY</span><span class="token operator">=</span><span class="token plain">your_openai_api_key</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-deployment">Docker Deployment<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#docker-deployment" class="hash-link" aria-label="Direct link to Docker Deployment" title="Direct link to Docker Deployment" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">discord-bot</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">build</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> .</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> discord</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">gpt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">bot</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">stopped</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> DISCORD_TOKEN=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DISCORD_TOKEN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> OPENAI_API_KEY=$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">OPENAI_API_KEY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">Dockerfile</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">FROM</span><span class="token instruction"> node:20-alpine</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">WORKDIR</span><span class="token instruction"> /app</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">COPY</span><span class="token instruction"> package*.json ./</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">RUN</span><span class="token instruction"> npm install --production</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">COPY</span><span class="token instruction"> . .</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">CMD</span><span class="token instruction"> [</span><span class="token instruction string" style="color:rgb(255, 121, 198)">"node"</span><span class="token instruction">, </span><span class="token instruction string" style="color:rgb(255, 121, 198)">"index.js"</span><span class="token instruction">]</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="customization-ideas">Customization Ideas<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#customization-ideas" class="hash-link" aria-label="Direct link to Customization Ideas" title="Direct link to Customization Ideas" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="personality-prompts">Personality Prompts<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#personality-prompts" class="hash-link" aria-label="Direct link to Personality Prompts" title="Direct link to Personality Prompts" translate="no">​</a></h3>
<p>Make your bot unique:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">SYSTEM_PROMPT</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">You are a pirate captain named Captain Byte. </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token template-string string" style="color:rgb(255, 121, 198)">You speak like a pirate and relate everything to sailing the digital seas.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token template-string string" style="color:rgb(255, 121, 198)">You help with tech questions but always stay in character.</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="channel-specific-behavior">Channel-Specific Behavior<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#channel-specific-behavior" class="hash-link" aria-label="Direct link to Channel-Specific Behavior" title="Direct link to Channel-Specific Behavior" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> channelPrompts </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string-property property">'helpdesk'</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'You are a helpful support agent...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string-property property">'coding'</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'You are a senior developer...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string-property property">'gaming'</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'You are a gaming buddy...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rate-limiting">Rate Limiting<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#rate-limiting" class="hash-link" aria-label="Direct link to Rate Limiting" title="Direct link to Rate Limiting" translate="no">​</a></h3>
<p>Prevent API cost overruns:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> cooldowns </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'messageCreate'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> cooldown </span><span class="token operator">=</span><span class="token plain"> cooldowns</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">cooldown </span><span class="token operator">&amp;&amp;</span><span class="token plain"> Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">now</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain"> cooldown </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">5000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">reply</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Please wait a few seconds...'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  cooldowns</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">set</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">now</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// ... rest of handler</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost-management">Cost Management<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#cost-management" class="hash-link" aria-label="Direct link to Cost Management" title="Direct link to Cost Management" translate="no">​</a></h2>
<p>GPT-3.5 Turbo costs approximately:</p>
<ul>
<li class="">Input: $0.0005 per 1K tokens</li>
<li class="">Output: $0.0015 per 1K tokens</li>
</ul>
<p>For a 500-word conversation: ~$0.001</p>
<p>Set usage limits in OpenAI dashboard to avoid surprises.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.bankai-tech.com/blog/discord-bot-gpt-ai-tutorial#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.bankai-tech.com/Discord/Docs/Bots/AI%20Bot">Discord Bot Documentation</a></li>
<li class=""><a class="" href="https://docs.bankai-tech.com/Discord/Docs/Comments%20Integration">Discord Comments Integration</a></li>
</ul>
<hr>
<p><em>Built a cool Discord bot? Share it on <a href="https://discord.gg/6THYdvayjg" target="_blank" rel="noopener noreferrer" class="">Discord</a>!</em></p>]]></content>
        <author>
            <name>BankaiTech</name>
            <uri>https://github.com/TrueBankai416</uri>
        </author>
        <category label="discord" term="discord"/>
        <category label="ai" term="ai"/>
        <category label="bots" term="bots"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
</feed>