<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>homelab</title>
    <link>https://homelab.nbkelley.com/</link>
    <description>Recent content on homelab</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sat, 02 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://homelab.nbkelley.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>hugoboss</title>
      <link>https://homelab.nbkelley.com/docs/machines/hugoboss/</link>
      <pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/machines/hugoboss/</guid>
      <description>&lt;h1 id=&#34;hugoboss&#34;&gt;hugoboss&lt;a class=&#34;anchor&#34; href=&#34;#hugoboss&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;hugoboss (192.168.1.237) is a lightweight Ubuntu server dedicated to Hugo static site development. It serves as the authoring and scaffolding machine for all Hugo-based sites in the homelab. A full machine audit was conducted 2026-05-01; repos were synced and organised 2026-05-02.&lt;/p&gt;&#xA;&lt;h2 id=&#34;identity&#34;&gt;Identity&lt;a class=&#34;anchor&#34; href=&#34;#identity&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hostname&lt;/strong&gt;: hugoboss&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;IP&lt;/strong&gt;: 192.168.1.237 (VLAN Gandalf)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;OS&lt;/strong&gt;: Ubuntu 24.04.3 LTS (Noble Numbat), kernel 6.8.0-88-generic&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User&lt;/strong&gt;: iluvatar&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Disk&lt;/strong&gt;: 63G total, ~12G used, 49G free&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Memory&lt;/strong&gt;: 3.8G total, ~2.7G available&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;hugo-installation&#34;&gt;Hugo Installation&lt;a class=&#34;anchor&#34; href=&#34;#hugo-installation&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Hugo is installed via Homebrew (linuxbrew), not via apt or direct binary download.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wiki Pipeline Scripts</title>
      <link>https://homelab.nbkelley.com/docs/ai/wiki-pipeline-scripts/</link>
      <pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/ai/wiki-pipeline-scripts/</guid>
      <description>&lt;h1 id=&#34;wiki-pipeline-scripts&#34;&gt;Wiki Pipeline Scripts&lt;a class=&#34;anchor&#34; href=&#34;#wiki-pipeline-scripts&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Eight Python scripts in &lt;code&gt;/opt/wiki/homelab/scripts/&lt;/code&gt; implement the full wiki pipeline: file conversion, document ingestion, conversation crystallization (standard, DeepSeek, and Claude formats), shared LLM infrastructure, wiki health-checking, and knowledge-graph integration. All scripts were ported from the work wiki pipeline (itself developed 2026-04-21 → 2026-04-26) with homelab-specific infrastructure baked in.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;crystallize.py&lt;/code&gt; (Claude format) uses a two-step LLM approach: gemma4:e2b cleans, qwen3.6:35b crystallizes. &lt;code&gt;crystallize_deepseek.py&lt;/code&gt; skips gemma — JSON parsing is handled deterministically in Python (&lt;code&gt;load_conversation&lt;/code&gt; + &lt;code&gt;_clean_text&lt;/code&gt;), so only qwen is needed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wiki System - Architecture</title>
      <link>https://homelab.nbkelley.com/docs/ai/wiki-system/</link>
      <pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/ai/wiki-system/</guid>
      <description>&lt;h1 id=&#34;wiki-system---architecture&#34;&gt;Wiki System - Architecture&lt;a class=&#34;anchor&#34; href=&#34;#wiki-system---architecture&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The wiki system is designed around the LLM wiki pattern (Karpathy): raw sources (chat transcripts, notes, docs) are crystallized into structured markdown pages, embedded into pgvector, and retrieved semantically by agents in future sessions. A dedicated LXC (&lt;code&gt;nk-wiki&lt;/code&gt;) will host the wiki VM, separating wiki infrastructure from other services.&lt;/p&gt;&#xA;&lt;h2 id=&#34;multi-wiki-namespace-design&#34;&gt;Multi-Wiki Namespace Design&lt;a class=&#34;anchor&#34; href=&#34;#multi-wiki-namespace-design&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Three wikis are planned, each with its own namespace in pgvector:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bambu Studio Layer G-code</title>
      <link>https://homelab.nbkelley.com/docs/3d-printing/bambu-studio-layer-gcode/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/3d-printing/bambu-studio-layer-gcode/</guid>
      <description>&lt;h1 id=&#34;bambu-studio-layer-g-code&#34;&gt;Bambu Studio Layer G-code&lt;a class=&#34;anchor&#34; href=&#34;#bambu-studio-layer-g-code&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Methods for applying custom G-code to specific layers in Bambu Studio, including Height Range Modifiers and the Layer Range G-code interface. Specific commands for Bambu Lab printers to control infill angles, wall order, and layer pauses.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer Range G-code Interface&lt;/strong&gt;: Preferred for direct layer-specific application without Height Range Modifiers.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer Numbering&lt;/strong&gt;: The Layer Range G-code UI uses 1-indexed layer numbers. Conditional logic (&lt;code&gt;{if layer_num == X}&lt;/code&gt;) uses 0-indexed numbers.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bambu Proprietary G-code&lt;/strong&gt;: Commands like &lt;code&gt;M9000&lt;/code&gt; (infill angle) and &lt;code&gt;M9001&lt;/code&gt; (wall order) are specific to Bambu Lab firmware.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;layer-range-g-code-setup&#34;&gt;Layer Range G-code Setup&lt;a class=&#34;anchor&#34; href=&#34;#layer-range-g-code-setup&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Slice the model.&lt;/li&gt;&#xA;&lt;li&gt;Navigate to the &lt;strong&gt;G-code&lt;/strong&gt; tab.&lt;/li&gt;&#xA;&lt;li&gt;Scroll to &lt;strong&gt;Layer Range G-code&lt;/strong&gt; in the left panel.&lt;/li&gt;&#xA;&lt;li&gt;Click &lt;strong&gt;+ Add&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Enter &lt;strong&gt;From&lt;/strong&gt; and &lt;strong&gt;To&lt;/strong&gt; layer numbers.&lt;/li&gt;&#xA;&lt;li&gt;Enter G-code in the field.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;examples&#34;&gt;Examples&lt;a class=&#34;anchor&#34; href=&#34;#examples&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Layer 27 Direction Change&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bambu Studio Print Order &amp; Travel Optimization</title>
      <link>https://homelab.nbkelley.com/docs/3d-printing/bambu-studio-print-order/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/3d-printing/bambu-studio-print-order/</guid>
      <description>&lt;h1 id=&#34;bambu-studio-print-order--travel-optimization&#34;&gt;Bambu Studio Print Order &amp;amp; Travel Optimization&lt;a class=&#34;anchor&#34; href=&#34;#bambu-studio-print-order--travel-optimization&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Methods for controlling print sequence and travel paths in Bambu Studio, specifically addressing chaotic jumping when printing multiple identical objects (e.g., 64 clones) in layer-by-layer mode.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Print Sequence&lt;/strong&gt;: Change from &amp;ldquo;By layer&amp;rdquo; to &amp;ldquo;By object&amp;rdquo; or &amp;ldquo;Sequential&amp;rdquo; to complete one item before moving to the next.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Travel Optimization&lt;/strong&gt;: Adjusting &amp;ldquo;Order of walls&amp;rdquo;, &amp;ldquo;Avoid crossing walls&amp;rdquo;, and &amp;ldquo;Reduce infill retraction&amp;rdquo; can impact travel patterns.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Orca Slicer&lt;/strong&gt;: Recommended for better manual control over print sequence within layers.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Post-Processing&lt;/strong&gt;: G-code editors can manually reorder layer segments if slicer settings are insufficient.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bambu Studio&lt;/strong&gt;: Default slicer for Bambu Lab printers.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Orca Slicer&lt;/strong&gt;: Alternative slicer (Bambu Studio fork) with &amp;ldquo;Sequential Printing&amp;rdquo; feature.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;G-code Editors&lt;/strong&gt;: gcode.ws, Pronterface, or custom Python scripts for manual reordering.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User reported chaotic jumping when printing 64 clones of the same STL in layer-by-layer mode.&lt;/li&gt;&#xA;&lt;li&gt;Solutions explored included changing infill/wall order, travel optimization settings, and manual reordering.&lt;/li&gt;&#xA;&lt;li&gt;Orca Slicer identified as the most reliable solution for true manual ordering within layers.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does &amp;ldquo;One at a time&amp;rdquo; printing significantly increase total print time for 64 clones?&lt;/li&gt;&#xA;&lt;li&gt;Are there Bambu Studio plugins for sequential layer printing?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/3d-printing/bambu-studio-layer-gcode/&#34;&gt;Bambu Studio Layer G-code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/3d-printing/pla-troubleshooting/&#34;&gt;PLA Filament Troubleshooting &amp;amp; Calibration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/164-Fixing Bambu Studio Print Order Issues.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Conversation: Fixing Bambu Studio Print Order Issues (2026-02-02)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>BlueBikes API Feeds Guide</title>
      <link>https://homelab.nbkelley.com/docs/services/bluebikes-api/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/bluebikes-api/</guid>
      <description>&lt;h1 id=&#34;bluebikes-api-feeds-guide&#34;&gt;BlueBikes API Feeds Guide&lt;a class=&#34;anchor&#34; href=&#34;#bluebikes-api-feeds-guide&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Comprehensive breakdown of BlueBikes GBFS (General Bikeshare Feed Specification) endpoints.&lt;/li&gt;&#xA;&lt;li&gt;JSON structure analysis for static (&lt;code&gt;station_information&lt;/code&gt;) and real-time (&lt;code&gt;station_status&lt;/code&gt;) feeds.&lt;/li&gt;&#xA;&lt;li&gt;JavaScript patterns for fetching, joining, and displaying station data.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Base URL&lt;/strong&gt;: &lt;code&gt;https://gbfs.lyft.com/gbfs/1.1/bos/en/&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Primary Feeds&lt;/strong&gt;: &lt;code&gt;station_information&lt;/code&gt; (static map/location data) and &lt;code&gt;station_status&lt;/code&gt; (live availability) are the core feeds for real-time tracking.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Join Strategy&lt;/strong&gt;: Match &lt;code&gt;station_id&lt;/code&gt; fields between static and status feeds to combine location metadata with live bike/dock counts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;core-gbfs-endpoints&#34;&gt;Core GBFS Endpoints&lt;a class=&#34;anchor&#34; href=&#34;#core-gbfs-endpoints&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Feed&lt;/th&gt;&#xA;          &lt;th&gt;Purpose&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;station_information&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Static station list, names, IDs, coordinates, capacity, kiosk info&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;station_status&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Real-time bike/dock counts, station active/inactive status, last reported timestamp&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;system_information&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;System metadata (operator, name, URLs)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;system_regions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Regional breakdowns for color-coding/mapping&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;system_hours&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Operating hours&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;system_calendar&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Start/end years, holidays&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;gbfs_versions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Available GBFS versions&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;free_bike_status&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Free-floating bike locations&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;ebikes_at_stations&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Real-time e-bike counts per station&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;system_pricing_plans&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Membership &amp;amp; pricing details&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;system_alerts&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Current advisories&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;data-structure-examples&#34;&gt;Data Structure Examples&lt;a class=&#34;anchor&#34; href=&#34;#data-structure-examples&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;station_information&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloudflare Access Setup for Protected Sections</title>
      <link>https://homelab.nbkelley.com/docs/security/cloudflare-access-setup/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/security/cloudflare-access-setup/</guid>
      <description>&lt;h1 id=&#34;cloudflare-access-setup-for-protected-sections&#34;&gt;Cloudflare Access Setup for Protected Sections&lt;a class=&#34;anchor&#34; href=&#34;#cloudflare-access-setup-for-protected-sections&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Methodology for securing specific website paths or subdomains using Cloudflare Zero Trust Access.&lt;/li&gt;&#xA;&lt;li&gt;Authentication bypasses traditional &lt;code&gt;.htaccess&lt;/code&gt; or server-side auth; Cloudflare handles it at the edge.&lt;/li&gt;&#xA;&lt;li&gt;Prerequisites: Cloudflare domain, Paid/Zero Trust plan (free tier supports up to 50 users).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Identity Provider Choice&lt;/strong&gt;: One-time PIN (OTP) recommended for simplicity and shared access without managing user lists. Alternatives include Google/GitHub or specific email allowlists.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Policy Structure&lt;/strong&gt;: &amp;ldquo;Allow Authenticated Users&amp;rdquo; policy with wildcard email matching (&lt;code&gt;*&lt;/code&gt;) or specific domain matching (&lt;code&gt;*@domain.com&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Edge-Based Protection&lt;/strong&gt;: No server-side configuration changes required; protection occurs before requests hit the origin server.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pattern established but not yet applied to specific homelab services.&lt;/li&gt;&#xA;&lt;li&gt;Relevant to Nginx Proxy Manager (192.168.1.222) or Proxmox (192.168.1.69) admin interfaces if routed through Cloudflare.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation date: 2025-11-24.&lt;/li&gt;&#xA;&lt;li&gt;Focuses on the Cloudflare Zero Trust dashboard workflow for self-hosted applications.&lt;/li&gt;&#xA;&lt;li&gt;No changes to existing Cloudflare SSL/DNS integration patterns.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Which homelab services will leverage Cloudflare Access for admin/protected paths?&lt;/li&gt;&#xA;&lt;li&gt;Will static IP bypass policies be implemented for homelab admin access?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/security/cloudflare_integration/&#34;&gt;Cloudflare Integration: SSL &amp;amp; DNS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/hinterflix-help-site/&#34;&gt;Hinterflix Help Site - Cloudflare Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/proxy-management/&#34;&gt;Proxy Management &amp;amp; Cloudflare Tunnels&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/117-Setting Up Cloudflare Access for Website Protection.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: 2025-11-24 (Setting Up Cloudflare Access for Website Protection)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Filament Drying &amp; Storage Guide</title>
      <link>https://homelab.nbkelley.com/docs/3d-printing/filament-drying-storage/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/3d-printing/filament-drying-storage/</guid>
      <description>&lt;h1 id=&#34;filament-drying--storage-guide&#34;&gt;Filament Drying &amp;amp; Storage Guide&lt;a class=&#34;anchor&#34; href=&#34;#filament-drying--storage-guide&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Drying temperatures, times, and storage practices for common 3D printing filaments (TPU, PLA). Airtight container with desiccant is the standard storage method. Fresh-from-package filament typically needs minimal drying.&lt;/p&gt;&#xA;&lt;h2 id=&#34;drying-reference&#34;&gt;Drying Reference&lt;a class=&#34;anchor&#34; href=&#34;#drying-reference&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Filament&lt;/th&gt;&#xA;          &lt;th&gt;Temp&lt;/th&gt;&#xA;          &lt;th&gt;Time (stored)&lt;/th&gt;&#xA;          &lt;th&gt;Time (fresh)&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;TPU (Inland)&lt;/td&gt;&#xA;          &lt;td&gt;60-65°C&lt;/td&gt;&#xA;          &lt;td&gt;4-6 hours&lt;/td&gt;&#xA;          &lt;td&gt;2-3 hours (or skip)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;PLA&lt;/td&gt;&#xA;          &lt;td&gt;50-55°C&lt;/td&gt;&#xA;          &lt;td&gt;4-6 hours&lt;/td&gt;&#xA;          &lt;td&gt;1-2 hours (or skip)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;Lower-temp drying&lt;/strong&gt;: Some prefer 50°C for TPU to reduce deformation risk, extending time to 6-8 hours. The &amp;ldquo;lower and slower&amp;rdquo; approach is safer for sensitive filaments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git Push Authentication</title>
      <link>https://homelab.nbkelley.com/docs/administration/git-push-authentication/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/administration/git-push-authentication/</guid>
      <description>&lt;h1 id=&#34;git-push-authentication&#34;&gt;Git Push Authentication&lt;a class=&#34;anchor&#34; href=&#34;#git-push-authentication&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GitHub deprecated password authentication for Git over HTTPS. Even if passwords worked previously, they are now rejected with &lt;code&gt;password not supported&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Personal Access Tokens (PAT) or SSH keys are required for authentication.&lt;/li&gt;&#xA;&lt;li&gt;403 Permission Denied errors typically indicate stale cached credentials or insufficient token scopes.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use Personal Access Tokens (PAT) for HTTPS Git operations.&lt;/li&gt;&#xA;&lt;li&gt;Classic tokens require the &lt;code&gt;repo&lt;/code&gt; scope for private repositories.&lt;/li&gt;&#xA;&lt;li&gt;Fine-grained tokens require &lt;code&gt;Contents&lt;/code&gt; (Read and write) and &lt;code&gt;Metadata&lt;/code&gt; (Read) permissions, explicitly scoped to the target repository.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Username&lt;/strong&gt;: &lt;code&gt;NK-Iluvatar&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Target Repository&lt;/strong&gt;: &lt;code&gt;MBTADashboard&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remote URL&lt;/strong&gt;: &lt;code&gt;https://github.com/NK-Iluvatar/MBTADashboard.git&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Password Deprecation&lt;/strong&gt;: GitHub enforced its 2021 policy change retroactively, blocking account passwords for Git operations over HTTPS.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;403 Troubleshooting&lt;/strong&gt;: Resolved by clearing cached credentials (&lt;code&gt;git credential reject&lt;/code&gt; or OS credential manager) and verifying token scopes (&lt;code&gt;repo&lt;/code&gt; for classic, &lt;code&gt;Contents&lt;/code&gt; for fine-grained).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Token Testing&lt;/strong&gt;: Verified token validity using &lt;code&gt;curl -H &amp;quot;Authorization: token TOKEN&amp;quot; https://api.github.com/user&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;None.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Git Pull Strategies&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/homelab-dashboard/&#34;&gt;Homelab Dashboard&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DeepSeek conversation (2026-02-18) regarding &lt;code&gt;MBTADashboard&lt;/code&gt; push failures and PAT configuration.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Git Push Authentication</title>
      <link>https://homelab.nbkelley.com/docs/development/git-push-authentication/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/development/git-push-authentication/</guid>
      <description>&lt;h1 id=&#34;git-push-authentication&#34;&gt;Git Push Authentication&lt;a class=&#34;anchor&#34; href=&#34;#git-push-authentication&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Patterns for resolving Git push authentication issues and handling divergent branches when working across multiple machines.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Multi-machine workflow&lt;/strong&gt;: Always &lt;code&gt;git pull&lt;/code&gt; before starting work; commit and push when done.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Divergent branch resolution&lt;/strong&gt;: When local and remote have diverged, use &lt;code&gt;git pull --no-rebase&lt;/code&gt; (merge) for safety or &lt;code&gt;git fetch origin &amp;amp;&amp;amp; git reset --hard origin/main&lt;/code&gt; to discard local commits for remote-only state.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;resolving-divergent-branches&#34;&gt;Resolving Divergent Branches&lt;a class=&#34;anchor&#34; href=&#34;#resolving-divergent-branches&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;symptom&#34;&gt;Symptom&lt;a class=&#34;anchor&#34; href=&#34;#symptom&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hint: You have divergent branches and need to specify how to reconcile them.&#xA;fatal: Need to specify how to reconcile divergent branches.&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;option-1-merge-preserves-both-histories&#34;&gt;Option 1: Merge (preserves both histories)&lt;a class=&#34;anchor&#34; href=&#34;#option-1-merge-preserves-both-histories&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git pull --no-rebase&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Or set as default:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config pull.rebase false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;option-2-rebase-local-commits-on-top-of-remote&#34;&gt;Option 2: Rebase (local commits on top of remote)&lt;a class=&#34;anchor&#34; href=&#34;#option-2-rebase-local-commits-on-top-of-remote&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git pull --rebase&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Or set as default:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config pull.rebase true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;option-3-discard-local-use-remote-only&#34;&gt;Option 3: Discard local, use remote only&lt;a class=&#34;anchor&#34; href=&#34;#option-3-discard-local-use-remote-only&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git fetch origin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git reset --hard origin/main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;option-4-fast-forward-only-fails-if-diverged&#34;&gt;Option 4: Fast-forward only (fails if diverged)&lt;a class=&#34;anchor&#34; href=&#34;#option-4-fast-forward-only-fails-if-diverged&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git pull --ff-only&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;multi-machine-workflow&#34;&gt;Multi-Machine Workflow&lt;a class=&#34;anchor&#34; href=&#34;#multi-machine-workflow&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;When working from multiple machines on the same repo:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gluetun VPN Service</title>
      <link>https://homelab.nbkelley.com/docs/services/gluetun-vpn/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/gluetun-vpn/</guid>
      <description>&lt;h1 id=&#34;gluetun-vpn-service&#34;&gt;Gluetun VPN Service&lt;a class=&#34;anchor&#34; href=&#34;#gluetun-vpn-service&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Gluetun&lt;/strong&gt; is a lightweight Docker container acting as a dedicated VPN gateway for other containers.&lt;/li&gt;&#xA;&lt;li&gt;Implements the &lt;strong&gt;sidecar pattern&lt;/strong&gt;: dependent containers (e.g., qBittorrent, nzbget, prowlarr) share Gluetun&amp;rsquo;s network namespace via &lt;code&gt;network_mode: &amp;quot;service:gluetun&amp;quot;&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;AirVPN selected as the provider over ProtonVPN/Mullvad due to superior port forwarding support required for P2P services.&lt;/li&gt;&#xA;&lt;li&gt;Container-level VPN on the servarr VM is architecturally separate from the network-level UniFi VPN on Helms Deep (VLAN 2).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;deployment-context&#34;&gt;Deployment Context&lt;a class=&#34;anchor&#34; href=&#34;#deployment-context&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Gluetun runs on the &lt;strong&gt;servarr VM&lt;/strong&gt; (&lt;code&gt;192.168.1.112&lt;/code&gt;) as part of the Servarr Docker Compose stack at &lt;code&gt;/docker/servarr/&lt;/code&gt;. It is configured via &lt;code&gt;.env&lt;/code&gt; file in that directory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GPU Passthrough for Proxmox LXCs</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/gpu-passthrough-lxc/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/gpu-passthrough-lxc/</guid>
      <description>&lt;h1 id=&#34;gpu-passthrough-for-proxmox-lxcs&#34;&gt;GPU Passthrough for Proxmox LXCs&lt;a class=&#34;anchor&#34; href=&#34;#gpu-passthrough-for-proxmox-lxcs&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Intel GPU passthrough to Proxmox LXCs requires both host-side module loading and specific LXC device mounts.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;vainfo&lt;/code&gt; frequently fails with X11/X server errors in headless containers; this is expected and does not indicate a broken passthrough.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;intel_gpu_top&lt;/code&gt; requires &lt;code&gt;i915&lt;/code&gt; module loaded on the host and accessible debugfs/sysfs paths inside the container.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Headless VA-API Testing&lt;/strong&gt;: When &lt;code&gt;vainfo&lt;/code&gt; reports &lt;code&gt;error: can&#39;t connect to X server!&lt;/code&gt;, set environment variables to bypass X11:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export XDG_RUNTIME_DIR&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/tmp/runtime-root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export LIBVA_DRIVER_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;iHD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vainfo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Module Verification&lt;/strong&gt;: &lt;code&gt;lsmod | grep i915&lt;/code&gt; confirms the driver is loaded inside the container. Presence of &lt;code&gt;i915&lt;/code&gt;, &lt;code&gt;drm_buddy&lt;/code&gt;, &lt;code&gt;ttm&lt;/code&gt;, and &lt;code&gt;drm_display_helper&lt;/code&gt; indicates successful module injection.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Device Access&lt;/strong&gt;: &lt;code&gt;intel_gpu_top&lt;/code&gt; failing with &lt;code&gt;No device filter specified...&lt;/code&gt; typically points to missing debugfs mounts or host-side &lt;code&gt;i915&lt;/code&gt; parameters, not necessarily a broken &lt;code&gt;/dev/dri/&lt;/code&gt; passthrough.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Proxmox LXC Config (&lt;code&gt;/etc/pve/lxc/&amp;lt;container-id&amp;gt;.conf&lt;/code&gt;)&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hinterflix Help Site - Cloudflare Deployment</title>
      <link>https://homelab.nbkelley.com/docs/services/hinterflix-help-site/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/hinterflix-help-site/</guid>
      <description>&lt;h1 id=&#34;hinterflix-help-site---cloudflare-deployment&#34;&gt;Hinterflix Help Site - Cloudflare Deployment&lt;a class=&#34;anchor&#34; href=&#34;#hinterflix-help-site---cloudflare-deployment&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The Hinterflix help site (&lt;code&gt;help.hinterflix.com&lt;/code&gt;) is deployed as a static Hugo site on Cloudflare Workers. The domain is managed within the same Cloudflare account.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hosting&lt;/strong&gt;: Cloudflare Workers Pages (static hosting).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Domain&lt;/strong&gt;: &lt;code&gt;help.hinterflix.com&lt;/code&gt; (root subdomain of &lt;code&gt;hinterflix.com&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DNS&lt;/strong&gt;: CNAME record pointing to the Cloudflare Workers subdomain (&lt;code&gt;*.workers.dev&lt;/code&gt;). Proxy status set to &lt;strong&gt;Proxied&lt;/strong&gt; (orange cloud).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SSL/TLS&lt;/strong&gt;: Automatically provisioned by Cloudflare. &amp;ldquo;Always Use HTTPS&amp;rdquo; enabled in SSL/TLS settings.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;configuration-steps&#34;&gt;Configuration Steps&lt;a class=&#34;anchor&#34; href=&#34;#configuration-steps&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Cloudflare DNS Setup&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Homelab Dashboard</title>
      <link>https://homelab.nbkelley.com/docs/services/homelab-dashboard/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/homelab-dashboard/</guid>
      <description>&lt;h1 id=&#34;homelab-dashboard&#34;&gt;Homelab Dashboard&lt;a class=&#34;anchor&#34; href=&#34;#homelab-dashboard&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A Node.js + Express dashboard is deployed at &lt;code&gt;https://status.nbkelley.com&lt;/code&gt;, serving homelab monitoring data. All API calls are server-side — no internal IPs, credentials, or raw API responses reach the browser.&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment&#34;&gt;Deployment&lt;a class=&#34;anchor&#34; href=&#34;#deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Public URL&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://status.nbkelley.com&#34;&gt;https://status.nbkelley.com&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Host&lt;/td&gt;&#xA;          &lt;td&gt;proxy VM (192.168.1.222)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Port&lt;/td&gt;&#xA;          &lt;td&gt;3002&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Runtime&lt;/td&gt;&#xA;          &lt;td&gt;Node.js + Express, Docker container&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;compose.yaml location&lt;/td&gt;&#xA;          &lt;td&gt;/home/iluvatar/compose.yaml on proxy VM&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;App directory&lt;/td&gt;&#xA;          &lt;td&gt;/opt/homelab-dashboard/ on proxy VM&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Routing&lt;/td&gt;&#xA;          &lt;td&gt;Cloudflare Tunnel → 127.0.0.1:3002&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;file-structure&#34;&gt;File Structure&lt;a class=&#34;anchor&#34; href=&#34;#file-structure&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/opt/homelab-dashboard/&#xA;  server.js         ← Express app, all API logic&#xA;  package.json&#xA;  package-lock.json&#xA;  dockerfile&#xA;  start.sh&#xA;  node_modules/&#xA;  public/&#xA;    index.html&#xA;    styles.css&#xA;    app.js          ← frontend render engine&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;composeyaml-entry&#34;&gt;compose.yaml Entry&lt;a class=&#34;anchor&#34; href=&#34;#composeyaml-entry&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;homelab-dashboard&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/opt/homelab-dashboard&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;homelab-dashboard&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;network_mode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;host&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;PORT=3002&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;network_mode: host&lt;/code&gt; means the app binds directly to host port 3002. The &lt;code&gt;ports:&lt;/code&gt; mapping is ignored when using host networking.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo Deployment to Cloudflare Pages - Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/services/hugo-cloudflare-pages/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/hugo-cloudflare-pages/</guid>
      <description>&lt;h1 id=&#34;hugo-deployment-to-cloudflare-pages---troubleshooting&#34;&gt;Hugo Deployment to Cloudflare Pages - Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#hugo-deployment-to-cloudflare-pages---troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Patterns for resolving missing assets (favicons, CSS, styling) and build failures when deploying Hugo-generated static sites to Cloudflare Pages.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Build Configuration&lt;/strong&gt;: Set build command to &lt;code&gt;hugo&lt;/code&gt;, output directory to &lt;code&gt;public&lt;/code&gt;, and explicitly match the local Hugo version in Cloudflare Pages settings.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Static Asset Placement&lt;/strong&gt;: Ensure all static files (e.g., &lt;code&gt;favicon.ico&lt;/code&gt;, CSS) reside in the &lt;code&gt;static/&lt;/code&gt; directory root or theme-specific static folders.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Rebuild Enforcement&lt;/strong&gt;: Use &lt;code&gt;hugo --cleanDestinationDir&lt;/code&gt; or manually remove the &lt;code&gt;public/&lt;/code&gt; directory to force Hugo to regenerate all assets and detect changes.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cache Management&lt;/strong&gt;: Clear both Cloudflare Pages deployment cache and browser cache to prevent stale asset delivery.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verification Workflow&lt;/strong&gt;: Validate locally via &lt;code&gt;hugo server&lt;/code&gt;, inspect the generated &lt;code&gt;public/&lt;/code&gt; directory, review Cloudflare deployment logs, and confirm full Git commits.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Build Command&lt;/strong&gt;: &lt;code&gt;hugo&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Output Directory&lt;/strong&gt;: &lt;code&gt;public&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Static Directory&lt;/strong&gt;: &lt;code&gt;static/&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Config File&lt;/strong&gt;: &lt;code&gt;config.toml&lt;/code&gt; / &lt;code&gt;config.yaml&lt;/code&gt; (verify &lt;code&gt;baseURL&lt;/code&gt; matches target domain)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;obsidian-integration-for-hugo-date-format&#34;&gt;Obsidian Integration for Hugo Date Format&lt;a class=&#34;anchor&#34; href=&#34;#obsidian-integration-for-hugo-date-format&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Hugo expects ISO 8601 dates with timezone offset: &lt;code&gt;2025-11-22T23:11:12-05:00&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo Git Submodule Extraction Pattern</title>
      <link>https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/</guid>
      <description>&lt;h1 id=&#34;hugo-git-submodule-extraction-pattern&#34;&gt;Hugo Git Submodule Extraction Pattern&lt;a class=&#34;anchor&#34; href=&#34;#hugo-git-submodule-extraction-pattern&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Hugo themes installed as Git submodules (e.g., &lt;code&gt;git submodule add &amp;lt;url&amp;gt; themes/theme-name&lt;/code&gt;)&#xA;carry their own Git history. When you want to customize the theme beyond configuration,&#xA;extracting the submodule into the main repository gives you full control over theme files&#xA;without managing a separate submodule repository.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-pattern&#34;&gt;The Pattern&lt;a class=&#34;anchor&#34; href=&#34;#the-pattern&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remove the submodule registration:&lt;/strong&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule deinit themes/theme-name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rm themes/theme-name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Re-add the theme as regular files:&lt;/strong&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone &amp;lt;theme-url&amp;gt; /tmp/theme-temp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -r /tmp/theme-temp/* themes/theme-name/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add themes/theme-name/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Extract theme-name from submodule into main repo&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; Theme files are now tracked directly in the main repository.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;when-to-use&#34;&gt;When to Use&lt;a class=&#34;anchor&#34; href=&#34;#when-to-use&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You need to modify theme templates, layouts, or partials beyond what config allows&lt;/li&gt;&#xA;&lt;li&gt;The upstream theme is stable and you don&amp;rsquo;t need to pull updates&lt;/li&gt;&#xA;&lt;li&gt;You want simpler CI/CD without recursive submodule clones&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;when-not-to-use&#34;&gt;When Not to Use&lt;a class=&#34;anchor&#34; href=&#34;#when-not-to-use&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The theme receives frequent updates you want to track&lt;/li&gt;&#xA;&lt;li&gt;You only need CSS overrides (use &lt;code&gt;assets/&lt;/code&gt; or &lt;code&gt;static/&lt;/code&gt; instead)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/administration/git-push-authentication/&#34;&gt;Git Push Authentication&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/web/ilmare-website/&#34;&gt;Ilmarë Website&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/services/cms-options/&#34;&gt;Self-Hosted CMS Options &amp;amp; Landscape&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ilmarë Website</title>
      <link>https://homelab.nbkelley.com/docs/web/ilmare-website/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/web/ilmare-website/</guid>
      <description>&lt;h1 id=&#34;ilmarë-website&#34;&gt;Ilmarë Website&lt;a class=&#34;anchor&#34; href=&#34;#ilmar%c3%ab-website&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Static Hugo site hosted on Varda (&lt;code&gt;192.168.1.131&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Features CSS Grid layout, hamburger menu, and parallax hero.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;development-patterns&#34;&gt;Development Patterns&lt;a class=&#34;anchor&#34; href=&#34;#development-patterns&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;conditional-title-suffixes&#34;&gt;Conditional Title Suffixes&lt;a class=&#34;anchor&#34; href=&#34;#conditional-title-suffixes&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Append a suffix (e.g., &lt;code&gt;/home&lt;/code&gt;) to the page title only on the index page.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Implementation&lt;/strong&gt;: Leverage Hugo&amp;rsquo;s &lt;code&gt;.IsHome&lt;/code&gt; boolean within template conditionals.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pattern&lt;/strong&gt;:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;IsHome&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Site&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;home&lt;/span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;or using a variable for cleaner syntax:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;suffix&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;IsHome&lt;/span&gt; }}{{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;suffix&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home&amp;#34;&lt;/span&gt; }}{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;IsHome&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Site&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}{{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;suffix&lt;/span&gt; }}{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Context&lt;/strong&gt;: Applied to &lt;code&gt;layouts/index.html&lt;/code&gt; or base templates to differentiate the root URL from inner pages.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt;: Varda (&lt;code&gt;192.168.1.131&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Stack&lt;/strong&gt;: Hugo static site generation&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Template Engine&lt;/strong&gt;: Go templates&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation dated 2025-11-24. Pattern confirmed for Hugo static site generation.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;None.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/varda-server/&#34;&gt;Varda Server (Ubuntu)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/development/vscode-liveserver-paths/&#34;&gt;VS Code Live Server Path Configuration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/&#34;&gt;Hugo Git Submodule Extraction Pattern&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/115-Adding -home to index page conditionally.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Jellyfin Docker Compose Reference</title>
      <link>https://homelab.nbkelley.com/docs/services/jellyfin-compose/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/jellyfin-compose/</guid>
      <description>&lt;h1 id=&#34;jellyfin-docker-compose-reference&#34;&gt;Jellyfin Docker Compose Reference&lt;a class=&#34;anchor&#34; href=&#34;#jellyfin-docker-compose-reference&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Canonical copy of &lt;code&gt;/docker/jellyfin/compose.yaml&lt;/code&gt; on the &lt;code&gt;servarr&lt;/code&gt; VM (&lt;code&gt;192.168.1.112&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin and Jellyseerr run in a &lt;strong&gt;separate compose file&lt;/strong&gt; from the main Servarr stack, on their own Docker network (&lt;code&gt;jellyfin_default&lt;/code&gt;, &lt;code&gt;172.18.0.0/16&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;composeyaml&#34;&gt;compose.yaml&lt;a class=&#34;anchor&#34; href=&#34;#composeyaml&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;jellyfin&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/jellyfin:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jellyfin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=1000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=1000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=America/Los_Angeles&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;JELLYFIN_PublishedServerUrl=http://192.168.1.112&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#optional&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./config:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./jellyfin-web/config.json:/usr/share/jellyfin/web/config.json&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;devices&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/dev/dri:/dev/dri&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#Use for Intel QuickSync&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;8096&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8096&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;7359&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;7359&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/udp&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#Service Discovery&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;1900&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;1900&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/udp&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#Client Discovery&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;labels&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;deunhealth.restart.on.unhealthy=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;healthcheck&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;test&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;curl -f http://localhost:8096/health || exit 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;interval&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;retries&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;start_period&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;30s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;timeout&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Remove the Jellyfin service if installed directly on system.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;jellyseerr&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jellyseerr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;fallenbagel/jellyseerr:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=1000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=1000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=America/Los_Angeles&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./jellyseerr:/app/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;5055&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;5055&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;key-details&#34;&gt;Key Details&lt;a class=&#34;anchor&#34; href=&#34;#key-details&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt;: Uses the auto-created &lt;code&gt;jellyfin_default&lt;/code&gt; bridge network (&lt;code&gt;172.18.0.0/16&lt;/code&gt;). Jellyseerr reaches the *arr services via the host IP (&lt;code&gt;192.168.1.112&lt;/code&gt;) and their exposed ports.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU Passthrough&lt;/strong&gt;: &lt;code&gt;/dev/dri:/dev/dri&lt;/code&gt; enables Intel QuickSync hardware-accelerated transcoding.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;PUID/PGID&lt;/strong&gt;: Hardcoded to &lt;code&gt;1000&lt;/code&gt; (unlike the servarr stack which uses &lt;code&gt;.env&lt;/code&gt; variables).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;TZ&lt;/strong&gt;: &lt;code&gt;America/Los_Angeles&lt;/code&gt; (note: servarr stack uses &lt;code&gt;America/New_York&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Healthcheck&lt;/strong&gt;: Already configured with deunhealth label — auto-restarts on unhealthy.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Custom web config&lt;/strong&gt;: &lt;code&gt;./jellyfin-web/config.json&lt;/code&gt; is bind-mounted into the container for UI customization (e.g., the Hinterflix help link).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;directory-layout&#34;&gt;Directory Layout&lt;a class=&#34;anchor&#34; href=&#34;#directory-layout&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/docker/jellyfin/&#xA;├── compose.yaml&#xA;├── config/          # Jellyfin server config&#xA;├── jellyfin-web/&#xA;│   └── config.json  # Custom web UI config&#xA;└── jellyseerr/      # Jellyseerr app config&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr-compose/&#34;&gt;Servarr Docker Compose Reference&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr/&#34;&gt;Servarr - Media Automation Stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/jellyfin-gpu-passthrough/&#34;&gt;Jellyfin LXC GPU Passthrough &amp;amp; Hardware Acceleration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/jellyfin-help-link/&#34;&gt;Jellyfin Help Link Integration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Jellyfin Help Link Integration</title>
      <link>https://homelab.nbkelley.com/docs/services/jellyfin-help-link/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/jellyfin-help-link/</guid>
      <description>&lt;h1 id=&#34;jellyfin-help-link-integration&#34;&gt;Jellyfin Help Link Integration&lt;a class=&#34;anchor&#34; href=&#34;#jellyfin-help-link-integration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Integrate a persistent, user-facing help link directly into the Jellyfin UI for logged-in users, directing them to the Hinterflix documentation.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Methods Evaluated&lt;/strong&gt;: Custom Login Message (pre-login only), Custom CSS (Dashboard &amp;gt; General), Reverse Proxy HTML injection (Nginx), Custom JavaScript, and Plugin-based solutions.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Selected Approach&lt;/strong&gt;: Custom CSS injected via the Jellyfin Dashboard. It provides immediate visibility without requiring external dependencies or server restarts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Placement&lt;/strong&gt;: Prioritized persistent in-interface links over pre-login messages. Options included header navigation, floating action button, and sidebar integration.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Implementation Path&lt;/strong&gt;: Chose &lt;code&gt;Dashboard &amp;gt; General &amp;gt; Custom CSS&lt;/code&gt; for its simplicity and zero-dependency nature compared to reverse proxy modifications or plugin development.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Target URL&lt;/strong&gt;: The CSS &lt;code&gt;href&lt;/code&gt; attributes should point to the deployed Hinterflix help site (e.g., &lt;code&gt;https://status.nbkelley.com&lt;/code&gt; or the specific docs subdomain).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt;: Jellyfin Web UI → Dashboard → General → Custom CSS&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Active Selectors&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;headerTabs::after&lt;/code&gt; for top navigation bar integration&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;body::after&lt;/code&gt; for a fixed floating action button (FAB)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;sidebarBox:last-child::after&lt;/code&gt; for sidebar menu integration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;: None. Relies entirely on Jellyfin&amp;rsquo;s built-in CSS injection capability.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation dated 2025-11-22.&lt;/li&gt;&#xA;&lt;li&gt;Jellyfin&amp;rsquo;s frontend framework (Ember.js/React hybrid) frequently updates CSS class names. Selectors like &lt;code&gt;headerTabs&lt;/code&gt; and &lt;code&gt;sidebarBox&lt;/code&gt; may break after major Jellyfin version upgrades, requiring CSS updates.&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;sub_filter&lt;/code&gt; Nginx approach was considered but discarded in favor of native dashboard configuration to avoid proxy overhead and cache invalidation issues.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Has the chosen CSS snippet been applied and verified against the current Jellyfin version running on the homelab?&lt;/li&gt;&#xA;&lt;li&gt;Are there any specific UX guidelines or family-user constraints that dictate the preferred placement (header vs. floating vs. sidebar)?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/hinterflix-help-site/&#34;&gt;Hinterflix Help Site - Cloudflare Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/jellyfin-gpu-passthrough/&#34;&gt;Jellyfin LXC GPU Passthrough &amp;amp; Hardware Acceleration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr/&#34;&gt;Servarr - Media Automation Stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/128-Add User to Sudoers Group Guide.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/113-Adding Help Link to Jellyfin Server.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/028-Basic Header with Hamburger Menu Design.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: &amp;ldquo;Adding Help Link to Jellyfin Server&amp;rdquo; (2025-11-22)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Jellyfin LXC GPU Passthrough &amp; Hardware Acceleration</title>
      <link>https://homelab.nbkelley.com/docs/services/jellyfin-gpu-passthrough/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/jellyfin-gpu-passthrough/</guid>
      <description>&lt;h1 id=&#34;jellyfin-lxc-gpu-passthrough--hardware-acceleration&#34;&gt;Jellyfin LXC GPU Passthrough &amp;amp; Hardware Acceleration&lt;a class=&#34;anchor&#34; href=&#34;#jellyfin-lxc-gpu-passthrough--hardware-acceleration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Successfully configured Intel UHD Graphics 630 GPU passthrough to a Jellyfin LXC container on Proxmox for hardware-accelerated transcoding via Intel QuickSync (QSV).&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU Passthrough Method&lt;/strong&gt;: LXC container-level GPU device mapping (not full VM passthrough)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hardware Acceleration&lt;/strong&gt;: Intel QuickSync (QSV) selected over VAAPI for Jellyfin&amp;rsquo;s native support&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Monitoring Constraints&lt;/strong&gt;: Accepted that LXC container restrictions prevent full GPU monitoring tools (dmesg, intel_gpu_top) from functioning; validated functionality through actual transcoding tests instead&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;host-gpu-details&#34;&gt;Host GPU Details&lt;a class=&#34;anchor&#34; href=&#34;#host-gpu-details&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630]&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;PCI Address&lt;/strong&gt;: 00:02.0&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Driver&lt;/strong&gt;: i915 (loaded)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Related Modules&lt;/strong&gt;: drm_buddy, ttm, drm_display_helper, cec, i2c_algo_bit, video&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;lxc-container-gpu-devices&#34;&gt;LXC Container GPU Devices&lt;a class=&#34;anchor&#34; href=&#34;#lxc-container-gpu-devices&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;/dev/dri/card0&lt;/code&gt; — character special (major 226, minor 0)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/dev/dri/renderD128&lt;/code&gt; — character special (major 226, minor 128)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Permissions&lt;/strong&gt;: &lt;code&gt;crw-rw---- root:video&lt;/code&gt; (226/0 and 226/128)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;jellyfin-configuration&#34;&gt;Jellyfin Configuration&lt;a class=&#34;anchor&#34; href=&#34;#jellyfin-configuration&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Group Assignment&lt;/strong&gt;: &lt;code&gt;jellyfin&lt;/code&gt; user added to &lt;code&gt;video&lt;/code&gt; group (&lt;code&gt;usermod -a -G video jellyfin&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dashboard → Playback Settings&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Hardware Acceleration: &lt;code&gt;Intel QuickSync (QSV)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enable hardware encoding: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enable hardware decoding: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enable tone mapping: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Allow encoding in HEVC: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Allow encoding in AV1: &lt;code&gt;Yes&lt;/code&gt; (if supported)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;validation-commands&#34;&gt;Validation Commands&lt;a class=&#34;anchor&#34; href=&#34;#validation-commands&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Verify GPU device accessibility&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la /dev/dri/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Check if processes are using GPU during playback&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsof /dev/dri/renderD128&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Monitor Jellyfin logs for hardware acceleration&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo journalctl -u jellyfin -f | grep -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hardware\|qsv\|quicksync\|vaapi&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Check active transcoding sessions in Jellyfin UI&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Dashboard → Active Devices → look for (HW) indicator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;dmesg restriction&lt;/strong&gt;: &lt;code&gt;dmesg: read kernel buffer failed: Operation not permitted&lt;/code&gt; — expected in LXC containers without full device access&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;intel_gpu_top limitation&lt;/strong&gt;: GPU monitoring tools that require kernel debugfs access will not work inside the LXC; validated via actual transcoding performance and log inspection instead&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;i915 driver loaded&lt;/strong&gt;: Confirmed via &lt;code&gt;lsmod | grep i915&lt;/code&gt; showing 3,928,064 bytes loaded&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No GPU debug info&lt;/strong&gt;: &lt;code&gt;/sys/kernel/debug/dri&lt;/code&gt; not available in container — accepted limitation&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does AV1 hardware encoding actually work on Coffee Lake-S (Gen 9.5) — typically limited to H.264/H.265&lt;/li&gt;&#xA;&lt;li&gt;Performance baseline: what CPU load reduction is observed with QSV vs software transcoding?&lt;/li&gt;&#xA;&lt;li&gt;Can GPU passthrough be extended to other LXC containers (e.g., Plex, if migrated)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Plex Transcoding LXC — similar GPU passthrough patterns for Plex&lt;/li&gt;&#xA;&lt;li&gt;Proxmox LXC Configuration — LXC container setup patterns&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr/&#34;&gt;Servarr - Media Automation Stack&lt;/a&gt; — media server ecosystem&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/gluetun-vpn/&#34;&gt;Gluetun VPN Service&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>KVM Input Switch Sleep Issues</title>
      <link>https://homelab.nbkelley.com/docs/hardware/kvm-troubleshooting/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/hardware/kvm-troubleshooting/</guid>
      <description>&lt;h1 id=&#34;kvm-input-switch-sleep-issues&#34;&gt;KVM Input Switch Sleep Issues&lt;a class=&#34;anchor&#34; href=&#34;#kvm-input-switch-sleep-issues&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Switching inputs on a KVM switch can trigger connected PCs to enter sleep mode and fail to wake up. This is typically caused by EDID handshake interruptions or power management settings reacting to display signal loss when the KVM switches away from a connected machine.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions--troubleshooting-steps&#34;&gt;Key Decisions &amp;amp; Troubleshooting Steps&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions--troubleshooting-steps&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hardware Model&lt;/strong&gt;: Inland Dual 4K Display KVM Switch/Dock.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;EDID Emulation&lt;/strong&gt;: The most critical fix. Ensure the KVM is configured for EDID emulation (often via dip switches or firmware settings) to maintain a persistent display handshake and prevent the host OS from detecting a disconnected monitor.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Firmware Updates&lt;/strong&gt;: Check manufacturer resources (e.g., Micro Center for Inland) for firmware updates to improve display handshake compatibility.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Windows Power Management&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &amp;lsquo;Screen&amp;rsquo; and &amp;lsquo;Sleep&amp;rsquo; to &amp;lsquo;Never&amp;rsquo; in Power &amp;amp; Sleep settings.&lt;/li&gt;&#xA;&lt;li&gt;Adjust NVIDIA Control Panel power management to &amp;lsquo;Prefer Maximum Performance&amp;rsquo;.&lt;/li&gt;&#xA;&lt;li&gt;Use Group Policy (&lt;code&gt;gpedit.msc&lt;/code&gt;) to disable video/display power saving templates.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Linux Mint Power Management&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Configure &lt;code&gt;/etc/X11/xorg.conf&lt;/code&gt; to disable blank/standby/suspend/off times (&lt;code&gt;ServerFlags&lt;/code&gt; section).&lt;/li&gt;&#xA;&lt;li&gt;Add &lt;code&gt;xset s off&lt;/code&gt; and &lt;code&gt;xset -dpms&lt;/code&gt; to startup applications.&lt;/li&gt;&#xA;&lt;li&gt;Modify GRUB cmdline (&lt;code&gt;/etc/default/grub&lt;/code&gt;) with &lt;code&gt;video=vesafb:off video=eefb:off drm_kms_helper.edid_firmware=edid/1920x1080.bin&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hardware Checks&lt;/strong&gt;: Use high-quality/shorter HDMI/DisplayPort cables, ensure direct monitor connections to KVM outputs, and utilize the KVM&amp;rsquo;s built-in USB hub for peripherals.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Workaround&lt;/strong&gt;: Manual wake via brief power button press or keyboard input if automatic wake fails due to lost display signal.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation date: 2025-11-29.&lt;/li&gt;&#xA;&lt;li&gt;Specific to Inland Dual 4K KVM dock behavior.&lt;/li&gt;&#xA;&lt;li&gt;EDID emulation is consistently the primary resolution for this class of KVM-induced sleep issues.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does the specific Inland dock model have a known firmware revision that fully resolves this behavior?&lt;/li&gt;&#xA;&lt;li&gt;Are external EDID emulators required if built-in emulation remains insufficient?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/hardware/monitor-standards.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/infrastructure/gpu-passthrough-lxc.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/122-KVM Input Switch Causes PC Sleep Issue.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>MBTA Dashboard - Frontend Implementation</title>
      <link>https://homelab.nbkelley.com/docs/services/mbta-dashboard-frontend/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/mbta-dashboard-frontend/</guid>
      <description>&lt;h1 id=&#34;mbta-dashboard---frontend-implementation&#34;&gt;MBTA Dashboard - Frontend Implementation&lt;a class=&#34;anchor&#34; href=&#34;#mbta-dashboard---frontend-implementation&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A portrait-mode (1080x1920) transit dashboard displaying real-time MBTA departures, commuter rail, weather, news, and a static transit map. Hosted on PLT-MBTADisplay (&lt;code&gt;192.168.168.42&lt;/code&gt;), served via Nginx with a Node/Express proxy that handles all external API calls server-side. Target display is a 1080p vertical screen driven by Anthias on a Raspberry Pi 3B+.&lt;/p&gt;&#xA;&lt;h2 id=&#34;design-evolution&#34;&gt;Design Evolution&lt;a class=&#34;anchor&#34; href=&#34;#design-evolution&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The dashboard went through several major design iterations:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Initial&lt;/strong&gt;: Line-based cards with MBTA colors, horizontal layout for 1080p TV&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Minimalist redesign&lt;/strong&gt;: White background, grey dividers, MBTA colors only on small abbreviated line pills (RL, OL, BL, GL-B/C/D/E), smaller station-only headers with walk time&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Station-based cards&lt;/strong&gt;: Cards grouped by station (South Station, State Street, Park Street) rather than by line, with all routes listed per station&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Final portrait layout&lt;/strong&gt;: 2-column CSS Grid, flex column containers, flat time-sorted departure list with line pills, full-width static map image at bottom&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;layout-1080x1920-portrait&#34;&gt;Layout (1080x1920 Portrait)&lt;a class=&#34;anchor&#34; href=&#34;#layout-1080x1920-portrait&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2-column, 3-row card grid above a full-width static map image&lt;/li&gt;&#xA;&lt;li&gt;Cards flex with content height (no preset card height)&lt;/li&gt;&#xA;&lt;li&gt;CSS Grid with &lt;code&gt;grid-template-columns: 1fr 1fr&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-features&#34;&gt;Key Features&lt;a class=&#34;anchor&#34; href=&#34;#key-features&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;css-tickermarquee&#34;&gt;CSS Ticker/Marquee&lt;a class=&#34;anchor&#34; href=&#34;#css-tickermarquee&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Header text that overflows its container scrolls seamlessly in a ticker&lt;/li&gt;&#xA;&lt;li&gt;Uses CSS animation with &lt;code&gt;transform: translateX()&lt;/code&gt; — no JavaScript&lt;/li&gt;&#xA;&lt;li&gt;Animation speed set slow for readability&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;station-based-grouping&#34;&gt;Station-Based Grouping&lt;a class=&#34;anchor&#34; href=&#34;#station-based-grouping&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Cards grouped by physical station: South Station, State Street, Park Street&lt;/li&gt;&#xA;&lt;li&gt;Each station card shows all lines serving that station&lt;/li&gt;&#xA;&lt;li&gt;Departures sorted by time, each with abbreviated line pill (RL, OL, BL, GL-B, etc.)&lt;/li&gt;&#xA;&lt;li&gt;Filtered to show departures within 10 minutes walking distance&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;server-side-proxy-architecture&#34;&gt;Server-Side Proxy Architecture&lt;a class=&#34;anchor&#34; href=&#34;#server-side-proxy-architecture&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;All API calls proxied through Node/Express on &lt;code&gt;localhost:3000&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Client fetches single &lt;code&gt;/api/data&lt;/code&gt; endpoint — no direct browser-to-MBTA calls&lt;/li&gt;&#xA;&lt;li&gt;API keys stored in environment variables, never exposed to browser&lt;/li&gt;&#xA;&lt;li&gt;Server-side caching with TTL to reduce upstream API calls&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;news-ticker&#34;&gt;News Ticker&lt;a class=&#34;anchor&#34; href=&#34;#news-ticker&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pulls from multiple RSS feeds (MassLive Boston, State House News)&lt;/li&gt;&#xA;&lt;li&gt;Displays first 3 items from each feed as &lt;code&gt;&amp;lt;title&amp;gt; - &amp;lt;description&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Modular RSS feed configuration for easy addition of new sources&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;static-map&#34;&gt;Static Map&lt;a class=&#34;anchor&#34; href=&#34;#static-map&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Originally Leaflet.js with OpenStreetMap and hardcoded markers&lt;/li&gt;&#xA;&lt;li&gt;Replaced with static image for performance on Raspberry Pi&lt;/li&gt;&#xA;&lt;li&gt;Generated via Snazzy Maps + PowerPoint, served as local &lt;code&gt;webp&lt;/code&gt; file&lt;/li&gt;&#xA;&lt;li&gt;Full-width, placed below the card grid&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;performance--optimization&#34;&gt;Performance &amp;amp; Optimization&lt;a class=&#34;anchor&#34; href=&#34;#performance--optimization&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;memory-constraints-raspberry-pi-3b&#34;&gt;Memory Constraints (Raspberry Pi 3B+)&lt;a class=&#34;anchor&#34; href=&#34;#memory-constraints-raspberry-pi-3b&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Total system memory: 788MB&lt;/li&gt;&#xA;&lt;li&gt;Dockerized Anthias viewer consumes significant resources&lt;/li&gt;&#xA;&lt;li&gt;Strategies employed:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Server-side proxy&lt;/strong&gt;: Eliminates duplicate API calls from browser&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lazy loading&lt;/strong&gt;: Defer non-critical rendering&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DOM optimization&lt;/strong&gt;: Remove unused elements, minimize reflows&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Image optimization&lt;/strong&gt;: Convert to WebP, use static image over dynamic map&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cache management&lt;/strong&gt;: Server-side cache with periodic clearing&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Swap avoidance&lt;/strong&gt;: Swap degrades SD card — keep memory footprint below physical RAM&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;font-standardization&#34;&gt;Font Standardization&lt;a class=&#34;anchor&#34; href=&#34;#font-standardization&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Default to Arial for cross-platform consistency&lt;/li&gt;&#xA;&lt;li&gt;Helvetica Neue as preferred fallback&lt;/li&gt;&#xA;&lt;li&gt;Qt WebEngine (Anthias) renders fonts differently than desktop Chrome&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt;: PLT-MBTADisplay (&lt;code&gt;192.168.168.42&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Web root&lt;/strong&gt;: &lt;code&gt;/var/www/MBTADisplay/public&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Proxy&lt;/strong&gt;: &lt;code&gt;/opt/mbta-proxy/server.js&lt;/code&gt; (Node/Express, port 3000)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Process manager&lt;/strong&gt;: pm2 with systemd service (&lt;code&gt;pm2-administrator&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: Git push → GitHub → manual pull on server&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Access URLs&lt;/strong&gt;: &lt;code&gt;http://transit.intra.plgt.com&lt;/code&gt; (internal), &lt;code&gt;https://mbtadash.nbkelley.com&lt;/code&gt; (Cloudflare)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation dates: 2026-03-12 to 2026-04-12.&lt;/li&gt;&#xA;&lt;li&gt;Collaborative workflow: Claude AI (creative/prompt engineering) → Claude Code (implementation).&lt;/li&gt;&#xA;&lt;li&gt;Blue Bikes section was added, then fully removed when GBFS feed deprecated.&lt;/li&gt;&#xA;&lt;li&gt;Ferry panel configuration evolved significantly — seasonal routes removed seasonally.&lt;/li&gt;&#xA;&lt;li&gt;Several Claude Code UI hallucinations corrected by user during Bambu Studio discussion.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/mbta-dashboard-setup/&#34;&gt;MBTA Dashboard - Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/mbta-kiosk-mode/&#34;&gt;MBTA Dashboard - Kiosk Mode&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/bluebikes-api/&#34;&gt;BlueBikes API Feeds Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/159-Create MBTA Train Dashboard with API.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Claude Code conversation: &amp;ldquo;MBTADashboard - Prompt Maker&amp;rdquo; (chat 24)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>MBTA Dashboard - Kiosk Mode</title>
      <link>https://homelab.nbkelley.com/docs/services/mbta-kiosk-mode/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/mbta-kiosk-mode/</guid>
      <description>&lt;h1 id=&#34;mbta-dashboard---kiosk-mode&#34;&gt;MBTA Dashboard - Kiosk Mode&lt;a class=&#34;anchor&#34; href=&#34;#mbta-dashboard---kiosk-mode&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The MBTA dashboard runs as a 24/7 kiosk display on a Raspberry Pi 3B+ using Anthias (formerly Screenly OSE) in Docker. The display is portrait 1080x1920. The Pi has severe memory constraints (788MB total) requiring aggressive optimization.&lt;/p&gt;&#xA;&lt;h2 id=&#34;anthias-deployment&#34;&gt;Anthias Deployment&lt;a class=&#34;anchor&#34; href=&#34;#anthias-deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;hardware&#34;&gt;Hardware&lt;a class=&#34;anchor&#34; href=&#34;#hardware&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Device&lt;/strong&gt;: Raspberry Pi 3B+ (788MB RAM)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Display&lt;/strong&gt;: 1080x1920 portrait screen&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Software&lt;/strong&gt;: Anthias (Docker-based digital signage)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;display-configuration&#34;&gt;Display Configuration&lt;a class=&#34;anchor&#34; href=&#34;#display-configuration&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dashboard page set as primary asset&lt;/li&gt;&#xA;&lt;li&gt;Splash page appears for 1 minute every 11 hours 59 minutes as a refresh cycle&lt;/li&gt;&#xA;&lt;li&gt;Page refreshes via cron job to prevent memory leaks&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;cron-refresh&#34;&gt;Cron Refresh&lt;a class=&#34;anchor&#34; href=&#34;#cron-refresh&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Refresh the kiosk page periodically to clear memory&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; */6 * * * docker restart screenly-anthias-viewer-1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;qt-webengine-quirks&#34;&gt;Qt WebEngine Quirks&lt;a class=&#34;anchor&#34; href=&#34;#qt-webengine-quirks&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Anthias uses Qt WebEngine for rendering, which differs from desktop Chrome:&lt;/p&gt;</description>
    </item>
    <item>
      <title>MBTA Dashboard - Setup</title>
      <link>https://homelab.nbkelley.com/docs/services/mbta-dashboard-setup/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/mbta-dashboard-setup/</guid>
      <description>&lt;h1 id=&#34;mbta-dashboard---setup&#34;&gt;MBTA Dashboard - Setup&lt;a class=&#34;anchor&#34; href=&#34;#mbta-dashboard---setup&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Office transit dashboard deployed on a self-hosted Debian VM (&lt;code&gt;PLT-MBTADisplay&lt;/code&gt;, &lt;code&gt;192.168.168.42&lt;/code&gt;). Nginx serves static files from &lt;code&gt;/var/www/MBTADisplay/public&lt;/code&gt; and proxies &lt;code&gt;/api/&lt;/code&gt; requests to a Node/Express caching proxy on port 3000. API keys are stored server-side and never exposed to the browser. Process managed via pm2 with a systemd service.&lt;/p&gt;&#xA;&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;a class=&#34;anchor&#34; href=&#34;#architecture&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Browser (Anthias/Desktop)&#xA;    → Nginx (:80) → / → static files (/var/www/MBTADisplay/public)&#xA;                   → /api/ → Node/Express proxy (:3000)&#xA;                                → MBTA v3 API&#xA;                                → OpenWeatherMap API&#xA;                                → RSS feeds&#xA;                                → Caches responses&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;nginx-configuration&#34;&gt;Nginx Configuration&lt;a class=&#34;anchor&#34; href=&#34;#nginx-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server {&#xA;    listen 80;&#xA;    server_name transit.intra.plgt.com 192.168.168.42;&#xA;&#xA;    root /var/www/MBTADisplay/public;&#xA;    index index.html;&#xA;&#xA;    location / {&#xA;        try_files $uri $uri/ =404;&#xA;    }&#xA;&#xA;    location /api/ {&#xA;        proxy_pass http://localhost:3000;&#xA;        proxy_http_version 1.1;&#xA;        proxy_set_header Host $host;&#xA;        proxy_set_header X-Real-IP $remote_addr;&#xA;    }&#xA;}&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;nodeexpress-proxy&#34;&gt;Node/Express Proxy&lt;a class=&#34;anchor&#34; href=&#34;#nodeexpress-proxy&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;setup&#34;&gt;Setup&lt;a class=&#34;anchor&#34; href=&#34;#setup&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /opt/mbta-proxy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /opt/mbta-proxy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm init -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install express node-fetch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;api-key-management&#34;&gt;API Key Management&lt;a class=&#34;anchor&#34; href=&#34;#api-key-management&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;API keys stored in &lt;code&gt;/opt/mbta-proxy/.env&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Loaded via &lt;code&gt;process.env.MBTA_API_KEY&lt;/code&gt; in server.js&lt;/li&gt;&#xA;&lt;li&gt;pm2 started with &lt;code&gt;--env&lt;/code&gt; flag to load .env file&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Critical&lt;/strong&gt;: API key must survive server.js overwrites from GitHub syncs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;pm2-process-manager&#34;&gt;pm2 Process Manager&lt;a class=&#34;anchor&#34; href=&#34;#pm2-process-manager&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm2 start server.js --name mbta-proxy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm2 save&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm2 startup systemd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;systemd-service-etcsystemdsystempm2-administratorservice&#34;&gt;systemd Service (&lt;code&gt;/etc/systemd/system/pm2-administrator.service&lt;/code&gt;)&lt;a class=&#34;anchor&#34; href=&#34;#systemd-service-etcsystemdsystempm2-administratorservice&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]&#xA;Description=PM2 process manager&#xA;After=network.target&#xA;&#xA;[Service]&#xA;Type=forking&#xA;User=administrator&#xA;ExecStart=/usr/local/bin/pm2 resurrect&#xA;ExecReload=/usr/local/bin/pm2 reload all&#xA;ExecStop=/usr/local/bin/pm2 kill&#xA;Restart=on-failure&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;github-deployment&#34;&gt;GitHub Deployment&lt;a class=&#34;anchor&#34; href=&#34;#github-deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;repository&#34;&gt;Repository&lt;a class=&#34;anchor&#34; href=&#34;#repository&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Repo: &lt;code&gt;https://github.com/bich-nguyen/MBTADisplay.git&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Cloned to &lt;code&gt;/var/www/MBTADisplay&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Static files in &lt;code&gt;public/&lt;/code&gt; subdirectory&lt;/li&gt;&#xA;&lt;li&gt;Server files in &lt;code&gt;/opt/mbta-proxy/&lt;/code&gt; (separate from web root)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;ownership&#34;&gt;Ownership&lt;a class=&#34;anchor&#34; href=&#34;#ownership&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chown -R administrator:administrator /var/www/MBTADisplay&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note: &lt;code&gt;www-data&lt;/code&gt; ownership breaks git operations from administrator user.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mobile Hotspot &amp; Proton VPN Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/networking/mobile-hotspot-vpn/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/mobile-hotspot-vpn/</guid>
      <description>&lt;h1 id=&#34;mobile-hotspot--proton-vpn-troubleshooting&#34;&gt;Mobile Hotspot &amp;amp; Proton VPN Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#mobile-hotspot--proton-vpn-troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A PC connected to a mobile hotspot will always display a local/private IP address (e.g., &lt;code&gt;192.168.43.x&lt;/code&gt;) to communicate with the phone acting as the gateway/router.&lt;/li&gt;&#xA;&lt;li&gt;Enabling Proton VPN on the mobile device does not automatically extend the encrypted tunnel to connected hotspot devices by default. This is due to app-level vs. system-level routing, separate network interfaces, and carrier/OS restrictions.&lt;/li&gt;&#xA;&lt;li&gt;Public IP verification and DNS leak tests are required to confirm whether hotspot traffic is actually being routed through the VPN tunnel.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local IP vs Public IP&lt;/strong&gt;: Local IPs are expected and required for LAN communication; privacy and security are determined by the public IP and DNS resolution, not the local address.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN Extension Methods&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Enable &amp;ldquo;Always-on VPN&amp;rdquo; and &amp;ldquo;VPN passthrough&amp;rdquo; in the phone&amp;rsquo;s hotspot/tethering settings.&lt;/li&gt;&#xA;&lt;li&gt;Install Proton VPN directly on the PC for guaranteed tunneling, kill switch functionality, and split tunneling control.&lt;/li&gt;&#xA;&lt;li&gt;Use USB tethering instead of Wi-Fi hotspot if Wi-Fi passthrough fails or is blocked by the carrier.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Order of Operations&lt;/strong&gt;: Disabling and re-enabling the hotspot &lt;em&gt;after&lt;/em&gt; establishing the VPN connection can force the routing table to update and apply the tunnel correctly.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;N/A (General networking troubleshooting pattern applicable to remote management of homelab infrastructure like Isengard (192.168.1.69) or Legolas (192.168.1.45) via mobile data).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation dated 2025-12-13.&lt;/li&gt;&#xA;&lt;li&gt;Proton VPN mobile app behavior varies significantly by OS (iOS/Android) and mobile carrier; some devices natively block VPN over hotspot.&lt;/li&gt;&#xA;&lt;li&gt;This pattern is relevant for remote homelab administration or travel scenarios where mobile data serves as the primary internet source.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does the specific mobile carrier or OS version in use support native VPN passthrough for hotspots without third-party apps?&lt;/li&gt;&#xA;&lt;li&gt;Are there specific Proton VPN mobile app settings that consistently bypass carrier restrictions for tethering?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/unifi-express-vpn/&#34;&gt;UniFi Express VPN &amp;amp; Network Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/proxy-management/&#34;&gt;Proxy Management &amp;amp; Cloudflare Tunnels&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network/&#34;&gt;Network Infrastructure &amp;amp; VLANs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/130-PC Local IP While Hotspot with VPN.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: PC Local IP While Hotspot with VPN (2025-12-13)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>PLA Filament Troubleshooting &amp; Calibration</title>
      <link>https://homelab.nbkelley.com/docs/3d-printing/pla-troubleshooting/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/3d-printing/pla-troubleshooting/</guid>
      <description>&lt;h1 id=&#34;pla-filament-troubleshooting--calibration&#34;&gt;PLA Filament Troubleshooting &amp;amp; Calibration&lt;a class=&#34;anchor&#34; href=&#34;#pla-filament-troubleshooting--calibration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Switching PLA filament colors can cause functional failures even with identical models due to subtle differences in pigment, viscosity, shrinkage rates, and surface finish.&lt;/li&gt;&#xA;&lt;li&gt;Whistle functionality is highly sensitive to airway geometry, fipple edge sharpness, and internal surface smoothness.&lt;/li&gt;&#xA;&lt;li&gt;Top surface ironing in Bambu Studio can cause &amp;ldquo;dimple&amp;rdquo; pits due to over-melting, insufficient underlying support, or incorrect flow/speed ratios.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;functional-failure-color-switch&#34;&gt;Functional Failure (Color Switch)&lt;a class=&#34;anchor&#34; href=&#34;#functional-failure-color-switch&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dimensional Accuracy:&lt;/strong&gt; Different pigments cause varying shrinkage. A 0.1-0.2mm variance in airway width or fipple can kill sound.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Run a Temperature Tower and Flow Rate/Extrusion Multiplier Calibration for the new color.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Surface Finish &amp;amp; Friction:&lt;/strong&gt; Viscosity differences affect interior surface smoothness.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Lower print temperature by 5-10°C to reduce glossiness and sharpen the fipple edge. Max cooling fan (100%) during ironing/printing.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Moisture:&lt;/strong&gt; New filament rolls may absorb ambient moisture, causing bubbling and inconsistent extrusion.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Dry filament at 45-50°C for 4-6 hours.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Retraction/Oozing:&lt;/strong&gt; Viscosity changes can cause stringing inside the airway.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Increase retraction distance by 0.5-1mm or increase speed. Enable &amp;ldquo;Retract on Layer Change&amp;rdquo;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Post-Processing:&lt;/strong&gt; Critical for fipple edges.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Use folded printer paper or a precision knife to manually deburr and sharpen the internal fipple edge. Probe airway with thin filament to check for obstructions.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;surface-pitting-ironing&#34;&gt;Surface Pitting (Ironing)&lt;a class=&#34;anchor&#34; href=&#34;#surface-pitting-ironing&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Over-Ironing:&lt;/strong&gt; Excessive ironing flow or low nozzle height displaces molten plastic, creating waves that solidify into pits.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Reduce &lt;code&gt;Ironing Flow&lt;/code&gt; by half (e.g., 10% -&amp;gt; 5%). Increase &lt;code&gt;Ironing Speed&lt;/code&gt; by 20-30%. Adjust &lt;code&gt;Ironing Line Spacing&lt;/code&gt; wider (e.g., 0.1mm -&amp;gt; 0.15mm).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Insufficient Support:&lt;/strong&gt; Too few top layers or low infill density causes the top surface to deflect into the infill pattern.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Increase &lt;code&gt;Top Layers&lt;/code&gt; to 4-6. Increase &lt;code&gt;Infill Density&lt;/code&gt; to 20-25% using Gyroid or Rectilinear patterns.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Temperature Sensitivity:&lt;/strong&gt; Blue PLA may be more heat-sensitive.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Set &lt;code&gt;Ironing Temperature&lt;/code&gt; 5-10°C lower than normal print temp. Ensure 100% fan cooling during the ironing pass.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;alternative-approach-skip-ironing&#34;&gt;Alternative Approach (Skip Ironing)&lt;a class=&#34;anchor&#34; href=&#34;#alternative-approach-skip-ironing&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ironing is aesthetic and unnecessary for functional parts like whistle bodies.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Fix:&lt;/em&gt; Rely on standard top layer settings: &lt;code&gt;Top Layer Flow&lt;/code&gt; at 105-110%, smaller &lt;code&gt;Top Layer Line Width&lt;/code&gt; (e.g., 0.3mm on 0.4mm nozzle), and sufficient &lt;code&gt;Infill Overlap&lt;/code&gt; (15-20%).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Baseline Ironing Settings (Clean Ironing):&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Top Layers: 5&lt;/li&gt;&#xA;&lt;li&gt;Infill Density: 25% (Gyroid)&lt;/li&gt;&#xA;&lt;li&gt;Ironing: Enabled&lt;/li&gt;&#xA;&lt;li&gt;Ironing Flow: 5%&lt;/li&gt;&#xA;&lt;li&gt;Ironing Speed: 100 mm/s (or 1.5x normal top layer speed)&lt;/li&gt;&#xA;&lt;li&gt;Ironing Temperature: -5°C from base print temp&lt;/li&gt;&#xA;&lt;li&gt;Fan during Ironing: 100%&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Standard Top Layer Fallback:&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Top Layer Flow: 105-110%&lt;/li&gt;&#xA;&lt;li&gt;Top Layer Line Width: 0.3mm (on 0.4mm nozzle)&lt;/li&gt;&#xA;&lt;li&gt;Infill Overlap: 15-20%&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation date: 2026-02-01.&lt;/li&gt;&#xA;&lt;li&gt;Specific to Bambu Studio slicer settings and PLA filament behavior.&lt;/li&gt;&#xA;&lt;li&gt;No specific hardware or software versions mentioned beyond standard PLA and Bambu Studio ironing features.&lt;/li&gt;&#xA;&lt;li&gt;No known changes to filament manufacturing standards or slicer algorithms since this date.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does the specific blue PLA brand have known shrinkage characteristics compared to the green PLA?&lt;/li&gt;&#xA;&lt;li&gt;Are there slicer profiles or G-code modifiers specifically tuned for whistle geometries?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/3d-printing/bambu-studio-layer-gcode/&#34;&gt;Bambu Studio Layer G-code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/163-Troubleshooting Blue PLA 3D Printed Whistles.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Historical DeepSeek conversation (2026-02-01) on 3D printed whistle troubleshooting.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>PowerShell Local PC Scripting Patterns</title>
      <link>https://homelab.nbkelley.com/docs/scripts/powershell-local-scripting/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/scripts/powershell-local-scripting/</guid>
      <description>&lt;h1 id=&#34;powershell-local-pc-scripting-patterns&#34;&gt;PowerShell Local PC Scripting Patterns&lt;a class=&#34;anchor&#34; href=&#34;#powershell-local-pc-scripting-patterns&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A collection of PowerShell scripting patterns for local PC automation tasks, including folder renaming from CSV data, and basic system administration.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;CSV-driven automation&lt;/strong&gt;: Use &lt;code&gt;Import-Csv&lt;/code&gt; with &lt;code&gt;Rename-Item&lt;/code&gt; for bulk folder renaming driven by spreadsheet data.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Path validation&lt;/strong&gt;: Always &lt;code&gt;Test-Path&lt;/code&gt; before operating to avoid errors on missing sources or existing destinations.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Error handling&lt;/strong&gt;: Wrap rename operations in conditional checks; log warnings rather than failing silently.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;folder-renaming-from-csv&#34;&gt;Folder Renaming from CSV&lt;a class=&#34;anchor&#34; href=&#34;#folder-renaming-from-csv&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;CSV format&lt;/strong&gt; (&lt;code&gt;folder_renaming.csv&lt;/code&gt;):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox LXC Storage Mounts</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox-lxc-mounts/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox-lxc-mounts/</guid>
      <description>&lt;h1 id=&#34;proxmox-lxc-storage-mounts&#34;&gt;Proxmox LXC Storage Mounts&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-lxc-storage-mounts&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SMB/CIFS shares can be integrated into Proxmox via CLI or the Web GUI.&lt;/li&gt;&#xA;&lt;li&gt;GUI integration is recommended for Proxmox-native features (backups, ISOs, templates) and automatic retention management.&lt;/li&gt;&#xA;&lt;li&gt;LXC containers can directly mount Proxmox storage paths using &lt;code&gt;mp0&lt;/code&gt;/&lt;code&gt;mp1&lt;/code&gt; directives in the container config file.&lt;/li&gt;&#xA;&lt;li&gt;Separate CIFS storages should be used for media vs. backups to maintain clean separation of concerns.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Storage Content Types&lt;/strong&gt;: For media-only CIFS shares, select &lt;code&gt;Container templates&lt;/code&gt;, &lt;code&gt;ISO images&lt;/code&gt;, or &lt;code&gt;Disk image&lt;/code&gt;. Explicitly avoid &lt;code&gt;Containers&lt;/code&gt; and &lt;code&gt;VZDump backup file&lt;/code&gt; to prevent Proxmox from treating the media share as a system storage.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Subdirectory Configuration&lt;/strong&gt;: Leave the Proxmox storage subdirectory field blank to mount the root of the SMB share, enabling flexible navigation to specific subfolders (e.g., &lt;code&gt;Documents/Movies&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Jellyfin Path Targeting&lt;/strong&gt;: Point Jellyfin directly to the specific media subfolder (e.g., &lt;code&gt;/media/synology/Documents/Movies&lt;/code&gt;) rather than the mount root.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;LXC Config Path&lt;/strong&gt;: &lt;code&gt;/etc/pve/lxc/&amp;lt;CT-ID&amp;gt;.conf&lt;/code&gt; (e.g., &lt;code&gt;/etc/pve/lxc/100.conf&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mount Syntax&lt;/strong&gt;: &lt;code&gt;mp0: /mnt/pve/&amp;lt;Storage-ID&amp;gt;,mp=/media/&amp;lt;mount-name&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Permission Mapping&lt;/strong&gt; (for unprivileged containers):&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;lxc.idmap: u 0 100000 65536&#xA;lxc.idmap: g 0 100000 65536&#xA;lxc.idmap: u 1000 1000 1&#xA;lxc.idmap: g 1000 1000 1&#xA;lxc.idmap: u 1001 101001 64535&#xA;lxc.idmap: g 1001 101001 64535&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Jellyfin Setup&lt;/strong&gt;: Dashboard → Libraries → Add Media Library → Folders: &lt;code&gt;/media/synology/Documents/Movies&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation date: 2025-11-07.&lt;/li&gt;&#xA;&lt;li&gt;Focuses on resolving LXC mount visibility and permission issues for Jellyfin on a Synology NAS.&lt;/li&gt;&#xA;&lt;li&gt;No major infrastructure changes flagged; patterns remain valid for Proxmox 8.x.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;None.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr/&#34;&gt;Servarr - Media Automation Stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/machines/vair%C3%AB/&#34;&gt;TrueNAS (Vairë) - Storage &amp;amp; Backup Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/092-Mount NAS Storage to LXC Containers.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/091-Mount Synology SMB to Proxmox Guide.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/090-Mount SMB Share on Proxmox Guide.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: Mount NAS Storage to LXC Containers (2025-11-07)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources-1&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources-1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/092-Mount NAS Storage to LXC Containers.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/091-Mount Synology SMB to Proxmox Guide.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/090-Mount SMB Share on Proxmox Guide.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Historical DeepSeek conversation: &amp;ldquo;Mount SMB Share on Proxmox Guide&amp;rdquo; (2025-11-07)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages-1&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages-1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-storage/&#34;&gt;Proxmox Storage Management&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-systemd-mounts/&#34;&gt;Proxmox Systemd Mounts&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox NVMe Partition Management</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox-nvme-partitioning/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox-nvme-partitioning/</guid>
      <description>&lt;h1 id=&#34;proxmox-nvme-partition-management&#34;&gt;Proxmox NVMe Partition Management&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-nvme-partition-management&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Advanced manual partitioning strategy for separating OS and VM/Container data on a single NVMe drive.&lt;/li&gt;&#xA;&lt;li&gt;Recommended for test clusters where OS reinstalls are expected without risking data loss on the storage partition.&lt;/li&gt;&#xA;&lt;li&gt;Uses &lt;code&gt;sgdisk&lt;/code&gt; to create distinct partitions that Proxmox treats as independent storage targets.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Partition Layout&lt;/strong&gt;: EFI (1GB), OS (~100GB), Data (remaining ~399GB).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tooling&lt;/strong&gt;: &lt;code&gt;sgdisk&lt;/code&gt; for GPT partitioning, &lt;code&gt;mkfs.ext4&lt;/code&gt;/&lt;code&gt;mkfs.fat&lt;/code&gt; for formatting, manual mounting for data.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Storage Integration&lt;/strong&gt;: Data partition mounted at &lt;code&gt;/mnt/data&lt;/code&gt; and added as a Directory storage in Proxmox.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Target Hardware&lt;/strong&gt;: 3x Laptops with 500GB NVMe drives.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Partition Scheme&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;/dev/nvme0n1p1&lt;/code&gt;: 1GB EFI System Partition (FAT32)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/dev/nvme0n1p2&lt;/code&gt;: ~100GB Proxmox OS (ext4)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/dev/nvme0n1p3&lt;/code&gt;: ~399GB VM/Container Data (ext4)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Post-Install Mount&lt;/strong&gt;: Data partition mounted at &lt;code&gt;/mnt/data&lt;/code&gt; and auto-mounted via &lt;code&gt;/etc/fstab&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;As of 2026-02-28, the user opted for the &amp;ldquo;complex&amp;rdquo; manual partitioning approach over the installer&amp;rsquo;s built-in LVM/ZFS options to ensure OS and data appear as totally separate drives.&lt;/li&gt;&#xA;&lt;li&gt;This method requires dropping to a shell during installation and manually launching &lt;code&gt;proxinstall&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How does this partitioning scheme interact with future ZFS pool expansions if the laptops are clustered?&lt;/li&gt;&#xA;&lt;li&gt;Are there specific &lt;code&gt;sgdisk&lt;/code&gt; flags needed for NVMe drives in UEFI mode?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-storage/&#34;&gt;Proxmox Storage Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs/&#34;&gt;Proxmox ZFS Storage &amp;amp; Installation Patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Proxmox ZFS Storage Setup&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/013-Set Up Proxmox with LVM and ZFS.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: Proxmox OS and Storage Separation Guide (2026-02-28)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Proxmox Storage Management</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox-storage/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox-storage/</guid>
      <description>&lt;h1 id=&#34;proxmox-storage-management&#34;&gt;Proxmox Storage Management&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-storage-management&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;historical-true&#34;&gt;title: Proxmox Storage Management&#xA;version: 1.2&#xA;date: 2026-04-30&#xA;namespace: general&#xA;wiki: homelab&#xA;tags: [proxmox, storage, smb, cifs, zfs, backups]&#xA;changes: Crystallized from historical DeepSeek conversation&#xA;historical: true&lt;a class=&#34;anchor&#34; href=&#34;#historical-true&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h1 id=&#34;proxmox-storage-management-1&#34;&gt;Proxmox Storage Management&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-storage-management-1&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SMB/CIFS shares can be integrated into Proxmox via CLI or the Web GUI.&lt;/li&gt;&#xA;&lt;li&gt;GUI integration is recommended for Proxmox-native features (backups, ISOs, templates) and automatic retention management.&lt;/li&gt;&#xA;&lt;li&gt;Local disk inspection (e.g., &lt;code&gt;sda2&lt;/code&gt;) requires verifying mount status and filesystem type to avoid conflicts with active root partitions.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;cli-mounting-persistent&#34;&gt;CLI Mounting (Persistent)&lt;a class=&#34;anchor&#34; href=&#34;#cli-mounting-persistent&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install utilities: &lt;code&gt;apt update &amp;amp;&amp;amp; apt install cifs-utils&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Create credentials file: &lt;code&gt;/etc/smb-credentials&lt;/code&gt; with &lt;code&gt;chmod 600&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Add to &lt;code&gt;/etc/fstab&lt;/code&gt;:&#xA;&lt;code&gt;//server/share /mnt/smb-share cifs credentials=/etc/smb-credentials,uid=0,gid=0,file_mode=0660,dir_mode=0770,iocharset=utf8 0 0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Test mount: &lt;code&gt;mount -a&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;gui-mounting-proxmox-native&#34;&gt;GUI Mounting (Proxmox Native)&lt;a class=&#34;anchor&#34; href=&#34;#gui-mounting-proxmox-native&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Navigate to &lt;strong&gt;Datacenter&lt;/strong&gt; → &lt;strong&gt;Storage&lt;/strong&gt; → &lt;strong&gt;Add&lt;/strong&gt; → &lt;strong&gt;SMB/CIFS&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Required Fields&lt;/strong&gt;: ID, Server, Share, Username, Password.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Content Types&lt;/strong&gt; (select based on use case):&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ISO images&lt;/li&gt;&#xA;&lt;li&gt;Container templates&lt;/li&gt;&#xA;&lt;li&gt;VZDump backup files&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Advanced Options&lt;/strong&gt;: Max Backups, Prune Backups, SMB Version (e.g., &lt;code&gt;3.0&lt;/code&gt;), Domain.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verification&lt;/strong&gt;: Green checkmark in Storage list indicates active status. Use &amp;ldquo;Test Connection&amp;rdquo; if available.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;local-disk-inspection&#34;&gt;Local Disk Inspection&lt;a class=&#34;anchor&#34; href=&#34;#local-disk-inspection&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Check status: &lt;code&gt;lsblk&lt;/code&gt;, &lt;code&gt;blkid /dev/sda2&lt;/code&gt;, &lt;code&gt;mount | grep sda2&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Mount temporarily: &lt;code&gt;mount /dev/sda2 /mnt/sda2&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Inspect: &lt;code&gt;ls -la /mnt/sda2&lt;/code&gt;, &lt;code&gt;df -h&lt;/code&gt;, &lt;code&gt;du -sh /mnt/sda2/*&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;code&gt;sda2&lt;/code&gt; is typically the root partition on Proxmox hosts; avoid modifying if already mounted at &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Specific purpose of &lt;code&gt;sda2&lt;/code&gt; on Isengard (192.168.1.69)? (Likely root, but verify with &lt;code&gt;lsblk&lt;/code&gt;/&lt;code&gt;blkid&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;SMB share usage for LonelyMountain (192.168.1.137) backups vs ISOs? (GUI method preferred for VZDump retention).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-systemd-mounts/&#34;&gt;Proxmox Systemd Mounts&lt;/a&gt; — systemd mount units for NAS shares&#xA;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-lxc-mounts/&#34;&gt;Proxmox LXC Storage Mounts&lt;/a&gt; — LXC bind mounts and permission mapping&#xA;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs/&#34;&gt;Proxmox ZFS Storage &amp;amp; Installation Patterns&lt;/a&gt;&#xA;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-nvme-partitioning/&#34;&gt;Proxmox NVMe Partition Management&lt;/a&gt;&#xA;&lt;a href=&#34;https://homelab.nbkelley.com/docs/machines/vair%C3%AB/&#34;&gt;TrueNAS (Vairë) - Storage &amp;amp; Backup Server&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox Systemd Mounts</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox-systemd-mounts/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox-systemd-mounts/</guid>
      <description>&lt;h1 id=&#34;proxmox-systemd-mounts&#34;&gt;Proxmox Systemd Mounts&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-systemd-mounts&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SMB/CIFS shares can be integrated into Proxmox via CLI or the Web GUI.&lt;/li&gt;&#xA;&lt;li&gt;GUI integration is recommended for Proxmox-native features (backups, ISOs, templates) and automatic retention management.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;System-level mounts&lt;/strong&gt; (e.g., at &lt;code&gt;/media/synology&lt;/code&gt;) are distinct from Proxmox Storage and are used for general file operations accessible by the host OS.&lt;/li&gt;&#xA;&lt;li&gt;Proxmox automatically mounts SMB shares under &lt;code&gt;/mnt/pve/&amp;lt;storage_id&amp;gt;&lt;/code&gt; when configured via the GUI.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Maintain both a Proxmox Storage entry (for VM disks/backups) and a system-level mount (for general file access).&lt;/li&gt;&#xA;&lt;li&gt;Extract credentials from &lt;code&gt;/etc/pve/storage.cfg&lt;/code&gt; to avoid hardcoding passwords in multiple places.&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;code&gt;pvesm status&lt;/code&gt; to verify existing storage mounts and avoid conflicts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Synology NAS (LonelyMountain)&lt;/strong&gt;: &lt;code&gt;192.168.1.137&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Proxmox Storage&lt;/strong&gt;: Configured via Datacenter &amp;gt; Storage (SMB/CIFS) for VM-related content.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;System Mount&lt;/strong&gt;: Targeted at &lt;code&gt;/media/synology&lt;/code&gt; for general file operations.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;system-level-mount-methods&#34;&gt;System-Level Mount Methods&lt;a class=&#34;anchor&#34; href=&#34;#system-level-mount-methods&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-extract-credentials--create-system-mount&#34;&gt;1. Extract Credentials &amp;amp; Create System Mount&lt;a class=&#34;anchor&#34; href=&#34;#1-extract-credentials--create-system-mount&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Check existing Proxmox storage: &lt;code&gt;pvesm status&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Extract server/share info from &lt;code&gt;/etc/pve/storage.cfg&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Create credentials file:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nano /root/.smbcredentials&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Add: username=your_username, password=your_password&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt; /root/.smbcredentials&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;Add to &lt;code&gt;/etc/fstab&lt;/code&gt;:&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;//192.168.1.137/share_name /media/synology cifs credentials=/root/.smbcredentials,uid=0,gid=0,file_mode=0660,dir_mode=0770,iocharset=utf8 0 0&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;li&gt;Test: &lt;code&gt;mount -a&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;2-systemd-mount-unit-recommended-for-robustness&#34;&gt;2. Systemd Mount Unit (Recommended for robustness)&lt;a class=&#34;anchor&#34; href=&#34;#2-systemd-mount-unit-recommended-for-robustness&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Create &lt;code&gt;/etc/systemd/system/media-synology.mount&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox VM Boot Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox-vm-boot-troubleshooting/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox-vm-boot-troubleshooting/</guid>
      <description>&lt;h1 id=&#34;proxmox-vm-boot-troubleshooting&#34;&gt;Proxmox VM Boot Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-vm-boot-troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ubuntu VMs can hang during the boot process at &lt;code&gt;apparmor.service&lt;/code&gt; (displayed as &amp;ldquo;staring apparmor.service - L:oad appArmor profiles&amp;hellip;&amp;rdquo;).&lt;/li&gt;&#xA;&lt;li&gt;In Proxmox, this specific hang was caused by an iGPU (&amp;hellip;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;coffee-lake-igpu-passthrough-freeze--recovery&#34;&gt;Coffee Lake iGPU Passthrough Freeze &amp;amp; Recovery&lt;a class=&#34;anchor&#34; href=&#34;#coffee-lake-igpu-passthrough-freeze--recovery&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Issue&lt;/strong&gt;: Coffee Lake iGPU passthrough to an Ubuntu VM causes the Proxmox VM to freeze on boot.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Immediate Recovery Steps&lt;/strong&gt; (run from Proxmox host console):&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Stop the frozen VM&lt;/strong&gt;: &lt;code&gt;qm stop &amp;lt;VMID&amp;gt; --force&lt;/code&gt; or &lt;code&gt;kill -9 &amp;lt;PID&amp;gt;&lt;/code&gt; via &lt;code&gt;ps aux | grep qemu&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remove iGPU from VM config&lt;/strong&gt;: Edit &lt;code&gt;/etc/pve/qemu-server/&amp;lt;VMID&amp;gt;.conf&lt;/code&gt; and remove &lt;code&gt;hostpci&lt;/code&gt; lines and GPU-related &lt;code&gt;args:&lt;/code&gt; lines.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reset host iGPU state&lt;/strong&gt;: Edit &lt;code&gt;/etc/modprobe.d/pve-blacklist.conf&lt;/code&gt; and comment out &lt;code&gt;blacklist i915&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reboot host&lt;/strong&gt;: &lt;code&gt;update-initramfs -u -k all &amp;amp;&amp;amp; reboot&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verify host recovery&lt;/strong&gt;: &lt;code&gt;lspci | grep -i vga&lt;/code&gt; and &lt;code&gt;lsmod | grep i915&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Proper Re-configuration Steps&lt;/strong&gt;:&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Enable IOMMU&lt;/strong&gt;: Update &lt;code&gt;/etc/default/grub&lt;/code&gt; with &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet intel_iommu=on iommu=pt&amp;quot;&lt;/code&gt;, then &lt;code&gt;update-grub &amp;amp;&amp;amp; reboot&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verify IOMMU Groups&lt;/strong&gt;: &lt;code&gt;find /sys/kernel/iommu_groups/ -type l&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Add iGPU via UI&lt;/strong&gt;: VM → Hardware → Add PCI Device → Select iGPU → Check &amp;ldquo;All Functions&amp;rdquo; &amp;amp; &amp;ldquo;PCI-Express&amp;rdquo; → &lt;strong&gt;DO NOT&lt;/strong&gt; check &amp;ldquo;Primary GPU&amp;rdquo;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Advanced/Alternative Configuration&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GRUB Parameters&lt;/strong&gt;: &lt;code&gt;quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction nofb nomodeset video=efifb:off&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Host Blacklist&lt;/strong&gt;: &lt;code&gt;echo &amp;quot;blacklist i915&amp;quot; &amp;gt;&amp;gt; /etc/modprobe.d/pve-blacklist.conf&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VM Config (&lt;code&gt;args&lt;/code&gt;)&lt;/strong&gt;:&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;args: -device vfio-pci,host=00:02.0,addr=0x18,x-igd-gms=1,driver=vfio-pci&#xA;args: -device vfio-pci,host=00:02.1,addr=0x18.1,driver=vfio-pci&#xA;args: -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off&#xA;args: -set device.vga.ramfb=off&#xA;args: -set device.vga.driver=vfio-pci&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VM Hardware Requirements&lt;/strong&gt;: Machine &lt;code&gt;q35&lt;/code&gt;, BIOS &lt;code&gt;OVMF (UEFI)&lt;/code&gt;, Display &lt;code&gt;Default&lt;/code&gt; (not SPICE).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ubuntu VM Guest&lt;/strong&gt;: Install Intel graphics drivers, add &lt;code&gt;i915.enable_guc=2&lt;/code&gt; to kernel parameters, ensure early KMS start.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/103-Troubleshooting Coffee Lake iGPU Passthrough on Proxmox.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/101-Troubleshooting Slow Ubuntu VM Boot.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Proxy Management &amp; Cloudflare Tunnels</title>
      <link>https://homelab.nbkelley.com/docs/networking/proxy-management/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/proxy-management/</guid>
      <description>&lt;h1 id=&#34;proxy-management--cloudflare-tunnels&#34;&gt;Proxy Management &amp;amp; Cloudflare Tunnels&lt;a class=&#34;anchor&#34; href=&#34;#proxy-management--cloudflare-tunnels&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;There are multiple layers of proxying available in the homelab, ranging from edge protection (Cloudflare) to local routing (OPNsense/Nginx Proxy Manager).&lt;/p&gt;&#xA;&lt;h2 id=&#34;nginx-proxy-manager-npm-troubleshooting&#34;&gt;Nginx Proxy Manager (NPM) Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#nginx-proxy-manager-npm-troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Redirect Loops &amp;amp; Timeouts&lt;/strong&gt;: Often caused by misconfigured upstream servers or aggressive timeout settings in NPM&amp;rsquo;s web UI. Resolving a redirect loop may expose underlying connectivity issues that manifest as timeouts.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Compose Pattern&lt;/strong&gt;: NPM is deployed with &lt;code&gt;network_mode: host&lt;/code&gt; to bind directly to host ports (80, 443, 81), bypassing Docker&amp;rsquo;s NAT for direct host network access.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verification Steps&lt;/strong&gt;:&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Check container health: &lt;code&gt;docker ps | grep nginx-proxy-manager&lt;/code&gt; (ensure &lt;code&gt;healthy&lt;/code&gt; status).&lt;/li&gt;&#xA;&lt;li&gt;Verify port bindings: &lt;code&gt;sudo netstat -tulpn | grep :80&lt;/code&gt; / &lt;code&gt;:443&lt;/code&gt; (requires &lt;code&gt;net-tools&lt;/code&gt; package).&lt;/li&gt;&#xA;&lt;li&gt;Inspect NPM Web UI: Access at &lt;code&gt;http://&amp;lt;host-ip&amp;gt;:81&lt;/code&gt; to review Proxy Host settings, specifically timeout values and upstream server addresses.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Port Conflicts&lt;/strong&gt;: Use &lt;code&gt;netstat&lt;/code&gt; to identify which container owns a specific port (e.g., &lt;code&gt;docker-proxy&lt;/code&gt; vs &lt;code&gt;nginx: master&lt;/code&gt;). In this setup, port 8000 was observed bound to &lt;code&gt;docker-proxy&lt;/code&gt;, indicating another service in the compose stack.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Co-located Services&lt;/strong&gt;: The same Docker Compose stack hosts &lt;code&gt;cloudflare-ddns&lt;/code&gt; (for dynamic IP updates) and &lt;code&gt;netbird&lt;/code&gt; (for mesh networking), requiring careful port management to avoid conflicts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use &lt;code&gt;network_mode: host&lt;/code&gt; for NPM to simplify port mapping and ensure direct access to host network interfaces.&lt;/li&gt;&#xA;&lt;li&gt;Rely on &lt;code&gt;net-tools&lt;/code&gt; (&lt;code&gt;netstat&lt;/code&gt;) for quick port binding verification in host-networked Docker containers.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Host&lt;/strong&gt;: &lt;code&gt;iluvatar@proxy&lt;/code&gt; (192.168.1.208)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;NPM Web UI&lt;/strong&gt;: &lt;code&gt;http://192.168.1.208:81&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ports&lt;/strong&gt;: 80 (HTTP), 443 (HTTPS), 81 (NPM Admin UI)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Troubleshooting session from 2025-11-17 resolved a redirect loop that subsequently turned into a timeout issue.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;net-tools&lt;/code&gt; installation was required to diagnose port bindings on the host.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Specific timeout values configured in NPM for upstream services.&lt;/li&gt;&#xA;&lt;li&gt;Whether &lt;code&gt;netbird&lt;/code&gt; or &lt;code&gt;cloudflare-ddns&lt;/code&gt; requires dedicated port exposure or can share the host network.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/security/cloudflare_integration/&#34;&gt;Cloudflare Integration: SSL &amp;amp; DNS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/opnsense_dmz_iot_firewall/&#34;&gt;OPNsense DMZ Firewall Rules for IoT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Docker Host Configuration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/uptime-kuma/&#34;&gt;Uptime Kuma - Configuration &amp;amp; Integrations&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self-Hosted CMS Options &amp; Landscape</title>
      <link>https://homelab.nbkelley.com/docs/services/cms-options/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/cms-options/</guid>
      <description>&lt;h1 id=&#34;self-hosted-cms-options--landscape&#34;&gt;Self-Hosted CMS Options &amp;amp; Landscape&lt;a class=&#34;anchor&#34; href=&#34;#self-hosted-cms-options--landscape&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User seeks a self-hosted CMS for an Ubuntu VM, explicitly rejecting WordPress due to business practices.&lt;/li&gt;&#xA;&lt;li&gt;Preference for tools respected by the web development and self-hosting communities.&lt;/li&gt;&#xA;&lt;li&gt;Exploration of CMS categories: Monolithic, Flat-file, Static Site Generators (SSG), Headless CMS, and Custom.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Rejected WordPress&lt;/strong&gt;: Cited business practices as a dealbreaker.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Favoring Developer-Respected Alternatives&lt;/strong&gt;: Leaned towards headless or modern flat-file CMS options.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Top Contenders Identified&lt;/strong&gt;: Directus (Headless), Strapi (Headless), Kirby (Flat-file), Payload CMS (Headless/TS), Ghost (Blogging).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;cms-landscape--options&#34;&gt;CMS Landscape &amp;amp; Options&lt;a class=&#34;anchor&#34; href=&#34;#cms-landscape--options&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;monolithic-cms&#34;&gt;Monolithic CMS&lt;a class=&#34;anchor&#34; href=&#34;#monolithic-cms&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt;: Dominant (60% market), huge ecosystem, but rejected by user.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Drupal&lt;/strong&gt;: Flexible, steep learning curve.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Joomla&lt;/strong&gt;: Balanced ease/power, smaller community.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;flat-file-cms-no-database&#34;&gt;Flat-file CMS (No Database)&lt;a class=&#34;anchor&#34; href=&#34;#flat-file-cms-no-database&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Grav&lt;/strong&gt;: Fast, simple, file-based.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Kirby&lt;/strong&gt;: Beautiful UI, file-based, commercial license (~$129), highly respected by designers/devs.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;static-site-generators-ssg&#34;&gt;Static Site Generators (SSG)&lt;a class=&#34;anchor&#34; href=&#34;#static-site-generators-ssg&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Jekyll&lt;/strong&gt;: GitHub Pages compatible.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hugo&lt;/strong&gt;: Blazing fast, Go-based.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Eleventy&lt;/strong&gt;: Flexible, JS-based.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;: React-based, hybrid.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;headless-cms-api-driven&#34;&gt;Headless CMS (API-Driven)&lt;a class=&#34;anchor&#34; href=&#34;#headless-cms-api-driven&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Directus&lt;/strong&gt;: Community favorite. Node.js/Vue.js. Provides REST/GraphQL APIs, beautiful admin UI. Excellent for full frontend control.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Strapi&lt;/strong&gt;: Most popular headless. Node.js/React. Strong plugin ecosystem.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Payload CMS&lt;/strong&gt;: Rising star. TypeScript-first, excellent DX.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ghost&lt;/strong&gt;: Primarily for blogging/publishing. Markdown-native.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Contentful/Sanity&lt;/strong&gt;: Enterprise/Developer friendly, but often cloud-hosted (though self-hostable options exist).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;custom--build-your-own&#34;&gt;Custom / Build-Your-Own&lt;a class=&#34;anchor&#34; href=&#34;#custom--build-your-own&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;The Guardian&amp;rsquo;s &amp;ldquo;Composer&amp;rdquo;&lt;/strong&gt;: Fully custom-built in Scala/Play Framework. Not recommended for small projects.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Server-Side&lt;/strong&gt;: PHP includes, Python (Django/Flask), Node.js (Express).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;recommended-stack-for-ubuntu&#34;&gt;Recommended Stack for Ubuntu&lt;a class=&#34;anchor&#34; href=&#34;#recommended-stack-for-ubuntu&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;For Maximum Control &amp;amp; Flexibility&lt;/strong&gt;: Directus or Payload CMS.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;For Content-Focused Sites&lt;/strong&gt;: Kirby or Statamic.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;For API-Driven Projects&lt;/strong&gt;: Strapi.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Quick Start (Directus on Ubuntu)&lt;/strong&gt;:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm create directus-project@latest my-cms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd my-cms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npx directus start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation date: 2025-11-17.&lt;/li&gt;&#xA;&lt;li&gt;User explicitly stated a preference against WordPress due to business practices.&lt;/li&gt;&#xA;&lt;li&gt;Focus remains on self-hosted, developer-respected tools.&lt;/li&gt;&#xA;&lt;li&gt;Note: Directus and Strapi have evolved significantly since late 2025; verify current self-hosting requirements, licensing, and Docker compatibility for homelab deployment.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;hugo-specific-configuration&#34;&gt;Hugo-Specific Configuration&lt;a class=&#34;anchor&#34; href=&#34;#hugo-specific-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;project-structure&#34;&gt;Project Structure&lt;a class=&#34;anchor&#34; href=&#34;#project-structure&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;myblog/&#xA;├── config.toml   -- Main configuration (baseURL, languageCode, title, theme)&#xA;├── content/      -- Blog posts in Markdown&#xA;├── themes/       -- Installed themes (git submodules)&#xA;├── static/       -- Static assets (images, JS, CSS)&#xA;└── public/       -- Generated static files (deployed to Nginx)&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;key-configtoml-settings&#34;&gt;Key config.toml Settings&lt;a class=&#34;anchor&#34; href=&#34;#key-configtoml-settings&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;baseURL&lt;/code&gt; — Domain URL (e.g., &lt;code&gt;https://blog.nbkelley.com&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;theme&lt;/code&gt; — Must match theme folder name in &lt;code&gt;themes/&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;buildDrafts&lt;/code&gt; — &lt;code&gt;true&lt;/code&gt; during development, &lt;code&gt;false&lt;/code&gt; for production&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;paginate&lt;/code&gt; — Posts per page&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;creating-posts&#34;&gt;Creating Posts&lt;a class=&#34;anchor&#34; href=&#34;#creating-posts&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new posts/my-post.md  &lt;span style=&#34;color:#75715e&#34;&gt;# Draft in content/posts/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo -D                     &lt;span style=&#34;color:#75715e&#34;&gt;# Build including drafts&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo                        &lt;span style=&#34;color:#75715e&#34;&gt;# Production build to public/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;deployment-options&#34;&gt;Deployment Options&lt;a class=&#34;anchor&#34; href=&#34;#deployment-options&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Manual rsync&lt;/strong&gt;: &lt;code&gt;rsync -avz --delete public/ user@server:/var/www/html/blog&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Git webhook&lt;/strong&gt;: Server-side script that &lt;code&gt;git pull &amp;amp;&amp;amp; hugo &amp;amp;&amp;amp; cp -r public /var/www/html/blog&lt;/code&gt; on push&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cloudflare Pages&lt;/strong&gt;: Push Hugo source to GitHub, Cloudflare builds and deploys automatically&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;comments-for-static-sites&#34;&gt;Comments for Static Sites&lt;a class=&#34;anchor&#34; href=&#34;#comments-for-static-sites&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Utterances&lt;/strong&gt; — GitHub issues-based, no backend&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Disqus&lt;/strong&gt; — Traditional, JS-based&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hyvor Talk&lt;/strong&gt; — Self-hostable alternative&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/hugo-cloudflare-pages/&#34;&gt;Hugo Deployment to Cloudflare Pages - Troubleshooting&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/&#34;&gt;Hugo Git Submodule Extraction Pattern&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/web-server-stack/&#34;&gt;Web Server Stack (Nginx + Apache)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/106-Beginner Guide to Building Websites with Ubuntu.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/036-Setting Up Self-Hosted Blogs with Nginx.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: &amp;ldquo;Self-Hosted Websites on Ubuntu Server&amp;rdquo; (historical)&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: &amp;ldquo;Setting Up Self-Hosted Blogs with Nginx&amp;rdquo; (chat 036)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Servarr - Media Automation Stack</title>
      <link>https://homelab.nbkelley.com/docs/services/servarr/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/servarr/</guid>
      <description>&lt;h1 id=&#34;servarr---media-automation-stack&#34;&gt;Servarr - Media Automation Stack&lt;a class=&#34;anchor&#34; href=&#34;#servarr---media-automation-stack&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;anchor&#34; href=&#34;#overview&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Servarr is a full VM at &lt;code&gt;192.168.1.112&lt;/code&gt; (hostname: &lt;code&gt;servarr&lt;/code&gt;) running a Docker Compose media automation stack. All services depend on a NAS mount at &lt;code&gt;/data&lt;/code&gt; for media storage. Download clients (qbittorrent, nzbget) and indexer (prowlarr) route through a Gluetun VPN container via &lt;code&gt;network_mode: service:gluetun&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This VM is distinct from &lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/varda-server/&#34;&gt;Varda&lt;/a&gt; (&lt;code&gt;192.168.1.131&lt;/code&gt;), which is a separate web server hosting &lt;code&gt;ilmare.nbkelley.com&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;vm-specs&#34;&gt;VM Specs&lt;a class=&#34;anchor&#34; href=&#34;#vm-specs&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Hostname&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;servarr&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;IP&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;192.168.1.112&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;OS&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Ubuntu 24.04.4 LTS (Noble)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Kernel&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;6.8.0-107-generic&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;QEMU Virtual CPU, 4 vCPUs&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;7.8 GB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Disk&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;63 GB root (&lt;code&gt;/dev/sda2&lt;/code&gt; ext4, 38% used)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Hypervisor&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Proxmox (Minas Tirith)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;container-inventory&#34;&gt;Container Inventory&lt;a class=&#34;anchor&#34; href=&#34;#container-inventory&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;servarr-stack-dockerservarrcomposeyaml&#34;&gt;Servarr Stack (&lt;code&gt;/docker/servarr/compose.yaml&lt;/code&gt;)&lt;a class=&#34;anchor&#34; href=&#34;#servarr-stack-dockerservarrcomposeyaml&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Network: &lt;code&gt;servarrnetwork&lt;/code&gt; (&lt;code&gt;172.39.0.0/24&lt;/code&gt;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Servarr Docker Compose Reference</title>
      <link>https://homelab.nbkelley.com/docs/services/servarr-compose/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/servarr-compose/</guid>
      <description>&lt;h1 id=&#34;servarr-docker-compose-reference&#34;&gt;Servarr Docker Compose Reference&lt;a class=&#34;anchor&#34; href=&#34;#servarr-docker-compose-reference&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Canonical copy of &lt;code&gt;/docker/servarr/compose.yaml&lt;/code&gt; on the &lt;code&gt;servarr&lt;/code&gt; VM (&lt;code&gt;192.168.1.112&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;composeyaml&#34;&gt;compose.yaml&lt;a class=&#34;anchor&#34; href=&#34;#composeyaml&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Compose file for the *arr stack. Configuration files are stored in the&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# directory you launch the compose file on. Change to bind mounts if needed.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# All containers are ran with user and group ids of the main user and&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# group to aviod permissions issues of downloaded files, please refer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# the read me file for more information.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#############################################################################&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# NOTICE: We recently switched to using a .env file. PLEASE refer to the docs.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# https://github.com/TechHutTV/homelab/tree/main/media#docker-compose-and-env&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#############################################################################&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;servarrnetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;servarrnetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ipam&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;config&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;subnet&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;172.39.0.0&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/24&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# airvpn recommended (referral url: https://airvpn.org/?referred_by=673908)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;gluetun&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;qmcgaw/gluetun&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;gluetun&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;cap_add&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;NET_ADMIN&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;devices&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/dev/net/tun:/dev/net/tun&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# If running on an LXC see readme for more info.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;servarrnetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;ipv4_address&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;172.39.0.2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;${FIREWALL_VPN_INPUT_PORTS}:${FIREWALL_VPN_INPUT_PORTS}&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# airvpn forwarded port, pulled from .env&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;8080&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8080&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# qbittorrent web interface&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;6881&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;6881&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# qbittorrent torrent port&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;6789&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;6789&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# nzbget&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;9696&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;9696&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# prowlarr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./gluetun:/gluetun&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Make a &amp;#39;.env&amp;#39; file in the same directory.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;env_file&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;.env&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;healthcheck&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;test&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ping -c 1 www.google.com || exit 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;interval&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;20s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;timeout&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;retries&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;qbittorrent&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/qbittorrent:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;qbittorrent&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;labels&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;deunhealth.restart.on.unhealthy=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;WEBUI_PORT=8080&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# must match &amp;#34;qbittorrent web interface&amp;#34; port number in gluetun&amp;#39;s service above&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TORRENTING_PORT=${FIREWALL_VPN_INPUT_PORTS}&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# airvpn forwarded port, pulled from .env&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./qbittorrent:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;gluetun&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;condition&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;service_healthy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;network_mode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;service:gluetun&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;healthcheck&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;test&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ping -c 1 www.google.com || exit 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;interval&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;retries&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;start_period&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;20s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;timeout&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# See the &amp;#39;qBittorrent Stalls with VPN Timeout&amp;#39; section for more information.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;deunhealth&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;qmcgaw/deunhealth&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;deunhealth&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;network_mode&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;LOG_LEVEL=info&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;HEALTH_SERVER_ADDRESS=127.0.0.1:9999&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;nzbget&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/nzbget:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;nzbget&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./nzbget:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;gluetun&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;condition&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;service_healthy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;network_mode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;service:gluetun&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;prowlarr&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/prowlarr:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;prowlarr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./prowlarr:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;gluetun&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;condition&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;service_healthy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;network_mode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;service:gluetun&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;sonarr&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/sonarr:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;sonarr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./sonarr:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;8989&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8989&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;servarrnetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;ipv4_address&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;172.39.0.3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;radarr&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/radarr:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;radarr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./radarr:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;7878&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;7878&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;servarrnetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;ipv4_address&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;172.39.0.4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;lidarr&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lidarr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/lidarr:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./lidarr:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;8686&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8686&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;servarrnetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;ipv4_address&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;172.39.0.5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;bazarr&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;lscr.io/linuxserver/bazarr:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bazarr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./bazarr:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data:/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;6767&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;6767&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;servarrnetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;ipv4_address&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;172.39.0.6&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Newer additions to this stack feel. Remove the &amp;#39;#&amp;#39; to add the service.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ytdl-sub&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ghcr.io/jmbannon/ytdl-sub-gui:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ytdl-sub&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DOCKER_MODS=linuxserver/mods:universal-cron&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./ytdl-sub:/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/data/youtube:/youtube&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;servarrnetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;ipv4_address&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;172.39.0.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#  jellyseerr:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    container_name: jellyseerr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    image: fallenbagel/jellyseerr:latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    environment:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      - PUID=${PUID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      - PGID=${PGID}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      - TZ=${TZ}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    volumes:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      - ./jellyseerr:/app/config&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    ports:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      - 5055:5055&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    networks:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      servarrnetwork:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#        ipv4_address: 172.39.0.9&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    restart: unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;network-architecture&#34;&gt;Network Architecture&lt;a class=&#34;anchor&#34; href=&#34;#network-architecture&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;172.39.0.0/24 (servarrnetwork)&#xA;├── 172.39.0.2  gluetun (VPN gateway)&#xA;│   ├── qbittorrent  (network_mode: service:gluetun)&#xA;│   ├── nzbget       (network_mode: service:gluetun)&#xA;│   └── prowlarr     (network_mode: service:gluetun)&#xA;├── 172.39.0.3  sonarr&#xA;├── 172.39.0.4  radarr&#xA;├── 172.39.0.5  lidarr&#xA;├── 172.39.0.6  bazarr&#xA;└── 172.39.0.8  ytdl-sub&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;key-patterns&#34;&gt;Key Patterns&lt;a class=&#34;anchor&#34; href=&#34;#key-patterns&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN routing&lt;/strong&gt;: qbittorrent, nzbget, and prowlarr use &lt;code&gt;network_mode: service:gluetun&lt;/code&gt; to route all traffic through the VPN. They are NOT directly on servarrnetwork.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Static IPs&lt;/strong&gt;: Media managers (sonarr, radarr, lidarr, bazarr) use static IPs on servarrnetwork for predictable inter-container communication.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;.env file&lt;/strong&gt;: Secrets (PUID, PGID, TZ, FIREWALL_VPN_INPUT_PORTS, VPN credentials) are stored in &lt;code&gt;.env&lt;/code&gt; in the same directory.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;deunhealth&lt;/strong&gt;: Monitors container health via Docker socket and restarts unhealthy containers with the &lt;code&gt;deunhealth.restart.on.unhealthy=true&lt;/code&gt; label.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Config persistence&lt;/strong&gt;: Each service&amp;rsquo;s config is stored in a subdirectory of &lt;code&gt;/docker/servarr/&lt;/code&gt; (e.g., &lt;code&gt;./sonarr&lt;/code&gt;, &lt;code&gt;./radarr&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Media storage&lt;/strong&gt;: All containers bind-mount &lt;code&gt;/data&lt;/code&gt; (SMB share from NAS at &lt;code&gt;192.168.1.137&lt;/code&gt;) for media access.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;jellyseerr&lt;/strong&gt;: Commented out here — deployed in &lt;code&gt;/docker/jellyfin/compose.yaml&lt;/code&gt; instead.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr/&#34;&gt;Servarr - Media Automation Stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/jellyfin-compose/&#34;&gt;Jellyfin Docker Compose Reference&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/gluetun-vpn/&#34;&gt;Gluetun VPN Service&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr-vpn-troubleshooting/&#34;&gt;Servarr Stack - Gluetun VPN Troubleshooting&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Servarr Stack - Gluetun VPN Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/services/servarr-vpn-troubleshooting/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/servarr-vpn-troubleshooting/</guid>
      <description>&lt;h1 id=&#34;servarr-stack---gluetun-vpn-troubleshooting&#34;&gt;Servarr Stack - Gluetun VPN Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#servarr-stack---gluetun-vpn-troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Historical note:&lt;/strong&gt; This session was conducted on a machine at &lt;code&gt;192.168.1.30&lt;/code&gt; (hostname possibly &amp;ldquo;Varda&amp;rdquo; at the time, directory &lt;code&gt;~/home/nbkelley/docker/servarr&lt;/code&gt;). The current production Servarr stack lives on the &lt;code&gt;servarr&lt;/code&gt; VM at &lt;code&gt;192.168.1.112&lt;/code&gt;, directory &lt;code&gt;/docker/servarr/&lt;/code&gt;. See &lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr/&#34;&gt;Servarr - Media Automation Stack&lt;/a&gt; for current configuration. The troubleshooting patterns documented here remain applicable.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This session documents the deployment and troubleshooting of the Servarr media automation stack (Sonarr, Prowlarr, qBittorrent) behind a Gluetun VPN container. The stack relies on &lt;code&gt;network_mode: service:gluetun&lt;/code&gt; to route all container traffic through AirVPN.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH Host Key Management &amp; Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/ssh_host_key_management/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/ssh_host_key_management/</guid>
      <description>&lt;h1 id=&#34;ssh-host-key-management--troubleshooting&#34;&gt;SSH Host Key Management &amp;amp; Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#ssh-host-key-management--troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Standard procedures for resolving SSH &lt;code&gt;REMOTE HOST IDENTIFICATION HAS CHANGED&lt;/code&gt; warnings, which occur when a host&amp;rsquo;s SSH fingerprint differs from the locally stored &lt;code&gt;known_hosts&lt;/code&gt; entry. This typically happens after a server reinstall, OS upgrade, or SSH key regeneration.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions--commands&#34;&gt;Key Decisions &amp;amp; Commands&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions--commands&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verify Legitimacy&lt;/strong&gt;: Always confirm with a system administrator or check server logs if a key change is unexpected, as it could indicate a man-in-the-middle attack.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remove Stale Keys&lt;/strong&gt;: Use &lt;code&gt;ssh-keygen -R &amp;lt;hostname&amp;gt;&lt;/code&gt; to safely remove the outdated entry from &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Targeted Removal&lt;/strong&gt;: If the error specifies a line number (e.g., line 9), you can remove it via &lt;code&gt;sed -i &#39;&#39; &#39;9d&#39; ~/.ssh/known_hosts&lt;/code&gt; or manually edit the file.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pre-populate Keys&lt;/strong&gt;: In managed environments, use &lt;code&gt;ssh-keyscan &amp;lt;host&amp;gt; &amp;gt;&amp;gt; ~/.ssh/known_hosts&lt;/code&gt; to automate key acceptance.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Security Best Practice&lt;/strong&gt;: Prefer certificate-based authentication in sensitive environments to bypass host key checking entirely.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Host Encountered&lt;/strong&gt;: &lt;code&gt;proxy&lt;/code&gt; (192.168.1.222, Nginx Proxy Manager)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Context&lt;/strong&gt;: Commands executed from macOS (&lt;code&gt;NK---Galadriel&lt;/code&gt;) as user &lt;code&gt;natekelley&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Fingerprint Example&lt;/strong&gt;: &lt;code&gt;SHA256:k5j8V356rpQXapznIs12MeBEWHfZYwfeicXdNNWFyOI&lt;/code&gt; (ED25519)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Initial troubleshooting documented on 2025-11-17. The &lt;code&gt;proxy&lt;/code&gt; host likely had its underlying VM/container rebuilt or its SSH configuration reset, triggering the warning.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Should SSH host keys be version-controlled or managed via a configuration management tool (e.g., Ansible) to prevent future mismatches?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/proxy-management/&#34;&gt;Proxy Management &amp;amp; Cloudflare Tunnels&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network_troubleshooting/&#34;&gt;Troubleshooting Network Interface Changes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/111-Check and Install Git, Go, Dart Sass on Ubuntu.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/104-SSH Host Key Change Warning and Fix.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Historical DeepSeek conversation: SSH Host Key Change Warning and Fix (2025-11-17)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Uptime Kuma - Configuration &amp; Integrations</title>
      <link>https://homelab.nbkelley.com/docs/services/uptime-kuma/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/uptime-kuma/</guid>
      <description>&lt;h1 id=&#34;uptime-kuma---configuration--integrations&#34;&gt;Uptime Kuma - Configuration &amp;amp; Integrations&lt;a class=&#34;anchor&#34; href=&#34;#uptime-kuma---configuration--integrations&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Aruba Instant On Switch Monitoring&lt;/strong&gt;: Confirmed that Aruba Instant On switches (specifically 1930 and 1960 series) support SNMP monitoring when configured via their local web interface, despite being primarily cloud-managed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Microsoft Teams Webhook Integration&lt;/strong&gt;: Established the correct method for routing Uptime Kuma alerts to Microsoft Teams using Power Automate Workflows, noting the deprecation of legacy &lt;code&gt;webhook.office.com&lt;/code&gt; connectors.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;SNMP over Ping&lt;/strong&gt;: While basic ping monitoring is viable for switch reachability, SNMP is preferred for detailed port status and traffic metrics on supported Aruba models.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Power Automate for Teams Alerts&lt;/strong&gt;: Migrated away from deprecated Office 365 Connectors (&lt;code&gt;webhook.office.com&lt;/code&gt;) to Power Automate Workflows to ensure long-term compatibility with Uptime Kuma webhooks.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;aruba-instant-on-switches-19301960-series&#34;&gt;Aruba Instant On Switches (1930/1960 Series)&lt;a class=&#34;anchor&#34; href=&#34;#aruba-instant-on-switches-19301960-series&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network Setup&lt;/strong&gt;: Assign a static IP address to the switch via the Aruba Instant On cloud portal or local interface.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SNMP Enablement&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Access the switch&amp;rsquo;s local web interface.&lt;/li&gt;&#xA;&lt;li&gt;Navigate to SNMP settings (typically under &amp;ldquo;Switching&amp;rdquo; or &amp;ldquo;Management&amp;rdquo;).&lt;/li&gt;&#xA;&lt;li&gt;Enable the SNMP agent.&lt;/li&gt;&#xA;&lt;li&gt;Configure &lt;strong&gt;SNMPv2c&lt;/strong&gt; (read-only community string) or &lt;strong&gt;SNMPv3&lt;/strong&gt; (username/password with optional encryption). Restrict access by IP for security.&lt;/li&gt;&#xA;&lt;li&gt;Reboot the switch if required for settings to apply.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Uptime Kuma Monitor&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Add a new monitor of type &lt;strong&gt;SNMP&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Input the switch&amp;rsquo;s static IP, selected SNMP version, and credentials.&lt;/li&gt;&#xA;&lt;li&gt;Customize OIDs if monitoring specific interface traffic or port status beyond system uptime.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;microsoft-teams-webhook-notifications&#34;&gt;Microsoft Teams Webhook Notifications&lt;a class=&#34;anchor&#34; href=&#34;#microsoft-teams-webhook-notifications&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Notification Type&lt;/strong&gt;: &lt;code&gt;Webhook&lt;/code&gt; (Generic Webhook).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Post URL&lt;/strong&gt;: Power Automate Workflow endpoint URL (e.g., &lt;code&gt;https://prod-05.westus.logic.azure.com/...&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Content Type&lt;/strong&gt;: &lt;code&gt;application/json&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Testing&lt;/strong&gt;: Use the &amp;ldquo;Test&amp;rdquo; button in Uptime Kuma notification settings to verify connectivity. A &lt;code&gt;400&lt;/code&gt; error typically indicates a malformed payload or deprecated connector URL.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Legacy Connector Deprecation&lt;/em&gt;: Microsoft retired the old &amp;ldquo;Office 365 Connectors&amp;rdquo; on October 1, 2024. Any Uptime Kuma setups using &lt;code&gt;webhook.office.com&lt;/code&gt; URLs will fail and require migration to Power Automate.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;SNMP Availability&lt;/em&gt;: Early guidance incorrectly stated Aruba Instant On switches lack SNMP support. It was later confirmed that local management interfaces on 1930/1960 models fully support SNMPv2c/v3.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Are there specific OIDs recommended for Aruba Instant On 1930/1960 switches to monitor port-level errors or traffic thresholds?&lt;/li&gt;&#xA;&lt;li&gt;Has the Uptime Kuma version been verified against known bugs with Power Automate JSON payloads?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/homelab-dashboard/&#34;&gt;Homelab Dashboard&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network/&#34;&gt;Network Infrastructure &amp;amp; VLANs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Poe Switch Alerts&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/unifi-express-vpn/&#34;&gt;UniFi Express VPN &amp;amp; Network Management&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Varda Server (Ubuntu)</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/varda-server/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/varda-server/</guid>
      <description>&lt;h1 id=&#34;varda-server-ubuntu&#34;&gt;Varda Server (Ubuntu)&lt;a class=&#34;anchor&#34; href=&#34;#varda-server-ubuntu&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;anchor&#34; href=&#34;#overview&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Varda is an Ubuntu Server VM at &lt;code&gt;192.168.1.131&lt;/code&gt; used for web hosting and development. It serves as the primary host for the &lt;code&gt;ilmare.nbkelley.com&lt;/code&gt; website.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Varda is a different VM from &lt;code&gt;servarr&lt;/code&gt; (&lt;code&gt;192.168.1.112&lt;/code&gt;), which runs the media automation stack. These were previously conflated in some wiki pages.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-details&#34;&gt;Key Details&lt;a class=&#34;anchor&#34; href=&#34;#key-details&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hypervisor&lt;/strong&gt;: Proxmox (Minas Tirith)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Management&lt;/strong&gt;: Cockpit GUI (Port 9090)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Web Server&lt;/strong&gt;: Nginx for static content&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Firewall&lt;/strong&gt;: UFW enabled (ports 22, 80, 443)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Development&lt;/strong&gt;: VS Code Remote-SSH&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;nginx-site-structure&#34;&gt;Nginx Site Structure&lt;a class=&#34;anchor&#34; href=&#34;#nginx-site-structure&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/var/www/ilmare.nbkelley.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── Assets/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── Images/  (Case-sensitive: capital I)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── html/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── index.html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── Scripts/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── scripts.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── Styles/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── styles.css&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;nginx-server-block&#34;&gt;Nginx Server Block&lt;a class=&#34;anchor&#34; href=&#34;#nginx-server-block&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;/etc/nginx/sites-available/ilmare.nbkelley.com&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>OPNsense DMZ Firewall Rules for IoT</title>
      <link>https://homelab.nbkelley.com/docs/networking/opnsense_dmz_iot_firewall/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/opnsense_dmz_iot_firewall/</guid>
      <description>&lt;h1 id=&#34;opnsense-dmz-firewall-rules-for-iot&#34;&gt;OPNsense DMZ Firewall Rules for IoT&lt;a class=&#34;anchor&#34; href=&#34;#opnsense-dmz-firewall-rules-for-iot&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A structured firewall rule set for isolating IoT devices in a DMZ zone. The rules enforce a &amp;ldquo;high-to-low trust&amp;rdquo; flow, ensuring IoT devices can reach the internet for cloud services while preventing them from initiating connections to the trusted LAN. This pattern is critical for preventing lateral movement from compromised IoT devices.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Explicit Allow / Implicit Deny&lt;/strong&gt;: Only allow necessary outbound traffic (HTTP/HTTPS, DNS, NTP) from DMZ to WAN.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Strict Containment&lt;/strong&gt;: Explicitly block all DMZ-initiated traffic to the LAN zone.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Controlled LAN Access&lt;/strong&gt;: Default deny for LAN-to-DMZ, with specific allow rules only for administration or required services.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;WAN Isolation&lt;/strong&gt;: Block all unsolicited inbound traffic from WAN to DMZ.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;Note: The homelab currently uses VLANs (Gandalf 192.168.1.x, Mithrandir 192.168.2.x, Tharkûn 192.168.3.x, Rivendell 192.168.4.x) managed by a UniFi Express gateway (&amp;ldquo;Olorín&amp;rdquo;, 192.168.1.1). These OPNsense zone-based rules should be adapted to the homelab&amp;rsquo;s VLAN structure or applied to a dedicated IoT VLAN (e.g., 192.168.50.x).&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>PowerShell Local PC Scripting Patterns</title>
      <link>https://homelab.nbkelley.com/docs/scripts/powershell-local-pc-troubleshooting/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/scripts/powershell-local-pc-troubleshooting/</guid>
      <description>&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Standardized PowerShell commands for local file operations and MSI package management.&lt;/li&gt;&#xA;&lt;li&gt;A streamlined, linear pattern for automating software installation, execution, and uninstallation on local Windows hosts without over-engineering modular functions.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prefer &lt;code&gt;Get-ChildItem&lt;/code&gt; with wildcards (&lt;code&gt;C:\Users\*\Downloads\*.msi&lt;/code&gt;) for rapid file discovery over manual profile loops.&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;code&gt;Start-Process&lt;/code&gt; with &lt;code&gt;msiexec.exe&lt;/code&gt; for silent MSI installs (&lt;code&gt;/qn&lt;/code&gt;) to keep scripts concise for linear workflows.&lt;/li&gt;&#xA;&lt;li&gt;Simplified error handling and removed verbose logging for basic administrative tasks, reserving complex wrappers for larger automation frameworks.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration--patterns&#34;&gt;Current Configuration / Patterns&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration--patterns&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;file-listing--discovery&#34;&gt;File Listing &amp;amp; Discovery&lt;a class=&#34;anchor&#34; href=&#34;#file-listing--discovery&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# List files recursively, sorted newest first&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Get-ChildItem -Path &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Path&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-File&lt;/span&gt; -Recurse | Sort-Object LastWriteTime -Descending&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Find first matching file across user profiles&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Get-ChildItem &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Users\*\Downloads\CleanUpTool.msi&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue | Select-Object -First &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;file-copying&#34;&gt;File Copying&lt;a class=&#34;anchor&#34; href=&#34;#file-copying&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Copy single file, force overwrite&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copy-Item -Path &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Source\File.ext&amp;#34;&lt;/span&gt; -Destination &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Target\&amp;#34;&lt;/span&gt; -Force&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Copy entire directory tree&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copy-Item -Path &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Source\*&amp;#34;&lt;/span&gt; -Destination &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;D:\Destination\&amp;#34;&lt;/span&gt; -Recurse&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;msi-install--run--uninstall-pattern&#34;&gt;MSI Install / Run / Uninstall Pattern&lt;a class=&#34;anchor&#34; href=&#34;#msi-install--run--uninstall-pattern&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Requires&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;-RunAsAdministrator&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. Find and Install&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$cleanupPath = Get-ChildItem &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Users\*\Downloads\CleanUpTool.msi&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue | Select-Object -First &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($cleanupPath) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Start-Process &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;msiexec.exe&amp;#34;&lt;/span&gt; -ArgumentList &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/i &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;$($cleanupPath.FullName)&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; /qn&amp;#34;&lt;/span&gt; -Wait&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 2. Run (locate executable in Program Files)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $exePath = Get-ChildItem &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files\&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\&amp;#34;&lt;/span&gt; -Recurse -Filter &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*CleanUpTool*.exe&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue | Select-Object -First &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($exePath) { Start-Process $exePath.FullName -Wait }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 3. Uninstall&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $product = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name &lt;span style=&#34;color:#f92672&#34;&gt;-like&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*CleanUpTool*&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($product) { $product.Uninstall() }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4. Install Next Package&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$foxitPath = Join-Path $PSScriptRoot &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Foxit.msi&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (Test-Path $foxitPath) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Start-Process &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;msiexec.exe&amp;#34;&lt;/span&gt; -ArgumentList &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/i &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;$foxitPath&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; /qn&amp;#34;&lt;/span&gt; -Wait&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation dated 2025-06-11. The simplified linear script approach was explicitly chosen over a modular function-based approach to reduce overhead for routine local PC tasks.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Get-WmiObject -Class Win32_Product&lt;/code&gt; is a legacy enumeration method. While functional for basic scripts, it is known to trigger package repairs and is slow on large systems. Consider migrating to &lt;code&gt;Get-CimInstance -Class Win32_Product&lt;/code&gt; or querying &lt;code&gt;HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall&lt;/code&gt; for production use.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does the local PC environment still rely on &lt;code&gt;Get-WmiObject&lt;/code&gt; for software inventory, or has it migrated to &lt;code&gt;Get-CimInstance&lt;/code&gt; / registry queries?&lt;/li&gt;&#xA;&lt;li&gt;Are there standardized locations for MSI installers beyond user Downloads and script root for future automation?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/scripts/powershell-cleanup-patterns.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/scripts/bulk-folder-rename-script.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/administration/powershell-administration-commands.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/056-List Files in Folder Using PowerShell.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: &amp;ldquo;List Files in Folder Using PowerShell&amp;rdquo; (2025-06-11)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>UniFi Express VPN &amp; Network Management</title>
      <link>https://homelab.nbkelley.com/docs/networking/unifi-express-vpn/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/unifi-express-vpn/</guid>
      <description>&lt;h1 id=&#34;unifi-express-vpn--network-management&#34;&gt;UniFi Express VPN &amp;amp; Network Management&lt;a class=&#34;anchor&#34; href=&#34;#unifi-express-vpn--network-management&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Methodology for configuring ProtonVPN WireGuard on UniFi Express.&lt;/li&gt;&#xA;&lt;li&gt;Kill switch implementation to prevent IP/DNS leaks when the VPN drops.&lt;/li&gt;&#xA;&lt;li&gt;Best practices for managing Netgear managed switches via dedicated subnets and secure ports.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;WireGuard Protocol&lt;/strong&gt;: Selected over OpenVPN for superior speed and efficiency on UniFi Express.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Kill Switch Pattern&lt;/strong&gt;: Default-deny WAN traffic; only allow forwarding through the &lt;code&gt;wg0&lt;/code&gt; interface.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Netgear Management&lt;/strong&gt;: Restrict switch web GUI access to a dedicated management VLAN/subnet using HTTPS.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN Client&lt;/strong&gt;: ProtonVPN (WireGuard)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Endpoint&lt;/strong&gt;: &lt;code&gt;us-123.protonvpn.net:51820&lt;/code&gt; (example high-speed server)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ProtonVPN DNS&lt;/strong&gt;: &lt;code&gt;10.2.0.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Allowed IPs&lt;/strong&gt;: &lt;code&gt;0.0.0.0/0&lt;/code&gt; (full tunnel)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Netgear Switch Management Ports&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTP: &lt;code&gt;80&lt;/code&gt; (insecure, avoid)&lt;/li&gt;&#xA;&lt;li&gt;HTTPS: &lt;code&gt;443&lt;/code&gt; (secure web GUI)&lt;/li&gt;&#xA;&lt;li&gt;SSH: &lt;code&gt;22&lt;/code&gt; (CLI access)&lt;/li&gt;&#xA;&lt;li&gt;SNMP: &lt;code&gt;161&lt;/code&gt; (monitoring)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation dated 2025-04-14.&lt;/li&gt;&#xA;&lt;li&gt;Gateway device referred to as UniFi Express (infrastructure list notes &amp;ldquo;UCG Express &amp;lsquo;Olorín&amp;rsquo; at 192.168.1.1&amp;rdquo;).&lt;/li&gt;&#xA;&lt;li&gt;Netgear MS308E is the managed switch in the homelab.&lt;/li&gt;&#xA;&lt;li&gt;Kill switch and DNS leak prevention rely on &lt;code&gt;iptables&lt;/code&gt;/&lt;code&gt;nftables&lt;/code&gt; or UniFi OS firewall rules.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does UniFi Express support native WireGuard kill switch in the GUI, or is manual CLI firewall configuration required?&lt;/li&gt;&#xA;&lt;li&gt;Specific UniFi OS version and exact GUI paths for VPN/kill switch implementation.&lt;/li&gt;&#xA;&lt;li&gt;Whether split tunneling is needed for specific homelab services.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network/&#34;&gt;Network Infrastructure &amp;amp; VLANs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/vlan_setup/&#34;&gt;VLAN Configuration: OPNsense &amp;amp; Netgear MS308E&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/security/cloudflare_integration/&#34;&gt;Cloudflare Integration: SSL &amp;amp; DNS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/uptime-kuma/&#34;&gt;Uptime Kuma - Configuration &amp;amp; Integrations&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>UniFi UX7 &amp; Netgear MS308E VLAN Setup</title>
      <link>https://homelab.nbkelley.com/docs/networking/ufi-netgear-vlan-setup/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/ufi-netgear-vlan-setup/</guid>
      <description>&lt;h1 id=&#34;unifi-ux7--netgear-ms308e-vlan-setup&#34;&gt;UniFi UX7 &amp;amp; Netgear MS308E VLAN Setup&lt;a class=&#34;anchor&#34; href=&#34;#unifi-ux7--netgear-ms308e-vlan-setup&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Multi-switch VLAN topology using UniFi UCG Express (UX7) and Netgear MS308E switches.&lt;/li&gt;&#xA;&lt;li&gt;Netgear MS308E 802.1Q Advanced configuration pattern for trunks and access ports.&lt;/li&gt;&#xA;&lt;li&gt;Troubleshooting methodology for multi-switch chains (isolate to inter-switch trunks vs. device-specific vs. firewall).&lt;/li&gt;&#xA;&lt;li&gt;UX7 firewall rule correction for IoT isolation (Tharkûn VLAN 3).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;VLAN 1 (Gandalf): Untagged on trunks, PVID 1. Used for servers and switch management.&lt;/li&gt;&#xA;&lt;li&gt;VLAN 2 (Mithrandir): Tagged on trunks, Untagged on access. PVID 2. Routes through UX7 VPN.&lt;/li&gt;&#xA;&lt;li&gt;VLAN 3 (Tharkûn): Tagged on trunks, Untagged on access. PVID 3. Isolated IoT network.&lt;/li&gt;&#xA;&lt;li&gt;Native VLAN set to 1 on trunks to ensure management traffic passes untagged and remains accessible.&lt;/li&gt;&#xA;&lt;li&gt;UX7 Firewall: Tharkûn (VLAN 3) placed in DMZ zone. Required explicit &amp;ldquo;Allow DMZ to Internet&amp;rdquo; rule to restore IoT connectivity.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;UX7 (Olorín)&lt;/strong&gt;: 192.168.1.1&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Port 1 (to Netgear Switch 1): Trunk, Native VLAN 1, Allowed VLANs 1, 2, 3.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Netgear MS308E (Switch 1)&lt;/strong&gt;: 192.168.1.239&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Port 1 (to UX7): VLAN 1 Untagged (PVID 1), VLAN 2 Tagged, VLAN 3 Tagged.&lt;/li&gt;&#xA;&lt;li&gt;Ports 2, 3 (to downstream switches): Same as Port 1.&lt;/li&gt;&#xA;&lt;li&gt;Access Ports (e.g., Port 8 to U7 AP): VLAN 3 Untagged, PVID 3.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Netgear MS308E (Switch 2)&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Trunk ports: VLAN 1 Untagged (PVID 1), VLAN 2 Tagged, VLAN 3 Tagged.&lt;/li&gt;&#xA;&lt;li&gt;Access Ports: VLAN 2 Untagged (PVID 2) for PCs, VLAN 3 Untagged (PVID 3) for IoT (e.g., Hue Hub).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;UX7 Firewall Rules (Tharkûn/DMZ)&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Allow DMZ to Internet&lt;/li&gt;&#xA;&lt;li&gt;Allow DMZ to Gateway&lt;/li&gt;&#xA;&lt;li&gt;Block DMZ to Internal&lt;/li&gt;&#xA;&lt;li&gt;Block DMZ to VPN&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Initial attempts to set trunk ports to &amp;ldquo;No Native VLAN&amp;rdquo; (all tagged) caused lockout because management traffic (VLAN 1) became untagged and was dropped. Reverted to Native VLAN = 1.&lt;/li&gt;&#xA;&lt;li&gt;VLAN 2 (Mithrandir) initially failed on downstream switches due to missing tagged configuration on inter-switch trunks.&lt;/li&gt;&#xA;&lt;li&gt;VLAN 3 (Tharkûn) failed due to missing firewall rule in UX7 Site Manager for the DMZ zone.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How to handle Rivendell (VLAN 4) when deployed?&lt;/li&gt;&#xA;&lt;li&gt;Will U7 APs require specific VLAN tagging configurations for Tharkûn WiFi?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/networking/vlan_setup.md&lt;/code&gt; (Legacy OPNsense context)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/infrastructure/network.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/networking/opnsense_dmz_iot_firewall.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/uptime-kuma/&#34;&gt;Uptime Kuma - Configuration &amp;amp; Integrations&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>OPNsense Interface Reassignment &amp; NIC Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/networking/opnsense_interface_reassignment/</link>
      <pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/opnsense_interface_reassignment/</guid>
      <description>&lt;h1 id=&#34;opnsense-interface-reassignment--nic-troubleshooting&#34;&gt;OPNsense Interface Reassignment &amp;amp; NIC Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#opnsense-interface-reassignment--nic-troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Procedures for reassigning WAN/LAN interfaces via the OPNsense console following a system upgrade, and troubleshooting connectivity loss after a physical NIC replacement.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Console-Based Reassignment&lt;/strong&gt;: Use the OPNsense console menu (&lt;code&gt;1. Assign Interfaces&lt;/code&gt;) to map physical ports to WAN/LAN roles.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network-Only Reset&lt;/strong&gt;: If configuration is lost, use &lt;code&gt;2. Reset to factory defaults&lt;/code&gt; and select &amp;ldquo;Reset only the network configuration&amp;rdquo; to preserve other settings.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Manual Config Edit&lt;/strong&gt;: Fallback to &lt;code&gt;vi /conf/config.xml&lt;/code&gt; to manually adjust &lt;code&gt;&amp;lt;interfaces&amp;gt;&lt;/code&gt; tags (&lt;code&gt;&amp;lt;wan&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;lan&amp;gt;&lt;/code&gt;) if the menu fails.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;NIC Troubleshooting Workflow&lt;/strong&gt;: Verify driver recognition (&lt;code&gt;vmstat -i&lt;/code&gt;), link status (&lt;code&gt;ifconfig&lt;/code&gt;), and system logs (&lt;code&gt;dmesg&lt;/code&gt;). Check NAT/Outbound and LAN firewall rules. Isolate hardware issues by reverting to the original NIC.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Gateway&lt;/strong&gt;: UCG Express &amp;ldquo;Olorín&amp;rdquo; (OPNsense) at &lt;code&gt;192.168.1.1&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VLANs&lt;/strong&gt;: Gandalf (192.168.1.x), Mithrandir (192.168.2.x), Tharkûn (192.168.3.x), Rivendell (192.168.4.x).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Switch&lt;/strong&gt;: Netgear MS308E (trunk/access VLANs managed via OPNsense).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Procedures documented for OPNsense upgrades where interface assignments reset.&lt;/li&gt;&#xA;&lt;li&gt;Troubleshooting steps refined for scenarios involving physical NIC swaps (e.g., 2.5GbE to 1GbE) causing interface loss.&lt;/li&gt;&#xA;&lt;li&gt;Note: Driver support (Intel &lt;code&gt;igb&lt;/code&gt;/&lt;code&gt;em&lt;/code&gt;, Realtek) and firmware updates may be required for newer NICs.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Specific driver requirements for the current UCG Express &amp;ldquo;Olorín&amp;rdquo; gateway NICs.&lt;/li&gt;&#xA;&lt;li&gt;Automation of interface reassignment to prevent manual console steps during future upgrades.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/opnsense_dhcp/&#34;&gt;OPNsense DHCP Configuration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/vlan_setup/&#34;&gt;VLAN Configuration: OPNsense &amp;amp; Netgear MS308E&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network_troubleshooting/&#34;&gt;Troubleshooting Network Interface Changes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network/&#34;&gt;Network Infrastructure &amp;amp; VLANs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/034-Reassign WAN and LAN on OPNsense Post-Upgrade.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Historical DeepSeek conversation on OPNsense console interface reassignment and NIC troubleshooting.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>TrueNAS (Vairë) - Storage &amp; Backup Server</title>
      <link>https://homelab.nbkelley.com/docs/machines/vair%C3%AB/</link>
      <pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/machines/vair%C3%AB/</guid>
      <description>&lt;h1 id=&#34;truenas-vairë---storage--backup-server&#34;&gt;TrueNAS (Vairë) - Storage &amp;amp; Backup Server&lt;a class=&#34;anchor&#34; href=&#34;#truenas-vair%c3%ab---storage--backup-server&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;TrueNAS (Vairë) is deployed as a Proxmox VM to serve as the primary storage and backup server for the homelab. It handles ZFS storage pools, NFS/SMB shares for Proxmox and other VMs, and hosts Collabora Office in an iocage jail.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;VM Type&lt;/strong&gt;: Q35 with UEFI firmware (recommended for ZFS stability).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Resources&lt;/strong&gt;: 16 GiB RAM (fixed, no ballooning) and 2 vCPUs. 32 GB boot disk separate from storage.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 4TB HDD passed through directly to the VM for ZFS data integrity and performance.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Backup Integration&lt;/strong&gt;: NFS share (&lt;code&gt;/mnt/tank/backups&lt;/code&gt;) configured for Proxmox backups. SMB share available for manual access.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Collabora Office&lt;/strong&gt;: Deployed in a dedicated iocage jail on port 9980.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hostname&lt;/strong&gt;: Vairë&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;IP Address&lt;/strong&gt;: 192.168.1.100 (NFS) / 192.168.1.133 (SMB)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Proxmox VM ID&lt;/strong&gt;: [Pending verification]&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ZFS Pool&lt;/strong&gt;: &lt;code&gt;tank&lt;/code&gt; (4TB HDD passthrough)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;NFS Share&lt;/strong&gt;: &lt;code&gt;/mnt/tank/backups&lt;/code&gt; (Network: 192.168.1.0/24, Maproot: root)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SMB Share&lt;/strong&gt;: &lt;code&gt;/mnt/tank/backups&lt;/code&gt; (Version 3.0)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Collabora Jail&lt;/strong&gt;: iocage jail, port 9980&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The conversation notes two different IPs for TrueNAS (192.168.1.100 and 192.168.1.133). Verify which IP is currently assigned to the TrueNAS VM.&lt;/li&gt;&#xA;&lt;li&gt;TrueNAS CORE uses iocage jails. Ensure jail templates are up to date.&lt;/li&gt;&#xA;&lt;li&gt;Proxmox backups to NFS require &lt;code&gt;hard,intr,noatime&lt;/code&gt; mount options in &lt;code&gt;/etc/fstab&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Which IP address is currently active for Vairë (192.168.1.100 or 192.168.1.133)?&lt;/li&gt;&#xA;&lt;li&gt;Is the 4TB HDD currently formatted as a ZFS pool on Vairë?&lt;/li&gt;&#xA;&lt;li&gt;Has Collabora Office been integrated with a Nextcloud instance?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs/&#34;&gt;Proxmox ZFS Storage &amp;amp; Installation Patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs-setup/&#34;&gt;Proxmox ZFS Storage Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network/&#34;&gt;Network Infrastructure &amp;amp; VLANs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/032-TrueNas - Vairë.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Historical DeepSeek conversation on TrueNAS VM setup and Proxmox integration.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>AI Infrastructure Overview</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/ai_fleet/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/ai_fleet/</guid>
      <description>&lt;h1 id=&#34;ai-infrastructure-overview&#34;&gt;AI Infrastructure Overview&lt;a class=&#34;anchor&#34; href=&#34;#ai-infrastructure-overview&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The homelab is transitioning into a multi-node agentic architecture, utilizing a mix of existing laptops, desktops, and a future Mac Studio to handle different tiers of LLM workloads (Batch vs. Interactive).&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Nodes are specialized by their hardware capabilities (VRAM and CPU/RAM) to optimize for cost and performance:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Inference Node (Batch/Heavy + Embeddings):&lt;/strong&gt; HP Pavilion 15t-e300 — hostname &lt;strong&gt;nk-celebrimbor&lt;/strong&gt;, IP 192.168.2.192. Intel i7, 32GB RAM, NVIDIA MX550 (2GB VRAM, CUDA disabled). Runs &lt;code&gt;gemma4:e4b&lt;/code&gt; for monitoring pipeline synthesis (~15-18 t/s, CPU-only) and &lt;code&gt;nomic-embed-text&lt;/code&gt; for wiki semantic embeddings (768-dim, via Ollama on port 11434).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Orchestrator Node:&lt;/strong&gt; Thinkpad T480. Intel i5/i7 8th Gen, 32GB RAM. Running headless Ubuntu. Hosts n8n and lightweight models (Gemma 4 E4B) for routing and decision-making.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Interactive Node (Potential):&lt;/strong&gt; ROG Zephyrus (GU501). Intel i7, NVIDIA GTX 1080 Max-Q (8GB VRAM). Ideal for 7B/8B models requiring high tokens-per-second for real-time chat.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Primary Reasoning Node (Deployed 2026-04-24):&lt;/strong&gt; Mac Studio M1 Max, 64GB Unified Memory — hostname &lt;strong&gt;Legolas&lt;/strong&gt;, IP 192.168.1.45. Handles all wiki pipeline LLM calls: &lt;code&gt;gemma4:e2b&lt;/code&gt; (text cleaning), &lt;code&gt;qwen3.6:35b-a3b-coding-nvfp4&lt;/code&gt; (JSON crystallization), &lt;code&gt;minicpm-v:8b&lt;/code&gt; (PDF OCR/vision). Fast interactive inference — 31B models at ~25+ t/s vs Pavilion&amp;rsquo;s ~15 t/s CPU-only. See &lt;a href=&#34;https://homelab.nbkelley.com/docs/machines/mac-studio/&#34;&gt;Mac Studio&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Parallelism Nodes:&lt;/strong&gt; Various i5 8th Gen desktops. 32GB RAM, no GPU. Used for distributed pipeline stages or additional lightweight model instances.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Legolas (Mac Studio)&lt;/strong&gt;: Ollama at 192.168.1.45:11434. Running &lt;code&gt;gemma4:e2b&lt;/code&gt;, &lt;code&gt;qwen3.6:35b-a3b-coding-nvfp4&lt;/code&gt;, &lt;code&gt;minicpm-v:8b&lt;/code&gt; for wiki pipeline. Deployed 2026-04-24.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;nk-celebrimbor (Pavilion)&lt;/strong&gt;: headless Ubuntu, Ollama CPU-only (CUDA disabled — MX550 2GB VRAM too small). Running &lt;code&gt;gemma4:e4b&lt;/code&gt; at ~15-18 t/s for hourly monitoring pipeline; &lt;code&gt;nomic-embed-text&lt;/code&gt; for wiki embeddings.&lt;/li&gt;&#xA;&lt;li&gt;T480: planned orchestrator role not yet active.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/ollama_config/&#34;&gt;Ollama Configuration&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/services/open_webui_deployment/&#34;&gt;Open WebUI Deployment&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/machines/mac-studio/&#34;&gt;Mac Studio&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/machines/pavilion/&#34;&gt;Pavilion (AI PC) Configuration&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mac Studio</title>
      <link>https://homelab.nbkelley.com/docs/machines/mac-studio/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/machines/mac-studio/</guid>
      <description>&lt;h1 id=&#34;mac-studio&#34;&gt;Mac Studio&lt;a class=&#34;anchor&#34; href=&#34;#mac-studio&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Mac Studio M1 Max 64GB purchased 2026-04-17 for $2,299 (used/refurbished market). Deployed 2026-04-24 as the primary AI inference node for the homelab, replacing the Pavilion as the fast interactive reasoning machine.&lt;/p&gt;&#xA;&lt;h2 id=&#34;hardware&#34;&gt;Hardware&lt;a class=&#34;anchor&#34; href=&#34;#hardware&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Model&lt;/td&gt;&#xA;          &lt;td&gt;Mac Studio (2022, M1 Max)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Hostname&lt;/td&gt;&#xA;          &lt;td&gt;Legolas&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;IP&lt;/td&gt;&#xA;          &lt;td&gt;192.168.1.45&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Memory&lt;/td&gt;&#xA;          &lt;td&gt;64GB Unified Memory&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Memory bandwidth&lt;/td&gt;&#xA;          &lt;td&gt;~400 GB/s&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Purchase price&lt;/td&gt;&#xA;          &lt;td&gt;$2,299 (used)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Status&lt;/td&gt;&#xA;          &lt;td&gt;Deployed, operational 2026-04-24&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;why-this-hardware&#34;&gt;Why This Hardware&lt;a class=&#34;anchor&#34; href=&#34;#why-this-hardware&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;64GB unified memory is the key spec for LLM inference on Apple Silicon. Memory bandwidth determines tokens/second — the M1 Max at ~400 GB/s delivers ~25+ t/s for 27-31B models vs the Pavilion&amp;rsquo;s ~15 t/s CPU-only for E4B. At the time of purchase, 64GB Mac Studio/Mac Mini new from Apple was backordered to late June. The used M1 Max at $2,299 was judged a reasonable buy given scarcity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pavilion (AI PC) Configuration</title>
      <link>https://homelab.nbkelley.com/docs/machines/pavilion/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/machines/pavilion/</guid>
      <description>&lt;h1 id=&#34;pavilion-ai-pc-configuration&#34;&gt;Pavilion (AI PC) Configuration&lt;a class=&#34;anchor&#34; href=&#34;#pavilion-ai-pc-configuration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The Pavilion machine uses a USB-based or specific Ethernet interface (&lt;code&gt;enx6c1f7197a66&lt;/code&gt;) that occasionally fails to bring the link up automatically on boot.&lt;/p&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;netplan-configuration&#34;&gt;Netplan Configuration&lt;a class=&#34;anchor&#34; href=&#34;#netplan-configuration&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Ensure &lt;code&gt;/etc/netplan/01-netcfg.yaml&lt;/code&gt; is correctly configured with the active interface name and permissions are set to &lt;code&gt;600&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;network&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ethernets&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;enx6c1f7197a66&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;dhcp4&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Apply with:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt; /etc/netplan/01-netcfg.yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo netplan apply&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;boot-time-interface-fix&#34;&gt;Boot-time Interface Fix&lt;a class=&#34;anchor&#34; href=&#34;#boot-time-interface-fix&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;If the interface remains DOWN after reboot, use a systemd service to force the link up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PostgreSQL</title>
      <link>https://homelab.nbkelley.com/docs/services/postgresql/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/postgresql/</guid>
      <description>&lt;h1 id=&#34;postgresql&#34;&gt;PostgreSQL&lt;a class=&#34;anchor&#34; href=&#34;#postgresql&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;PostgreSQL 16 runs as an LXC on Proxmox, serving as the central database for n8n, the monitoring pipeline, and pgvector embeddings for the wiki.&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment&#34;&gt;Deployment&lt;a class=&#34;anchor&#34; href=&#34;#deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;LXC host&lt;/td&gt;&#xA;          &lt;td&gt;postgresql&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Container ID&lt;/td&gt;&#xA;          &lt;td&gt;108&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;IP&lt;/td&gt;&#xA;          &lt;td&gt;192.168.1.57&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Port&lt;/td&gt;&#xA;          &lt;td&gt;5432&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Version&lt;/td&gt;&#xA;          &lt;td&gt;16.13 (Debian 16.13-1.pgdg13+1)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;OS&lt;/td&gt;&#xA;          &lt;td&gt;Debian 13 (unprivileged LXC)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Disk&lt;/td&gt;&#xA;          &lt;td&gt;4 GB (App-Storage ZFS pool)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;RAM&lt;/td&gt;&#xA;          &lt;td&gt;1024 MiB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CPU&lt;/td&gt;&#xA;          &lt;td&gt;1 core&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Installed via&lt;/td&gt;&#xA;          &lt;td&gt;tteck Proxmox helper scripts&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Web UI&lt;/td&gt;&#xA;          &lt;td&gt;Adminer — not yet installed&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;SSH user&lt;/td&gt;&#xA;          &lt;td&gt;iluvatar (sudo, PermitRootLogin no)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;databases-and-users&#34;&gt;Databases and Users&lt;a class=&#34;anchor&#34; href=&#34;#databases-and-users&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Database&lt;/th&gt;&#xA;          &lt;th&gt;User&lt;/th&gt;&#xA;          &lt;th&gt;Purpose&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;homelab&lt;/td&gt;&#xA;          &lt;td&gt;homelab&lt;/td&gt;&#xA;          &lt;td&gt;n8n workflows, monitoring pipeline, pgvector wiki embeddings&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;setup-commands-run-as-postgres-user&#34;&gt;Setup commands (run as postgres user)&lt;a class=&#34;anchor&#34; href=&#34;#setup-commands-run-as-postgres-user&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DATABASE&lt;/span&gt; homelab;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;USER&lt;/span&gt; homelab &lt;span style=&#34;color:#66d9ef&#34;&gt;WITH&lt;/span&gt; PASSWORD &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;password&amp;gt;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GRANT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ALL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIVILEGES&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DATABASE&lt;/span&gt; homelab &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; homelab;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GRANT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ALL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;SCHEMA&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; homelab;  &lt;span style=&#34;color:#75715e&#34;&gt;-- required for n8n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;GRANT ALL ON SCHEMA public&lt;/code&gt; step is required — without it n8n fails to start with a permissions error even though the database and user exist.&lt;/p&gt;</description>
    </item>
    <item>
      <title>wiki-llm</title>
      <link>https://homelab.nbkelley.com/docs/machines/wiki-llm/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/machines/wiki-llm/</guid>
      <description>&lt;h1 id=&#34;wiki-llm&#34;&gt;wiki-llm&lt;a class=&#34;anchor&#34; href=&#34;#wiki-llm&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Dedicated Ubuntu 24.04 VM for hosting the homelab wiki system and Claude Code sessions. Chosen as a VM rather than an LXC for stronger isolation (wiki infrastructure handles credentials and embeddings).&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment&#34;&gt;Deployment&lt;a class=&#34;anchor&#34; href=&#34;#deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Hostname&lt;/td&gt;&#xA;          &lt;td&gt;wiki-llm&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;IP&lt;/td&gt;&#xA;          &lt;td&gt;192.168.1.206&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;VLAN&lt;/td&gt;&#xA;          &lt;td&gt;Gandalf (192.168.1.x)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;OS&lt;/td&gt;&#xA;          &lt;td&gt;Ubuntu 24.04&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CPU&lt;/td&gt;&#xA;          &lt;td&gt;2 cores&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;RAM&lt;/td&gt;&#xA;          &lt;td&gt;4 GB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Type&lt;/td&gt;&#xA;          &lt;td&gt;VM (Proxmox)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;SSH user&lt;/td&gt;&#xA;          &lt;td&gt;iluvatar (sudo, PermitRootLogin no)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;access&#34;&gt;Access&lt;a class=&#34;anchor&#34; href=&#34;#access&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;VS Code Remote SSH&lt;/strong&gt;: Primary method for Claude Code sessions — VS Code connects to wiki-llm via remote SSH, giving Claude Code native filesystem access to &lt;code&gt;/opt/wiki/homelab/&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Direct SSH&lt;/strong&gt;: &lt;code&gt;ssh iluvatar@192.168.1.206&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;wiki-file-structure&#34;&gt;Wiki File Structure&lt;a class=&#34;anchor&#34; href=&#34;#wiki-file-structure&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/opt/wiki/&#xA;  homelab/        ← git repo, all homelab wiki pages and skills&#xA;  work/           ← git repo, work/princelobel wiki + pipeline scripts&#xA;  projects/       ← git repo, projects wiki (planned)&#xA;  personal/       ← git repo, personal wiki (Gemma-only)&#xA;  raw-sources/    ← symlink to /mnt/wiki-nas/LLMWiki&#xA;  skills-reference/  ← clone of vanillaflava/llm-wiki-claude-skills (reference only)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Each wiki directory is an independent git repository (&lt;code&gt;git init&lt;/code&gt;&amp;rsquo;d) for clean version history per namespace.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Local Model Training &amp; Fine-Tuning Guide</title>
      <link>https://homelab.nbkelley.com/docs/ai/local-model-training/</link>
      <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/ai/local-model-training/</guid>
      <description>&lt;h1 id=&#34;local-model-training--fine-tuning-guide&#34;&gt;Local Model Training &amp;amp; Fine-Tuning Guide&lt;a class=&#34;anchor&#34; href=&#34;#local-model-training--fine-tuning-guide&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Guide for fine-tuning local LLMs (DeepSeek) using Hugging Face &lt;code&gt;transformers&lt;/code&gt;, with emphasis on VRAM-efficient techniques for single-GPU setups.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Framework&lt;/strong&gt;: Hugging Face &lt;code&gt;transformers&lt;/code&gt; + &lt;code&gt;Trainer&lt;/code&gt; API for fine-tuning&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Model&lt;/strong&gt;: &lt;code&gt;deepseek-ai/deepseek-llm-7b&lt;/code&gt; (example model)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;: LoRA (Low-Rank Adaptation) + 4-bit quantization via &lt;code&gt;bitsandbytes&lt;/code&gt; to fit large models on consumer GPUs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;a class=&#34;anchor&#34; href=&#34;#setup&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install torch transformers datasets accelerate peft bitsandbytes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify GPU: &lt;code&gt;nvidia-smi&lt;/code&gt; — need CUDA 11.8+.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows VM Installation Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/windows-vm-installation/</link>
      <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/windows-vm-installation/</guid>
      <description>&lt;h1 id=&#34;windows-vm-installation-troubleshooting&#34;&gt;Windows VM Installation Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#windows-vm-installation-troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Troubleshooting guide for Windows installation when the local disk does not appear in the partitioning screen during setup.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-troubleshooting-steps&#34;&gt;Key Troubleshooting Steps&lt;a class=&#34;anchor&#34; href=&#34;#key-troubleshooting-steps&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Check disk detection in BIOS/UEFI&lt;/strong&gt; — If the disk doesn&amp;rsquo;t appear in BIOS, it&amp;rsquo;s a hardware issue (loose cable, faulty drive, wrong SATA port).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Load storage drivers&lt;/strong&gt; — Modern NVMe/RAID controllers may need drivers loaded during setup via &lt;code&gt;Shift + F10&lt;/code&gt; → &amp;ldquo;Load Driver&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AI-Driven Monitoring Pipeline</title>
      <link>https://homelab.nbkelley.com/docs/monitoring/pipeline/</link>
      <pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/monitoring/pipeline/</guid>
      <description>&lt;h1 id=&#34;ai-driven-monitoring-pipeline&#34;&gt;AI-Driven Monitoring Pipeline&lt;a class=&#34;anchor&#34; href=&#34;#ai-driven-monitoring-pipeline&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The monitoring pipeline is fully operational and running hourly. It collects rich structured data from four sources (Prometheus — 7 metrics, Uptime Kuma, UniFi, Synology), runs 4 parallel Ollama summarization calls, synthesises a final status report, and writes everything to Postgres. Hourly snapshots of raw UniFi and Prometheus data are stored in dedicated tables for delta computation. End-to-end runtime is ~13 minutes using &lt;code&gt;gemma4:e4b&lt;/code&gt; CPU-only on the Pavilion — accepted as-is pending Mac Studio.&lt;/p&gt;</description>
    </item>
    <item>
      <title>n8n</title>
      <link>https://homelab.nbkelley.com/docs/services/n8n/</link>
      <pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/n8n/</guid>
      <description>&lt;h1 id=&#34;n8n&#34;&gt;n8n&lt;a class=&#34;anchor&#34; href=&#34;#n8n&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;n8n is the automation and orchestration hub for the homelab. It runs as an LXC on Proxmox, connected to PostgreSQL for persistent workflow state and execution history. Community edition is sufficient for current use.&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment&#34;&gt;Deployment&lt;a class=&#34;anchor&#34; href=&#34;#deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;LXC host&lt;/td&gt;&#xA;          &lt;td&gt;n8n&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;IP&lt;/td&gt;&#xA;          &lt;td&gt;192.168.1.169&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Port&lt;/td&gt;&#xA;          &lt;td&gt;5678&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;URL&lt;/td&gt;&#xA;          &lt;td&gt;http://192.168.1.169:5678&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Version&lt;/td&gt;&#xA;          &lt;td&gt;2.15.1 (Self Hosted)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Installed via&lt;/td&gt;&#xA;          &lt;td&gt;tteck Proxmox helper scripts&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;OS&lt;/td&gt;&#xA;          &lt;td&gt;Debian 13 (unprivileged LXC)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Config file&lt;/td&gt;&#xA;          &lt;td&gt;/opt/n8n.env&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;configuration-optn8nenv&#34;&gt;Configuration (/opt/n8n.env)&lt;a class=&#34;anchor&#34; href=&#34;#configuration-optn8nenv&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_SECURE_COOKIE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_PORT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5678&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_PROTOCOL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_HOST&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;192.168.1.169&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_TYPE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;postgresdb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_HOST&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;192.168.1.57&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_PORT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5432&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_DATABASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;homelab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_USER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;homelab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;password&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After editing: &lt;code&gt;systemctl restart n8n&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Node Exporter Deployment</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/node-exporter/</link>
      <pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/node-exporter/</guid>
      <description>&lt;h1 id=&#34;node-exporter-deployment&#34;&gt;Node Exporter Deployment&lt;a class=&#34;anchor&#34; href=&#34;#node-exporter-deployment&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;node_exporter&lt;/code&gt; is used to expose system-level metrics (CPU, RAM, Disk, Network) from Linux hosts to the central Prometheus instance at 192.168.1.167.&lt;/p&gt;&#xA;&lt;h2 id=&#34;monitored-hosts&#34;&gt;Monitored Hosts&lt;a class=&#34;anchor&#34; href=&#34;#monitored-hosts&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Host&lt;/th&gt;&#xA;          &lt;th&gt;IP&lt;/th&gt;&#xA;          &lt;th&gt;Port&lt;/th&gt;&#xA;          &lt;th&gt;Prometheus job&lt;/th&gt;&#xA;          &lt;th&gt;VLAN&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;nk-celebrimbor (Pavilion)&lt;/td&gt;&#xA;          &lt;td&gt;192.168.2.192&lt;/td&gt;&#xA;          &lt;td&gt;9100&lt;/td&gt;&#xA;          &lt;td&gt;pavilion&lt;/td&gt;&#xA;          &lt;td&gt;mithrandir&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;wiki-llm&lt;/td&gt;&#xA;          &lt;td&gt;192.168.1.206&lt;/td&gt;&#xA;          &lt;td&gt;9100&lt;/td&gt;&#xA;          &lt;td&gt;wiki&lt;/td&gt;&#xA;          &lt;td&gt;gandalf&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;a class=&#34;anchor&#34; href=&#34;#installation&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;method-a-apt-ubuntu--preferred-for-ubuntu-hosts&#34;&gt;Method A: apt (Ubuntu) — preferred for Ubuntu hosts&lt;a class=&#34;anchor&#34; href=&#34;#method-a-apt-ubuntu--preferred-for-ubuntu-hosts&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install prometheus-node-exporter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Service auto-enabled; runs on port 9100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;method-b-manual-binary-other-distros&#34;&gt;Method B: Manual binary (other distros)&lt;a class=&#34;anchor&#34; href=&#34;#method-b-manual-binary-other-distros&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://github.com/prometheus/node_exporter/releases/download/v1.11.1/node_exporter-1.11.1.linux-amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar xvf node_exporter-1.11.1.linux-amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo cp node_exporter-1.11.1.linux-amd64/node_exporter /usr/local/bin/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create &lt;code&gt;/etc/systemd/system/node_exporter.service&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Network Infrastructure &amp; VLANs</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/network/</link>
      <pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/network/</guid>
      <description>&lt;h1 id=&#34;network-infrastructure--vlans&#34;&gt;Network Infrastructure &amp;amp; VLANs&lt;a class=&#34;anchor&#34; href=&#34;#network-infrastructure--vlans&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The network uses a UniFi UCG Express with a multi-VLAN setup. A recent incident involving a VPN expiry caused a routing failure on specific VLANs due to policy-based routing (PBR) without a fallback mechanism.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;VLAN Segmentation&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Gandalf&lt;/strong&gt;: Server network (Always-on, stable, no VPN).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mithrandir (VLAN 2)&lt;/strong&gt;: Client/AI network. Traffic is routed through ProtonVPN via WireGuard.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Harken (VLAN 3)&lt;/strong&gt;: General usage.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tharkûn (DMZ)&lt;/strong&gt;: Restricted zone (DMZ $\rightarrow$ Internal is Blocked).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Rivendell (VLAN 4)&lt;/strong&gt;: Unused.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN Configuration&lt;/strong&gt;: ProtonVPN WireGuard Client 1 is used for Mithrand/VLAN 2. &lt;strong&gt;Critical&lt;/strong&gt;: Ensure &amp;ldquo;Block traffic if WireGuard is down&amp;rdquo; is enabled to prevent IP leaks.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;IP Management&lt;/strong&gt;: Use &lt;strong&gt;DHCP Reservations (Fixed IPs)&lt;/strong&gt; in the UniFi Controller rather than configuring static IPs on individual hosts to prevent port-forward breakage during DHCP lease renewals.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Known Fixed IPs (DHCP Reservations)&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Book Discovery Pipeline</title>
      <link>https://homelab.nbkelley.com/docs/projects/book_discovery_pipeline/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/projects/book_discovery_pipeline/</guid>
      <description>&lt;h1 id=&#34;book-discovery-pipeline&#34;&gt;Book Discovery Pipeline&lt;a class=&#34;anchor&#34; href=&#34;#book-discovery-pipeline&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A multi-agent, multi-node pipeline designed to identify high-prestige, upcoming literary works by analyzing critical reviews before they hit the mainstream.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Architecture:&lt;/strong&gt; Two-tier agent system. Lightweight models (E4B) on the Orchestrator (T480) handle routing/filtering; heavier models (26B) on the Inference node (Pavilion) handle deep analysis.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt; n8n (Orchestration), PostgreSQL (Data Storage), Hugo (Static Site Generation), Python/JS (Custom Logic).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Sources:&lt;/strong&gt; RSS feeds (Literary Hub, etc.), Web Scraping (for indie blogs), and Goodreads API/Scraping for popularity comparison.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;the-pipeline-chain&#34;&gt;The Pipeline Chain&lt;a class=&#34;anchor&#34; href=&#34;#the-pipeline-chain&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ingestion:&lt;/strong&gt; n8n fetches RSS feeds and scrapes blogs.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Filtering (E4B):&lt;/strong&gt; Classifies content (Review vs. News). Discards non-reviews.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Extraction (26B):&lt;/strong&gt; Extracts title, author, publisher, and critical language.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Scoring (26B):&lt;/strong&gt; Analyates &amp;ldquo;prestige signals&amp;rdquo; (e.g., phrases like &amp;ldquo;formally ambitious&amp;rdquo;) and compares against Goodreads popularity.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Aggregation:&lt;/strong&gt; Aggregates data into PostgreSQL.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Publication:&lt;/strong&gt; n8n generates a Markdown file and commits it to a Hugo repository.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;data-schema-postgresql&#34;&gt;Data Schema (PostgreSQL)&lt;a class=&#34;anchor&#34; href=&#34;#data-schema-postgresql&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;sources&lt;/code&gt;: RSS metadata.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;articles&lt;/code&gt;: Raw ingested content.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;books&lt;/code&gt;: Normalized book records.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;reviews&lt;/code&gt;: Links articles to books + extracted critical language.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;prestige_scores&lt;/code&gt;: Historical scoring for trend tracking.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How to effectively scrape Substack/paywalled content without high costs.&lt;/li&gt;&#xA;&lt;li&gt;Determining the optimal frequency for the pipeline run (Weekly vs. Bi-weekly).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/open_webui_deployment/&#34;&gt;Open WebUI Deployment&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/services/ollama_config/&#34;&gt;Ollama Configuration&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/monitoring/pipeline/&#34;&gt;AI-Driven Monitoring Pipeline&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux Server Optimization</title>
      <link>https://homelab.nbkelley.com/docs/maintenance/linux_server_optimization/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/maintenance/linux_server_optimization/</guid>
      <description>&lt;h1 id=&#34;linux-server-optimization&#34;&gt;Linux Server Optimization&lt;a class=&#34;anchor&#34; href=&#34;#linux-server-optimization&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Optimizations for headless Ubuntu servers (specifically HP Pavilion and Thinkpad T480) to prevent sleep/suspend when the lid is closed.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Modify &lt;code&gt;systemd-logind&lt;/code&gt; to ignore lid switch events to ensure the server remains active when the laptop lid is closed.&lt;/p&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;prevent-sleep-on-lid-close&#34;&gt;Prevent Sleep on Lid Close&lt;a class=&#34;anchor&#34; href=&#34;#prevent-sleep-on-lid-close&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Edit &lt;code&gt;/etc/systemd/logind.conf&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/systemd/logind.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensure the following lines are uncommented and set to &lt;code&gt;ignore&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;HandleLidSwitch&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ignore&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;HandleLidSwitchExternalPower&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ignore&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;HandleLidSwitchDocked&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ignore&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Apply the changes:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ollama Configuration</title>
      <link>https://homelab.nbkelley.com/docs/services/ollama_config/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/ollama_config/</guid>
      <description>&lt;h1 id=&#34;ollama-configuration&#34;&gt;Ollama Configuration&lt;a class=&#34;anchor&#34; href=&#34;#ollama-configuration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Ollama is used as the primary model backend across the fleet. The configuration focuses on making the API accessible to other nodes (like the T480 orchestrator) and running models like Gemma 4.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;To allow remote access from other machines in the homelab (e.g., from a Docker container or another PC), the Ollama service must be configured to listen on all network interfaces, not just localhost.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Open WebUI Deployment</title>
      <link>https://homelab.nbkelley.com/docs/services/open_webui_deployment/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/open_webui_deployment/</guid>
      <description>&lt;h1 id=&#34;open-webui-deployment&#34;&gt;Open WebUI Deployment&lt;a class=&#34;anchor&#34; href=&#34;#open-webui-deployment&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Open WebUI is deployed via Docker to provide a ChatGPT-like interface for interacting with local Ollama instances. It is configured to connect to the host&amp;rsquo;s Ollama API.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Because the WebUI runs inside a Docker container, it cannot reach &lt;code&gt;localhost:11434&lt;/code&gt; of the host machine directly. The &lt;code&gt;OLLMA_BASE_URL&lt;/code&gt; must point to the host&amp;rsquo;s actual LAN IP or use the &lt;code&gt;host.docker.internal&lt;/code&gt; gateway.&lt;/p&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;docker-deployment&#34;&gt;Docker Deployment&lt;a class=&#34;anchor&#34; href=&#34;#docker-deployment&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run -d &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  --name open-webui &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  --restart always &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -p 3000:8080 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -v open-webui:/app/backend/data &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  --add-host&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -e OLLAMA_BASE_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://&amp;lt;YOUR_HOST_IP&amp;gt;:11434 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  ghcr.io/open-webui/open-webui:main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Note: Replace &lt;code&gt;&amp;lt;YOUR_HOST_IP&amp;gt;&lt;/code&gt; with the actual IP of the machine (e.g., 192.168.172.168) to ensure the container can route to the Ollama service.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>VS Code Live Server Path Configuration</title>
      <link>https://homelab.nbkelley.com/docs/development/vscode-liveserver-paths/</link>
      <pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/development/vscode-liveserver-paths/</guid>
      <description>&lt;h1 id=&#34;vs-code-live-server-path-configuration&#34;&gt;VS Code Live Server Path Configuration&lt;a class=&#34;anchor&#34; href=&#34;#vs-code-live-server-path-configuration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Resolved the &amp;ldquo;Cannot GET /page-name&amp;rdquo; error in VS Code Live Server by implementing a standardized project directory structure and correct relative pathing. The core fix involves ensuring the server root is set to the project root and using &lt;code&gt;../&lt;/code&gt; to traverse up from subdirectories.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Project Rooting&lt;/strong&gt;: Always open the top-level project folder in VS &lt;code&gt;Code&lt;/code&gt; rather than individual subfolders (like &lt;code&gt;html/&lt;/code&gt;). This allows Live Server to correctly resolve paths relative to the project root.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Directory Separation&lt;/strong&gt;: Adopted a structured hierarchy to separate assets, logic, and presentation.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;project-structure&#34;&gt;Project Structure&lt;a class=&#34;anchor&#34; href=&#34;#project-structure&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;project-root/&#xA;├── Assets/&#xA;│   ├── icons/&#xA;│   └── images/&#xA;├── html/&#xA;│   ├── index.html&#xA;│   ├── about.html&#xA;│   └── contact.html&#xA;├── scripts/&#xA;│   └── main.js&#xA;└── Styles/&#xA;    └── style.css&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;pathing-rules-when-working-inside-html&#34;&gt;Pathing Rules (when working inside &lt;code&gt;html/&lt;/code&gt;)&lt;a class=&#34;anchor&#34; href=&#34;#pathing-rules-when-working-inside-html&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;When files are located within the &lt;code&gt;html/&lt;/code&gt; subdirectory, all links to external directories must use the &lt;code&gt;../&lt;/code&gt; prefix to exit the &lt;code&gt;html/&lt;/code&gt; folder first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Web Server Stack (Nginx &#43; Apache)</title>
      <link>https://homelab.nbkelley.com/docs/services/web-server-stack/</link>
      <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/web-server-stack/</guid>
      <description>&lt;h1 id=&#34;web-server-stack-nginx--apache&#34;&gt;Web Server Stack (Nginx + Apache)&lt;a class=&#34;anchor&#34; href=&#34;#web-server-stack-nginx--apache&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In this setup, Nginx is utilized as a high-performance reverse proxy to handle incoming traffic and static content, while Apache serves as the backend for dynamic content (e.g., PHP/WordPress) due to its flexible &lt;code&gt;.htaccess&lt;/code&gt; support.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Architecture&lt;/strong&gt;: Nginx acts as the entry point (Port 80/443) and proxies requests to Apache running on a non-standard port (e.g., 8080).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Rationale&lt;/strong&gt;: Leverages Nginx&amp;rsquo;s superior concurrency and static content handling with Apache&amp;rsquo;s ease of use for per-directory configuration.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;apache-backend-configuration&#34;&gt;Apache Backend Configuration&lt;a class=&#34;anchor&#34; href=&#34;#apache-backend-configuration&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Modify &lt;code&gt;/etc/apache2/ports.conf&lt;/code&gt; to listen on a different port to avoid conflict with Nginx:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nginx vs Apache for Static Hosting</title>
      <link>https://homelab.nbkelley.com/docs/services/web_server_comparison/</link>
      <pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/web_server_comparison/</guid>
      <description>&lt;h1 id=&#34;nginx-vs-apache-for-static-hosting&#34;&gt;Nginx vs Apache for Static Hosting&lt;a class=&#34;anchor&#34; href=&#34;#nginx-vs-apache-for-static-hosting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A comparison of Nginx and Apache for the purpose of hosting static HTML/CSS/JS files within a Proxmox LXC or VM.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Choose Nginx if&lt;/strong&gt;: You prioritize performance, low memory footprint, and plan to use it as a reverse proxy for modern stacks (Node.js, Python).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Choose Apache if&lt;/strong&gt;: You require &lt;code&gt;.htaccess&lt;/code&gt; support for per-directory configuration or are working with legacy PHP/LAMP stacks.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;nginx-basic-static-config&#34;&gt;Nginx Basic Static Config&lt;a class=&#34;anchor&#34; href=&#34;#nginx-basic-static-config&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;server&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;root&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/var/www/html&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;index.html&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;apache-basic-static-config&#34;&gt;Apache Basic Static Config&lt;a class=&#34;anchor&#34; href=&#34;#apache-basic-static-config&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-apache&#34; data-lang=&#34;apache&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;VirtualHost&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;*:80&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DocumentRoot &lt;span style=&#34;color:#e6db74&#34;&gt;/var/www/html&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DirectoryIndex index.html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;deployment-commands-lxc&#34;&gt;Deployment Commands (LXC)&lt;a class=&#34;anchor&#34; href=&#34;#deployment-commands-lxc&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;To create a standard Ubuntu 22.04 LXC for web hosting:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox ZFS Storage Setup</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs-setup/</link>
      <pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs-setup/</guid>
      <description>&lt;h1 id=&#34;proxmox-zfs-storage-setup&#34;&gt;Proxmox ZFS Storage Setup&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-zfs-storage-setup&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Procedures for initializing ZFS pools using multiple drives via the Proxmox Web GUI and configuring them as usable storage for Virtual Machines (VMs) and Linux Containers (LXC).&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;RAID Levels&lt;/strong&gt;: Selection depends on the number of disks and redundancy requirements:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Stripe (RAID 0)&lt;/strong&gt;: Maximum capacity, no redundancy.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mirror (RAID 1)&lt;/strong&gt;: Redundancy, 50% capacity loss.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;RAID-Z1/Z2&lt;/strong&gt;: Requires 3+ disks for parity-based redundancy.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Compression&lt;/strong&gt;: &lt;code&gt;lz4&lt;/code&gt; is the recommended compression algorithm for performance.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ashift&lt;/strong&gt;: Set to &lt;code&gt;12&lt;/code&gt; for modern SSDs/NVMe to ensure proper block alignment.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Thin Provisioning&lt;/strong&gt;: Enabled for storage pools to allow for flexible disk allocation.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-initialize-zfs-pools-web-gui&#34;&gt;1. Initialize ZFS Pools (Web GUI)&lt;a class=&#34;anchor&#34; href=&#34;#1-initialize-zfs-pools-web-gui&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Navigate to: &lt;code&gt;Datacenter&lt;/code&gt; → &lt;code&gt;Node&lt;/code&gt; → &lt;code&gt;Disks&lt;/code&gt; → &lt;code&gt;ZFS&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Web Server Architecture on Proxmox</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/web_server_architecture/</link>
      <pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/web_server_architecture/</guid>
      <description>&lt;h1 id=&#34;web-server-architecture-on-proxmox&#34;&gt;Web Server Architecture on Proxmox&lt;a class=&#34;anchor&#34; href=&#34;#web-server-architecture-on-proxmox&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;High-level architectural strategies for deploying web development environments on Proxmox, focusing on balancing isolation with resource efficiency.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;LXC for Services&lt;/strong&gt;: Use LXC containers for lightweight, single-purpose services (e.g., Nginx, Databases) to minimize overhead.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VM for Complex Workloads&lt;/strong&gt;: Use full VMs when running Docker, Kubernetes, or when custom kernel modules are required.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reverse Proxy Pattern&lt;/strong&gt;: Always use a reverse proxy (Nginx Proxy Manager, Traefik, or C/Caddy) to handle SSL termination and route traffic to multiple internal services.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Database Isolation&lt;/strong&gt;: Separate databases into their own containers/VMs to improve security and facilitate independent backups.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;networking-patterns&#34;&gt;Networking Patterns&lt;a class=&#34;anchor&#34; href=&#34;#networking-patterns&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bridge Mode&lt;/strong&gt;: Default &lt;code&gt;vmbr0&lt;/code&gt; for services requiring LAN access.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Internal Network&lt;/strong&gt;: Use secondary bridges (e.g., &lt;code&gt;vmbr1&lt;/code&gt;) for isolated communication between web servers and databases.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;storage-patterns&#34;&gt;Storage Patterns&lt;a class=&#34;anchor&#34; href=&#34;#storage-patterns&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local-LVM&lt;/strong&gt;: Preferred for high-performance VM/container disks.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Directory Storage&lt;/strong&gt;: Suitable for container volumes and simpler storage needs.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This architecture plan was established in March 2025. The preference for LXCs over VMs for simple web services was a primary driver.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloudflare Integration: SSL &amp; DNS</title>
      <link>https://homelab.nbkelley.com/docs/security/cloudflare_integration/</link>
      <pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/security/cloudflare_integration/</guid>
      <description>&lt;h1 id=&#34;cloudflare-integration-ssl--dns&#34;&gt;Cloudflare Integration: SSL &amp;amp; DNS&lt;a class=&#34;anchor&#34; href=&#34;#cloudflare-integration-ssl--dns&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Methodology for securing OPNsense and Proxmox web interfaces using Cloudflare&amp;rsquo;s Origin CA certificates and protecting the WAN via Cloudflare-specific firewall rules.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;SSL Mode&lt;/strong&gt;: Cloudflare SSL/TLS setting must be set to &lt;strong&gt;Full (Strict)&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Security Pattern&lt;/strong&gt;: Use &lt;strong&gt;Cloudflare IP Aliases&lt;/strong&gt; on OPNsense to restrict WAN HTTPS (Port 443) access exclusively to Cloudflare&amp;rsquo;s IP ranges.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DNS Strategy&lt;/strong&gt;: Use A records with &lt;strong&gt;Proxy (Orange Cloud)&lt;/strong&gt; enabled for web services to leverage DDoS protection.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cloudflare-origin-ssl-opnsense&#34;&gt;Cloudflare Origin SSL (OPNsense)&lt;a class=&#34;anchor&#34; href=&#34;#cloudflare-origin-ssl-opnsense&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Generate Cert&lt;/strong&gt;: In Cloudflare, go to &lt;code&gt;SSL/TLS → Origin Server&lt;/code&gt; and create a certificate for the domain.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Import to OPNsense&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;System → Trust → Certificates&lt;/code&gt; → &lt;strong&gt;Import existing Certificate&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Paste PEM (Cert) and Private Key.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Assign to WebUI&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;System → Settings → Administration&lt;/code&gt; → Set &lt;strong&gt;SSL Certificate&lt;/strong&gt; to the imported Cloudflare cert.&lt;/li&gt;&#xA;&lt;li&gt;Restart WebGUI: &lt;code&gt;configctl webgui restart&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;wan-hardening-opnsense&#34;&gt;WAN Hardening (OPNsense)&lt;a class=&#34;anchor&#34; href=&#34;#wan-hardening-opnsense&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Create Alias&lt;/strong&gt;: &lt;code&gt;Firewall → Aliases&lt;/code&gt; → &lt;strong&gt;URL Table Alias&lt;/strong&gt;.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Name: &lt;code&gt;Cloudflare_IPs&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;URL: &lt;code&gt;https://www.cloudflare.com/ips-v4&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Firewall Rule&lt;/strong&gt;: &lt;code&gt;Firewall → Rules → WAN&lt;/code&gt;.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Pass&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Source&lt;/strong&gt;: &lt;code&gt;Cloudflare_IPs&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Destination Port&lt;/strong&gt;: &lt;code&gt;443&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Block Rule&lt;/strong&gt;: Add a block rule for port 443 from all other sources at the bottom of the WAN list.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Note: If the browser shows &amp;ldquo;Not Secure&amp;rdquo; after import, ensure the &lt;strong&gt;Cloudflare Origin CA Root Certificate&lt;/strong&gt; is also imported into OPNsense &lt;code&gt;System → Trust → Authorities&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OPNsense DHCP Configuration</title>
      <link>https://homelab.nbkelley.com/docs/networking/opnsense_dhcp/</link>
      <pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/opnsense_dhcp/</guid>
      <description>&lt;h1 id=&#34;opnsense-dhcp-configuration&#34;&gt;OPNsense DHCP Configuration&lt;a class=&#34;anchor&#34; href=&#34;#opnsense-dhcp-configuration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Procedures for modifying DHCPv4 ranges and identifying other network segments where IP assignment ranges must be managed to prevent conflicts.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;DHCP Scope Management&lt;/strong&gt;: Always ensure static leases or reserved IPs (like Proxmox) are excluded from the dynamic DHCP range to prevent IP conflicts.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Subnet Alignment&lt;/strong&gt;: DHCP ranges must reside within the defined subnet (e.g., &lt;code&gt;/24&lt;/code&gt; for &lt;code&gt;192.168.0.0/24&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;dhcpv4-modification&#34;&gt;DHCPv4 Modification&lt;a class=&#34;anchor&#34; href=&#34;#dhcpv4-modification&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Navigate to &lt;strong&gt;Services → DHCPv4 → [Interface]&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Under &lt;strong&gt;General DHCP Options&lt;/strong&gt;, set the &lt;strong&gt;Range&lt;/strong&gt; (Start and End IP).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Save&lt;/strong&gt; and &lt;strong&gt;Apply&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;other-assignment-areas-to-monitor&#34;&gt;Other Assignment Areas to Monitor&lt;a class=&#34;anchor&#34; href=&#34;#other-assignment-areas-to-monitor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;DHCPv6&lt;/strong&gt;: Found under &lt;code&gt;Services → DHCPv6 → [Interface]&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPNs&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;OpenVPN: &lt;code&gt;VPN → Open/IPsec → [Server]&lt;/code&gt; (Tunnel Network).&lt;/li&gt;&#xA;&lt;li&gt;WireGuard: Manual assignment per peer.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VLANs&lt;/strong&gt;: Each VLAN interface requires its own DHCP scope.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;As of March 2025, this covers the standard DHCPv4/v6 setup for the LAN and VLAN interfaces.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox Network Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox_networking/</link>
      <pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox_networking/</guid>
      <description>&lt;h1 id=&#34;proxmox-network-troubleshooting&#34;&gt;Proxmox Network Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-network-troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Troubleshooting steps for resolving connectivity loss to Proxmox nodes, specifically addressing IP conflicts and subnet mismatches.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Static IP Reservation&lt;/strong&gt;: Proxmox nodes should always have a static IP (e.g., &lt;code&gt;192.168.0.69&lt;/code&gt;) that is &lt;strong&gt;excluded&lt;/strong&gt; from the OPNsense DHCP pool.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;troubleshooting-workflow&#34;&gt;Troubleshooting Workflow&lt;a class=&#34;anchor&#34; href=&#34;#troubleshooting-workflow&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verify Connectivity&lt;/strong&gt;: &lt;code&gt;ping 192.168.0.69&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Check Local Config&lt;/strong&gt;: Log in via console and verify &lt;code&gt;/etc/network/interfaces&lt;/code&gt;:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;auto vmbr0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;iface vmbr0 inet static&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;address 192.168.0.69/24&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gateway 192.168.0.1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;bridge-ports enp3s0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Check for IP Conflicts&lt;/strong&gt;: Ensure no other device (via DHCP) has been assigned &lt;code&gt;192.168.0.69&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ARP Cache&lt;/strong&gt;: Clear local ARP cache if IP conflicts are suspected: &lt;code&gt;arp -d 192.168.0.69&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Identified an issue where a DHCP client was assigned &lt;code&gt;192.168.0.69&lt;/code&gt;, conflicting with the Proxmox static IP.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Troubleshooting DeepSeek Language Switching</title>
      <link>https://homelab.nbkelley.com/docs/ai/deepseek_language_switching/</link>
      <pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/ai/deepseek_language_switching/</guid>
      <description>&lt;h1 id=&#34;troubleshooting-deepseek-language-switching&#34;&gt;Troubleshooting DeepSeek Language Switching&lt;a class=&#34;anchor&#34; href=&#34;#troubleshooting-deepseek-language-switching&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Local DeepSeek models may intermittently switch from English to Chinese mid-response. This is typically caused by training bias (heavy Chinese dataset influence), loss of context during long conversations, or mixed-language input prompts.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;To maintain English-only responses, the following parameters and prompting strategies should be applied:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Explicit Instruction&lt;/strong&gt;: Always include a system-level or initial prompt instruction to respond exclusively in English.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Temperature Control&lt;/strong&gt;: Use lower temperature settings (e.g., &lt;code&gt;0.3&lt;/code&gt;) to make the model more deterministic and less likely to drift.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Repetition Penalty&lt;/strong&gt;: Implement a &lt;code&gt;repetition_penalty&lt;/code&gt; (e.g., &lt;code&gt;1.2&lt;/code&gt;) to discourage the model from falling into repetitive patterns that might trigger language switching.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;system-message-pattern&#34;&gt;System Message Pattern&lt;a class=&#34;anchor&#34; href=&#34;#system-message-pattern&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;When using APIs or local inference engines that support system roles:&lt;/p&gt;</description>
    </item>
    <item>
      <title>VLAN Configuration: OPNsense &amp; Netgear MS308E</title>
      <link>https://homelab.nbkelley.com/docs/networking/vlan_setup/</link>
      <pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/vlan_setup/</guid>
      <description>&lt;h1 id=&#34;vlan-configuration-opnsense--netgear-ms308e&#34;&gt;VLAN Configuration: OPNsense &amp;amp; Netgear MS308E&lt;a class=&#34;anchor&#34; href=&#34;#vlan-configuration-opnsense--netgear-ms308e&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Configuration pattern for implementing tagged (trunk) and untagged (access) VLANs using OPNsense as the router and a Netgear MS308E managed switch.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;VLAN Naming/ID&lt;/strong&gt;: Example VLAN &amp;ldquo;Incánus&amp;rdquo; assigned ID &lt;code&gt;20&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Trunking Strategy&lt;/strong&gt;: The port connecting OPNsense to the Netgear switch must be configured as a &lt;strong&gt;Tagged&lt;/strong&gt; port for all active VLANs.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Access Port Strategy&lt;/strong&gt;: Ports for end-devices must be &lt;strong&gt;Untagged&lt;/strong&gt; for the specific VLAN, with the &lt;strong&gt;PVID&lt;/strong&gt; (Port VLAN ID) set to match that VLAN.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;opnsense-setup&#34;&gt;OPNsense Setup&lt;a class=&#34;anchor&#34; href=&#34;#opnsense-setup&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Create VLAN&lt;/strong&gt;: &lt;code&gt;Interfaces → Other Types → VLAN&lt;/code&gt; (Assign Parent Interface and Tag ID).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Assign Interface&lt;/strong&gt;: &lt;code&gt;Interfaces → Assignments&lt;/code&gt; (Add the new VLAN interface).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Configure IP&lt;/strong&gt;: Set a static IPv4 address (e.g., &lt;code&gt;192.168.20.1/24&lt;/code&gt; for VLAN 20).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DHCP&lt;/strong&gt;: Enable DHCPv4 under &lt;code&gt;Services → DHCPv4 → [VLAN Interface]&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;netgear-ms308e-setup&#34;&gt;Netgear MS308E Setup&lt;a class=&#34;anchor&#34; href=&#34;#netgear-ms308e-setup&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;VLAN Membership&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Trunk Port (to OPNsense)&lt;/strong&gt;: Set as &lt;strong&gt;Tagged&lt;/strong&gt; for all VLANs (e.g., VLAN 20, 30).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Access Port (to Device)&lt;/strong&gt;: Set as &lt;strong&gt;Untagged&lt;/strong&gt; for the target VLAN.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;PVID Configuration&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;For Access Ports, the &lt;strong&gt;PVID&lt;/strong&gt; must be updated to match the VLAN ID (e.g., Port 1: PVID 20).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Configuration established during the rollout of the &amp;ldquo;Incánus&amp;rdquo; network segment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox Network Configuration</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox_network/</link>
      <pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox_network/</guid>
      <description>&lt;h1 id=&#34;proxmox-network-configuration&#34;&gt;Proxmox Network Configuration&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-network-configuration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Procedures for manually updating the IP address and network interface settings on a Proxmox VE host via the command line.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Network configuration is managed via the &lt;code&gt;/etc/network/interfaces&lt;/code&gt; file. When changing network parameters, the Linux bridge (&lt;code&gt;vmbr0&lt;/code&gt;) must be updated to point to the correct physical interface.&lt;/p&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;To modify the IP, gateway, or interface, edit the configuration file:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nano /etc/network/interfaces&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example of a static configuration for a bridge interface:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox ZFS Storage &amp; Installation Patterns</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs/</link>
      <pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/proxmox-zfs/</guid>
      <description>&lt;h1 id=&#34;proxmox-zfs-storage--installation-patterns&#34;&gt;Proxmox ZFS Storage &amp;amp; Installation Patterns&lt;a class=&#34;anchor&#34; href=&#34;#proxmox-zfs-storage--installation-patterns&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Procedures for managing ZFS &lt;code&gt;rpool&lt;/code&gt; on single-disk Proxmox installations, including methods for limiting pool size and troubleshooting import failures.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Single Disk Size Limitation&lt;/strong&gt;: When installing Proxmox on a large disk but wanting to limit the ZFS pool to a specific size (e.g., 64GB) to leave room for other partitions, use the &lt;code&gt;hdsize&lt;/code&gt; parameter in the Proxmox installer&amp;rsquo;s &lt;strong&gt;Advanced Options&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Custom Partitioning Method&lt;/strong&gt;: For complex layouts, it is possible to manually partition a drive in Debian and then upgrade the system to Proxmox VE.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;zfs-pool-creation-manual&#34;&gt;ZFS Pool Creation (Manual)&lt;a class=&#34;anchor&#34; href=&#34;#zfs-pool-creation-manual&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;To create a ZFS pool with specific optimizations (ashift=12, compression=lz4) and a size limit:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Troubleshooting Network Interface Changes</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/network_troubleshooting/</link>
      <pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/network_troubleshooting/</guid>
      <description>&lt;h1 id=&#34;troubleshooting-network-interface-changes&#34;&gt;Troubleshooting Network Interface Changes&lt;a class=&#34;anchor&#34; href=&#34;#troubleshooting-network-interface-changes&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;When replacing a physical Network Interface Card (NIC)—for example, swapping a 2.5GbE card for a 1GbE card—the system will lose connectivity if the software configuration still references the old interface name.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Connectivity loss after a hardware swap is usually due to a mismatch in the &lt;code&gt;bridge-ports&lt;/code&gt; setting within the network configuration. The new NIC will likely have a different kernel interface name (e.g., changing from &lt;code&gt;enp0s1&lt;/code&gt; to &lt;code&gt;enp0s2&lt;/code&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Web Server Deployment Pattern (Beginner)</title>
      <link>https://homelab.nbkelley.com/docs/services/web-server-setup/</link>
      <pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/web-server-setup/</guid>
      <description>&lt;h1 id=&#34;web-server-deployment-pattern-beginner&#34;&gt;Web Server Deployment Pattern (Beginner)&lt;a class=&#34;anchor&#34; href=&#34;#web-server-deployment-pattern-beginner&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;For a beginner-friendly, lightweight, and scalable homelab setup, a stack consisting of Ubuntu Server LTS and Nginx is the recommended standard. This provides a balance of ease of use, extensive documentation, and low resource overhead.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: Ubuntu Server LTS (chosen for stability, community support, and ease of management).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Web Server&lt;/strong&gt;: Nginx (chosen over Apache for being lightweight, faster for static content, and better suited for future use as a reverse proxy).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Resource Allocation (Small Site)&lt;/strong&gt;: 1-2 CPU cores, 1-2 GB RAM, 10-2/GB Disk.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;nginx-site-configuration&#34;&gt;Nginx Site Configuration&lt;a class=&#34;anchor&#34; href=&#34;#nginx-site-configuration&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Default root directory: &lt;code&gt;/var/www/html&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wi-Fi Performance Optimization (U7 Lite)</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/wifi_optimization/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/wifi_optimization/</guid>
      <description>&lt;h1 id=&#34;wi-fi-performance-optimization-u7-lite&#34;&gt;Wi-Fi Performance Optimization (U7 Lite)&lt;a class=&#34;anchor&#34; href=&#34;#wi-fi-performance-optimization-u7-lite&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Diagnostic steps for addressing throughput discrepancies between wired (1 Gbps) and wireless (300 Mbps) connections on Wi-Fi 6/6E hardware.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Channel Width&lt;/strong&gt;: For high-speed Wi-Fi 6/6E, utilize &lt;strong&gt;80 MHz&lt;/strong&gt; or &lt;strong&gt;160 MHz&lt;/strong&gt; channel widths on the 5 GHz/6 GHz bands.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Band Steering&lt;/strong&gt;: Disable Band Steering if it causes frequent client roaming/drops.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;optimization-steps&#34;&gt;Optimization Steps&lt;a class=&#34;anchor&#34; href=&#34;#optimization-steps&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verify Link Speed&lt;/strong&gt;: Check client-side PHY rates (e.g., &lt;code&gt;netsh wlan show interfaces&lt;/code&gt; on Windows) to ensure the client is connecting via 5 GHz/6 GHz.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;AP Settings (Unifi/Ubiquiti)&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mode&lt;/strong&gt;: Set to &lt;code&gt;HE (Wi-Fi 6)&lt;/code&gt; or &lt;code&gt;EHT (Wi-Fi 7)&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Channel Width&lt;/strong&gt;: Set to &lt;code&gt;80 MHz&lt;/code&gt; or &lt;code&gt;160 MHz&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Minimum Data Rate&lt;/strong&gt;: Set to &lt;code&gt;24 Mbps&lt;/code&gt; to disable legacy (802.11b/g) rates.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Client-Side&lt;/strong&gt;: Disable Wi-Fi Power Saving mode on Linux clients:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iw dev wlan0 set power_save off&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Addressed a specific case where a U7 Lite was capped at 300 Mbps due to potential client-side or channel width limitations.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
