<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Services on homelab</title>
    <link>https://homelab.nbkelley.com/docs/services/</link>
    <description>Recent content in Services on homelab</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 01 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://homelab.nbkelley.com/docs/services/index.xml" rel="self" type="application/rss+xml" />
    <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>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>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>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>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>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>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>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>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>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>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>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>
  </channel>
</rss>
