<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0">
  <title>Posts tagged: homelab Archive</title>
  <id>https://pype.dev/tags/homelab/archive/atom.xml</id>
  <updated>2026-10-06T21:30:00Z</updated>
  <subtitle>All posts with the tag &#34;homelab&#34;</subtitle>
  <link href="https://pype.dev/tags/homelab/" rel="alternate" type="text/html"></link>
  <link href="https://pype.dev/tags/homelab/archive/atom.xml" rel="self" type="application/atom+xml"></link>
  <link href="https://pype.dev/tags/homelab/atom.xml" rel="current" type="application/atom+xml"></link>
  <author>
    <name>Nic Payne</name>
  </author>
  <generator uri="https://github.com/WaylonWalker/markata-go">markata-go</generator>
  <fh:complete></fh:complete>
  <entry>
    <title>The Faulted Disk: harbor Replacement Writeup</title>
    <id>https://pype.dev/harbor-faulted-disk-replacement/</id>
    <updated>2026-10-06T21:30:00Z</updated>
    <published>2026-10-06T21:30:00Z</published>
    <link href="https://pype.dev/harbor-faulted-disk-replacement/" rel="alternate" type="text/html"></link>
    <summary type="text">The sequel to panicking-led-to-losing-my-desktop — this time the monitoring actually caught the disk dying, and nothing was lost.</summary>
    <content type="html">&lt;p&gt;The sequel to &lt;a href=&#34;/panicking-led-to-losing-my-desktop&#34;&gt;panicking-led-to-losing-my-desktop&lt;/a&gt; — this time the monitoring actually caught the disk dying, and nothing was lost.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-happened&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;What happened&lt;/span&gt; &lt;a href=&#34;#what-happened&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;harbor&lt;/code&gt; is my replica pool — a 10.9T mirror (2x 12TB) that receives syncoid snapshots from &lt;code&gt;tank&lt;/code&gt;. One side of the mirror, a Seagate Exos &lt;code&gt;ST12000NM0127&lt;/code&gt; (serial &lt;code&gt;ZJV4QFLB&lt;/code&gt;, &lt;code&gt;/dev/sdb&lt;/code&gt;), went &lt;strong&gt;FAULTED&lt;/strong&gt; with 14 read + 22 checksum errors.&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mirror-0                              DEGRADED     0     0     0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ata-ST12000VN0008-2PH103_ZTM0NFDW  ONLINE       0     0     0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ata-ST12000NM0127_ZJV4QFLB         FAULTED     14     0    22  too many errors&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The IronWolf mirror side carried the pool — &lt;code&gt;No known data errors&lt;/code&gt;. ZFS redundancy did exactly its job.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-difference-from-last-time&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The difference from last time&lt;/span&gt; &lt;a href=&#34;#the-difference-from-last-time&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Last failure: no monitoring, found out by accident months later, desktop died.&lt;/p&gt;&#xA;&lt;p&gt;This failure: SigNoz + node-exporter&amp;rsquo;s ZFS collector → &lt;code&gt;node_zfs_zpool_state{state=&amp;quot;degraded&amp;quot;}&lt;/code&gt; → alert rule → Gotify → my phone. The gotify notification fired &lt;em&gt;before&lt;/em&gt; I knew anything was wrong.&lt;/p&gt;&#xA;&lt;h2 id=&#34;diagnosis&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Diagnosis&lt;/span&gt; &lt;a href=&#34;#diagnosis&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Before &lt;code&gt;zpool clear&lt;/code&gt; or replace — check SMART. &lt;code&gt;smartctl-exporter&lt;/code&gt; already scrapes all disks into SigNoz, so I didn&amp;rsquo;t even need sudo:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Reallocated_Sector_Ct&lt;/code&gt; raw = &lt;strong&gt;3024&lt;/strong&gt; and counting&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Offline_Uncorrectable&lt;/code&gt; value/worst still 100 but raw errors climbing&lt;/li&gt;&#xA;&lt;li&gt;SMART overall: still PASS (SMART&amp;rsquo;s overall bit is conservative until threshold)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;3k+ remapped sectors is a platter going bad — not a cable blip. Verdict: replace, don&amp;rsquo;t clear.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-swap-the-annoying-part&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The swap (the annoying part)&lt;/span&gt; &lt;a href=&#34;#the-swap-the-annoying-part&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Hot-plug is never as smooth as it should be:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;zpool offline harbor &amp;lt;old&amp;gt;&lt;/code&gt; to stop writes to the dead drive — actually skipped; drive fell off the bus on its own&lt;/li&gt;&#xA;&lt;li&gt;New IronWolf &lt;code&gt;ZTN1CQ07&lt;/code&gt; in hand → plugged into ghost&amp;rsquo;s SATA → &lt;strong&gt;didn&amp;rsquo;t enumerate&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Forced rescan (&lt;code&gt;echo &amp;quot;- - -&amp;quot; | sudo tee /sys/class/scsi_host/host*/scan&lt;/code&gt;) → nothing&lt;/li&gt;&#xA;&lt;li&gt;Moved it to the &lt;em&gt;old drive&amp;rsquo;s port&lt;/em&gt; → nothing&lt;/li&gt;&#xA;&lt;li&gt;Sabrent USB dock on aurora → dock enumerated as &lt;code&gt;0B&lt;/code&gt; device, no disk behind it → reseated + replugged → &lt;strong&gt;drive spun up and appeared&lt;/strong&gt;: &lt;code&gt;/dev/sdd&lt;/code&gt;, 10.9T, old ZFS partition table on it (used drive — &lt;code&gt;part1&lt;/code&gt;/&lt;code&gt;part9&lt;/code&gt; layout)&lt;/li&gt;&#xA;&lt;li&gt;Back to ghost, direct SATA → enumerated as &lt;code&gt;sdb&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Lesson: &amp;ldquo;spins up but doesn&amp;rsquo;t enumerate&amp;rdquo; on direct SATA + dock-shows-0B = seating/power problem, not DOA. The drive was fine all along.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-replace&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The replace&lt;/span&gt; &lt;a href=&#34;#the-replace&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo zpool replace harbor &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ata-ST12000NM0127_ZJV4QFLB &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ata-ST12000VN0008-2PH103_ZTN1CQ07&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Resilver: &lt;strong&gt;8.80T in 18h38m, 0 errors&lt;/strong&gt; (~154M/s). Pool stayed online and usable the whole time.&lt;/p&gt;&#xA;&lt;p&gt;One gotcha: after resilver, &lt;code&gt;zpool status&lt;/code&gt; showed &lt;code&gt;errors: 1 data errors&lt;/code&gt; — but &lt;code&gt;zpool status -v&lt;/code&gt; showed an &lt;strong&gt;empty error list&lt;/strong&gt;. The corrupted data was already repaired; the counter was just stale. &lt;code&gt;sudo zpool clear harbor&lt;/code&gt; → clean.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-monitoring-that-made-this-possible&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The monitoring that made this possible&lt;/span&gt; &lt;a href=&#34;#the-monitoring-that-made-this-possible&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Wired during this session (all now in SigNoz):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;node_zfs_zpool_state&lt;/code&gt; — pool health (node-exporter zfs collector)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;smartctl-exporter&lt;/code&gt; — SMART attributes incl. reallocated sectors (the early-death signal)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;zfs-metrics.sh&lt;/code&gt; textfile bridge — sanoid &lt;code&gt;--monitor-*&lt;/code&gt; exit codes, zpool error counters, scrub ages, resilver %, syncoid last-success&lt;/li&gt;&#xA;&lt;li&gt;Alert rules → Gotify → phone&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The replication alerting even proved itself live: syncoid failed twice during the resilver window and I got paged on both. Turned out to be send-time contention — self-healed once resilver finished — but the notification path works end to end.&lt;/p&gt;&#xA;&lt;h2 id=&#34;remaining-homework&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Remaining homework&lt;/span&gt; &lt;a href=&#34;#remaining-homework&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Buy the replacement spare (the shelf&amp;rsquo;s empty now)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;10Fold&lt;/code&gt; datasets are garbage + have zero snapshots — destroy&lt;/li&gt;&#xA;&lt;li&gt;Every scheduled job emits &lt;code&gt;cron_last_success_epoch&lt;/code&gt; now — if a job dies silently again, I&amp;rsquo;ll know&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Same failure as April, opposite outcome. Redundancy did the protection; monitoring did the &lt;em&gt;detection&lt;/em&gt;. You need both.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;em&gt;Co-authored with Devin, who ran the monitoring stack, the SMART diagnosis, and the alerting loop.&lt;/em&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 Docker | Atuin Docs</title>
    <id>https://pype.dev/thoughts-871/</id>
    <updated>2025-11-22T20:58:59Z</updated>
    <published>2025-11-22T20:58:59Z</published>
    <link href="https://pype.dev/thoughts-871/" rel="alternate" type="text/html"></link>
    <summary type="text">A 2-fer... So I want to host atuin and share shell history across my machines on my tailnet I think... it&#39;s such a nice</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - Docker | Atuin Docs&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server&#34;&gt;Docker | Atuin Docs&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;A 2-fer... So I want to host atuin and share shell history across my machines on my tailnet I think... it&#39;s such a nice interface but I barely use it so I&#39;m sure the features will improve some aspects of my life. And secondly, this section on using systemd is interesting... I hadn&#39;t thought to use systemd to schedule container upgrades - sounds incredibly trivial and probably a widely practiced thing now that I say it out loud... Saving here for implementing something... sometime...&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Homelabbing Realization - Configs and Git</title>
    <id>https://pype.dev/homelabbing-realization-configs-and-git/</id>
    <updated>2025-11-13T05:48:15Z</updated>
    <published>2025-11-13T05:48:15Z</published>
    <link href="https://pype.dev/homelabbing-realization-configs-and-git/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;m back to brainstorming migrations away from Docker Compose to something that solves multi-node networking and secrets but I don&#39;t want to go to k8s... so...</summary>
    <content type="html">&lt;h2 id=&#34;realization&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Realization&lt;/span&gt; &lt;a href=&#34;#realization&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m back to brainstorming migrations away from Docker Compose to something that&#xA;solves multi-node networking and secrets but I don&amp;rsquo;t want to go to k8s&amp;hellip; so my&#xA;options are probably Docker Swarm or Nomad. As I wrestle mentally here I was&#xA;thinking about one of my issues with multi-node setup is that I still keep&#xA;everything out of one git repo, so if something gets managed remotely then I&#xA;get out of sync. Best example is dashy, Due to some constraint of wanting to be&#xA;as close to zero-day deployment-ready as possible, I think I overcomplicate&#xA;some of the simple stuff - like it&amp;rsquo;s ok to just have to put a file on a server&#xA;for a container to start the first time&amp;hellip; That doesn&amp;rsquo;t mean ansible is a&#xA;requirement, in fact lately I&amp;rsquo;ve just leaned into just recipes. But even then,&#xA;I cornered myself into tracking my dashy config in git, so I&amp;rsquo;m hesitant to ever&#xA;update it in the browser cause I&amp;rsquo;ll have to redownload the config, reconcile&#xA;the formatting differences in my repo (there&amp;rsquo;s a reason for this that a linter&#xA;doesn&amp;rsquo;t ssolve&amp;hellip;), etc&amp;hellip;. but in all of my brainstorming I just decided that&#xA;my dashy config doesn&amp;rsquo;t have to live in git&amp;hellip; it can just be on the zfs&#xA;storage, which is backed up, and configured via the app itself&amp;hellip; the config&#xA;can simply be apart of the data and container lifecycle, it doesn&amp;rsquo;t have to be&#xA;apart of the infra lifecycle.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>RepoFlow Robot User</title>
    <id>https://pype.dev/repoflow-robot-user/</id>
    <updated>2025-11-10T09:24:25Z</updated>
    <published>2025-11-10T09:24:25Z</published>
    <link href="https://pype.dev/repoflow-robot-user/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;m trying to lean into repoFlow at home, and model some slightly better patterns than open borders to artifacts across all my services. As I&#39;m getting...</summary>
    <content type="html">&lt;p&gt;I&amp;rsquo;m trying to lean into &lt;a href=&#34;https://repoflow.io&#34;&gt;repoFlow&lt;/a&gt; at home, and model some slightly better&#xA;patterns than open borders to artifacts across all my services. As I&amp;rsquo;m getting repoflow&#xA;going I see that I can make users in the console, but then I do have to invite&#xA;users to workspaces with a manually generate invite link.&lt;/p&gt;&#xA;&lt;p&gt;The workspaces an abstraction layer, and in each workspace can be many kinds of&#xA;repositories. For my purposes I&amp;rsquo;ll probably have 2 workspaces, even though 1&#xA;would almost certainly suffice.&lt;/p&gt;&#xA;&lt;p&gt;There doesn&amp;rsquo;t seem to be a way to add a user to a workspace from the admin&#xA;setting so for a while I was pretty confused why I couldn&amp;rsquo;t add my robot user&#xA;to a docker repository in my main workspace&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;After generating the invite link and accepting though then I see in the workspace settings a&#xA;simple click to give the robot user access to all repos (if you want)&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251111122419_580b2ad4.png&#34; alt=&#34;20251111122419_580b2ad4.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251110162252_6c7b2fe9.png&#34; alt=&#34;20251110162252_6c7b2fe9.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;&lt;code&gt;Can manage&lt;/code&gt; allows the user to mutate tags (ie. push &lt;code&gt;latest&lt;/code&gt; docker tags). If&#xA;the user only has &lt;code&gt;Can deploy&lt;/code&gt; then they can only create new artifacts (ie. not&#xA;mutate any tags)&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Proxy Pull Docker Images From Self-Hosted Container Registry Through Self-Hosted Repoflow</title>
    <id>https://pype.dev/proxy-pull-docker-images-from-self-hosted-container-registry-through-self-hosted-repoflow/</id>
    <updated>2025-08-12T06:59:02Z</updated>
    <published>2025-08-12T06:59:02Z</published>
    <link href="https://pype.dev/proxy-pull-docker-images-from-self-hosted-container-registry-through-self-hosted-repoflow/" rel="alternate" type="text/html"></link>
    <summary type="text">This post is a short write-up of an issue I had while exploring Reploflow - a super solid artifactory-esq replacement for the homelab (and enterprise!). I&#39;ve...</summary>
    <content type="html">&lt;p&gt;This post is a short write-up of an issue I had while exploring &lt;a href=&#34;https://repoflow.io&#34;&gt;Reploflow&lt;/a&gt; - a&#xA;super solid artifactory-esq replacement for the homelab (and enterprise!). I&amp;rsquo;ve been playing with&#xA;it and have tried to setup a few artifact repos that I&amp;rsquo;m familiar with - docker&#xA;and pypi.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pypi&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;PyPi&lt;/span&gt; &lt;a href=&#34;#pypi&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t a post about repoflow, but I had an issue with pypi and Tomer was&#xA;EXTREMELY responsive in helping to fix my issue and patch repoflow within a day&#xA;of me reporting the issue via email!&lt;/p&gt;&#xA;&lt;h2 id=&#34;docker&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Docker&lt;/span&gt; &lt;a href=&#34;#docker&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;For docker I have a few options I just wanted to see work - obviously&#xA;proxy pull from Dockerhub for ease, but also in the interim I&amp;rsquo;d like to proxy&#xA;pull from my original container registry to avoid having to update any homelab config just yet.&#xA;Now, obviously I&amp;rsquo;ll have to update all my build pipelines to start using&#xA;repoflow, and my homelab configuration to reference the repoflow docker&#xA;repository rather than my existing registry.&lt;/p&gt;&#xA;&lt;p&gt;But there&amp;rsquo;s something to bear in mind if maintaining that middle registry -&#xA;turns out a there&amp;rsquo;s a default namespace in dockerhub &lt;code&gt;/library/&lt;/code&gt; and repoflow&#xA;expects this standard across any docker registry, so it&amp;rsquo;s pull paths fully&#xA;resolve to an incorrect tag if you don&amp;rsquo;t take this into account in your&#xA;existing infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;TLDR: if you tag an image &lt;code&gt;myregistry/ubuntu:latest&lt;/code&gt; and push it&#xA;then try to pull it back through repoflow then repoflow expects the image to be&#xA;&lt;code&gt;myregistry/library/ubuntu:latest&lt;/code&gt;. I think repoflow should support&#xA;configurating the namespace/org for the images - but in the meantime I can&#xA;go find all my images and update my build scripts to add /library/ to my&#xA;tags&amp;hellip; or while I&amp;rsquo;m doing that I can just push to repoflow directly&amp;hellip; All in&#xA;all, nice little lesson on namespaces in docker repos and third-party tooling.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 My Ultimate Self-hosting Setup</title>
    <id>https://pype.dev/thoughts-764/</id>
    <updated>2025-07-25T19:56:38Z</updated>
    <published>2025-07-25T19:56:38Z</published>
    <link href="https://pype.dev/thoughts-764/" rel="alternate" type="text/html"></link>
    <summary type="text">great post on self-hosting. I think in a lot of similar ways and had a siar journey. There&#39;s things I want to accomplish</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://codecaptured.com/blog/my-ultimate-self-hosting-setup/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://codecaptured.com/blog/my-ultimate-self-hosting-setup/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - My Ultimate Self-hosting Setup&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://codecaptured.com/blog/my-ultimate-self-hosting-setup/&#34;&gt;My Ultimate Self-hosting Setup&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;great post on self-hosting. I think in a lot of similar ways and had a siar journey. There&#39;s things I want to accomplish as time goes on, looking for motivation to get a post like this going myself&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Using restic to backup my home directory</title>
    <id>https://pype.dev/using-restic-to-backup-my-home-directory/</id>
    <updated>2025-07-16T09:12:26Z</updated>
    <published>2025-07-16T09:12:26Z</published>
    <link href="https://pype.dev/using-restic-to-backup-my-home-directory/" rel="alternate" type="text/html"></link>
    <summary type="text">I need to backup my personal $HOME to my NAS cause there&#39;s a lot in there, and mostly my git projects with .env files all over. Plus some docker data</summary>
    <content type="text">&#xA;# Intro&#xA;&#xA;I need to backup my personal $HOME to my NAS cause there&#39;s a lot in there, and&#xA;mostly my git projects with .env files all over. Plus some docker data&#xA;&#xA;## Why Not ZFS?&#xA;&#xA;GREAT QUESTION! It&#39;s because I struggled getting all the syncoid/sanoid&#xA;requirements installed on my Aurora OS.... I like the immutable desktop trend,&#xA;but I don&#39;t understand rpm-ostree enough to properly get all the lower level&#xA;kernel stuff setup in a way I trust. So because I don&#39;t have ZFS at $HOME&#xA;what&#39;s a boy to do?&#xA;&#xA;`rsync` would probably work fine especially if I [[rsync-like-a-pro]] but I figured I could cobble together some other tech and broaden my horizons...&#xA;&#xA;## Enter restic&#xA;&#xA;Apparently [restic](https://restic.net/) has been around for a while, and you can run it in a container... awesome that&#39;s all I needed to hear...&#xA;&#xA;## How?&#xA;&#xA;I&#39;ll use a docker compose stack for this... typically I think running `restic`&#xA;right on the host is the way to go, but on my desktop I float between my host&#xA;and distroboxes and to keep things as simple as possible, even though less&#xA;efficient, I want to manage everything through containers as my homelab gets&#xA;built out and eventually I&#39;ll have a more full-featured ecosystem.&#xA;&#xA;## The Value&#xA;&#xA;You can find code below and an example repo that more or less is what I use for my desktop backup but that&#39;s primarily what I was after.... backing up the data on my desktop to my NAS in a way that:&#xA;&#xA;1. I wouldn&#39;t have to &#34;remember&#34; how I was doing it&#xA;&#xA;- I accomplish this by having good git repo organization and README files that explain my own usage patterns&#xA;&#xA;2. Tracked snapshots&#xA;&#xA;- I need some kind of snapshotting - `zfs` has spoiled me, and turns out `restic` has some amount of support for it&#xA;&#xA;3. Running in docker would be ideal for now so that I don&#39;t need to worry about installing specific binaries across machine while I build out my patterns&#xA;&#xA;With this setup I get to backup my $HOME to my NAS which contains 1. docker&#xA;volume info for all the AI workloads I run on my desktop and 2. all my&#xA;sensitive info in my git repos is at least backed up in a way that I can&#xA;recover `.env` files with relative ease...&#xA;&#xA;# Code&#xA;&#xA;Check out the [Example GH&#xA;Repo](https://github.com/pypeaday/docker-compose-restic) but I&#39;ll drop key file&#xA;contents here for a quick read if you&#39;re interested in some of the setup... but&#xA;the blog post mostly ends here&#xA;&#xA;## The Files&#xA;&#xA;We have a `docker-compose.yml` of course&#xA;&#xA;```yaml&#xA;services:&#xA;  backup:&#xA;    image: restic/restic:latest&#xA;    network_mode: host&#xA;    container_name: restic_backup&#xA;    hostname: restic-backup-runner&#xA;    env_file:&#xA;      - .env&#xA;    environment:&#xA;      # The location of the backup repository inside the container&#xA;      - RESTIC_REPOSITORY=/target&#xA;      # The location of the password file inside the container&#xA;      - RESTIC_PASSWORD_FILE=/password&#xA;    volumes:&#xA;      # --- Source and Config Mounts ---&#xA;      - &#34;${BACKUP_SOURCE}:/source:ro&#34;&#xA;      - &#34;${RESTIC_PASSWORD_FILE}:/password:ro&#34;&#xA;      - &#34;./backup-and-prune.sh:/usr/local/bin/backup-and-prune:ro&#34;&#xA;&#xA;      # --- Persistent Data Mounts ---&#xA;      - &#34;./.ssh:/root/.ssh:rw&#34;&#xA;      - &#34;./.cache:/root/.cache:rw&#34;&#xA;&#xA;    # Set the default entrypoint to our new script. This will be executed when&#xA;    # the container starts, unless overridden.&#xA;    entrypoint: [&#34;/usr/local/bin/backup-and-prune&#34;]&#xA;```&#xA;&#xA;Your `.env` file will need to look like this&#xA;&#xA;```bash&#xA;``# HOST related variables&#xA;# The source directory to back up (absolute path)&#xA;BACKUP_SOURCE=/home/nic&#xA;&#xA;# --- Restic Configuration ---&#xA;# The file containing the restic repository password (absolute path on host)&#xA;HOST_RESTIC_PASSWORD_FILE=/home/nic/projects/personal/homelab-mono/dataops/docker/.restic-password&#xA;# The SSH private key to use for connecting to the NAS (absolute path on host)&#xA;# It&#39;s recommended to use a dedicated key for this purpose.&#xA;SSH_PRIVATE_KEY_FILE=/home/nic/.skm/ghost/id_rsa&#xA;&#xA;# Container Env Vars&#xA;# the container makes the sftp connection using my credentials, but nonetheless the container needs them, so this isn&#39;t envrc stuff&#xA;&#xA;# --- SFTP/SSH Connection Details for the NAS ---&#xA;SFTP_USER=nic&#xA;SFTP_HOST=ghost&#xA;# The path on the NAS where the restic repository will be stored&#xA;SFTP_PATH=/tank/encrypted/nas/nic-home/&#xA;&#xA;# --- Restic Configuration ---&#xA;&#xA;RESTIC_REPOSITORY=/target&#xA;RESTIC_PASSWORD_FILE=/password&#xA;```&#xA;&#xA;And then the backup script that the container will execute is something like this:&#xA;&#xA;```bash&#xA;&#xA;#!/bin/sh&#xA;set -e # Exit immediately if a command exits with a non-zero status.&#xA;&#xA;# Construct the repository path from environment variables passed by docker-compose&#xA;REPO=&#34;sftp:${SFTP_USER}@${SFTP_HOST}:${SFTP_PATH}&#34;&#xA;&#xA;# 1. Run the backup&#xA;# -----------------&#xA;echo &#34;--- Starting backup for ${BACKUP_SOURCE} ---&#34;&#xA;restic backup /source --verbose -r &#34;${REPO}&#34;&#xA;echo &#34;--- Backup complete ---&#34;&#xA;&#xA;# 2. Clean up old snapshots according to the policy&#xA;# --------------------------------------------------&#xA;echo &#34;--- Pruning old snapshots ---&#xA;(Policy: keep last 7 daily, 4 weekly, 6 monthly)&#34;&#xA;restic forget \&#xA;    --prune \&#xA;    --keep-daily 7 \&#xA;    --keep-weekly 4 \&#xA;    --keep-monthly 6 \&#xA;    -r &#34;${REPO}&#34;&#xA;&#xA;echo &#34;--- Backup and prune process finished successfully ---&#34;&#xA;```&#xA;&#xA;## Systemd&#xA;&#xA;Finally there&#39;s a systemd unit and timer file in there so you can setup a systemd service for the backup&#xA;&#xA;### service&#xA;&#xA;```bash&#xA;&#xA;[Unit]&#xA;Description=Run Restic backup to NAS using Docker Compose&#xA;# We are running this as a user service, so we assume that the system-level&#xA;# docker.service is already running.&#xA;After=network-online.target&#xA;&#xA;[Service]&#xA;Type=oneshot&#xA;# Set the working directory to where your docker-compose.yml and .env file are located&#xA;WorkingDirectory=/home/user/nas-backup/docker&#xA;&#xA;# The command to execute. We use the full path to docker-compose for reliability.&#xA;# You may need to adjust this path if &#39;docker compose&#39; is installed elsewhere.&#xA;ExecStart=/usr/bin/docker compose run --rm backup&#xA;&#xA;[Install]&#xA;WantedBy=default.target&#xA;```&#xA;&#xA;### timer&#xA;&#xA;```bash&#xA;&#xA;[Unit]&#xA;Description=Run Restic backup job daily&#xA;&#xA;[Timer]&#xA;# Run daily at 2:00 AM&#xA;OnCalendar=daily&#xA;# Or uncomment for a specific time:&#xA;# OnCalendar=*-*-* 02:00:00&#xA;&#xA;# Run the backup immediately if the last scheduled run was missed (e.g., if the computer was off)&#xA;Persistent=true&#xA;&#xA;[Install]&#xA;WantedBy=timers.target&#xA;```&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Jellyfin</title>
    <id>https://pype.dev/jellyfin/</id>
    <updated>2025-07-11T20:39:00Z</updated>
    <published>2025-07-11T20:39:00Z</published>
    <link href="https://pype.dev/jellyfin/" rel="alternate" type="text/html"></link>
    <summary type="text">Jellyfin is the media server software I run at home</summary>
    <content type="html">&lt;p&gt;Jellyfin is the media server software I run at home&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Ghost</title>
    <id>https://pype.dev/ghost/</id>
    <updated>2025-07-11T20:23:35Z</updated>
    <published>2025-07-11T20:23:35Z</published>
    <link href="https://pype.dev/ghost/" rel="alternate" type="text/html"></link>
    <summary type="text">Ghost is my primary application server. These are the specs...</summary>
    <content type="text">&#xA;# Intro&#xA;&#xA;Ghost is my primary application server. These are the specs...&#xA;&#xA;&gt; I wrote about some of the specs in [[homelab-journey-part-1#current-homelab-setup]] but here is where I will keep up to date information&#xA;&#xA;## Why&#xA;&#xA;Why `ghost`? I don&#39;t know... I was going for a theme at one point it time, or&#xA;several points rather... and after giving up on the theatrics of a fully&#xA;consistent harry potter naming scheme across all my homelab entities, I decided&#xA;to just come up with some short aliases that were easy to type. So `ghost` was&#xA;born, and the backup server is `ghost-vault`.&#xA;&#xA;## CPU&#xA;&#xA;I have a `AMD Ryzen 7 5700G with Radeon Graphics @ 16x 4.426GHz` in this bad&#xA;boy... why this chip? Well I knew I wanted many cores, and I was previously on&#xA;a Ryzn 5 3600, which was fine but I noticed that as I started to develop with&#xA;containers more that I was going to want to take advnaatage of more cores...&#xA;&#xA;I also was pretty sure that the built-in graphics would be enough for the&#xA;acceleration requirements I had in mind - which was primarily [[jellyfin]].&#xA;&#xA;At this point in time, I think AMD was still beating Intel on most of the&#xA;benchmarks I tended to care about (I was watching channels like Bitwit and LTT&#xA;at the time of building this machine)&#xA;&#xA;So because of the moderate amount of cores and built-in GPU, I paid $229 for it&#xA;according to my Amazon history, and it&#39;s currently priced at $174, so that&#39;s a&#xA;pretty sweet deal if you&#39;re on AM4 and looking to upgrade in July of 2025&#xA;&#xA;## Memory&#xA;&#xA;I maxxed her out at 128 Gee Beez. I snagged that kit of Crucial that&#39;s all&#xA;black that we&#39;ve all seen on Amazon. I paid aboaut $90 for it, it&#39;s currently&#xA;priced way high for some reason, which is unfortunate. It&#39;s been totally fine&#xA;for me as far as memory performance goes - in that it&#39;s stable and I don&#39;t&#xA;think about it...&#xA;&#xA;## Boot&#xA;&#xA;I have a 1 TB NVMe in here to boot from. I think it&#39;s a Crucial P3&#xA;&#xA;## Storage&#xA;&#xA;Storage is the interesting bit, it&#39;s supposed to be the most rock solid but&#xA;it&#39;s also been the most fluid for me from a hardware perspective, and as of my&#xA;most recent case migration I think I&#39;m in a good spot..&#xA;&#xA;&gt; The case is a Sagitatius 8-bay NAS Chassis from aliexpress&#xA;&#xA;I use&#xA;[zfs](https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html)&#xA;and recommend you do to.... but this isn&#39;t a post about that&#xA;&#xA;My primary zpool is a 12TB ZFS Mirror, and I have another 12TB ZFS Mirror as an&#xA;on-prem replica plugged into this same box.&#xA;&#xA;There is a 4TB drive that serves as frigate&#39;s media directory - I wanted a&#xA;dedicated drive due to the write-intensive nature of the NVR.&#xA;&#xA;&gt; I backup to an offsite box using syncoid&#xA;&#xA;## OS&#xA;&#xA;I am currently running Ubuntu Server 24.04&#xA;&#xA;I am eager for Ubuntu to get zfs in their release that contains the zfs data&#xA;corruption with encrypted datasets but I don&#39;t expect to see it until 26.04 at&#xA;the earliest _fingers crossed_.&#xA;&#xA;## KVM&#xA;&#xA;I recently purchased a [jetkvm](https://www.jetkvm.com/) and it&#39;s exactly what&#xA;I need for both my main server and my backup off-site... An amazingly simple&#xA;and elegant solution to remote KVM.&#xA;&#xA;## Applications&#xA;&#xA;Currently I use `docker compose` to manage practically everything. Stay tuned&#xA;for more about those things&#xA;&#xA;I also have a few ansible playbooks for setting up my shell and some utilities&#xA;on my computers, including the server. They&#39;re in&#xA;[github](https://github.com/pypeaday/ansible-playbooks)&#xA;&#xA;Find more at [[the-homelab]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>The Homelab</title>
    <id>https://pype.dev/the-homelab/</id>
    <updated>2025-07-11T20:22:51Z</updated>
    <published>2025-07-11T20:22:51Z</published>
    <link href="https://pype.dev/the-homelab/" rel="alternate" type="text/html"></link>
    <summary type="text">This is the landing page for my homelab posts. It isn&#39;t a feed because I will write things here and link out to relevant parts of the homelab.</summary>
    <content type="text">&#xA;# The Lab&#xA;&#xA;This is the landing page for my homelab posts. It isn&#39;t a feed because I will&#xA;write things here and link out to relevant parts of the homelab.&#xA;&#xA;I&#39;ll probably have notes about the hardware mostly here.&#xA;&#xA;## Primary Application Server&#xA;&#xA;My main server is called [[ghost]]&#xA;&#xA;## Current Homelab Setup&#xA;&#xA;&gt; I copied this our of [[homelab-journey-part-1#current-homelab-setup]] for now to stub out what this page will link to&#xA;&#xA;## Ad blocking | Pi-Hole&#xA;&#xA;Hardware: pi-3&#xA;&#xA;I have a Raspberry Pi 3 hardwired in that is running pi-hole so that&#39;s been a&#xA;part of my infrastructure now for a long time.&#xA;&#xA;## Router | OPNSense&#xA;&#xA;!!! note &#34;stats&#34;&#xA;&#xA;    CPU: i5-8700&#xA;&#xA;    Memory: 8GB of whatever was in the box&#xA;&#xA;    Storage: 1TB SSD&#xA;&#xA;My router is an old Optiplex SFF 5060 I got from Amazon for less than $100.&#xA;So I&#39;m running a x86 system for my router with&#xA;OpenSense on it. Just seemed it to be another home lab standard and I&#39;d like to&#xA;someday bring pi-hole over there or use AdGuard or integrate those two things&#xA;maybe a little bit more completely but right now they are mostly separate.&#xA;&#xA;## Networking | VLANs&#xA;&#xA;There&#39;s a&#xA;managed switch in there for some VLAN tomfoolery for my cameras and an IOT&#xA;network type of a thing.&#xA;&#xA;## Networking | VPN | Tailscale&#xA;&#xA;They&#39;re on tailscale as well so my DNS happens over tailscale.&#xA;&#xA;## My Desktop&#xA;&#xA;!!! note &#34;stats&#34;&#xA;&#xA;    CPU: Ryzen 7 5700X&#xA;&#xA;    GPU: Nvidia 3090&#xA;&#xA;    Memory: 64 GB&#xA;&#xA;    Storage: 4TB SSD + 2 TB HDD for zfs backup&#xA;&#xA;    OS: Universal Blue Aurora&#xA;&#xA;My daily-driver desktop is somewhat apart of my homelab now as I have a 3090 in&#xA;there with 20 GB of VRAM so I can run some heavier LLMs for self-hosted AI&#xA;workloads. Everything in that space runs in a container and then I manage&#xA;docker containers with compose stacks and portainer for visibility.&#xA;&#xA;### Applications&#xA;&#xA;Some of the apps I run here are ollama, open-webui, automatic1111&#39;s stable diffusion webui, whisper-webui&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 Docker Brings Compose to the AI Agent Era | Docker</title>
    <id>https://pype.dev/thoughts-746/</id>
    <updated>2025-07-11T11:49:41Z</updated>
    <published>2025-07-11T11:49:41Z</published>
    <link href="https://pype.dev/thoughts-746/" rel="alternate" type="text/html"></link>
    <summary type="text">Seems like docker is leaning harder into compose - which is great for me as a heavy compose user. I had heard about some</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://www.docker.com/blog/build-ai-agents-with-docker-compose/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://www.docker.com/blog/build-ai-agents-with-docker-compose/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - Docker Brings Compose to the AI Agent Era | Docker&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://www.docker.com/blog/build-ai-agents-with-docker-compose/&#34;&gt;Docker Brings Compose to the AI Agent Era | Docker&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;Seems like docker is leaning harder into compose - which is great for me as a heavy compose user. I had heard about some of the LLM enablements directly through docker desktop - for example taking fuller advantage of the host&#39;s compute power without paying the penalty of the nvidia runtime or something... I can&#39;t claim to have followed it all but I heard &#34;run LLMs in docker directly for a bigger boost&#34; and I&#39;m in.&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 restic · Backups done right!</title>
    <id>https://pype.dev/thoughts-740/</id>
    <updated>2025-07-08T11:53:41Z</updated>
    <published>2025-07-08T11:53:41Z</published>
    <link href="https://pype.dev/thoughts-740/" rel="alternate" type="text/html"></link>
    <summary type="text">Welp, I need to be backing up my desktop home directory, specifically a directory of docker volume data... I thought dup</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://restic.net/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://restic.net/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - restic · Backups done right!&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://restic.net/&#34;&gt;restic · Backups done right!&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;Welp, I need to be backing up my desktop home directory, specifically a directory of docker volume data... I thought duplicati made sense, but that mostly targets cloud-based backends, and rsync is great but I wasn&#39;t sure how i wanted to manage the job. &#xA;Through a little AI chat I learned about restic and am working on a compose stack to run restic in a container to regularly backup my home directory via sftp to my NAS to then be swept up in my NAS backup workflow&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Thoughts To Nostr</title>
    <id>https://pype.dev/thoughts-to-nostr/</id>
    <updated>2025-07-08T08:30:35Z</updated>
    <published>2025-07-08T08:30:35Z</published>
    <link href="https://pype.dev/thoughts-to-nostr/" rel="alternate" type="text/html"></link>
    <summary type="text">I am trying to use temporal at home for running automated pipelines. It&#39;s definitely overkill for my use case but this is America...</summary>
    <content type="text">&#xA;I am trying to use [[temporal]] at home for running automated pipelines. It&#39;s&#xA;definitely overkill for my use case but this is America...&#xA;&#xA;So my first project is a system that takes my [[thoughts]] and posts them to&#xA;[[nostr]] as I briefly discussed in [[testing-a-postiz-change-locally]].&#xA;&#xA;I have temporal infrastructure setup in homelab-compose and then&#xA;homelab-temporal should probably be homelab-temporal-pipelines or something,&#xA;but it&#39;s the app code. I also have a repo homelab-social-media-pipelines -&#xA;which has been consolidated down into homelab-temporal. once that all works I&#xA;can destroy the homelab-social-media-pipelines repo&#xA;&#xA;NOTE: everything is moving to homelab-mono&#xA;&#xA;## Issue 01&#xA;&#xA;I am currently hitting a stupid python issue:&#xA;&#xA;```&#xA;nic in homelab-temporal   main    ×2  ×4  ×7 via   v3.12.8(homelab-temporal)   (dev) 󰒄&#xA;⬢ [devbox] ❯ python -c &#34;from homelab_temporal.postiz.postiz_client import PostizClient&#34;&#xA;(homelab-temporal)&#xA;nic in homelab-temporal   main    ×2  ×4  ×7 via   v3.12.8(homelab-temporal)   (dev) 󰒄&#xA;⬢ [devbox] ❯ python scripts/postiz/simple_post.py&#xA;Traceback (most recent call last):&#xA;  File &#34;/home/nic/projects/personal/homelab-temporal/scripts/postiz/simple_post.py&#34;, line 3, in &lt;module&gt;&#xA;    from homelab_temporal.postiz.postiz_client import PostizClient, process_for_nostr, process_for_x&#xA;ModuleNotFoundError: No module named &#39;homelab_temporal&#39;&#xA;```&#xA;&#xA;very dumb venv problem...&#xA;&#xA;## Resolution&#xA;&#xA;need to use `python -m` because the script is outside the project root? see [[2025-07-08-notes]] and the chatgpt notes for more on this but it works now&#xA;&#xA;## Thoughts Order&#xA;&#xA;as of [[2025-07-11-notes]] I have the thoughts ordering correct - we post the oldest thoughts up to the newest ones. Now I want more intros for the notes so they don&#39;t get too repetitive&#xA;&#xA;## TODOs&#xA;&#xA;[x] - destroy the homelab-social-media-pipelines repo&#xA;&#xA;[] - think about how to structure things more... monorepo in homelab-temporal might be hard to manage with AI tools due to context management... unsure though&#xA;&#xA;[] - create workflow and activities for thoughts to nostr... revisit diagram to see what you need to build out in the temporal repo&#xA;&#xA;[] - do something like this for github stars and then blog posts&#xA;&#xA;---&#xA;&#xA;I need to update my templates for nostr og images using this as fodder&#xA;&#xA;```html&#xA;&lt;!-- HTML Meta Tags --&gt;&#xA;&lt;title&gt;Nostr Design&lt;/title&gt;&#xA;&lt;meta&#xA;  name=&#34;description&#34;&#xA;  content=&#34;A comprehensive resource for designers and developers to build successful nostr products&#34;&#xA;/&gt;&#xA;&#xA;&lt;!-- Facebook Meta Tags --&gt;&#xA;&lt;meta property=&#34;og:url&#34; content=&#34;https://nostrdesign.org&#34; /&gt;&#xA;&lt;meta property=&#34;og:type&#34; content=&#34;website&#34; /&gt;&#xA;&lt;meta property=&#34;og:title&#34; content=&#34;Nostr Design&#34; /&gt;&#xA;&lt;meta&#xA;  property=&#34;og:description&#34;&#xA;  content=&#34;A comprehensive resource for designers and developers to build successful nostr products&#34;&#xA;/&gt;&#xA;&lt;meta&#xA;  property=&#34;og:image&#34;&#xA;  content=&#34;https://nostrdesign.org/img/nostr-cover.jpg&#34;&#xA;/&gt;&#xA;&#xA;&lt;!-- Twitter Meta Tags --&gt;&#xA;&lt;meta name=&#34;twitter:card&#34; content=&#34;summary_large_image&#34; /&gt;&#xA;&lt;meta property=&#34;twitter:domain&#34; content=&#34;nostrdesign.org&#34; /&gt;&#xA;&lt;meta property=&#34;twitter:url&#34; content=&#34;https://nostrdesign.org&#34; /&gt;&#xA;&lt;meta name=&#34;twitter:title&#34; content=&#34;Nostr Design&#34; /&gt;&#xA;&lt;meta&#xA;  name=&#34;twitter:description&#34;&#xA;  content=&#34;A comprehensive resource for designers and developers to build successful nostr products&#34;&#xA;/&gt;&#xA;&lt;meta&#xA;  name=&#34;twitter:image&#34;&#xA;  content=&#34;https://nostrdesign.org/img/nostr-cover.jpg&#34;&#xA;/&gt;&#xA;```&#xA;&#xA;## Dockerizing&#xA;&#xA;I think I wnt to dockerize my workers and workflows... build them out of the `homelab-temporal` repo but then run them in compose stacks... that can get stitched together better but for now that&#39;ll probably be a good target.&#xA;I have things to think about though... for example the blog builder needs my ssh keys, or an ssh key for a user... also git is a little mess up anyways&#xA;&#xA;- temporal [link](https://temporal-ui.paynepride.com/namespaces/default/workflows/blog-build-ee488b69-6cdf-4819-bccd-df183cf8ec13/01981101-e48b-712a-96db-328ce720c13c/history)&#xA;&#xA;## Temporal&#xA;&#xA;I haev temporal workflows and stuff that all seem to work&#xA;&#xA;on [[ 2025-08-08-notes ]] I had issues with my nostr relay being too public, so I shut it down, reconfigured postiz and stuff and got it workign again, more restricted and in-memory database&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 HomeBox</title>
    <id>https://pype.dev/thoughts-737/</id>
    <updated>2025-07-07T10:48:12Z</updated>
    <published>2025-07-07T10:48:12Z</published>
    <link href="https://pype.dev/thoughts-737/" rel="alternate" type="text/html"></link>
    <summary type="text">I stumbled onto homebox this morning scrolling a newsletter and it looks like something I&#39;ve been lightly thinking about</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://homebox.software/en/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://homebox.software/en/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - HomeBox&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://homebox.software/en/&#34;&gt;HomeBox&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;I stumbled onto homebox this morning scrolling a newsletter and it looks like something I&#39;ve been lightly thinking about for a while. I have wanted a way to track all the things in my house, but I haven&#39;t given it enough thought to come up with the specific manner in which to do it. I&#39;ve seen other asset trackers but today this one excited me. &#xA;I spun it up at home quick and it looks great - It&#39;ll take quite a lot of time to fill it out but here&#39;s a few features I love out of the gate:&#xA;&#xA;1. the default setup seems very useful - pre-populated locations and tags for cataloging assets reduces the barrier to entry for me&#xA;2. it&#39;s pretty nice lookin&#xA;3. there&#39;s a label generator including qr codes that take you to the record in your homebox... I had an idea for something like this a while ago - qr codes to link to instructions for things around the house (like cleaning the oven or something). So it&#39;s neat to see that similar idea played out in another more useful way!&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 Self-Hosting A Cluster On Old Phones | Hackaday</title>
    <id>https://pype.dev/thoughts-735/</id>
    <updated>2025-07-06T11:30:17Z</updated>
    <published>2025-07-06T11:30:17Z</published>
    <link href="https://pype.dev/thoughts-735/" rel="alternate" type="text/html"></link>
    <summary type="text">Came across a blog and article on using a mobile OS to self-host a cluster on old phones... I happen to keep several old</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - Self-Hosting A Cluster On Old Phones | Hackaday&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev&#34;&gt;Self-Hosting A Cluster On Old Phones | Hackaday&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;Came across a blog and article on using a mobile OS to self-host a cluster on old phones... I happen to keep several old android phones lying around and although I&#39;m not presently super interested in figuring out an android/arm based homelab, I am excited for the next coming years when I&#39;m sure it&#39;ll only get easier, phones will only be more powerful, and perhaps we&#39;ll be running full blown CV pipeline in k8s clusters running on Pixel devices!&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Github Star Sorter</title>
    <id>https://pype.dev/github-star-sorter/</id>
    <updated>2025-07-01T08:01:31Z</updated>
    <published>2025-07-01T08:01:31Z</published>
    <link href="https://pype.dev/github-star-sorter/" rel="alternate" type="text/html"></link>
    <summary type="text">I wrote a simple app to sort, tag, and create tickets at home for my github stars... As of right now I have 1.3k stars and no convenient way to view them or...</summary>
    <content type="html">&lt;p&gt;I wrote a simple app to sort, tag, and create tickets at home for my github&#xA;stars&amp;hellip; As of right now I have 1.3k stars and no convenient way to view them&#xA;or remember which ones were ones I actually wanted to do something with. This&#xA;simple UI makes scrolling the stars list easy, updates is easy, and the kicker&#xA;for me is Kanboard integration so I can click a button from the stars UI and&#xA;get a ticket made in my kanboard instance so that the work I want to do is in&#xA;front of me and not hidden by Github&amp;rsquo;s shockingly HORRIBLE UI.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250701125804_c41ec692.png&#34; alt=&#34;20250701125804_c41ec692.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/pypeaday/gh-star-sorter&#34;&gt;GH Link&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>temporal</title>
    <id>https://pype.dev/temporal/</id>
    <updated>2025-06-24T21:21:43Z</updated>
    <published>2025-06-24T21:21:43Z</published>
    <link href="https://pype.dev/temporal/" rel="alternate" type="text/html"></link>
    <summary type="text">Temporal is a workflow orchestrator that I&#39;m interested in</summary>
    <content type="html">&lt;p&gt;&lt;a href=&#34;https://temporal.io/&#34;&gt;Temporal&lt;/a&gt; is a workflow orchestrator that I&amp;rsquo;m interested in&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Traefik and gRPC for Temporal at home</title>
    <id>https://pype.dev/traefik-and-grpc-for-temporal-at-home/</id>
    <updated>2025-06-24T20:55:42Z</updated>
    <published>2025-06-24T20:55:42Z</published>
    <link href="https://pype.dev/traefik-and-grpc-for-temporal-at-home/" rel="alternate" type="text/html"></link>
    <summary type="text">Someday I will potentially write up some stuff about temporal but for now it&#39;s a workflow orchestrator that I&#39;m interested in and I wanted to PoC it in my...</summary>
    <content type="text">&#xA;# Temporal Networking Woes&#xA;&#xA;Someday I will potentially write up some stuff about [[temporal]] but for now&#xA;it&#39;s a workflow orchestrator that I&#39;m interested in and I wanted to PoC it in&#xA;my homelab by replacing a simple cron job to build my blog with a temporal&#xA;workflow and activity. I was IMMEDIATELY thwarted by a networking error that&#xA;feels crazy to me but maybe won&#39;t be to others... so enjoy the problem and if&#xA;you&#39;re here from a Google search, I hope it&#39;s helpful.&#xA;&#xA;Getting started with Temporal I wanted to have the server and associated&#xA;components on my server, but I expected to be running workflows and workers&#xA;on another computer. &#xA;&#xA;For most of my apps I slap some [[traefik]] labels on&#xA;and we&#39;re good to go. But I got a wild set of errors trying to run a worker on&#xA;my desktop and connect it to the temporal server on my server over https.... it&#xA;ended up being because I needed to setup a special protocol in traefik for the&#xA;reverse proxy to appropriately proxy the grpc call.&#xA;&#xA;So I had a normal set of labels on my temporal container, went to run a worker&#xA;and got this nasty work of art&#xA;&#xA;```&#xA;RuntimeError: Failed client connect: `get_system_info` call error after connection: Status { code: Internal, message: &#34;protocol error: received message with invalid compression flag: 73 (valid flags are 0 and 1) while receiving response with status: 500 Internal Server Error&#34;, metadata: MetadataMap { headers: {&#34;content-type&#34;: &#34;text/plain; charset=utf-8&#34;, &#34;content-length&#34;: &#34;21&#34;, &#34;date&#34;: &#34;Wed, 25 Jun 2025 02:12:44 GMT&#34;} }, source: None }&#xA;```&#xA;&#xA;Thank God I had kind of seen this at work one other time in my life, and we&#xA;never fixed the issue there but I knew what it was... we had traefik acting as&#xA;a load balancer (as do I at home) and the traefik load balancer was &#34;balancing&#xA;traffic using https&#34;... no, I do not really know what I&#39;m saying. But what I do&#xA;know is that in order for the Temporal Server and Worker to communicate,&#xA;traefik has to properly route the traffic for gRPC instead of https.&#xA;&#xA;!!! warning &#34;&#34;&#xA;    I can&#39;t stress enough how little I know about the difference between https and grpc or why the load balancer cares... there&#39;s clearly something in the networking stack that is extremely relevant here&#xA;&#xA;But the fix is NOT hard thankfully, and it&#39;s even on [traefik&#39;s website](https://doc.traefik.io/traefik/user-guides/grpc/#traefik-configuration) - the warning annotation there tells you what you need - which is one more traefik label...&#xA;&#xA;```yaml&#xA;traefik.http.services.&lt;my-service-name&gt;.loadbalancer.server.scheme=h2c&#xA;```&#xA;&#xA;So after setting the loadbalancer.server.scheme to `h2c` I could run my worker just fine!&#xA;&#xA;![20250625021838_4d7104c2.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250625021838_4d7104c2.png)&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Nextcloud PHP Opache Memory Consumption</title>
    <id>https://pype.dev/nextcloud-php-opache-memory-consumption/</id>
    <updated>2025-06-23T08:46:20Z</updated>
    <published>2025-06-23T08:46:20Z</published>
    <link href="https://pype.dev/nextcloud-php-opache-memory-consumption/" rel="alternate" type="text/html"></link>
    <summary type="text">Today I was combing through Nextcloud, just taking a gander at the apps, updates, etc.</summary>
    <content type="html">&lt;h1 id=&#34;intro&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Intro&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Today I was combing through Nextcloud, just taking a gander at the apps, updates, etc.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The OPcache buffer is nearly full. To assure that all scripts can be hold in&#xA;cache, it is recommended to apply &amp;ldquo;opcache.memory_consumption&amp;rdquo; to your PHP&#xA;configuration with a value higher than &amp;ldquo;128&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;So I know &lt;em&gt;nothing&lt;/em&gt; about &lt;code&gt;php&lt;/code&gt; and I had no idea where to set this&amp;hellip; Also I&amp;rsquo;m&#xA;running Nextcloud in a container so any updates will be blown away when the&#xA;container is removed (say next time I update Nextcloud)&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;After a little duckduckgoing I came across &lt;a href=&#34;https://www.reddit.com/r/NextCloud/comments/1gpxl5b/need_help_with_php_opcache_module_warning/&#34;&gt;this reddit&#xA;post&lt;/a&gt;&#xA;where a guy had the same issue&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;The long and short of it is that on &lt;em&gt;single instance nextcloud deployments&lt;/em&gt;&#xA;this php memory consumption value can be too low for Nextcloud to keep up with&#xA;the demand&amp;hellip; You can see in the message they just recommend upping the value.&lt;/p&gt;&#xA;&lt;p&gt;So I had to think about how to persist the change and have it take effect now&#xA;ideally without affecting any users too much&amp;hellip; So here&amp;rsquo;s what I did - made the&#xA;change in 2 places:&lt;/p&gt;&#xA;&lt;h2 id=&#34;in-the-container&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;In the container&lt;/span&gt; &lt;a href=&#34;#in-the-container&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I exec&amp;rsquo;d into the container and used this handy &lt;code&gt;sed&lt;/code&gt; command &lt;code&gt;sed -i &#39;s/^opcache\.memory_consumption\s*=\s*128$/opcache.memory_consumption=256/&#39; /usr/local/etc/php/conf.d/opcache-recommended.ini&lt;/code&gt; to update the value in the&#xA;running container - and I guess &lt;code&gt;php&lt;/code&gt; maybe is loaded up dynamically or&#xA;something? but the warning did go away&amp;hellip;.&lt;/p&gt;&#xA;&lt;p&gt;So how to persist this change when the filesystem is blown away when the&#xA;container is updated?&lt;/p&gt;&#xA;&lt;h2 id=&#34;in-the-config&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;In the config&lt;/span&gt; &lt;a href=&#34;#in-the-config&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I set the env var &lt;code&gt;PHP_OPCACHE_MEMORY_CONSUMPTION&lt;/code&gt; in the &lt;code&gt;docker-compose.yml&lt;/code&gt;&#xA;file to 256 and voila&amp;hellip; the change should persist&amp;hellip;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Quit issueing 200s for 500s</title>
    <id>https://pype.dev/quit-issueing-200s-for-500s/</id>
    <updated>2025-06-22T06:55:21Z</updated>
    <published>2025-06-22T06:55:21Z</published>
    <link href="https://pype.dev/quit-issueing-200s-for-500s/" rel="alternate" type="text/html"></link>
    <content type="html">&lt;h1 id=&#34;stop-this-nonsense&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Stop this nonsense&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622115500_5bd3bc21.png&#34; alt=&#34;20250622115500_5bd3bc21.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 Control Your n8n Instance Remotely with Telegram Bot Commands …</title>
    <id>https://pype.dev/thoughts-711/</id>
    <updated>2025-06-22T00:38:53Z</updated>
    <published>2025-06-22T00:38:53Z</published>
    <link href="https://pype.dev/thoughts-711/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;m doing a lot of thinking and brainstorming about how I want to run some pipelines I have in my head, at home... thing</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://n8n.io/workflows/4928-control-your-n8n-instance-remotely-with-telegram-bot-commands/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://n8n.io/workflows/4928-control-your-n8n-instance-remotely-with-telegram-bot-commands/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - Control Your n8n Instance Remotely with Telegram Bot Commands | n8n workflow template&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://n8n.io/workflows/4928-control-your-n8n-instance-remotely-with-telegram-bot-commands/&#34;&gt;Control Your n8n Instance Remotely with Telegram Bot Commands | n8n workflow template&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;I&#39;m doing a lot of thinking and brainstorming about how I want to run some pipelines I have in my head, at home... things like image gen for blog posts, posting to various social media, click to generate qr codes and send emails, etc... things that require a lot of integration. &#xA;&#xA;I tried n8n a while ago with 1 use case, it didn&#39;t work but times have changed and whatever was wrong for that use case is now just fixed with a few updates... so I&#39;m strongly considering n8n as a platform I build my workflows on, and using telegram as a simple entry-point into workflow execution is kind of intriguing... imagine sending a message to telegram to generate an image with SD based on a picture you took with our phone, maybe do something else with that image (turn it into a qr code or something), and then email it? all with a text message and pic? that sounds pretty cool... not sure what I&#34;ll have spun up but I am excited to be making some progress on the automation ideas&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Thinking In Diagrams</title>
    <id>https://pype.dev/thinking-in-diagrams/</id>
    <updated>2025-06-20T06:55:31Z</updated>
    <published>2025-06-20T06:55:31Z</published>
    <link href="https://pype.dev/thinking-in-diagrams/" rel="alternate" type="text/html"></link>
    <summary type="text">Something I didn&#39;t appreciate earlier on in my career (and I&#39;m only 8 as far as the age of that career goes anyways) was thinking through problems with...</summary>
    <content type="text">&#xA;# Intro&#xA;&#xA;Something I didn&#39;t appreciate earlier on in my career (and I&#39;m only 8 as far as&#xA;the age of that career goes anyways) was thinking through problems with&#xA;diagrams... I&#39;ve often approached a problem with code first, and immediately&#xA;started implementing a solution. There&#39;s nothing actually wrong with that especially when considering:&#xA;&#xA;1. people think differently&#xA;2. some people think with their fingers&#xA;3. recognizing that the first thing you build should be thrown away should give you freedom to &#34;just start&#34;&#xA;&#xA;Now with that said, let&#39;s chat about how awesome diagrams are though...&#xA;&#xA;1. they put context in front of you without details&#xA;2. you can express many more components of a system in a consumable way when compared to code&#xA;3. diagrams help prioritize work and bubble up maybe unforseen dependencies&#xA;4. they force you to wireframe before getting lost in the details&#xA;&#xA;## Wireframing&#xA;&#xA;One of my biggest issue when I &#34;just start coding&#34; is not having a direction...&#xA;I can put a few place holders `def this:` `def that:` in a few python modules,&#xA;but without having every place holder in front of me it is hard to keep them&#xA;straight, know the order or dependencies, etc.&#xA;&#xA;Diagrams aren&#39;t beholden to a text file or series of them, and you can fit much&#xA;more on your screen because you have all the X-Y available to you instead of&#xA;the height of your monitor times your formatted lined length (usually 120 for&#xA;me).&#xA;&#xA;Diagrams also make it easy to spew out onto a page the different components you&#xA;need for a solution, without committing to an order (something that I cannot&#xA;express well in scripts)&#xA;&#xA;## A Plan&#xA;&#xA;Diagramming with purpose can get you to the place of having almost a&#xA;paint-by-number experience building your app/system/etc. Beecause you separate&#xA;the implemetation from the design and when you implement BASED on a design&#xA;rather than implement to DISCOVER a design you will be more efficient and in my&#xA;experience I&#39;ve improved my ability to forsee issues that I wouldn&#39;t have seen,&#xA;or have historically missed, by putting the design down in front of me, the&#xA;details of any integrations, etc. before starting to &#34;just code&#34;.&#xA;&#xA;## Good Enough&#xA;&#xA;A final note about diagrams for right now is that they&#39;re easy to leave as&#xA;&#34;good enough&#34;. The point was to get a guide for solving a problem.&#xA;&#xA;Diagrams don&#39;t have to be picture perfect, even for documentation&#39;s sake. They&#xA;can even remain somewhat unfinished (permitted you don&#39;t get yourself into a&#xA;bind of treating diagrams as docs that you didn&#39;t clean up)&#xA;&#xA;Here&#39;s an example of what I mean - I&#39;m working on a simple workflow to take [my-thoughts](/my-thoughts) and post them to [[nostr]]. I started with a diagram like this...&#xA;&#xA;![20250622112223_f1838d9b.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622112223_f1838d9b.png)&#xA;&#xA;&gt; In parallel I&#39;m working on posting my blog to other social media - this small&#xA;&gt; workflow is apart of a larger initiative I&#39;m working on at home&#xA;&#xA;AS you can see this diagram isn&#39;t super detailed or pretty. But what it does it&#xA;help me see the high level points of bringing my published thoughts to nostr as&#xA;posts.&#xA;&#xA;After I have the simple steps, I&#39;ve started diagramming out more details of each step:&#xA;&#xA;![20250622112415_f18663e3.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622112415_f18663e3.png)&#xA;&#xA;The diagram is easy to put notes on, add some color to for problems not yet solved, etc.&#xA;&#xA;And then with this diagram in front of me, it&#39;s easy to begin building&#xA;small-scoped components that will be assembled to my larger system, but without&#xA;the pressure of constructing every part of the system at once&#xA;&#xA;# Fin&#xA;&#xA;Diagrams help me break up a problem into manageable chunks so that I can put&#xA;the things I need later on the back-burner and can focus on one achievable&#xA;thing at a time.&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 pypeaday/whose-turn-is-it: Simple uv webapp to determine order…</title>
    <id>https://pype.dev/thoughts-709/</id>
    <updated>2025-06-20T01:23:26Z</updated>
    <published>2025-06-20T01:23:26Z</published>
    <link href="https://pype.dev/thoughts-709/" rel="alternate" type="text/html"></link>
    <summary type="text">We pray together as a family every night, but every single flipping night my daughter&#39;s fight about the order we go in..</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://github.com/pypeaday/whose-turn-is-it&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://github.com/pypeaday/whose-turn-is-it&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - pypeaday/whose-turn-is-it: Simple uv webapp to determine order fo players for an event&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://github.com/pypeaday/whose-turn-is-it&#34;&gt;pypeaday/whose-turn-is-it: Simple uv webapp to determine order fo players for an event&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;We pray together as a family every night, but every single flipping night my daughter&#39;s fight about the order we go in... well, NO MORE!&#xA;&#xA;I built a simple uv fastapi app that randomly sorts a list from an environment var `PLAYERS` and presents it in the web page at `/generate`.&#xA;&#xA;Super easy `uv run` at home...&#xA;&#xA;I love that with enough knowledge, or the right kind of knowledge, you can build like anything you want!&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Homelab Youtube Podcasts to AudioBookShelf Pipeline</title>
    <id>https://pype.dev/homelab-youtube-podcasts-to-audiobookshelf-pipeline/</id>
    <updated>2025-06-18T13:53:12Z</updated>
    <published>2025-06-18T13:53:12Z</published>
    <link href="https://pype.dev/homelab-youtube-podcasts-to-audiobookshelf-pipeline/" rel="alternate" type="text/html"></link>
    <summary type="text">I wrote about using homelab-pinchflat for at-home mashup creation and a song flow for church. But I use it for more than, that and here&#39;s another prime use case</summary>
    <content type="text">&#xA;I wrote about using [[homelab-pinchflat]] for at-home mashup creation and a song flow&#xA;for church. But I use it for more than, that and here&#39;s another prime use case&#xA;&#xA;There are podcasts on YouTube I want to follow - The Standup with Prime, or&#xA;Shawn Ryan&#39;s show. Basically I use pinchflat to download the audio and serve up&#xA;those files in ABS (audiobookshelf)&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>source_up for nested .envrc</title>
    <id>https://pype.dev/source-up-for-nested-envrc/</id>
    <updated>2025-06-17T09:52:17Z</updated>
    <published>2025-06-17T09:52:17Z</published>
    <link href="https://pype.dev/source-up-for-nested-envrc/" rel="alternate" type="text/html"></link>
    <summary type="text">I have a use case for nesting directories with cascading .envrc files. and ran into an issue where the parent environment was being reset by the child...</summary>
    <content type="html">&lt;h1 id=&#34;tldr&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;TLDR&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I have a use case for nesting directories with cascading .envrc files. and ran&#xA;into an issue where the parent environment was being reset by the child&#xA;environment. The fix is &lt;code&gt;source_up&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;context&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Context&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I manage some infrastructure at home with a folder like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── homelab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── .envrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── stack1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│       ├── .envrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I do this so that the &amp;ldquo;homelab-wide&amp;rdquo; terraform variables can be exported with&#xA;&lt;code&gt;TF_VAR_the_variable&lt;/code&gt; in the &lt;code&gt;homelab/.envrc&lt;/code&gt; and then the stack specific&#xA;variables in &lt;code&gt;stack1/.envrc&lt;/code&gt; get exported like &lt;code&gt;TF_VAR_stack_specific_var&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For example, my cloudflare account id is needed in every stack, but the&#xA;cloudflare zone id is different per stack - so instead of copying the account&#xA;id var to every stack (however the vars are managed), I can set it in a parent&#xA;.envrc and share it in nested stack directories&lt;/p&gt;&#xA;&lt;h2 id=&#34;problem&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Problem&lt;/span&gt; &lt;a href=&#34;#problem&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;# homelab/.envrc&#xA;#!/bin/bash&#xA;export VAR_FOO=BAR&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;So when I &lt;code&gt;cd homelab&lt;/code&gt; I get&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET&#xA;⬢ [devbox] ❯ direnv allow&#xA;direnv: loading /tmp/homelab/.envrc&#xA;direnv: export +VAR_FOO&#xA;&#xA;nic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET&#xA;⬢ [devbox] ❯ env | grep VAR&#xA;VAR_FOO=BAR&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You can see &lt;code&gt;VAR_FOO&lt;/code&gt; is set&amp;hellip; but now I&amp;rsquo;ll &lt;code&gt;cd stack1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET&#xA;⬢ [devbox] ❯ cd stack1&#xA;direnv: error /tmp/homelab/stack1/.envrc is blocked. Run `direnv allow` to approve its content&#xA;&#xA;nic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET&#xA;⬢ [devbox] ❯ direnv allow&#xA;direnv: loading /tmp/homelab/stack1/.envrc&#xA;direnv: export +VAR_BAZ&#xA;&#xA;nic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET&#xA;⬢ [devbox] ❯ env | grep VAR&#xA;VAR_BAZ=BAM&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;As you can see &lt;code&gt;VAR_FOO&lt;/code&gt; was unset, and &lt;code&gt;VAR_BAZ&lt;/code&gt; is set&amp;hellip; so &lt;code&gt;homelab/.envrc&lt;/code&gt; was blown away!&lt;/p&gt;&#xA;&lt;h2 id=&#34;fix&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Fix&lt;/span&gt; &lt;a href=&#34;#fix&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Edit &lt;code&gt;stack1/.envrc&lt;/code&gt; with a &lt;code&gt;source_up&lt;/code&gt; command&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# stack1/.envrc # NEW&#xA;#!/bin/bash&#xA;source_up  # source the parent environment&#xA;export VAR_BAZ=BAM&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;After the edit&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET&#xA;⬢ [devbox] ❯ vim .envrc&#xA;direnv: error /tmp/homelab/stack1/.envrc is blocked. Run `direnv allow` to approve its content&#xA;&#xA;nic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET  took 5s&#xA;⬢ [devbox] ❯ direnv allow&#xA;direnv: loading /tmp/homelab/stack1/.envrc&#xA;direnv: loading /tmp/homelab/.envrc&#xA;direnv: export +VAR_BAZ +VAR_FOO&#xA;&#xA;nic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET&#xA;⬢ [devbox] ❯ env | grep VAR&#xA;VAR_FOO=BAR&#xA;VAR_BAZ=BAM&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Both vars are set!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Stable Diffusion QR Codes for Josh</title>
    <id>https://pype.dev/stable-diffusion-qr-codes-for-josh/</id>
    <updated>2025-06-17T06:27:28Z</updated>
    <published>2025-06-17T06:27:28Z</published>
    <link href="https://pype.dev/stable-diffusion-qr-codes-for-josh/" rel="alternate" type="text/html"></link>
    <summary type="text">(fjords of Finland:1.3), (steep cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), (early morning light:1.2), (golden hour glow:1.1),...</summary>
    <content type="html">&lt;h1 id=&#34;after-my-blunder&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;After my blunder&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250627111955_e86d5db2.png&#34; alt=&#34;20250627111955_e86d5db2.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(fjords of Finland:1.3), (steep cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1),(serene nature:1.2), (8K landscape photography:1.3), (gaming concept art:1.2), (ultra realistic: 1.2)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1),y&#xA;Steps: 30, Sampler: Euler a, Schedule type: Automatic, CFG scale: 7, Seed: 784129766, Size: 1536x1536, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 0.8, Pixel Perfect: True, Control Mode: Balanced&amp;rdquo;, ControlNet 1: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 0.75, Pixel Perfect: True, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;h1 id=&#34;final-candidates&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Final Candidates&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Turns out upscaling can mess up the design&amp;hellip; so I generated new ones at the high res instead of using AI to upscale&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250621122040_2dfef68f.png&#34; alt=&#34;20250621122040_2dfef68f.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(fjords of Finland:1.3), (steep cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1),(serene nature:1.2), (8K landscape photography:1.3), (gaming concept art:1.2), (ultra realistic: 1.2)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: Euler a, Schedule type: Automatic, CFG scale: 7, Seed: 1827707865, Size: 1536x1536, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 1536, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 1.0, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, ControlNet 1: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 0.88, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I turned the brightness down on the above one a little and got a better result&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250621122629_1058a54f.png&#34; alt=&#34;20250621122629_1058a54f.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(fjords of Finland:1.3), (steep cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1),(serene nature:1.2), (8K landscape photography:1.3), (gaming concept art:1.2), (ultra realistic: 1.2)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: Euler a, Schedule type: Automatic, CFG scale: 7, Seed: 1827707865, Size: 1536x1536, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 1536, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 0.85, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, ControlNet 1: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 0.75, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;h1 id=&#34;some-favorites&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Some favorites&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250621020431_d6c69cd2.png&#34; alt=&#34;20250621020431_d6c69cd2.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(fjords of Finland:1.3), (steep cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (green orange:1.0), (serene nature:1.2), (8K landscape photography:1.3), (gaming concept art:1.2), (ultra realistic: 1.1)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: Euler a, Schedule type: Automatic, CFG scale: 7, Seed: 2926433856, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 1.0, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, ControlNet 1: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 0.85, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250621020700_37cf8c79.png&#34; alt=&#34;20250621020700_37cf8c79.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(fjords of Finland:1.3), (steep cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1),(serene nature:1.2), (8K landscape photography:1.3), (gaming concept art:1.2), (ultra realistic: 1.2)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: Euler a, Schedule type: Automatic, CFG scale: 7, Seed: 1827707865, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 1.0, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, ControlNet 1: &amp;ldquo;Module: none, Model: control_v1p_sd15_brightness [5f6aa6ed], Weight: 0.25, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.25, Guidance End: 0.88, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;h1 id=&#34;codes-and-prompts&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Codes and prompts&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;hr&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250617112815_b986db88.png&#34; alt=&#34;20250617112815_b986db88.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;prompt: (breathtaking scenic view:1.2), (fjords of Finland:1.3), (steep forested cliffs:1.1), (crystal-clear blue water:1.2), (reflection of sky on water:1.1), , (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (birch trees:1.0), (serene nature:1.2), (ultra-realistic:1.3), (8K landscape photography:1.3), (photorealistic:1.2), (atmospheric lighting:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: DPM++ 2M SDE, Schedule type: Karras, CFG scale: 7, Seed: 2206746812, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: controlnetQRPatternQR_v2Sd15 [2d8d5750], Weight: 1.15, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.0, Guidance End: 0.85, Pixel Perfect: True, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250617113111_d9075159.png&#34; alt=&#34;20250617113111_d9075159.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(breathtaking scenic view:1.2), (fjords of Finland:1.3), (steep forested cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), , (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (birch trees:1.0), (serene nature:1.2), (ultra-realistic:1.3), (8K landscape photography:1.3), (photorealistic:1.2), (greens and blues:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&#xA;Steps: 30, Sampler: DPM++ 2M SDE, Schedule type: Karras, CFG scale: 7, Seed: 2485699904, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: controlnetQRPatternQR_v2Sd15 [2d8d5750], Weight: 1.1, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.0, Guidance End: 0.8, Pixel Perfect: True, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250617113250_839c12e2.png&#34; alt=&#34;20250617113250_839c12e2.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(breathtaking scenic view:1.2), (fjord:1.3), (steep forested cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), , (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (birch trees:1.0), (serene nature:1.2), (ultra-realistic:1.3), (8K landscape photography:1.3), (photorealistic:1.2), (green:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&#xA;Steps: 30, Sampler: DPM++ 2M SDE, Schedule type: Karras, CFG scale: 8, Seed: 1055874558, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: controlnetQRPatternQR_v2Sd15 [2d8d5750], Weight: 1.1, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.0, Guidance End: 0.8, Pixel Perfect: True, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;top-contendor&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Top Contendor&lt;/span&gt; &lt;a href=&#34;#top-contendor&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250618005414_d77ff449.png&#34; alt=&#34;20250618005414_d77ff449.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(breathtaking scenic view:1.2), (fjords of Finland:1.3), (steep forested cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), , (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (green orange:1.0), (serene nature:1.2), (ultra-realistic:1.3), (8K landscape photography:1.3), (gaming concept art:1.2),&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: DPM++ 2M SDE, Schedule type: Karras, CFG scale: 8.5, Seed: 1240242415, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: controlnetQRPatternQR_v2Sd15 [2d8d5750], Weight: 1.1, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.0, Guidance End: 0.8, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250618005451_84cd9350.png&#34; alt=&#34;20250618005451_84cd9350.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(breathtaking scenic view:1.2), (fjords of Finland:1.3), (steep forested cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), , (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (green orange:1.0), (serene nature:1.2), (ultra-realistic:1.3), (8K landscape photography:1.3), (gaming concept art:1.2),&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: DPM++ 2M SDE, Schedule type: Karras, CFG scale: 8.5, Seed: 1240242416, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: controlnetQRPatternQR_v2Sd15 [2d8d5750], Weight: 1.1, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.0, Guidance End: 0.8, Pixel Perfect: False, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Scans!&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250621004622_6c9a66df.png&#34; alt=&#34;20250621004622_6c9a66df.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(fjords of Finland:1.3), (steep forested cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), , (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (green orange:1.0), (serene nature:1.2), (8K landscape photography:1.3), (gaming concept art:1.2),&lt;/p&gt;&#xA;&lt;p&gt;(blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: DPM++ 2M SDE, Schedule type: Exponential, CFG scale: 7, Seed: 4060643233, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: controlnetQRPatternQR_v2Sd15 [2d8d5750], Weight: 1.4, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.0, Guidance End: 0.8, Pixel Perfect: True, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250621004844_64e6b94b.png&#34; alt=&#34;20250621004844_64e6b94b.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;(fjords of Finland:1.3), (steep forested cliffs:1.1), (crystal-clear water:1.2), (reflection of sky on water:1.1), , (early morning light:1.2), (golden hour glow:1.1), (pine trees:1.1), (green blue:1.0), (serene nature:1.2), (8K landscape photography:1.3), (gaming concept art:1.2),&lt;/p&gt;&#xA;&lt;p&gt;Negative prompt: (blurry:1.3), (low resolution:1.3), (overexposed:1.2), (cartoonish:1.3), (unrealistic colors:1.3), (people:1.1), (city buildings:1.2), (vehicles:1.2), (text:1.3), (distortion:1.2)&lt;/p&gt;&#xA;&lt;p&gt;Steps: 30, Sampler: DPM++ 2M SDE, Schedule type: Exponential, CFG scale: 7, Seed: 3713594572, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122EOL, ControlNet 0: &amp;ldquo;Module: none, Model: controlnetQRPatternQR_v2Sd15 [2d8d5750], Weight: 1.4, Resize Mode: Crop and Resize, Processor Res: 512, Threshold A: 0.5, Threshold B: 0.5, Guidance Start: 0.0, Guidance End: 0.8, Pixel Perfect: True, Control Mode: Balanced&amp;rdquo;, Version: v1.9.4&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>U-Blue Aurora Upgrade Broke HWA Docker</title>
    <id>https://pype.dev/u-blue-aurora-upgrade-broke-hwa-docker/</id>
    <updated>2025-06-15T08:42:09Z</updated>
    <published>2025-06-15T08:42:09Z</published>
    <link href="https://pype.dev/u-blue-aurora-upgrade-broke-hwa-docker/" rel="alternate" type="text/html"></link>
    <summary type="text">I use Universal Blue&#39;s Aurora distribution on my daily driver desktop, and I rebooted today which led what I imagine is a kernel update. This broke all of my...</summary>
    <content type="html">&lt;p&gt;I use Universal Blue&amp;rsquo;s &lt;a href=&#34;https://getaurora.dev/en&#34;&gt;Aurora&lt;/a&gt; distribution on my daily driver desktop, and&#xA;I rebooted today which led what I imagine is a kernel update. This broke all of&#xA;my docker containers using a GPU.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nvidia-container-cli: detection error: open failed: /usr/lib/libnvidia-tls.so.570.153.02: no such file or directory: unknown&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Thankfully a reboot and booting into the older environment fixes everything&amp;hellip;&#xA;Linux and immutability FTW&lt;/p&gt;&#xA;&lt;h2 id=&#34;related&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Related&lt;/span&gt; &lt;a href=&#34;#related&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://universal-blue.discourse.group/t/cannot-use-nvidia-runtime-in-docker-since-update-to-fedora-42/8812/3&#34;&gt;Discorse Thread&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Homelab Pinchflat</title>
    <id>https://pype.dev/homelab-pinchflat/</id>
    <updated>2025-06-14T08:51:21Z</updated>
    <published>2025-06-14T08:51:21Z</published>
    <link href="https://pype.dev/homelab-pinchflat/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;ve written about self-hosted-media before and addressed some thoughts with YouTube.</summary>
    <content type="text">&#xA;# Why?&#xA;&#xA;I&#39;ve written about [[self-hosted-media]] before and addressed some thoughts with YouTube. &#xA;&#xA;Lately though I&#39;ve had 2 use cases for offline YouTube media and I&#39;m now&#xA;solving this problem by using [pinchflat](https://pinchflat.com/) as my `ytdl`&#xA;solution + file system organization for use throughout my homelab.&#xA;&#xA;## Use Case 1&#xA;&#xA;At church we use pre-recorded music to sing along to, or at least we used to,&#xA;thankfully as of June 2025 we&#39;re doing live-music every week. But in the before&#xA;times I would strip the audio out of song files we had purchased and then made&#xA;lyric videos with the instrumental tracks. As we wanted to try new songs out we&#xA;didn&#39;t want to purchase them in case they didn&#39;t work out for us to use and&#xA;that ends up being a waste (church budget is very tight). So using songs&#xA;available on YouTube is an easy solution, but the only way to strip the vocals&#xA;and see if the song sounded right with our singers and equipment was to make&#xA;the lyric video and rehearse it... Chicken or Egg problem unless we can freely&#xA;try it before purchasing... So using Pinchflat we can download songs in that&#xA;playlist, I can edit the files, the team can try it out, and if we like it we&#xA;can use it without hitting the budget any harder than necessary.&#xA;&#xA;&gt; Pinchflat syncs that playlist to a folder on my NAS that another process&#xA;&gt; watches and performs the audio stripping workflow&#xA;&#xA;## Use Case 2&#xA;&#xA;I just wrote about [[if-you-want-something-make-it-so-song-style]] which is the&#xA;second use case - cutting mashups of my favorite songs on youtube and then&#xA;hosting them myself for easy listening&#xA;&#xA;# The Setup&#xA;&#xA;I run it in docker compose like practically all my other services&#xA;&#xA;```yml&#xA;services:&#xA;  pinchflat:&#xA;    container_name: &#34;pinchflat&#34;&#xA;    image: &#34;ghcr.io/kieraneglin/pinchflat:latest&#34;&#xA;    ports:&#xA;      - &#34;8945:8945&#34;&#xA;    volumes:&#xA;      - &#34;/tank/encrypted/docker/the-pit-zfs/pinchflat/config:/config:rw&#34;&#xA;      - &#34;/tank/encrypted/nas/media/downloads/pinchflat/downloads:/downloads:rw&#34;&#xA;    environment:&#xA;      TZ: &#34;America/Chicago&#34;&#xA;      PUID: &#34;1000&#34;&#xA;      PGID: &#34;1000&#34;&#xA;    restart: unless-stopped&#xA;    deploy:&#xA;      resources:&#xA;        limits:&#xA;          memory: &#34;4g&#34;&#xA;```&#xA;&#xA;# The GUI&#xA;&#xA;The WebUI is easy to navigate - you organize your downloads however you want with &#34;sources&#34;, and here&#39;s how I setup the source for these mashups that I want to edit... I add them to my playlist and Pinchflat grabs them for me automatically&#xA;![20250614144201_fa16e7ac.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614144201_fa16e7ac.png)&#xA;&#xA;![20250614144307_bdf12ee0.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614144307_bdf12ee0.png)&#xA;&#xA;That&#39;s basically it - then as you can see in the compose file, I get the files in a folder on my NAS and from there I can edit them as I need.&#xA;&#xA;## Example&#xA;&#xA;The church app that does the audio processing is in a compose stack with the&#xA;pinchflat download directory on the host mounted in - this is how containers in&#xA;different stacks can share data, by sharing a filesystem bind mount&#xA;&#xA;```yml&#xA;services:&#xA;  olivet_watcher_app:&#xA;    image: pypeaday/vocal-remover-watcher&#xA;    container_name: olivet-youtube-watcher&#xA;    volumes:&#xA;      - /tank/encrypted/nas/media/downloads/pinchflat/downloads:/input:ro&#xA;      - /tank/encrypted/docker/vocal_remover_app/watcher-app/processed_mp3s:/output&#xA;      - /tank/encrypted/docker/vocal_remover_app/watcher-app/db:/data&#xA;    working_dir: /app&#xA;```&#xA;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>If You Want Something Make It So - Song Style</title>
    <id>https://pype.dev/if-you-want-something-make-it-so-song-style/</id>
    <updated>2025-06-14T08:44:14Z</updated>
    <published>2025-06-14T08:44:14Z</published>
    <link href="https://pype.dev/if-you-want-something-make-it-so-song-style/" rel="alternate" type="text/html"></link>
    <summary type="text">In grad school a professor of mine, Mark Hunacek, said one of the most profound things I&#39;ve ever heard to the tune &#34;if you want it, then make it so&#34;... It&#39;s...</summary>
    <content type="text">&#xA;In grad school a professor of mine, Mark Hunacek, said one of the most profound&#xA;things I&#39;ve ever heard to the tune &#34;if you want it, then make it so&#34;... It&#39;s a&#xA;great benefit to mathematicians at the bar to start a conversation with &#34;hey&#xA;let&#39;s assume X because we can&#34;...&#xA;&#xA;This phrase has affected my work greatly to the work I do and how I go about it- &#xA;it&#39;s literally changed how I design some of my code. But I also want this&#xA;mantra to flow into other parts of my life...&#xA;&#xA;&gt; So here&#39;s a post about how I use Pinchflat and Davinci Resolve to tickle my&#xA;&gt; brain with bespoke versions of beautifully crafted mashups&#xA;&#xA;In this example I took a Goobsie mashup, cut the part I didn&#39;t like quite as&#xA;much (though admittedly it&#39;s still beautiful) and spliced it with itself to&#xA;give me a longer running version of a musical piece that takes me to another&#xA;world...&#xA;&#xA;[OG Youtube Mashup](https://www.youtube.com/watch?v=7v7nreDnmDg)&#xA;&#xA;## Acquiring the Media&#xA;&#xA;Pinchflat isn&#39;t really necessary here, anyone can use `youtubedl` or another&#xA;tool to download from YouTube. I do use Pinchflat to subscribe to Youtube&#xA;playlists to automate this process for me. See more about that in&#xA;[[homelab-pinchflat]]&#xA;&#xA;## Creating the Mashup&#xA;&#xA;So Goobsie makes actually good mashups, and I&#39;m not anything even remotely close to an audio engineer or whatever, but there&#39;s a segment of this song that just strikes my whole body in a unique way and I want to sometimes just listen to it conveniently... So enter Davinci Resolve... Basically I took the downloaded file, added it twice to a timeline, and then faded in and out until it sounded ok to me.&#xA;&#xA;![20250614135418_b75bc26a.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614135418_b75bc26a.png)&#xA;&#xA;## Listening to the Mashup&#xA;&#xA;So now how do I listen to this?&#xA;&#xA;For the moment, it&#39;s a favorite in my Jellyfin library and I listen through&#xA;that client. It&#39;s a TODO item for me to set-up a more music-centric streaming&#xA;service&#xA;&#xA;&#xA;!!! info &#34;Go Forth&#34;&#xA;    So Go Forth - and if you want something, make it so</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>ZSA typing challenge issue</title>
    <id>https://pype.dev/zsa-typing-challenge-issue/</id>
    <updated>2025-06-13T08:07:41Z</updated>
    <published>2025-06-13T08:07:41Z</published>
    <link href="https://pype.dev/zsa-typing-challenge-issue/" rel="alternate" type="text/html"></link>
    <summary type="text">I love zsa and have been using a moonlander for a few years now.</summary>
    <content type="html">&lt;h1 id=&#34;zsa&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;ZSA&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I love &lt;a href=&#34;https://zsa.io&#34;&gt;zsa&lt;/a&gt; and have been using a moonlander for a few years now.&lt;/p&gt;&#xA;&lt;p&gt;They recently launched &lt;a href=&#34;https://typ.ing&#34;&gt;typ.ing&lt;/a&gt; as a way to train your typing skills - it&amp;rsquo;s a lot like &lt;a href=&#34;https://monkeytype.com&#34;&gt;monkeytype&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I have a thought about it &lt;a href=&#34;https://thoughts.waylonwalker.com/post/682&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;today-s-challenge&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Today’s Challenge&lt;/span&gt; &lt;a href=&#34;#today-s-challenge&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I went to do today&amp;rsquo;s daily challenge and have ran into an issue where part of&#xA;the challenge is to type &lt;code&gt;/&lt;/code&gt; the forward slash character but it&amp;rsquo;s actually a&#xA;keybind on the website for navigation (well done btw!)&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613130724_06b0f9ef.png&#34; alt=&#34;20250613130724_06b0f9ef.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;So when I try to type the challenge I actually bring up the nav menu&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613131031_ce06cf48.png&#34; alt=&#34;20250613131031_ce06cf48.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;So for today I&amp;rsquo;ll take the error on the character to complete it and maybe ZSA&#xA;can look into this?&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Double Check Your DNS Records</title>
    <id>https://pype.dev/double-check-your-dns-records/</id>
    <updated>2025-06-13T06:53:50Z</updated>
    <published>2025-06-13T06:53:50Z</published>
    <link href="https://pype.dev/double-check-your-dns-records/" rel="alternate" type="text/html"></link>
    <summary type="text">I host my blog on cloudflare and manage my infra with terraform. I got a 522 when I went to recently and I wondered why since worked fine...</summary>
    <content type="html">&lt;h1 id=&#34;my-blog&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;My Blog&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I host &lt;a href=&#34;https://pype.dev&#34;&gt;my blog&lt;/a&gt; on cloudflare and manage my infra with&#xA;terraform. I got a 522 when I went to &lt;code&gt;https://www.pype.dev&lt;/code&gt; recently and I&#xA;wondered why since &lt;code&gt;https://pype.dev&lt;/code&gt; worked fine&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;terraform&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Terraform&lt;/span&gt; &lt;a href=&#34;#terraform&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I had this right in the terraform:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;resource&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;cloudflare_pages_domain&amp;#34; &amp;#34;cf_domain&amp;#34;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;  account_id&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;account_id&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;  project_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;cloudflare_pages_project&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;build_config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;name&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;  domain&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;pype.dev&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But turns out the &lt;code&gt;www&lt;/code&gt; record was commented out for some reason in my terraform code:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;resource&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;cloudflare_pages_domain&amp;#34; &amp;#34;cf_domain_www&amp;#34;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;  account_id&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;account_id&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;  project_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;cloudflare_pages_project&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;build_config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;name&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;  domain&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;www.pype.dev&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A quick &lt;code&gt;terraform apply -auto-approve&lt;/code&gt; (careful with this) and we&amp;rsquo;re up and&#xA;running with the &lt;code&gt;www&lt;/code&gt; record now&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 qwen3</title>
    <id>https://pype.dev/thoughts-685/</id>
    <updated>2025-06-11T02:23:23Z</updated>
    <published>2025-06-11T02:23:23Z</published>
    <link href="https://pype.dev/thoughts-685/" rel="alternate" type="text/html"></link>
    <summary type="text">I really don&#39;t know much about every self-hostable LLM out there... so much as happened. I am blessed at home with a pre</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://ollama.com/library/qwen3&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://ollama.com/library/qwen3&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - qwen3&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://ollama.com/library/qwen3&#34;&gt;qwen3&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;I really don&#39;t know much about every self-hostable LLM out there... so much as happened. I am blessed at home with a pretty beefy GPU and so although I don&#39;t know all the deets, I can run a lot of the reasonably large &#34;open source&#34; models. The one I&#39;ve been playing with lately is qwen3. The conversational flow has felt more natural with it compared to llama3.2 or dolphin3. Granted I might need to update something and my experience is limited. I&#39;ve also had good experience with gemma3 as a noteworthy contender for my go-to LLM right now in open-webui&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 News - Apps - App Store - Nextcloud</title>
    <id>https://pype.dev/thoughts-680/</id>
    <updated>2025-06-09T11:37:39Z</updated>
    <published>2025-06-09T11:37:39Z</published>
    <link href="https://pype.dev/thoughts-680/" rel="alternate" type="text/html"></link>
    <summary type="text">I just started using FreshRSS to get familiar with subscribing to RSS feeds and leaning into that as opposed to social m</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://apps.nextcloud.com/apps/news&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://apps.nextcloud.com/apps/news&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - News - Apps - App Store - Nextcloud&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://apps.nextcloud.com/apps/news&#34;&gt;News - Apps - App Store - Nextcloud&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;I just started using FreshRSS to get familiar with subscribing to RSS feeds and leaning into that as opposed to social media... Twitter has become basically just a news outlet for me, not a place to connect with devs (except for 2 or 3 who are active). RSS seems like such cool and ancient technology that is protected from the corporate tentacles that hold up every social media outlet save for nostr... &#xA;&#xA;So as I look for an RSS reader and/or feed aggregator this Nextcloud plugin seems like a good choice to look at since I&#39;m already hosting NC.. although do I really want to lean into it for more and more?&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Example For Andrew</title>
    <id>https://pype.dev/example-for-andrew/</id>
    <updated>2025-06-08T14:48:53Z</updated>
    <published>2025-06-08T14:48:53Z</published>
    <link href="https://pype.dev/example-for-andrew/" rel="alternate" type="text/html"></link>
    <content type="html">&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250608194801_809d5306.png&#34; alt=&#34;20250608194801_809d5306.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>I built a simple app for adding images to my blog</title>
    <id>https://pype.dev/i-built-a-simple-app-for-adding-images-to-my-blog/</id>
    <updated>2025-06-07T13:30:28Z</updated>
    <published>2025-06-07T13:30:28Z</published>
    <link href="https://pype.dev/i-built-a-simple-app-for-adding-images-to-my-blog/" rel="alternate" type="text/html"></link>
    <summary type="text">I built a simple fastAPI app called &#34;shotput&#34; that I run locally inside a git repo where I save images for my blog. The app is simple:</summary>
    <content type="text">&#xA;# Quick Deets&#xA;&#xA;I built a simple fastAPI app called &#34;shotput&#34; that I run locally inside a git repo where I save images for my blog. The app is simple:&#xA;&#xA;1. upload image from clipboard&#xA;2. app commits image to repo (path is configurable)&#xA;3. app pushes the commit (auto-push configurable)&#xA;4. app returns a markdown link I can paste in my blog that uses statically.io (see [[statically-io-to-help-me-out]]) to serve the image from the repo to my blog&#xA;&#xA;See the image repo with app details at [images.pype.dev](https://github.com/pypeaday/images.pype.dev)&#xA;&#xA;# Usage&#xA;&#xA;Anyone could copy the script and config to their own git repo to put images in&#xA;and run this at home - instructions are in the readme but for simple running on localhost it&#39;s just `uv run`&#xA;&#xA;# Example&#xA;&#xA;![20250607130609_dadd33eb.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250607130609_dadd33eb.png)&#xA;&#xA;pasting an image let&#39;s you copy the markdown link for easy pasting&#xA;&#xA;```markdown&#xA;![20250607130609_dadd33eb.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250607130609_dadd33eb.png)&#xA;```&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Double check your CIDR blocks!</title>
    <id>https://pype.dev/double-check-your-cidr-blocks/</id>
    <updated>2025-06-07T07:27:31Z</updated>
    <published>2025-06-07T07:27:31Z</published>
    <link href="https://pype.dev/double-check-your-cidr-blocks/" rel="alternate" type="text/html"></link>
    <summary type="text">Copy paste - don&#39;t rely on typing correctly...</summary>
    <content type="html">&lt;h1 id=&#34;tl-dr&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;tl;dr&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Copy paste - don&amp;rsquo;t rely on typing correctly&amp;hellip;&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-issue&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The Issue&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I use tailscale at home and generally love it. One thing I use it for is&#xA;whitelisting - so I have some apps publically available and my homelab ones&#xA;have DNS with SSL certs by LE but I whitelist to only my private IPs so that I&#xA;can use https at home basically. However I have had a few issues&#xA;with a couple apps, and I kind of chaulked it up to &amp;ldquo;network protocol this&amp;rdquo;&#xA;&amp;ldquo;need to figure out that header that&amp;rdquo; but ultimately I was being lazy and the&#xA;issues weren&amp;rsquo;t catastrophic&amp;hellip; it was things like:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;couldn&amp;rsquo;t get to my NVR by DNS, so I&amp;rsquo;d have to use tailscale_ip:port&lt;/li&gt;&#xA;&lt;li&gt;couldn&amp;rsquo;t login with my user in jellyfin cause I lock me down to LAN only&#xA;since I dont&amp;rsquo; use a password&lt;/li&gt;&#xA;&lt;li&gt;gotify wouldn&amp;rsquo;t connect using DNS&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;These things aren&amp;rsquo;t huge but they are annoying and today I decided to figure it out.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;typo&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Typo!&lt;/span&gt; &lt;a href=&#34;#typo&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not an expert yet but I think the main problem was the CIDR block I was&#xA;using in my traefik config.&lt;/p&gt;&#xA;&lt;p&gt;This&amp;rsquo;ll shock some of you but &lt;code&gt;10.64.0.0/10&lt;/code&gt; and &lt;code&gt;100.64.0.0/10&lt;/code&gt; are not the&#xA;same blocks!&lt;/p&gt;&#xA;&lt;div class=&#34;admonition warning&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Check your CIDRs&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s always DNS, and even when it&amp;rsquo;s not, it&amp;rsquo;s still probably networking&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>homelab-journey-part-1</title>
    <id>https://pype.dev/homelab-journey-part-1/</id>
    <updated>2025-06-05T08:19:57Z</updated>
    <published>2025-06-05T08:19:57Z</published>
    <link href="https://pype.dev/homelab-journey-part-1/" rel="alternate" type="text/html"></link>
    <summary type="text">I want to start writing about my homelab and this first post can be a short introduction to how I got into homelabbing and a review of my current hardware....</summary>
    <content type="text">&#xA;# Introduction&#xA;&#xA;I want to start writing about my homelab and this first post can be a short&#xA;introduction to how I got into homelabbing and a review of my current hardware.&#xA;I&#39;ll hopefully write about the evolution of my homelab to get to this&#xA;current point and then start writing about updates as new things hit the lab.&#xA;&#xA;# The Journey&#xA;&#xA;## Applications | Pi-Hole&#xA;&#xA;I started with a pi-hole appliance running on a pi-0 I&#xA;had lying around. So, a little introduction into SSH and foreign operating&#xA;systems (I was loosely familiar with Linux and so Raspbian wasn&#39;t a huge deal&#xA;to start with) and then you could just [install pi-hole](https://docs.pi-hole.net/main/basic-install/).&#xA;After installing it I got to learn a little bit about networking, DNS, DHCP,&#xA;etc. all from just exploring and trying out the features of pi-hole.&#xA;&#xA;## Hardware&#xA;&#xA;From there I happened to come into a few computers kind of for free that a church was&#xA;recycling and so now with new-to-me x86 hardware and armed with a tiny bit of&#xA;docker experience at work - I thought &#34;well I wonder if I could run pi-hole in&#xA;docker on a Linux machine?&#34; and that opened the door to running other things in docker.&#xA;&#xA;# Applications | Free-NAS&#xA;&#xA;I quickly decided I wanted a NAS after talking with a friend at work, and one&#xA;of those computers that I inherited was the perfect target for Freenas by iX&#xA;systems (Freenas has since morphed into a few things - primarily TrueNAS Core&#xA;for the homelabber). That got me somewhat familiar with jails (which is a BSD&#xA;concept as FreeNAS was based on FreeBSD, not Linux) and running&#xA;containers in different ways and then I decided I wanted Linux so I rebuilt with&#xA;Ubuntu.&#xA;&#xA;!!! note &#34;&#34;&#xA;&#xA;    there&#39;s been several hardware changes and such in there but that&#xA;    does more or less get me to arrive at where I&#39;m at today which is I have a&#xA;    few different boxes running pretty standard operating systems for their&#xA;    purposes and they are as follows.&#xA;&#xA;# Current Homelab Setup&#xA;&#xA;!!! note &#34;Find updated information at [[the-homelab]]&#34;&#xA;&#xA;## Ad blocking | Pi-Hole&#xA;&#xA;Hardware: pi-3&#xA;&#xA;I have a Raspberry Pi 3 hardwired in that is running pi-hole so that&#39;s been a&#xA;part of my infrastructure now for a long time.&#xA;&#xA;## Router | OPNSense&#xA;&#xA;!!! note &#34;stats&#34;&#xA;&#xA;    CPU: i5-8700&#xA;&#xA;    Memory: 8GB of whatever was in the box&#xA;&#xA;    Storage: 1TB SSD&#xA;&#xA;My router is an old Optiplex SFF 5060 I got from Amazon for less than $100.&#xA;So I&#39;m running a x86 system for my router with&#xA;OpenSense on it. Just seemed it to be another home lab standard and I&#39;d like to&#xA;someday bring pi-hole over there or use AdGuard or integrate those two things&#xA;maybe a little bit more completely but right now they are mostly separate.&#xA;&#xA;## Networking | VLANs&#xA;&#xA;There&#39;s a&#xA;managed switch in there for some VLAN tomfoolery for my cameras and an IOT&#xA;network type of a thing.&#xA;&#xA;## Networking | VPN | Tailscale&#xA;&#xA;They&#39;re on tailscale as well so my DNS happens over tailscale.&#xA;&#xA;## My Desktop&#xA;&#xA;!!! note &#34;stats&#34;&#xA;&#xA;    CPU: Ryzen 7 5700X&#xA;&#xA;    GPU: Nvidia 3090&#xA;&#xA;    Memory: 64 GB&#xA;&#xA;    Storage: 4TB SSD + 2 TB HDD for zfs backup&#xA;&#xA;    OS: Universal Blue Aurora&#xA;&#xA;My daily-driver desktop is somewhat apart of my homelab now as I have a 3090 in&#xA;there with 20 GB of VRAM so I can run some heavier LLMs for self-hosted AI&#xA;workloads. Everything in that space runs in a container and then I manage&#xA;docker containers with compose stacks and portainer for visibility.&#xA;&#xA;### Applications&#xA;&#xA;Some of the apps I run here are ollama, open-webui, automatic1111&#39;s stable diffusion webui, whisper-webui&#xA;&#xA;## NAS / Server&#xA;&#xA;!!! note &#34;stats&#34;&#xA;&#xA;    CPU: Ryzen 7 5700G&#xA;&#xA;    GPU: None right now&#xA;&#xA;    Memory: 128 GB&#xA;&#xA;    Storage: 2x12 TB ZFS Mirror + another 2x12 TB ZFS Mirror + 500GB disk for NVR&#xA;&#xA;    OS: Ubuntu Server 24.04&#xA;&#xA;At the moment I am managing containers using Docker Compose stacks. Many&#xA;applications have their own stack but then I also have stacks of many&#xA;applications. The Compose files are all organized by host and they&#39;re in git&#xA;and I use GitHub as my main get back and remote storage.&#xA;&#xA;### Applications&#xA;&#xA;There are currently 74 containers running on my server, I will not list them all but here&#39;s some highlights:&#xA;&#xA;- traefik&#xA;- portainer&#xA;- nextcloud&#xA;- jellyfin&#xA;- \*arr stack&#xA;- code-server&#xA;- kanboard&#xA;&#xA;I regularly spin up compose stacks to try new things as I hear about them in&#xA;newsletters and such - I will be making an attempt to write about them more&#xA;frequently in a homelabbing series&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Backups interrupted by full disk usage</title>
    <id>https://pype.dev/backups-interrupted-by-full-disk-usage/</id>
    <updated>2025-06-03T21:08:50Z</updated>
    <published>2025-06-03T21:08:50Z</published>
    <link href="https://pype.dev/backups-interrupted-by-full-disk-usage/" rel="alternate" type="text/html"></link>
    <summary type="text">I just got a message from HCIO that my primary backup script is late... This happens every now and then but I decided to check on it... Quickly in and I...</summary>
    <content type="html">&lt;p&gt;I just got a message from HCIO that my primary backup script is late&amp;hellip; This&#xA;happens every now and then but I decided to check on it&amp;hellip; Quickly &lt;code&gt;ssh&lt;/code&gt; in and&#xA;I notice it takes a long time to connect, but nothing errors out&amp;hellip; I&amp;rsquo;ve been&#xA;in the game long enough to think this kind of latency is often disk IO. After&#xA;waiting a bit and haulting the zshrc sourcing, I hit a &lt;code&gt;sudo dust / -H&lt;/code&gt; and bam&amp;hellip;&#xA;There&amp;rsquo;s a container logfile that&amp;rsquo;s about 80GB sitting in &lt;code&gt;/var&lt;/code&gt;&amp;hellip;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;  75G   │ │ │ │   ┌── 57409a7f8d3168b368e0230babd08ec2e20aabb288806aa13652db1e653a0eee-json.log&#xA;  75G   │ │ │ │ ┌─┴ 57409a7f8d3168b368e0230babd08ec2e20aabb288806aa13652db1e653a0eee           &#xA;  76G   │ │ │ ├─┴ containers                                                                   &#xA;  83G   │ │ ├─┴ docker                                                                         &#xA;  85G   │ ├─┴ lib                                                                              &#xA;  90G   ├─┴ var                                                                                &#xA; 117G ┌─┴ /&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Easy enough to remove, but I need to setup some alerts on disk usage, and&#xA;identify the container to limit the log file size&lt;/p&gt;&#xA;&lt;div class=&#34;admonition info&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Useful Notifications&lt;/p&gt;&#xA;&lt;p&gt;I use healthchecks.io to monitor several scripts. You can self-host it but&#xA;I use the hosted service since he has simple Signal integration&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>homelab-computer-vision-pipelines</title>
    <id>https://pype.dev/homelab-computer-vision-pipelines/</id>
    <updated>2025-05-31T08:18:55Z</updated>
    <published>2025-05-31T08:18:55Z</published>
    <link href="https://pype.dev/homelab-computer-vision-pipelines/" rel="alternate" type="text/html"></link>
    <summary type="text">Done in 11 seconds! Subtitle and audio files are in the outputs folder.</summary>
    <content type="html">&lt;p&gt;Done in 11 seconds! Subtitle and audio files are in the outputs folder.&lt;/p&gt;&#xA;&lt;p&gt;I wanted to talk through an idea I have for some computer vision pipelines at home.&#xA;I heard of a tool called Roboflow, which is like a no-code computer vision pipeline training&#xA;and inference tool.&#xA;It seems very cool.&#xA;I also use Frigate at home, and Frigate supports lots of detection on the NVR side.&#xA;And so deploying a model in Frigate or using Roboflow, depending on what kind of customization&#xA;you would need, you can have these detections potentially be as accurate as you want, at&#xA;least with Roboflow.&#xA;The thing is, I don&amp;rsquo;t know about Frigate, but my ideas are if I have a model at home&#xA;that knows me and my wife and my children by name, then when monitored areas issue detections,&#xA;for example, say I&amp;rsquo;m in the backyard and the temperature is above 80 degrees, have a home&#xA;assistant kick on a sprinkler system or something like that.&#xA;And if my wife is back there and it&amp;rsquo;s 80 degrees, don&amp;rsquo;t do that because she wouldn&amp;rsquo;t want that&#xA;sprinkler on or whatever.&#xA;I think that something like that would be very feasible once you have the model.&#xA;So you would need a way to train the model, which would require gathering data and labeling&#xA;it.&#xA;Then you could train a model in lots of ways, but you need to have the deployment in mind.&#xA;If the deployment was Frigate, you would need to be able to compile that model into some&#xA;TensorFlow Lite thing that can run on a TPU.&#xA;That sounds very possible.&#xA;Otherwise, the Roboflow would probably be the platform for training, and then they make&#xA;the deployment kind of a one-click thing.&#xA;From there, I guess either way, Frigate is running the inference, and so the home assistant&#xA;integration would be about the same.&#xA;Frigate sends notifications over MQTT, and based on the Frigate blueprint that I&amp;rsquo;m using&#xA;for home assistant anyway, based on the object and whatever other conditions you want to&#xA;set in an automation, you do whatever you want to do in home assistant.&#xA;That sounds neat.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Backups are dope</title>
    <id>https://pype.dev/backups-are-dope/</id>
    <updated>2025-05-27T19:42:27Z</updated>
    <published>2025-05-27T19:42:27Z</published>
    <link href="https://pype.dev/backups-are-dope/" rel="alternate" type="text/html"></link>
    <summary type="text">I accidently chown&#39;d -R an app directory and it totally screwed up the database folder. Luckily I zfs replicate my docker volumes to another drive even on...</summary>
    <content type="text">&#xA;I accidently chown&#39;d -R an app directory and it totally screwed up the database&#xA;folder. Luckily I zfs replicate my docker volumes to another drive even on the&#xA;same host, so a quick [rsync] from /harbor/encrypted/docker/manyfold to&#xA;/tank/encrypted/docker/manyfold got me back up and running since I hadn&#39;t&#xA;replicated the messed up permission set yet&#xA;&#xA;Q: How to link to my rsync like a pro post?&#xA;&#xA;A: Wikilinks `[[rsync-like-a-pro]]` [[rsync-like-a-pro]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>SearXNG</title>
    <id>https://pype.dev/searxng/</id>
    <updated>2025-05-25T08:33:10Z</updated>
    <published>2025-05-25T08:33:10Z</published>
    <link href="https://pype.dev/searxng/" rel="alternate" type="text/html"></link>
    <summary type="text">I heard about SearXNG on a couple podcasts and saw it trending on GitHub several times before I finally decided to stand it up. I used it transparently when...</summary>
    <content type="html">&lt;p&gt;I heard about &lt;a href=&#34;https://searxng.org&#34;&gt;SearXNG&lt;/a&gt; on a couple podcasts and saw it trending on GitHub&#xA;several times before I finally decided to stand it up.&#xA;I used it transparently when trying out &lt;a href=&#34;https://khoj.dev/&#34;&gt;khoj&lt;/a&gt;, a self-hosted AI LLM agent&#xA;playground kind of a thing, but I&amp;rsquo;ve also been messing around with &lt;a href=&#34;https://openwebui.com&#34;&gt;Open-WebUI&lt;/a&gt; to&#xA;have a self-hosted ChatGPT-like experience.&#xA;I don&amp;rsquo;t know if SearchXNG used to be harder to set up, but it was pretty simple with a Docker Compose up&#xA;and a couple configuration options given my personal homelab setup. Using it feels&#xA;very nice.&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;docker.io/valkey/valkey:8-alpine&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;valkey-server --save 30 1 --loglevel warning&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;./data/redis:/data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json-file&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1m&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;searxng&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;searxng&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;docker.io/searxng/searxng:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8080:8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;./data/searxng:/etc/searxng:rw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.env&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json-file&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1m&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I love the self-hosted aspect. I love not seeing any ads on my search&#xA;results. I did a few searches where I know what results to expect and&#xA;it did okay.&#xA;It is good right now at filtering out garbage in my results.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://dropper.wayl.one/api/file/4ff5953c-bc8d-4978-8509-b43582460a0b.png&#34; alt=&#34;SearXNG&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;So I look forward to tweaking it and using it as a search&#xA;backend with open web UI. Next on my list is having enough resources to run&#xA;Ollama and a stable diffusion generator at the same time and have image&#xA;generation working through open web UI.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Grafana + Gotify for push notifications</title>
    <id>https://pype.dev/grafana-gotify-for-push-notifications/</id>
    <updated>2025-04-07T10:12:51Z</updated>
    <published>2025-04-07T10:12:51Z</published>
    <link href="https://pype.dev/grafana-gotify-for-push-notifications/" rel="alternate" type="text/html"></link>
    <summary type="text">It&#39;s easy to configure push notifications through Gotify from Grafana by setting up a generic Alerting Contact Point...</summary>
    <content type="html">&lt;p&gt;It&amp;rsquo;s easy to configure push notifications through Gotify from Grafana by setting up a generic &lt;code&gt;Webhook&lt;/code&gt; Alerting Contact Point&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;The parameters are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTP Method: POST&lt;/li&gt;&#xA;&lt;li&gt;URL: http://&lt;gotify url&gt;/message&lt;/li&gt;&#xA;&lt;li&gt;Authentication is done with an app token generated from Gotify, and you put it in &lt;code&gt;Authorization Header: Credentials&lt;/code&gt; in the Grafana configuration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://dropper.wayl.one/api/file/610b4efb-b4c4-4930-ac63-499d501ba3c3.png&#34;&gt;See image&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 audiobookshelf</title>
    <id>https://pype.dev/thoughts-479/</id>
    <updated>2024-12-29T20:53:19Z</updated>
    <published>2024-12-29T20:53:19Z</published>
    <link href="https://pype.dev/thoughts-479/" rel="alternate" type="text/html"></link>
    <summary type="text">Audiobookshelf looks like a solid competitor for booksonic. I&#39;ve liked the simple subsonic api driven nature of booksoni</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://www.audiobookshelf.org/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://www.audiobookshelf.org/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - audiobookshelf&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://www.audiobookshelf.org/&#34;&gt;audiobookshelf&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;Audiobookshelf looks like a solid competitor for booksonic. I&#39;ve liked the simple subsonic api driven nature of booksonic but my wife would like some more appropriate and easy-to-use organization... booksonic is not a great &#34;library&#34;... I&#39;m looking forward to putting this into my homelab soon &#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Add a healthcheck to your FastAPI app</title>
    <id>https://pype.dev/add-a-healthcheck-to-your-fastapi-app/</id>
    <updated>2024-12-15T15:41:36Z</updated>
    <published>2024-12-15T15:41:36Z</published>
    <link href="https://pype.dev/add-a-healthcheck-to-your-fastapi-app/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;m building a few FastAPI apps to throw in docker and run on my homelab... I wanted to add healthchecks and here&#39;s a simple way to do it</summary>
    <content type="html">&lt;p&gt;I&amp;rsquo;m building a few FastAPI apps to throw in docker and run on my homelab&amp;hellip; I wanted to add healthchecks and here&amp;rsquo;s a simple way to do it&lt;/p&gt;&#xA;&lt;p&gt;Make sure to install &lt;code&gt;curl&lt;/code&gt; in the dockerfile (near the top for effeciency)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# Install curl with minimal dependencies&#xA;RUN apt-get update &amp;amp;&amp;amp; \&#xA;    apt-get install -y --no-install-recommends curl &amp;amp;&amp;amp; \&#xA;    apt-get clean &amp;amp;&amp;amp; \&#xA;    rm -rf /var/lib/apt/lists/*&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Then I recommend making compose files even for single image deployments&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;services:&#xA;  app:&#xA;    build: .&#xA;    volumes:&#xA;      - type: bind&#xA;        source: .&#xA;        target: /app&#xA;    environment:&#xA;      - PYTHONPATH=/app&#xA;      - DOCKER_ENV=true&#xA;      - UV_VIRTUALENV=/opt/app-env&#xA;    user: &amp;quot;1000:1000&amp;quot;&#xA;    restart: unless-stopped&#xA;    healthcheck:&#xA;      test: [&amp;quot;CMD&amp;quot;, &amp;quot;curl&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;http://localhost:8000/health&amp;quot;]&#xA;      interval: 30s&#xA;      timeout: 10s&#xA;      retries: 3&#xA;      start_period: 10s&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Then finally you&amp;rsquo;ll need a &lt;code&gt;/health&lt;/code&gt; endpoint&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@app.get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/health&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response_class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HTMLResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;health_check&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    A health check endpoint that returns a status message.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Service is healthy&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Jellyfin container updates for HWE + AMD</title>
    <id>https://pype.dev/jellyfin-container-updates-for-hwe-amd/</id>
    <updated>2024-12-14T11:27:15Z</updated>
    <published>2024-12-14T11:27:15Z</published>
    <link href="https://pype.dev/jellyfin-container-updates-for-hwe-amd/" rel="alternate" type="text/html"></link>
    <summary type="text">I use LSIO Jelyfin container for the easy addon they provide for AMD GPUs but I couldn&#39;t get trickplay to work with HWE...</summary>
    <content type="html">&lt;p&gt;I use LSIO Jelyfin container for the easy addon they provide for AMD GPUs but I couldn&amp;rsquo;t get trickplay to work with HWE&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;There was almost NOTHING on the internet about the error, and all the threads were about BSD systems&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Thankfully someone posted &lt;a href=&#34;https://forum.jellyfin.org/t-jellyfin-amd-docker&#34;&gt;on the formum here&lt;/a&gt; but the only answer was to literally upgrade stuff in the container&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Someday maybe I&amp;rsquo;ll build off of LSIO to add this, but until then I shell&amp;rsquo;d in and homelab&amp;rsquo;d the hell out of it&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;THIS IS INSIDE THE CONTAINER - I use Portianer to make it easy&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;pre&gt;&lt;code&gt;&#xA;apt update &amp;amp;&amp;amp; apt install -y curl gpg&#xA;&#xA;mkdir -p /etc/apt/keyrings&#xA;&#xA;curl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | gpg --dearmor -o /etc/apt/keyrings/rocm.gpg&#xA;&#xA;cat &amp;lt;&amp;lt;EOF | tee /etc/apt/sources.list.d/rocm.sources&#xA;&#xA;Types: deb&#xA;&#xA;URIs: https://repo.radeon.com/rocm/apt/latest&#xA;&#xA;Suites: ubuntu&#xA;&#xA;Components: main&#xA;&#xA;Architectures: amd64&#xA;&#xA;Signed-By: /etc/apt/keyrings/rocm.gpg&#xA;&#xA;EOF&#xA;&#xA;apt update &amp;amp;&amp;amp; apt install -y rocm-opencl-runtime&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>hostnamectl to easily change hostname</title>
    <id>https://pype.dev/hostnamectl-to-easily-change-hostname/</id>
    <updated>2024-12-06T07:25:59Z</updated>
    <published>2024-12-06T07:25:59Z</published>
    <link href="https://pype.dev/hostnamectl-to-easily-change-hostname/" rel="alternate" type="text/html"></link>
    <summary type="text">hostnamectl is apparently a linux utility for easily changing your hostname in a variety of ways</summary>
    <content type="html">&lt;p&gt;hostnamectl is apparently a linux utility for easily changing your hostname in a variety of ways&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ hostnamectl --help&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hostnamectl &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;OPTIONS...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; COMMAND ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query or change system hostname.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Commands:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  status                 Show current hostname settings&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  hostname &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;NAME&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;        Get/set system hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  icon-name &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;NAME&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;       Get/set icon name &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; host&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  chassis &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;NAME&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;         Get/set chassis &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; host&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  deployment &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;NAME&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;      Get/set deployment environment &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; host&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  location &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;NAME&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;        Get/set location &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; host&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Options:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -h --help              Show this &lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     --version           Show package version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     --no-ask-password   Do not prompt &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H --host&lt;span class=&#34;o&#34;&gt;=[&lt;/span&gt;USER@&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;HOST  Operate on remote host&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -M --machine&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;CONTAINER Operate on &lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; container&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     --transient         Only &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; transient hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     --static            Only &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; static hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     --pretty            Only &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; pretty hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     --json&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;pretty&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;short&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                         Generate JSON output&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;See the hostnamectl&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; man page &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; details.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I learned there&amp;rsquo;s transient and static hostnames, so that&amp;rsquo;s cool&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;The thing I needed was &lt;code&gt;hostnamectl --static hostname babyblue-aurora&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;pretty sweet tool&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>DNS Broke After Reboot - Ubuntu 22.04</title>
    <id>https://pype.dev/dns-broke-after-reboot-ubuntu-22-04/</id>
    <updated>2024-11-22T08:08:40Z</updated>
    <published>2024-11-22T08:08:40Z</published>
    <link href="https://pype.dev/dns-broke-after-reboot-ubuntu-22-04/" rel="alternate" type="text/html"></link>
    <summary type="text">I rebooted by server and DNS broke randomly. I have no idea if it was from a kernel update or what but that&#39;s the issue with Ubuntu I guess...</summary>
    <content type="html">&lt;p&gt;I rebooted by server and DNS broke randomly. I have no idea if it was from a kernel update or what but that&amp;rsquo;s the issue with Ubuntu I guess&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;After much toil and none of the other options working for me (sorry to not have those documented here) this is what got me the vic from this &lt;a href=&#34;https://askubuntu.com/questions/1406827/how-to-set-dns-on-ubuntu-22-04-when-you-have-no-netplan-config&#34;&gt;SO Post&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;sudo mkdir /etc/systemd/resolved.conf.d/&#xA;sudo $EDITOR /etc/systemd/resolved.conf.d/dns_servers.conf&lt;/p&gt;&#xA;&lt;p&gt;Most folks probably are good with google (8.8.8.8) and cloudflare (1.1.1.1)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;[Resolve]&#xA;DNS=8.8.8.8 1.1.1.1&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;But I decided to use tailscale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;[Resolve]&#xA;DNS=100.100.100.100&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Then restart systemd-resolved&lt;/p&gt;&#xA;&lt;p&gt;sudo systemctl restart systemd-resolved&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>OPNSense Bootstrap Recovery</title>
    <id>https://pype.dev/opnsense-bootstrap-recovery/</id>
    <updated>2024-11-07T08:40:19Z</updated>
    <published>2024-11-07T08:40:19Z</published>
    <link href="https://pype.dev/opnsense-bootstrap-recovery/" rel="alternate" type="text/html"></link>
    <summary type="text">enabling DHCP WAN port ()- running the bootstrap script -</summary>
    <content type="html">&lt;p&gt;enabling DHCP WAN port (&lt;code&gt;dhclient &amp;lt;iface&amp;gt;&lt;/code&gt;)- running the bootstrap script - &lt;code&gt;sh /usr/local/sbin/opnsense-bootstrap&lt;/code&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Recovering OPNSense</title>
    <id>https://pype.dev/recovering-opnsense/</id>
    <updated>2024-11-06T00:00:00Z</updated>
    <published>2024-11-06T00:00:00Z</published>
    <link href="https://pype.dev/recovering-opnsense/" rel="alternate" type="text/html"></link>
    <summary type="text">I woke up to faulty internet and after some troubleshooting it turns out the root zfs dataset that OPNSense boots from got corrupted...</summary>
    <content type="html">&lt;p&gt;I woke up to faulty internet and after some troubleshooting it turns out the&#xA;root zfs dataset that OPNSense boots from got corrupted&amp;hellip;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;PRO-TIP - Auto backup your OPNSense config to Google Drive, git, or&#xA;nextcloud&amp;hellip; But if you won&amp;rsquo;t then at least back up your OPNSense config&#xA;somewhere everytime you update it.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;It&amp;rsquo;s too much to recount every issue, so here&amp;rsquo;s a bullet list what worked.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;On a fresh drive install OPNSense&lt;/li&gt;&#xA;&lt;li&gt;Plug in the old drive through a USB enclosure - now I&amp;rsquo;m not sure what would&#xA;happen if you plugged it in along with the new drive and then booted up.&#xA;Because both drives will have a zfs pool &lt;code&gt;zroot&lt;/code&gt; and the boot dataset is&#xA;automounted at &lt;code&gt;/zroot/ROOT/default&lt;/code&gt;. My old &lt;code&gt;zroot&lt;/code&gt; pool was &lt;code&gt;SUSPENDED&lt;/code&gt; so it&#xA;didn&amp;rsquo;t automount&lt;/li&gt;&#xA;&lt;li&gt;Because the old &lt;code&gt;zoot/ROOT/default&lt;/code&gt; was corrupted I did this to mount it RO:&#xA;&lt;code&gt;zpool import -d &amp;lt;path to zfs partition - /dev/stuff&amp;gt; -N zroot zrootrecovery&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;-d is the zfs flag to import the pool by disk id, -N it to not mount any of&#xA;the datasets (we need to change mountpoints) and the &lt;code&gt;zroot zrootrecovery&lt;/code&gt;&#xA;imports the &lt;code&gt;zroot&lt;/code&gt; pool with a new name&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;Change the mountpoints for all the &lt;code&gt;zrootrecovery&lt;/code&gt; datasets to somewhere&#xA;like &lt;code&gt;/mnt/zrootrecovery&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Depending on the mount point you set you&amp;rsquo;ll find a &lt;code&gt;config&lt;/code&gt; directory around&#xA;&lt;code&gt;/mnt/zrootrecovery/ROOT/default/config&lt;/code&gt; - copy the file you want to another&#xA;machine via scp or whatever&lt;/li&gt;&#xA;&lt;li&gt;Go to OPNSense webui and recover from that config!&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;All in all this process took me around 8 hours but I did run into about ever&#xA;issue under the sun (several bad disks in the mix, a laptop that wouldn&amp;rsquo;t live&#xA;boot into a BSD system, etc.)&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>docker-remote-add</title>
    <id>https://pype.dev/docker-remote-add/</id>
    <updated>2024-09-17T06:19:00Z</updated>
    <published>2024-09-17T06:19:00Z</published>
    <link href="https://pype.dev/docker-remote-add/" rel="alternate" type="text/html"></link>
    <summary type="text">Add from url??</summary>
    <content type="html">&lt;p&gt;Add from url??&lt;/p&gt;&#xA;&lt;p&gt;ADD &lt;a href=&#34;http://example.com/cars.csv&#34;&gt;http://example.com/cars.csv&lt;/a&gt; /tmp/cars.csv&lt;/p&gt;&#xA;&lt;p&gt;Unpack automatically!? (.tar, .tar.gz, .tgz, .bz2, .tbz2, .txz, .zip)&lt;/p&gt;&#xA;&lt;p&gt;ADD myapp.tar.gz /opt/myapp/&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Docker copy and chown</title>
    <id>https://pype.dev/docker-copy-and-chown/</id>
    <updated>2024-09-17T06:18:09Z</updated>
    <published>2024-09-17T06:18:09Z</published>
    <link href="https://pype.dev/docker-copy-and-chown/" rel="alternate" type="text/html"></link>
    <summary type="text">COPY --chown=myuser:mygroup source-file target-file</summary>
    <content type="html">&lt;p&gt;COPY &amp;ndash;chown=myuser:mygroup source-file target-file&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Interesting IPs between Jellyfin clients and server depending on tailscale and server address</title>
    <id>https://pype.dev/interesting-ips-between-jellyfin-clients-and-server-depending-on-tailscale-and-server-address/</id>
    <updated>2024-07-12T06:24:57Z</updated>
    <published>2024-07-12T06:24:57Z</published>
    <link href="https://pype.dev/interesting-ips-between-jellyfin-clients-and-server-depending-on-tailscale-and-server-address/" rel="alternate" type="text/html"></link>
    <summary type="text">When connecting from my phone to jellyfin I&#39;m seeing some interesting patterns.</summary>
    <content type="html">&lt;p&gt;When connecting from my phone to jellyfin I&amp;rsquo;m seeing some interesting patterns.&lt;/p&gt;&#xA;&lt;h2 id=&#34;scenarios&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Scenarios&lt;/span&gt; &lt;a href=&#34;#scenarios&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;tailscale-ip-of-phone-is-listed-as-local-network-to-jellyfin&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Tailscale IP of phone is listed as local network to jellyfin&lt;/span&gt; &lt;a href=&#34;#tailscale-ip-of-phone-is-listed-as-local-network-to-jellyfin&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Wifi: off&#xA;Tailscale: on&#xA;Use exit node: on&#xA;LAN access: on&#xA;Jellyfin: LAN IP&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin sees 192.168.1.1, my router address&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Wifi: off&#xA;tailscale: on&#xA;Use exit node: on&#xA;LAN access: on&#xA;Jellyfin: Tailscale magic DNS&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin sees the docker bridge network&lt;/p&gt;&#xA;&lt;p&gt;Q: This might be because of traefik somehow&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Wifi: off&#xA;tailsacale: on&#xA;Use exit node: on&#xA;LAN access: off&#xA;Jellyfin: LAN IP&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin sees the 192.168.1.1&lt;/p&gt;&#xA;&lt;p&gt;Q: Why did this work even work?&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Wifi: off&#xA;tailsacale: on&#xA;Use exit node: on&#xA;LAN access: off&#xA;Jellyfin: Tailscale magic DNS&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin sees the docker bridge network&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Wifi: off&#xA;tailsacale: on&#xA;Use exit node: off&#xA;LAN access: off&#xA;Jellyfin: LAN IP&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin sees the 192.168.1.1&lt;/p&gt;&#xA;&lt;p&gt;Q: Why did this work?&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Wifi: off&#xA;tailsacale: on&#xA;Use exit node: off&#xA;LAN access: off&#xA;Jellyfin: Tailscale magic DNS&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin sees the docker bridge network&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Wifi: on&#xA;tailsacale: of&#xA;Use exit node: off&#xA;LAN access: off&#xA;Jellyfin: LAN IP (via pihole DNS)&lt;/p&gt;&#xA;&lt;p&gt;Jellyfin sees the IP of my phone&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Upgrading your kernel can F you up… whoops</title>
    <id>https://pype.dev/upgrading-your-kernel-can-f-you-up-whoops/</id>
    <updated>2024-06-26T10:21:59Z</updated>
    <published>2024-06-26T10:21:59Z</published>
    <link href="https://pype.dev/upgrading-your-kernel-can-f-you-up-whoops/" rel="alternate" type="text/html"></link>
    <summary type="text">https://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975 I lost TPU for frigate, this saved me ass</summary>
    <content type="html">&lt;p&gt;&lt;a href=&#34;https://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975&#34;&gt;https://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975&lt;/a&gt; I lost TPU for frigate, this saved me ass&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Customize K9s</title>
    <id>https://pype.dev/customize-k9s/</id>
    <updated>2024-05-06T11:57:07Z</updated>
    <published>2024-05-06T11:57:07Z</published>
    <link href="https://pype.dev/customize-k9s/" rel="alternate" type="text/html"></link>
    <summary type="text">To customize k9s use the skins from catppuccin or the ones k9s supplies</summary>
    <content type="html">&lt;p&gt;To customize k9s use the skins from catppuccin or the ones k9s supplies&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;XDG_CONFIG_HOME&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:-&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/.config&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/k9s/skins&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$OUT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -L https://github.com/catppuccin/k9s/archive/main.tar.gz &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; tar xz -C &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$OUT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; --strip-components&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; k9s-main/dist&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then edit your k9s config&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# ~/.config/k9s/config.yml&#xA;k9s:&#xA;  ui:&#xA;    skin: catppuccin-mocha&#xA;    # ...or another flavor:&#xA;    # skin: catppuccin-macchiato&#xA;    # skin: catppuccin-frappe&#xA;    # skin: catppuccin-latte&#xA;&#xA;    # ...or the transparent variants:&#xA;    # skin: catppuccin-mocha-transparent&#xA;    # skin: catppuccin-macchiato-transparent&#xA;    # skin: catppuccin-frappe-transparent&#xA;    # skin: catppuccin-latte-transparent&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Other k9s skins are available &lt;a href=&#34;https://github.com/derailed/k9s/tree/master/skins&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Kanboard to keep me focused on my own ideas</title>
    <id>https://pype.dev/kanboard-to-keep-me-focused-on-my-own-ideas/</id>
    <updated>2024-04-20T18:27:07Z</updated>
    <published>2024-04-20T18:27:07Z</published>
    <link href="https://pype.dev/kanboard-to-keep-me-focused-on-my-own-ideas/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;ve been using kanboard as a self-hosted kanban board. It&#39;s keeping me focused on Digital Harbor when I&#39;d rather be doing something less productive.</summary>
    <content type="html">&lt;h2 id=&#34;tl-dr&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;TL;DR&lt;/span&gt; &lt;a href=&#34;#tl-dr&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been using kanboard as a self-hosted kanban board. It&amp;rsquo;s keeping me focused on &lt;a href=&#34;https://myditialharbor.com&#34;&gt;Digital Harbor&lt;/a&gt; when I&amp;rsquo;d rather be doing something less productive.&lt;/p&gt;&#xA;&lt;h2 id=&#34;my-todos&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;My TODOs&lt;/span&gt; &lt;a href=&#34;#my-todos&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the thing about my TODOs&amp;hellip; they&amp;rsquo;re everywhere. I&amp;rsquo;ve tried a crazy amount of different organizational tactics for my todo items. I&amp;rsquo;ve tried post-it notes, a journal, &lt;code&gt;TODO.md&lt;/code&gt; in specific repos, a master &lt;code&gt;todo&lt;/code&gt; repo, todo CLIs, etc&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;The problem for me was consistency&amp;hellip; I would regularly forget what I was using for TODOs at that moment in my life&amp;hellip; was there a todo file in this project? Do I have a todo repo cloned on this computer? Is this stuff in my journal or on post-it notes?&lt;/p&gt;&#xA;&lt;p&gt;And what do I do with new ideas? Do I organize them centrally or use a repo for the idea I have?&lt;/p&gt;&#xA;&lt;p&gt;It was getting out of hand to a debilitating degree&amp;hellip; For a while I just gave up on being organized at all&amp;hellip; Things would get done as necessary and if I got some motivation to work on something it was immediately smothered with the anxiety of how I was going to organize my work&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;At some point it became too much&amp;hellip; Now, I have some experience with Azure DevOps/Jira for project management and then I came across Kanboard&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;kanboard&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Kanboard&lt;/span&gt; &lt;a href=&#34;#kanboard&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://kanboard.org/&#34;&gt;Kanboard&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Kanboard is just a self-hosted kanban style todo app. I know there&amp;rsquo;s a ton of these so the TL;DR of my lesson is I picked an app that I would just use based on simplicity of managing and hosting.&lt;/p&gt;&#xA;&lt;p&gt;I have had kanboard running in my homelab for a long time, but I only barely use it intermittenly. And at that rate I didn&amp;rsquo;t spend any real time organizing my tickets, so I wasn&amp;rsquo;t akshuallly using it - it was just a post-it note replacement.&lt;/p&gt;&#xA;&lt;p&gt;But then I had an idea for a genuine business idea, and if I was going to ever have a hope of making it a reality, I needed to stay organized. This was when I decided to give kanboard a little more effort&amp;hellip; I knew I could always remember that I&amp;rsquo;d chosen an app as my TODO solution (given all the time I spent questioning what I was using at any given point in time). I also knew I could host kanboard so that I could get to it from wherever was necessary because my homelab is relatively easy to add another public service to.&lt;/p&gt;&#xA;&lt;p&gt;So once I just decided to lean into this thing, I would take advantage of any moments of motivation and just jot down ideas for things that had to get done&amp;hellip; Simple stuff like explore an infra management option, add one feature to a config, or migrate one website to another stack&amp;hellip; And I would just write these things downs until I have enough time free to crack down on a task. The beautiful thing is, when I am struck with just enough time to do something, and the motivation to do something, I don&amp;rsquo;t waste any time deciding what to do - past-me did present-me a favor and decided what was important already&amp;hellip; So as long as I do myself the favor, when I&amp;rsquo;m ready to go I am never beaten by the anxiety of not knowing what I ant to do or how I&amp;rsquo;ll track what I&amp;rsquo;m doing&amp;hellip; I chose kanboard and even though it&amp;rsquo;s not as fast as a terminal TUI,  it is reliable, simple, and keeps me focused on what I need to do.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-biggest-benefit&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The biggest benefit&lt;/span&gt; &lt;a href=&#34;#the-biggest-benefit&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Not only is just having one app as the solution nice because it&amp;rsquo;s centrally managed and accessible from wherever I need to get it, but the TOP feature of kanboard I use is comments on tickets&amp;hellip; I get to continue to do future-me favors, my jotting down where I&amp;rsquo;m at in a task, what&amp;rsquo;s left to do, what I&amp;rsquo;m trying, etc&amp;hellip; and future-me is in a great mood, because when I have that free few minutes, I can just read my own past thoughts and get back up to speed without wasting time trying to remember things I never would&amp;rsquo;ve remembered if I hadn&amp;rsquo;t written them down!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>DHCP Restart to Save Ubuntu 22.04 Server Networking</title>
    <id>https://pype.dev/dhcp-restart-to-save-ubuntu-22-04-server-networking/</id>
    <updated>2023-12-31T20:26:50Z</updated>
    <published>2023-12-31T20:26:50Z</published>
    <link href="https://pype.dev/dhcp-restart-to-save-ubuntu-22-04-server-networking/" rel="alternate" type="text/html"></link>
    <summary type="text">I moved a computer to a remote location for an off-site backup but when it was powered on it wouldn&#39;t show up on any networks. A solution that got me back in...</summary>
    <content type="html">&lt;p&gt;I moved a computer to a remote location for an off-site backup but when it was powered on it wouldn&amp;rsquo;t show up on any networks. A solution that got me back in was a friend restarting the dhcp client for me:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dhclient -r -v &amp;lt;interface&amp;gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo dhclient -v &amp;lt;interface&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Simple Port Forwarding OPNSense</title>
    <id>https://pype.dev/simple-port-forwarding-opnsense/</id>
    <updated>2023-10-17T10:26:34Z</updated>
    <published>2023-10-17T10:26:34Z</published>
    <link href="https://pype.dev/simple-port-forwarding-opnsense/" rel="alternate" type="text/html"></link>
    <summary type="text">https://forum.opnsense.org/index.php?topic=8783.0</summary>
    <content type="html">&lt;p&gt;&lt;a href=&#34;https://forum.opnsense.org/index.php?topic=8783.0&#34;&gt;https://forum.opnsense.org/index.php?topic=8783.0&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Refresh Nextcloud Groupfolders after messing around on the filesystem</title>
    <id>https://pype.dev/refresh-nextcloud-groupfolders-after-messing-around-on-the-filesystem/</id>
    <updated>2023-09-23T12:45:06Z</updated>
    <published>2023-09-23T12:45:06Z</published>
    <link href="https://pype.dev/refresh-nextcloud-groupfolders-after-messing-around-on-the-filesystem/" rel="alternate" type="text/html"></link>
    <summary type="text">Exec in as www-data and run ./occ groupfolders:scan folder_id -v (the -v to see what it&#39;s doing)</summary>
    <content type="html">&lt;p&gt;Exec in as www-data and run ./occ groupfolders:scan folder_id -v (the -v to see what it&amp;rsquo;s doing)&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>lsof to find what’s using your filesystem</title>
    <id>https://pype.dev/lsof-to-find-what-s-using-your-filesystem/</id>
    <updated>2023-04-09T13:32:38Z</updated>
    <published>2023-04-09T13:32:38Z</published>
    <link href="https://pype.dev/lsof-to-find-what-s-using-your-filesystem/" rel="alternate" type="text/html"></link>
    <summary type="text">lsof | grep /tank/nas shows me what is using my nas at any time!</summary>
    <content type="html">&lt;p&gt;lsof | grep /tank/nas shows me what is using my nas at any time!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Changing ZFS key for child datasets of encrypted dataset after migration</title>
    <id>https://pype.dev/changing-zfs-key-for-child-datasets-of-encrypted-dataset-after-migration/</id>
    <updated>2023-04-08T20:12:22Z</updated>
    <published>2023-04-08T20:12:22Z</published>
    <link href="https://pype.dev/changing-zfs-key-for-child-datasets-of-encrypted-dataset-after-migration/" rel="alternate" type="text/html"></link>
    <summary type="text">➜ pihole sudo zfs load-key -L file:///path/to/.zfs.tank.key tank/encrypted/vms/arch-sandbox ➜ pihole sudo zfs change-key -o...</summary>
    <content type="html">&lt;p&gt;➜ pihole sudo zfs load-key -L file:///path/to/.zfs.tank.key tank/encrypted/vms/arch-sandbox&#xA;➜ pihole sudo zfs change-key -o keylocation=file:///path/to/.zfs.tank.key -o keyformat=raw tank/encrypted/vms/arch-sandbox&#xA;Need to load-key for each individual dataset, then change key location to be a file instead of the prompt&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Stable Diffusion Notes</title>
    <id>https://pype.dev/stable-diffusion-notes/</id>
    <updated>2023-01-28T14:15:11Z</updated>
    <published>2023-01-28T14:15:11Z</published>
    <link href="https://pype.dev/stable-diffusion-notes/" rel="alternate" type="text/html"></link>
    <summary type="text">Stable Diffusion is an AI art generation model similar to DALLE-2. Here are some prompts for generating art with Stable Diffusion.</summary>
    <content type="html">&lt;h2 id=&#34;chatgpt-prompt&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;ChatGPT Prompt:&lt;/span&gt; &lt;a href=&#34;#chatgpt-prompt&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Stable Diffusion is an AI art generation model similar to DALLE-2.&#xA;Here are some prompts for generating art with Stable Diffusion.&lt;/p&gt;&#xA;&lt;p&gt;Example:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A ghostly apparition drifting through a haunted mansion&amp;rsquo;s grand ballroom, illuminated by flickering candlelight. Eerie, ethereal, moody lighting.&lt;/li&gt;&#xA;&lt;li&gt;portait of a homer simpson archer shooting arrow at forest monster, front game card, drark, marvel comics, dark, smooth&lt;/li&gt;&#xA;&lt;li&gt;pirate, deep focus, fantasy, matte, sharp focus&lt;/li&gt;&#xA;&lt;li&gt;red dead redemption 2, cinematic view, epic sky, detailed, low angle, high detail, warm lighting, volumetric, godrays, vivid, beautiful&lt;/li&gt;&#xA;&lt;li&gt;a fantasy style portrait painting of rachel lane / alison brie hybrid in the style of francois boucher oil painting, rpg portrait&lt;/li&gt;&#xA;&lt;li&gt;athena, greek goddess, claudia black, bronze greek armor, owl crown, d &amp;amp; d, fantasy, portrait, headshot, sharp focus&lt;/li&gt;&#xA;&lt;li&gt;closeup portrait shot of a large strong female biomechanic woman in a scenic scifi environment, elegant, smooth, sharp focus, warframe&lt;/li&gt;&#xA;&lt;li&gt;ultra realistic illustration of steve urkle as the hulk, elegant, smooth, sharp focus&lt;/li&gt;&#xA;&lt;li&gt;portrait of beautiful happy young ana de armas, ethereal, realistic anime, clean lines, sharp lines, crisp lines, vibrant color scheme&lt;/li&gt;&#xA;&lt;li&gt;A highly detailed and hyper realistic portrait of a gorgeous young ana de armas, lisa frank, butterflies, floral, sharp focus&lt;/li&gt;&#xA;&lt;li&gt;lots of delicious tropical fruits with drops of moisture on table, floating colorful water, mysterious expression, in a modern and abstract setting, with bold and colorful abstract art, blurred background, bright lighting&lt;/li&gt;&#xA;&lt;li&gt;1girl, The most beautiful form of chaos, Fauvist design, Flowing colors, Vivid colors, dynamic angle, fantasy world&lt;/li&gt;&#xA;&lt;li&gt;solo, sitting, close-up, girl in the hourglass, Sand is spilling out of the broken hourglass, flowing sand, huge hourglass art, hologram, particles, nebula, magic circle&lt;/li&gt;&#xA;&lt;li&gt;geometric abstract background, 1girl, depth of field, zentangle, mandala, tangle, entangle, beautiful and aesthetic, dynamic angle, glowing skin, floating colorful sparkles the most beautiful form of chaos, elegant, a brutalist designed, vivid colours, romanticism&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The prompt should adhere to and include all of the following rules:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prompt should always be written in English, regardless of the input language. Please provide the prompts in English.&lt;/li&gt;&#xA;&lt;li&gt;Each prompt should consist of a description of the scene followed by modifiers divided by commas.&lt;/li&gt;&#xA;&lt;li&gt;When generating descriptions, focus on portraying the visual elements rather than delving into abstract psychological and emotional aspects. Provide clear and concise details that vividly depict the scene and its composition, capturing the tangible elements that make up the setting.&lt;/li&gt;&#xA;&lt;li&gt;The modifiers should alter the mood, style, lighting, and other aspects of the scene.&lt;/li&gt;&#xA;&lt;li&gt;Multiple modifiers can be used to provide more specific details.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I want you to write me a list of detailed prompts exactly about the IDEA follow the rule at least 6 every time.&lt;/p&gt;&#xA;&lt;p&gt;Ready for my idea?&lt;/p&gt;&#xA;&lt;h2 id=&#34;chatgpt-prompt-for-rpg-v4&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;ChatGPT Prompt for RPG V4:&lt;/span&gt; &lt;a href=&#34;#chatgpt-prompt-for-rpg-v4&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Stable Diffusion is an AI art generation model similar to DALLE-2.&#xA;Here are some pairs of positive and negative prompts for generating art with Stable Diffusion.&lt;/p&gt;&#xA;&lt;p&gt;Example:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Positive: A (full body:1.3) shot at 8k resolution, splash art, fantastic comic book style, photorealistic, intense look, anatomical photorealistic digital painting portrait of a (old male:1.3) human (warrior:1.3) in black and gold intricate (heavy armor:1.3) in a (dark and moody universe:1.3), light particle, very detailed skin,samurai, very detailed eyes, (elden ring style:1.3), (warhammer style:1.1), concept artist, global illumination, depth of field, splash art, art by artgerm and greg rutkowski and viktoria gavrilenko&#xA;Negative: (symmetry:1.2), facial marking, crown, horn, (helmet:1.3), (hoodie:1.1), clock, Female, visible hand, asian, two face, big hair, open mouth, cartoon, high contrast, poorly drawn, Scribbles, Low quality, Low rated, Mediocre, Screenshot, Software, UI, watermark, text, overlay, getty images, cropped, low quality&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Positive: close-up head, facing camera, beautiful satanic female necromancer blood queen, ritualistic (neck tattoo:1.3), (insanely detailed:1.5), ((solo)), (highest quality, Alessandro Casagrande, Greg Rutkowski, Sally Mann, concept art, 4k), (colourful), (high sharpness), ((detailed pupils)), ((painting:1.1)), (digital painting:1.1), detailed face and eyes,Masterpiece, best quality, highly detailed photo:1, 8k, detailed face,photorealistic, (black long Hair:1.1),(young woman),By jeremy mann, by sandra chevrier, by maciej kuciara, smoke and shadow, night, sharp, ((perfect body)), realistic, real shadow, 3d, ((full body)), ((dark and gloomy universe)), (by Michelangelo)&#xA;Negative: crown, (facial marking:1.2), cloth gem, jewel, jewelry, (flower:1.3), (cloak:1.1), (bad art, low detail, pencil drawing, old, mature:1.6), (grainy, low quality, mutated hands and fingers:1.5), (watermark, thin lines:1.3), (deformed, signature:1.2), (big nipples, blurry, ugly, bad anatomy, extra limbs, undersaturated, low resolution), disfigured, deformations, out of frame, amputee, bad proportions, extra limb, missing limbs, distortion, floating limbs, out of frame, poorly drawn face, poorly drawn hands, text, malformed, error, missing fingers, cropped, jpeg artifacts, teeth, unsharp&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Positive: (Painting:1.3) of (Detailed illustration:1.3) A (full body:1.3) shot at 8k resolution, splash art, fantastic comic book style, photorealistic, intense look, anatomical photorealistic digital painting portrait of a (old male:1.3) human (warrior:1.3) in black and gold intricate (heavy armor:1.3) in a (dark and moody universe:1.3), light particle, very detailed skin,samurai, very detailed eyes, (elden ring style:1.3), (warhammer style:1.1), concept artist, global illumination, depth of field, splash art, art by artgerm and greg rutkowski and viktoria gavrilenko&#xA;Negative:  (symmetry:1.2), facial marking, crown, (horn:1.1), (helmet:1.3), (hoodie:1.1), clock, Female, visible hand, asian, two face, big hair, open mouth, cartoon, high contrast, poorly drawn, Scribbles, Low quality, Low rated, Mediocre, Screenshot, Software, UI, watermark, text, overlay, getty images, cropped, low qualityLow quality,Bad composition,Faded,(Photo:1.5),(Frame:1.3),watermark,signa ture&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Positive: sci-fi, space rogue thief girl, (smirk:1.1), short hair, black hood, light armor, big grey eyes, beautiful detailed eyes, drawn by Greg Rutkowski, Yoji Shinkawa:0.6&#xA;Negative: open mouth, facial marking, flower, bad-hands-5, lipstick, text, watermark&lt;/p&gt;&#xA;&lt;p&gt;The prompt should adhere to and include all of the following rules:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Each prompt should consist of a description of the scene followed by modifiers divided by commas.&lt;/li&gt;&#xA;&lt;li&gt;When generating descriptions, focus on portraying the visual elements rather than delving into abstract psychological and emotional aspects. Provide clear and concise details that vividly depict the scene and its composition, capturing the tangible elements that make up the setting.&lt;/li&gt;&#xA;&lt;li&gt;The modifiers should alter the mood, style, lighting, and other aspects of the scene.&lt;/li&gt;&#xA;&lt;li&gt;Multiple modifiers can be used to provide more specific details.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I want you to write me a list of detailed prompts exactly about the IDEA follow the rule at least 6 every time.&lt;/p&gt;&#xA;&lt;p&gt;Ready for my idea?&lt;/p&gt;&#xA;&lt;h3 id=&#34;ideas&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;IDEAS&lt;/span&gt; &lt;a href=&#34;#ideas&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;IDEA: A slice of pie that is filled with a futuristic city&lt;/p&gt;&#xA;&lt;h2 id=&#34;artists-i-like&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Artists I like&lt;/span&gt; &lt;a href=&#34;#artists-i-like&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://stablediffusion.fr/artists&#34;&gt;Examples&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;J. M. W. Turner&lt;/li&gt;&#xA;&lt;li&gt;Jean-Baptiste Monge&lt;/li&gt;&#xA;&lt;li&gt;John Lasseter&lt;/li&gt;&#xA;&lt;li&gt;John Martin&lt;/li&gt;&#xA;&lt;li&gt;Raymond Swanland&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;anime-styles&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Anime styles&lt;/span&gt; &lt;a href=&#34;#anime-styles&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Krenz Cushart&lt;/li&gt;&#xA;&lt;li&gt;Kyoto Animation&lt;/li&gt;&#xA;&lt;li&gt;Yoshiyuki Sadamoto&lt;/li&gt;&#xA;&lt;li&gt;Yuumei&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;scenic&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Scenic&lt;/span&gt; &lt;a href=&#34;#scenic&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ted Nasmith&lt;/li&gt;&#xA;&lt;li&gt;Terry Redlin&lt;/li&gt;&#xA;&lt;li&gt;Thomas Kinkade&lt;/li&gt;&#xA;&lt;li&gt;Thomas Moran&lt;/li&gt;&#xA;&lt;li&gt;Thomas W Schaller&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;cityscapes&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Cityscapes&lt;/span&gt; &lt;a href=&#34;#cityscapes&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Marc Simonetti&lt;/li&gt;&#xA;&lt;li&gt;Wadim Kashin&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;abstract&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Abstract&lt;/span&gt; &lt;a href=&#34;#abstract&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Scott Naismith&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;settings-notes&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Settings notes&lt;/span&gt; &lt;a href=&#34;#settings-notes&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I tend to like cfg at least on the higher end&lt;/p&gt;&#xA;&lt;h2 id=&#34;good-prompts&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Good prompts&lt;/span&gt; &lt;a href=&#34;#good-prompts&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Angel of death, shadows and mist, skelletol feathered wings, highly detailed, amazing details, intriciate lines, purple haze, styles Yuumei and Krenz Cushart, UHD, HDR, upscale, 8K photo, concept art&lt;/p&gt;&#xA;&lt;h3 id=&#34;unicorns&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Unicorns&lt;/span&gt; &lt;a href=&#34;#unicorns&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;positive: unicorn, &lt;a href=&#34;lora:Unicorns:0.9&#34;&gt;lora:Unicorns:0.9&lt;/a&gt;, portrait, professional photography, 35mm, highly detailed, incredibly realistic, best quality, high quality, highres, purple, &lt;a href=&#34;lora:mossbeast:0.3&#34;&gt;lora:mossbeast:0.3&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;negative: (two tails:1.2),FastNegativeV2,(bad-artist:1.0), (loli:1.2), (worst quality, low quality:1.4), (bad_prompt_version2:0.8), bad-hands-5,lowres, bad anatomy, bad hands, ((text)), (watermark), error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, ((username)), blurry, (extra limbs), bad-artist-anime, badhandv4, EasyNegative, ng_deepnegative_v1_75t, verybadimagenegative_v1.3, BadDream,(three hands:1.1),(three legs:1.1),(more than two hands:1.4),(more than two legs,:1.2),&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>FFMPEG 10-bit videos to 8-bit</title>
    <id>https://pype.dev/ffmpeg-10-bit-videos-to-8-bit/</id>
    <updated>2023-01-16T13:15:53Z</updated>
    <published>2023-01-16T13:15:53Z</published>
    <link href="https://pype.dev/ffmpeg-10-bit-videos-to-8-bit/" rel="alternate" type="text/html"></link>
    <content type="html">&lt;p&gt;&lt;code&gt;ffmpeg -i input.mp4 -map 0 -c:v libx264 -vf format=yuv420p -c:a copy output.mp4&lt;/code&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Reminder about ssh-copy-id for SSH and Ansible</title>
    <id>https://pype.dev/reminder-about-ssh-copy-id-for-ssh-and-ansible/</id>
    <updated>2022-12-28T13:33:07Z</updated>
    <published>2022-12-28T13:33:07Z</published>
    <link href="https://pype.dev/reminder-about-ssh-copy-id-for-ssh-and-ansible/" rel="alternate" type="text/html"></link>
    <summary type="text">this makes sure I can run ansible from my desktop against VMs on my server easily if they have tailscale for the hostname - otherwise use the IP</summary>
    <content type="html">&lt;p&gt;&lt;code&gt;ssh-copy-id -i my.key.pub &amp;lt;hostname probably from tailscale&amp;gt;&lt;/code&gt;&#xA;this makes sure I can run ansible from my desktop against VMs on my server&#xA;easily if they have tailscale for the hostname - otherwise use the IP&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Nextcloud Docker Upgrade Error</title>
    <id>https://pype.dev/nextcloud-docker-upgrade-error/</id>
    <updated>2022-12-28T09:39:27Z</updated>
    <published>2022-12-28T09:39:27Z</published>
    <link href="https://pype.dev/nextcloud-docker-upgrade-error/" rel="alternate" type="text/html"></link>
    <summary type="text">https://nicolasbouliane.com/blog/nextcloud-docker-upgrade-error</summary>
    <content type="html">&lt;p&gt;&lt;a href=&#34;https://nicolasbouliane.com/blog/nextcloud-docker-upgrade-error&#34;&gt;https://nicolasbouliane.com/blog/nextcloud-docker-upgrade-error&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Systemd timer for syncoid</title>
    <id>https://pype.dev/systemd-timer-for-syncoid/</id>
    <updated>2022-12-21T11:38:27Z</updated>
    <published>2022-12-21T11:38:27Z</published>
    <link href="https://pype.dev/systemd-timer-for-syncoid/" rel="alternate" type="text/html"></link>
    <summary type="text">I have a bash script called which boils down to a barebones -</summary>
    <content type="html">&lt;p&gt;I have a bash script called &lt;code&gt;syncoid-job&lt;/code&gt; which boils down to a barebones -&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;syncoid --no-sync-snap --sendoptions&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;w --no-privilege-elevation &lt;span class=&#34;nv&#34;&gt;$SYNOIC_USER&lt;/span&gt;@&lt;span class=&#34;nv&#34;&gt;$SERVER&lt;/span&gt;:tank/encrypted/nas tank/encrypted/nas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I want to run this script hourly but as my user (notice the no-privilege-elevation flag)&lt;/p&gt;&#xA;&lt;p&gt;First - create a systemd unit file at &lt;code&gt;/etc/systemd/system/syncoid-replication.service&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ZFS Replication With Syncoid&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;oneshot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/dotfiles/syncoid-job&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$USER&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Group&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$GROUP&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;multi-user.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then we save the unit file, enable the service, and then start it&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;systemctl enable syncoid-replication.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;systemctl start syncoid-replication.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;Note this will run that script&amp;hellip; so be ready for syncoid to do its thing&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Now for the timer&amp;hellip; We create &lt;code&gt;/etc/systemd/system/syncoid-replication.timer&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Run syncoid-replication every hour&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Timer&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OnCalendar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;hourly&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;timers.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hit it with a &lt;code&gt;systemctl enable syncoid-replication.timer&lt;/code&gt; and you&amp;rsquo;re in business!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Cron for Nextcloud in Docker</title>
    <id>https://pype.dev/cron-for-nextcloud-in-docker/</id>
    <updated>2022-12-13T06:43:45Z</updated>
    <published>2022-12-13T06:43:45Z</published>
    <link href="https://pype.dev/cron-for-nextcloud-in-docker/" rel="alternate" type="text/html"></link>
    <summary type="text">AJAX wasn&#39;t cutting it, traditional crontab in containers doesn&#39;t make much sense to me, webcron is recommended but I don&#39;t want to register with anything...</summary>
    <content type="html">&lt;p&gt;AJAX wasn&amp;rsquo;t cutting it, traditional crontab in containers doesn&amp;rsquo;t make much&#xA;sense to me, webcron is recommended but I don&amp;rsquo;t want to register with anything&#xA;outside my LAN&amp;hellip; Turns out you can just spin up an identical container with a&#xA;different entrypoint to /cron.sh that does what you need!&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Note that this is a task in an Ansible playbook - but the docker-compose is straight forward&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;So the only thing you need to make sure of is that &lt;em&gt;all&lt;/em&gt; the configuration&#xA;options - data volumes, user permissions, etc. are &lt;em&gt;identical&lt;/em&gt; between the&#xA;containers running the cron job and the one actually hosting NextCloud. This&#xA;ensures that the container running cron has proper access to the database and&#xA;filesystem - or at least the same access as NextCloud proper.&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Nextcloud Cron Docker Container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;docker_container&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nextcloud-cron&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_image }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pull&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;links&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;nextcloud-mysql:mysql&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entrypoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/cron.sh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_data_directory }}/nextcloud:/var/www/html:rw&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;MYSQL_HOST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mysql&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;nextcloud&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;MYSQL_USER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_sql_user }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_sql_password }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;NEXTCLOUD_TRUSTED_DOMAINS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_hostname }}.{{ ansible_nas_domain }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;PUID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_user_id }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;PGID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_group_id }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ ansible_nas_timezone }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart_policy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ nextcloud_memory }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>You can embed gifs?!</title>
    <id>https://pype.dev/you-can-embed-gifs/</id>
    <updated>2022-10-09T13:39:39Z</updated>
    <published>2022-10-09T13:39:39Z</published>
    <link href="https://pype.dev/you-can-embed-gifs/" rel="alternate" type="text/html"></link>
    <summary type="text">I learned you can embed gifs and stuch in things other than GH personal pages!</summary>
    <content type="html">&lt;p&gt;I learned you can embed gifs and stuch in things other than GH personal pages!&lt;/p&gt;&#xA;&lt;p&gt;So here I&amp;rsquo;ll keep ones I like and might use later&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://giphy.com/embed/jXBwoFfPsCCoE&#34; width=&#34;25px&#34; height=&#34;25px&#34; frameBorder=&#34;0&#34; class=&#34;giphy-embed&#34; allowFullScreen&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href=&#34;https://giphy.com/gifs/tech-rainbow-jXBwoFfPsCCoE&#34;&gt;via GIPHY&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Don’t forget to load XMP!</title>
    <id>https://pype.dev/dont-forget-to-load-xmp/</id>
    <updated>2022-10-09T07:17:43Z</updated>
    <published>2022-10-09T07:17:43Z</published>
    <link href="https://pype.dev/dont-forget-to-load-xmp/" rel="alternate" type="text/html"></link>
    <summary type="text">Bought some DDR4-3600 speed RAM but only seeing 2666? Load up the BIOS, find DRAM config or something similar, and make sure to load the XMP profile to get...</summary>
    <content type="html">&lt;p&gt;Bought some DDR4-3600 speed RAM but only seeing 2666? Load up the BIOS, find DRAM config or something similar, and make sure to load the XMP profile to get that advertised RAM speed!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>My PassMark Scores</title>
    <id>https://pype.dev/my-passmark-scores/</id>
    <updated>2022-10-08T18:43:29Z</updated>
    <published>2022-10-08T18:43:29Z</published>
    <link href="https://pype.dev/my-passmark-scores/" rel="alternate" type="text/html"></link>
    <summary type="text">!!! note &#34;Babyblue v2&#34;</summary>
    <content type="html">&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Babyblue v2&lt;/p&gt;&#xA;&lt;p&gt;Ryzen 5700x + 32 GB 3200 CL16 RAM&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.passmark.com/baselines/V10/display.php?id=503041456656&#34;&gt;&lt;img src=&#34;https://www.passmark.com/baselines/V10/media/503041456656.png&#34; alt=&#34;PassMark Rating&#34; border=&#34;0&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Venus &lt;/p&gt;&#xA;&lt;p&gt;Ryzen 3200G + 16GB 3600 CL16 RAM&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.passmark.com/baselines/V10/display.php?id=502360857958&#34;&gt;&lt;img src=&#34;https://www.passmark.com/baselines/V10/media/502360857958.png&#34; height=120px alt=&#34;PassMark Rating&#34; border=&#34;0&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Hogwarts&lt;/p&gt;&#xA;&lt;p&gt;Dual Xeon X5650 @2.67GHz | 90 GB 1883 DDR3 ECC RAM&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.passmark.com/baselines/V10/display.php?id=502361259420&#34;&gt;&lt;img src=&#34;https://www.passmark.com/baselines/V10/media/502361259420.png&#34; height=120px alt=&#34;PassMark Rating&#34; border=&#34;0&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Server 2 ... Change the name&lt;/p&gt;&#xA;&lt;p&gt;Ryzen 5700G + 128GB 3200 CL18 RAM&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.passmark.com/baselines/V10/display.php?id=502361424410&#34;&gt;&lt;img src=&#34;https://www.passmark.com/baselines/V10/media/502361424410.png&#34; height=120px alt=&#34;PassMark Rating&#34; border=&#34;0&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Server 2 with XMP enabled and undervolted from 1.35 to 1.2&lt;/p&gt;&#xA;&lt;p&gt;Ryzen 5700G + 128GB 3200 CL18 RAM&lt;/p&gt;&#xA;&lt;p&gt;Undervolted to 1.2V (from 1.35)&#xA;XMP enabled&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.passmark.com/baselines/V10/display.php?id=502363064921&#34;&gt;&lt;img src=&#34;https://www.passmark.com/baselines/V10/media/502363064921.png&#34; height=120px alt=&#34;PassMark Rating&#34; border=&#34;0&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Quick setup of ZFS encrytped datasets with sane permissions</title>
    <id>https://pype.dev/quick-setup-of-zfs-encrytped-datasets-with-sane-permissions/</id>
    <updated>2022-10-06T19:58:01Z</updated>
    <published>2022-10-06T19:58:01Z</published>
    <link href="https://pype.dev/quick-setup-of-zfs-encrytped-datasets-with-sane-permissions/" rel="alternate" type="text/html"></link>
    <summary type="text">Assuming you have a pool called ...</summary>
    <content type="html">&lt;p&gt;Assuming you have a pool called &lt;code&gt;tank&lt;/code&gt;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;And assuming you have an encrypted dataset (See &lt;a href=&#34;https://arstechnica.com/gadgets/2021/06/a-quick-start-guide-to-openzfs-native-encryption/&#34;&gt;Jim Saltar&amp;rsquo;s short&#xA;intro&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Create a group for permissions - in my case I have one called &lt;code&gt;home&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Then if there&amp;rsquo;s anything in &lt;code&gt;/tank/encrypted&lt;/code&gt; his it with &lt;code&gt;chgrp -R home /tank/encrypted&lt;/code&gt; to give the &lt;code&gt;home&lt;/code&gt; group ownership&lt;/li&gt;&#xA;&lt;li&gt;Next we need to make sure that the members of &lt;code&gt;home&lt;/code&gt; can do the writing&amp;hellip;&#xA;so &lt;code&gt;chmod 775 -R /tank/encrypted&lt;/code&gt; will do the trick&lt;/li&gt;&#xA;&lt;li&gt;Finally we want to make sure that all data created inside our dataset has&#xA;the same set of permissions with &lt;code&gt;chmod g+s /tank/encrypted&lt;/code&gt; and &lt;code&gt;chmod g+w /tank/encrypted&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Trick to login to web server on another box on lan</title>
    <id>https://pype.dev/trick-to-login-to-web-server-on-another-box-on-lan/</id>
    <updated>2022-09-12T18:48:45Z</updated>
    <published>2022-09-12T18:48:45Z</published>
    <link href="https://pype.dev/trick-to-login-to-web-server-on-another-box-on-lan/" rel="alternate" type="text/html"></link>
    <summary type="text">TODO: change title - add --listen or --host or something as 0.0.0.0... that way it listens not on localhost or 127.0.0.1, but on all addresses!</summary>
    <content type="html">&lt;p&gt;TODO: change title - add &amp;ndash;listen or &amp;ndash;host or something as 0.0.0.0&amp;hellip; that way it listens not on localhost or 127.0.0.1, but on all addresses!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Paperless-NGX filtering on IDs instead of values</title>
    <id>https://pype.dev/paperless-ngx-filtering-on-ids-instead-of-values/</id>
    <updated>2022-08-09T08:28:51Z</updated>
    <published>2022-08-09T08:28:51Z</published>
    <link href="https://pype.dev/paperless-ngx-filtering-on-ids-instead-of-values/" rel="alternate" type="text/html"></link>
    <summary type="text">To filter for saved views from the admin console you have to use the of the tag you are using to filter on...</summary>
    <content type="html">&lt;p&gt;To filter for saved views from the admin console you have to use the &lt;code&gt;id&lt;/code&gt; of&#xA;the tag you are using to filter on&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Ex: filtering for tags &amp;ldquo;Inbox&amp;rdquo; doesn&amp;rsquo;t work, but for tag 18 does (the id fo the&#xA;Inbox tag). I can find that ID by clicking on the tag and looking at the url&#xA;bar&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Mounting exFAT USB in Linux</title>
    <id>https://pype.dev/mounting-exfat-usb-in-linux/</id>
    <updated>2022-07-31T07:38:43Z</updated>
    <published>2022-07-31T07:38:43Z</published>
    <link href="https://pype.dev/mounting-exfat-usb-in-linux/" rel="alternate" type="text/html"></link>
    <content type="html">&lt;h1 id=&#34;steps&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Steps&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo fdisk -l&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;then look for the device and partition&lt;/p&gt;&#xA;&lt;p&gt;get the Type column&lt;/p&gt;&#xA;&lt;p&gt;mount&lt;/p&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Example&lt;/span&gt; &lt;a href=&#34;#example&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;&#xA;dumbledore in /media  NO PYTHON VENV SET &#xA;❯ sudo fdisk -l&#xA;&#xA;...&#xA;&#xA;Device     Boot    Start      End  Sectors  Size Id Type&#xA;/dev/sdk1  *        2048 60371951 60369904 28.8G  7 HPFS/NTFS/exFAT&#xA;/dev/sdk2       60371952 60437487    65536   32M ef EFI (FAT-12/16/32)&#xA;&#xA;&#xA;dumbledore in /media  NO PYTHON VENV SET &#xA;❯ sudo mount -t ntfs /dev/sdk1 /media/ventoy-usb -o uid=1000                       &#xA;NTFS signature is missing.&#xA;Failed to mount &#39;/dev/sdk1&#39;: Invalid argument&#xA;The device &#39;/dev/sdk1&#39; doesn&#39;t seem to have a valid NTFS.&#xA;Maybe the wrong device is used? Or the whole disk instead of a&#xA;partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?&#xA;&#xA;dumbledore in /media  NO PYTHON VENV SET &#xA;✗ sudo mount -t exfat /dev/sdk1 /media/ventoy-usb -o uid=1000&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Xrdp-Authentication-Required-To-Create-Managed-Color-Device</title>
    <id>https://pype.dev/xrdp-authentication-required-to-create-managed-color-device/</id>
    <updated>2022-07-18T00:00:00Z</updated>
    <published>2022-07-18T00:00:00Z</published>
    <link href="https://pype.dev/xrdp-authentication-required-to-create-managed-color-device/" rel="alternate" type="text/html"></link>
    <summary type="text">I just need to RDP into an Ubuntu box via Remmina and everytime I login I have to authenticate to create a color managed device... which I don&#39;t even know...</summary>
    <content type="html">&lt;p&gt;I just need to RDP into an Ubuntu box via Remmina and everytime I login I have&#xA;to authenticate to create a color managed device&amp;hellip; which I don&amp;rsquo;t even know&#xA;what that is!&lt;/p&gt;&#xA;&lt;p&gt;To fix it?&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;vim /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;polkit.addRule(function(action, subject) {&#xA; if ((action.id == &amp;quot;org.freedesktop.color-manager.create-device&amp;quot; ||&#xA; action.id == &amp;quot;org.freedesktop.color-manager.create-profile&amp;quot; ||&#xA; action.id == &amp;quot;org.freedesktop.color-manager.delete-device&amp;quot; ||&#xA; action.id == &amp;quot;org.freedesktop.color-manager.delete-profile&amp;quot; ||&#xA; action.id == &amp;quot;org.freedesktop.color-manager.modify-device&amp;quot; ||&#xA; action.id == &amp;quot;org.freedesktop.color-manager.modify-profile&amp;quot;) &amp;amp;&amp;amp;&#xA; subject.isInGroup(&amp;quot;{users}&amp;quot;)) {&#xA; return polkit.Result.YES;&#xA; }&#xA; });&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Give&amp;rsquo;r the &lt;code&gt;:x&lt;/code&gt;, logout, and you&amp;rsquo;re good to go&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>ZFS Permissions for Sanoid/Syncoid</title>
    <id>https://pype.dev/zfs-permissions-for-sanoid/</id>
    <updated>2022-07-08T15:54:58Z</updated>
    <published>2022-07-08T15:54:58Z</published>
    <link href="https://pype.dev/zfs-permissions-for-sanoid/" rel="alternate" type="text/html"></link>
    <content type="html">&lt;p&gt;&lt;code&gt;zfs allow -u $USER clone,load-key,create,destroy,mount,mountpoint,receive,send,rollback,compression,snapshot,hold,keylocation,bookmark tank&lt;/code&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;load-key only needed if using encrypted datasets&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Setup KVM to boot from local PXE server</title>
    <id>https://pype.dev/setup-kvm-to-boot-from-local-pxe-server/</id>
    <updated>2022-07-06T12:30:50Z</updated>
    <published>2022-07-06T12:30:50Z</published>
    <link href="https://pype.dev/setup-kvm-to-boot-from-local-pxe-server/" rel="alternate" type="text/html"></link>
    <summary type="text">Assuming you have a PXE server running you only need small edits to the virt-manager config</summary>
    <content type="html">&lt;p&gt;Assuming you have a PXE server running you only need small edits to the virt-manager config&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Self-hosted Docker registry with proxy pull through</title>
    <id>https://pype.dev/self-hosted-docker-registry-with-proxy-pull-through/</id>
    <updated>2022-07-06T06:44:35Z</updated>
    <published>2022-07-06T06:44:35Z</published>
    <link href="https://pype.dev/self-hosted-docker-registry-with-proxy-pull-through/" rel="alternate" type="text/html"></link>
    <summary type="text">I decided that I want to self-host all my docker images for the purposes of regularly rebuilding and security scanning. The first step is to set up a...</summary>
    <content type="html">&lt;p&gt;I decided that I want to self-host all my docker images for the purposes of&#xA;regularly rebuilding and security scanning. The first step is to set up a&#xA;registry, which coincidently enough you can do with a Docker container 😛!&lt;/p&gt;&#xA;&lt;p&gt;Instructions for setting up the proxy are on the offidical docker docs &lt;a href=&#34;https://docs.docker.com/registry/recipes/mirror/&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;deployment&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Deployment&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I chose to deploy with Portainer because I already use it for monitoring all my&#xA;docker containers. I deploy most container with Ansible but use Portainer to&#xA;setup a few more adhoc or non-git driven applications.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>kvm-network-interface-via-nat-ubuntu-20</title>
    <id>https://pype.dev/kvm-network-interface-via-nat-ubuntu-20/</id>
    <updated>2022-06-25T07:20:41Z</updated>
    <published>2022-06-25T07:20:41Z</published>
    <link href="https://pype.dev/kvm-network-interface-via-nat-ubuntu-20/" rel="alternate" type="text/html"></link>
    <summary type="text">I have started using VMs more and more in my development workflow and it&#39;s impossible to work in a VM without an internet connection for me most of the time....</summary>
    <content type="html">&lt;p&gt;I have started using VMs more and more in my development workflow and it&amp;rsquo;s&#xA;impossible to work in a VM without an internet connection for me most of the&#xA;time. Setting up the KVM networking is kind of confusing to me and I&amp;rsquo;ve done it&#xA;two different ways. Here is how I set it up on my home desktop using NAT.&lt;/p&gt;&#xA;&lt;h1 id=&#34;credit&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Credit&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;First thing&amp;rsquo;s first: &lt;a href=&#34;https://computingforgeeks.com/managing-kvm-network-interfaces-in-linux/&#34;&gt;credit to this post&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;commands&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Commands&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;There was a &lt;code&gt;default&lt;/code&gt; network already made by virt-manager but my VM couldn&amp;rsquo;t connect over it at all&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;These commands got me up and running without even turning the VM off&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I went full on &lt;code&gt;sudo -i&lt;/code&gt; for this just to make it easier - be careful&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;dump-an-existint-network-config&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Dump an existint network config&lt;/span&gt; &lt;a href=&#34;#dump-an-existint-network-config&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# as root&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;virsh net-dumpxml default &amp;gt; br1.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vim br1.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;edit-it&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Edit it&lt;/span&gt; &lt;a href=&#34;#edit-it&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I was unsure what the ip range should be so I just stuck with the original blog.&#xA;The &lt;code&gt;default&lt;/code&gt; network had the CIDR block defined as &lt;code&gt;192.168.122.0/24&lt;/code&gt; which is different from my home network so I guess it&amp;rsquo;s fine?&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;network&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;br1&lt;span class=&#34;nt&#34;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;forward&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;mode=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;nat&amp;#39;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;nat&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;lt;port&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;start=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;1024&amp;#39;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;end=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;65535&amp;#39;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/nat&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/forward&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;bridge&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;br1&amp;#39;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stp=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;on&amp;#39;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;delay=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;ip&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;address=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;192.168.10.1&amp;#39;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;netmask=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;255.255.255.0&amp;#39;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;dhcp&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;lt;range&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;start=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;192.168.10.10&amp;#39;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;end=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;192.168.10.100&amp;#39;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/dhcp&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/ip&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/network&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;define-a-network&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Define a network&lt;/span&gt; &lt;a href=&#34;#define-a-network&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;virsh net-define br1.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;virsh net-autostart br1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then to check&amp;hellip;&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;virsh net-list --all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; Name      State    Autostart   Persistent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--------------------------------------------&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; br1       active   yes         yes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; default   active   yes         yes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;uuid&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;UUID&lt;/span&gt; &lt;a href=&#34;#uuid&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;virsh net-uuid br1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;magic&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Magic&lt;/span&gt; &lt;a href=&#34;#magic&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;virsh attach-interface --domain &amp;lt;NAME OF VM&amp;gt; --type bridge --source br1 --model virtio --config --live&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;My VM, &lt;code&gt;ubuntu20.04&lt;/code&gt; was running and immediately connected to the newly attached device!&lt;/p&gt;&#xA;&lt;h1 id=&#34;credit-again&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Credit again&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Visit the original post for more details - this serves more as as a quicker set of notes for future me&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Reset SSH key passphrase</title>
    <id>https://pype.dev/reset-ssh-key-passphrase/</id>
    <updated>2022-06-13T06:55:32Z</updated>
    <published>2022-06-13T06:55:32Z</published>
    <link href="https://pype.dev/reset-ssh-key-passphrase/" rel="alternate" type="text/html"></link>
    <summary type="text">I got into a pickle where I encrypted the ssh keys I use for my SSH connections on LAN, but then I couldn&#39;t run my ansible playbook on my server! ssh-keygen...</summary>
    <content type="html">&lt;p&gt;I got into a pickle where I encrypted the ssh keys I use for my SSH connections on LAN, but then I couldn&amp;rsquo;t run my ansible playbook on my server! ssh-keygen -p and leave the new passphrase blank saved my day (although password protected key files are safer!)&lt;/p&gt;&#xA;&lt;h1 id=&#34;tl-dr-just-reset-it-to-nothing&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;TL;DR - just reset it to nothing&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;ssh-keygen -p&lt;/code&gt; will let you reset the passphrase on your ssh keys (good for you! yay security!)&lt;/p&gt;&#xA;&lt;p&gt;But I needed to remove the passphrase to quickly deploy an ansible playbook 🤓&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Samba on Ubuntu 22 needs “inherit permissions” set</title>
    <id>https://pype.dev/samba-on-ubuntu-22-needs-inherit-permissions-set/</id>
    <updated>2022-05-31T06:30:42Z</updated>
    <published>2022-05-31T06:30:42Z</published>
    <link href="https://pype.dev/samba-on-ubuntu-22-needs-inherit-permissions-set/" rel="alternate" type="text/html"></link>
    <summary type="text">see samba config on hogwarts</summary>
    <content type="html">&lt;p&gt;see samba config on hogwarts&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Reindex Nextcloud After Adding Data via CLI</title>
    <id>https://pype.dev/reindex-nextcloud-after-adding-data-via-cli/</id>
    <updated>2022-05-29T15:34:33Z</updated>
    <published>2022-05-29T15:34:33Z</published>
    <link href="https://pype.dev/reindex-nextcloud-after-adding-data-via-cli/" rel="alternate" type="text/html"></link>
    <summary type="text">I wrote here about setting up as the owner of any directories you want nextcloud to manage. However, I regularly struggle wtih permissions issues on my NAS...</summary>
    <content type="html">&lt;h1 id=&#34;my-nextcloud-woes&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;My Nextcloud woes&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I wrote &lt;a href=&#34;%22nextcloud-permissions-with-zfs-and-ansible-nas%22&#34;&gt;here&lt;/a&gt; about setting&#xA;up &lt;code&gt;www-data&lt;/code&gt; as the owner of any directories you want nextcloud to manage.&#xA;However, I regularly struggle wtih permissions issues on my NAS because of the&#xA;external storage app anyways so I&amp;rsquo;ve decided to just put our photos in the spot&#xA;Nextcloud would otherwise put them, and use this as healthy pressure on our&#xA;family to organize our photos and put the ones we care about with the rest of&#xA;our family media.&lt;/p&gt;&#xA;&lt;h1 id=&#34;migration&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Migration&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Because I had a ton of photos on the NAS anyways that I wanted moved over to&#xA;Nextcloud I just rsync&amp;rsquo;d the photos directory on my NAS to the user&amp;rsquo;s photos&#xA;directory in nextcloud but they weren&amp;rsquo;t showing up in the web UI!&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-fix&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The Fix?&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;As www-data I needed to &lt;code&gt;php /var/www/nextcloud/occ files:scan --all&lt;/code&gt; inside my&#xA;nextcloud docker container AFTER moving a bunch of photos off my &amp;ldquo;NAS&amp;rdquo; into the&#xA;folder mounted to the nextcloud container as its data folder! Before I did this&#xA;they weren&amp;rsquo;t showing up in the web UI/&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>arr client config</title>
    <id>https://pype.dev/arr-download-client-config/</id>
    <updated>2022-05-28T13:29:28Z</updated>
    <published>2022-05-28T13:29:28Z</published>
    <link href="https://pype.dev/arr-download-client-config/" rel="alternate" type="text/html"></link>
    <summary type="text">TIL that when setting up download clients for radarr/sonarr/lidarr/readarr/bazarr/prowlarr that you can utilize internal DNS and instead of hardcoding an IP...</summary>
    <content type="html">&lt;p&gt;TIL that when setting up download clients for&#xA;radarr/sonarr/lidarr/readarr/bazarr/prowlarr that you can utilize internal DNS&#xA;and instead of hardcoding an IP address of your download client server, can use&#xA;just the CNAME record (ie. instead of 172.10.14.13 I can use&#xA;transmission.mydomain.com&amp;hellip; notice the lact of http(s)://&amp;hellip; adding that won&amp;rsquo;t&#xA;allow the connection to work/&lt;/p&gt;&#xA;&lt;p&gt;Furthermore, you can use internal DNS to lookup the domain, not the subdomain,&#xA;and expose the port, like &lt;code&gt;mydomain.com:7878&lt;/code&gt; for sonarr. This was simpler to&#xA;maintain because I don&amp;rsquo;t change which ports an application exposes or utilizes&#xA;hardly ever, plus I don&amp;rsquo;t need to maintain CNAME records for every service!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Add space to your LVM on Ubuntu</title>
    <id>https://pype.dev/add-space-to-your-lvm-on-ubuntu/</id>
    <updated>2022-05-26T21:33:55Z</updated>
    <published>2022-05-26T21:33:55Z</published>
    <link href="https://pype.dev/add-space-to-your-lvm-on-ubuntu/" rel="alternate" type="text/html"></link>
    <summary type="text">I ran out of space on the SSD in my server when doing some file transfers but only 100GB was used of a 256 GB SSD?</summary>
    <content type="html">&lt;p&gt;I ran out of space on the SSD in my server when doing some file transfers but only 100GB was used of a 256 GB SSD?&lt;/p&gt;&#xA;&lt;h1 id=&#34;lvm&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;LVM&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;When installing Ubuntu live server the default option for how to partition the&#xA;disk (in my experience) has been to setup an LVM group that defaults to less&#xA;than the available space. Most recently I put Ubuntu server on a 256 GB SSD but&#xA;the main partition was formatted as an LVM group with 100GB of storage&amp;hellip; I&#xA;didn&amp;rsquo;t think anything of this even though I&amp;rsquo;m mostly used to EXT4.&lt;/p&gt;&#xA;&lt;p&gt;I think the reason for LVMs is performance, but in hindsight, I don&amp;rsquo;t really&#xA;care much about the performance differences, I really just want all my storage&#xA;that&amp;rsquo;s fast enough&lt;/p&gt;&#xA;&lt;h1 id=&#34;extending-the-lvm&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Extending the LVM&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;A moment of googling brought me to Ubuntu&amp;rsquo;s wiki and I&#xA;learned that I can expand my LVM to the space I need&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo lvdisplay&lt;/code&gt; and &lt;code&gt;sudo pvdisplay&lt;/code&gt; show detailed views of the logical volumes and physical volumes respectively.&lt;/p&gt;&#xA;&lt;p&gt;Take a look at those and find the volume you need to extend. For me I found this:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --- Logical volume ---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  LV Path                /dev/ubuntu-vg/ubuntu-lv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  LV Name                ubuntu-lv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  VG Name                ubuntu-vg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  LV Write Access        read/write&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  LV Status              available&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There&amp;rsquo;s more that you&amp;rsquo;ll see but this is what&amp;rsquo;s relevant - I need to extend the&#xA;&lt;code&gt;ubuntu-lv&lt;/code&gt; logical volume in the &lt;code&gt;ubuntu-vg&lt;/code&gt; volume group.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo lvextend -L +50g ubuntu-vg/ubuntu-lv&lt;/code&gt; gives me 50 more GB of storage which should be enough for at least tonight 🤓&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://wiki.ubuntu.com/Lvm&#34;&gt;RTFM&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Tdarr worker nodes share the cache!</title>
    <id>https://pype.dev/tdarr-worker-nodes-share-the-cache/</id>
    <updated>2022-05-25T06:36:59Z</updated>
    <published>2022-05-25T06:36:59Z</published>
    <link href="https://pype.dev/tdarr-worker-nodes-share-the-cache/" rel="alternate" type="text/html"></link>
    <summary type="text">When working with tdarr remote nodes, they need to have access not only to the same libraries but also the same transcode cache as the server otherwise the...</summary>
    <content type="html">&lt;p&gt;When working with tdarr remote nodes, they need to have access not only to the&#xA;same libraries but also the same transcode cache as the server otherwise the&#xA;transcodes will fail&amp;hellip;&lt;/p&gt;&#xA;&lt;h1 id=&#34;network-setup&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Network Setup&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;To explain I&amp;rsquo;ll give a brief overview of my home setup&lt;/p&gt;&#xA;&lt;p&gt;I have an old Dell PowerEdge R610 as my main server running a live server distribution of Ubuntu.&#xA;I use ZFS for my NAS file system, and most of my datasets are accesible over my home network.&#xA;I have a Tdarr server running in a docker container on the R610.&lt;/p&gt;&#xA;&lt;p&gt;In my office I dailyi drive a gaming desktop with an Nvidia 2060 Super running Ubuntu as well.&#xA;On that desktop I am running a Tdarr node in a docker container.&#xA;The container has access to the network folders with my media.&lt;/p&gt;&#xA;&lt;h1 id=&#34;initial-magic&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Initial Magic&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;When I spun up  a tdarr node on my desktop, the tdarr server running on my R610 automatically registered the node, which was freaking amazing.&#xA;That magic though spoiled me and I thought that I didn&amp;rsquo;t need to read the rest of the docs&amp;hellip;&lt;/p&gt;&#xA;&lt;h1 id=&#34;initial-fail&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Initial Fail&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I setup a transcode cache directory on the R610 locally and a separate transcode cache on my desktop that the remote tdarr node would use.&#xA;Having them separated led to 2 main issues:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Transcodes were not being migrated back to my library properly&lt;/li&gt;&#xA;&lt;li&gt;I was running out of disk space on my desktop because tdarr wasn&amp;rsquo;t deleting the completed cache files properly.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;the-fix&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The Fix&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Make a transcode cache directory accessible on my network, and give access to that directory to the docker container running my remote tdarr node.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Local DNS with Pi-hole</title>
    <id>https://pype.dev/local-dns-with-pi-hole/</id>
    <updated>2022-05-23T09:40:59Z</updated>
    <published>2022-05-23T09:40:59Z</published>
    <link href="https://pype.dev/local-dns-with-pi-hole/" rel="alternate" type="text/html"></link>
    <summary type="text">Tailscale is way easier than this... I was doing this local DNS overwrite in Pi-hole before running tailscale and I haven&#39;t just totally &#34;kicked the habit&#34;...</summary>
    <content type="html">&lt;h2 id=&#34;spoilers&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Spoilers&lt;/span&gt; &lt;a href=&#34;#spoilers&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Tailscale is way easier than this&amp;hellip; I was doing this local DNS overwrite in&#xA;Pi-hole before running tailscale and I haven&amp;rsquo;t just totally &amp;ldquo;kicked the habit&amp;rdquo;&#xA;yet, so for anyone NOT running tailcale, but wanting local HTTPS and using&#xA;Pi-Hole this method would work fine&lt;/p&gt;&#xA;&lt;h2 id=&#34;intro&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Intro&lt;/span&gt; &lt;a href=&#34;#intro&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I use &lt;a href=&#34;https://pi-hole.net/&#34;&gt;pihole&lt;/a&gt; as my DNS server at home. I run unbound as&#xA;well and have a pretty standard setup from their docs.&lt;/p&gt;&#xA;&lt;p&gt;Pi-hole does 2 primary things for me:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;dns sink-hold, the primary use case I believe&lt;/li&gt;&#xA;&lt;li&gt;local SSL for all my self-hosted apps&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;caveat&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Caveat&lt;/span&gt; &lt;a href=&#34;#caveat&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I know for sure there are better ways to do this, but there&amp;rsquo;s also worse&#xA;ones&amp;hellip; so for now this has been my pattern, and it&amp;rsquo;s only bitten me in the&#xA;butt when I&amp;rsquo;ve forgotten to add the final CNAME record&amp;hellip; which&amp;rsquo;ll make sense&#xA;in a sec.&lt;/p&gt;&#xA;&lt;h2 id=&#34;process&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Process&lt;/span&gt; &lt;a href=&#34;#process&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;It&amp;rsquo;s really quite simple - in pihole I have a DNS record for my domain pointing&#xA;to my primary server&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250706114501_8c34a31e.png&#34; alt=&#34;20250706114501_8c34a31e.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;Then for each service that I want to keep everything resolved locally for I add a CNAME&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250706114557_916fb4c4.png&#34; alt=&#34;20250706114557_916fb4c4.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;With DNS resolving this way for clients using my pihole, the networking all&#xA;stays local and I still get HTTPS for my wildcard cert in cloudflare&lt;/p&gt;&#xA;&lt;h2 id=&#34;why&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Why?&lt;/span&gt; &lt;a href=&#34;#why&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The reasons I do this are simple:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;I&amp;rsquo;ve been doing it since I started homelabbing and it started out of misunderstanding of how networking works &lt;em&gt;at all&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;I use a home dashboard with https:// links, and it&amp;rsquo;s nice to just use that&#xA;same dashbaord publically or at home. With local DNS resolution then I can&#xA;whitelist some services, but conveniently access over the public url with https&#xA;but routing such that my whitelist let&amp;rsquo;s me in when it wouldn&amp;rsquo;t if I tried to&#xA;access the service from an external client&lt;/li&gt;&#xA;&lt;li&gt;it&amp;rsquo;s my homelab - I can do what I want&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;it-s-too-complicated&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;It’s too complicated&lt;/span&gt; &lt;a href=&#34;#it-s-too-complicated&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Honestly, as simple as this is, it is tedious and kind of complicated&amp;hellip;&#xA;There&amp;rsquo;s options to make it better&amp;hellip;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;script any service deployment to update the pihole /etc/host file&lt;/li&gt;&#xA;&lt;li&gt;just use tailscale&amp;hellip;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Configure bridge network on Ubuntu 22.04 with Netplan</title>
    <id>https://pype.dev/configure-bridge-network-on-ubuntu-22-04-with-netplan/</id>
    <updated>2022-05-22T14:55:28Z</updated>
    <published>2022-05-22T14:55:28Z</published>
    <link href="https://pype.dev/configure-bridge-network-on-ubuntu-22-04-with-netplan/" rel="alternate" type="text/html"></link>
    <summary type="text">See 02-....yaml in ansible-nas</summary>
    <content type="html">&lt;p&gt;See 02-&amp;hellip;.yaml in ansible-nas&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Netplan change from Focal to Jammy</title>
    <id>https://pype.dev/netplan-change-from-focal-to-jammy/</id>
    <updated>2022-05-22T13:23:17Z</updated>
    <published>2022-05-22T13:23:17Z</published>
    <link href="https://pype.dev/netplan-change-from-focal-to-jammy/" rel="alternate" type="text/html"></link>
    <summary type="text">I am revamping my home server and bumped myself early up to Jammy Jellyfish... however to my peril I reused my netplan config and after hitting my server...</summary>
    <content type="html">&lt;p&gt;I am revamping my home server and bumped myself early up to Jammy Jellyfish&amp;hellip;&#xA;however to my peril I reused my netplan config and after hitting my server with&#xA;the &amp;lsquo;ol &lt;code&gt;netplan apply&lt;/code&gt; I lost connection&amp;hellip;&#xA;DNS still seemed to kinda work externally, but internally nothing was up&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Turns out Netplan got a little change in how to express the &lt;code&gt;gateway&lt;/code&gt; key in the netplan config!&lt;/p&gt;&#xA;&lt;p&gt;Old Ubuntu 20.04 way&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ethernets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;enp0s4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addresses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.1&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.{Static IP}/24]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;gateway4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.1.1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# &amp;lt;-- This changes!&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nameservers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addresses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1.1.1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;New jammin way for Jammy Jellyfish (&lt;strong&gt;at least that worked for me&lt;/strong&gt;)&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ethernets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;enp0s4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addresses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.1&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.{Static IP}/24]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;routes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;via&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.1.1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nameservers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addresses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1.1.1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>How I use Nextcloud for safe central storage</title>
    <id>https://pype.dev/how-i-use-nextcloud-for-safe-central-storage/</id>
    <updated>2022-05-19T21:17:42Z</updated>
    <published>2022-05-19T21:17:42Z</published>
    <link href="https://pype.dev/how-i-use-nextcloud-for-safe-central-storage/" rel="alternate" type="text/html"></link>
    <summary type="text">Setup admin 2. External Storage extension 3. Add my nas zfs dataset 4. chown -R www-data:www-data on anything nextcloud uploads to.</summary>
    <content type="html">&lt;ol&gt;&#xA;&lt;li&gt;Setup admin&lt;/li&gt;&#xA;&lt;li&gt;External Storage extension&lt;/li&gt;&#xA;&lt;li&gt;Add my nas zfs dataset&lt;/li&gt;&#xA;&lt;li&gt;chown -R www-data:www-data on anything nextcloud uploads to.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Nextcloud permissions with ZFS and Ansible-NAS</title>
    <id>https://pype.dev/nextcloud-permissions-with-zfs-and-ansible-nas/</id>
    <updated>2022-05-19T13:55:20Z</updated>
    <published>2022-05-19T13:55:20Z</published>
    <link href="https://pype.dev/nextcloud-permissions-with-zfs-and-ansible-nas/" rel="alternate" type="text/html"></link>
    <summary type="text">As the nextcloud docs say... if you want to write to an external volume that location has to be writeable by the user/group on the host system... so if that...</summary>
    <content type="html">&lt;h1 id=&#34;tl-dr&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;TL;DR&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;As the nextcloud docs say&amp;hellip; if you want to write to an external volume that&#xA;location has to be writeable by the user/group &lt;code&gt;www-data&lt;/code&gt; on the host system&amp;hellip;&#xA;so if that makes sense to you then this TIL probably isn&amp;rsquo;t a ton of value.. if&#xA;not however, read on :)&lt;/p&gt;&#xA;&lt;h1 id=&#34;case-study&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Case Study&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;You want to self-host your own cloud and use a smart file system for convenience&amp;hellip;&#xA;Nextcloud and ZFS are pretty common goto answers for each of those problems.&lt;/p&gt;&#xA;&lt;p&gt;My home NAS is built on ZFS and among other things I have a &lt;code&gt;zpool&lt;/code&gt; named&#xA;&lt;code&gt;tank&lt;/code&gt; and nested in there is a &lt;code&gt;tank/nas&lt;/code&gt; dataset with several child zfs&#xA;datasets under that.&lt;/p&gt;&#xA;&lt;p&gt;I want to use nextcloud mainly for auto-uploading photos from my wife&amp;rsquo;s and my phones for automatic backups.&#xA;The issue is that the nextcloud application (I run in Docker) is fixed as the&#xA;&lt;code&gt;www-data&lt;/code&gt; user and so any volume/folder that you want nextcloud to write to&#xA;needs to be permissioned such that &lt;code&gt;www-data&lt;/code&gt; owns it&amp;hellip; but I don&amp;rsquo;t want&#xA;&lt;code&gt;www-data&lt;/code&gt; to own everything in my NAS&amp;hellip; so what&amp;rsquo;s a girl to do?&lt;/p&gt;&#xA;&lt;h1 id=&#34;solution&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Solution&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Well, one way to go is to just utilize docker volumes, write the data in the&#xA;container to &lt;code&gt;/var/www/html&lt;/code&gt; and let that be the place your data backsup to.&lt;/p&gt;&#xA;&lt;p&gt;I still wanted nextcloud to automatically write right to my NAS so I created a&#xA;&lt;code&gt;nextcloud-upload&lt;/code&gt; directory inside of &lt;code&gt;tank/nas/media/photos&lt;/code&gt; (photos cause&#xA;that&amp;rsquo;s all that gets automatically uploaded)&lt;/p&gt;&#xA;&lt;p&gt;Then I &lt;code&gt;chown -R www-data:www-data /tank/nas/media/photos/nextcloud-upload&lt;/code&gt; so&#xA;that just that sub-folder is owned by &lt;code&gt;www-data&lt;/code&gt;. Now everyone&amp;rsquo;s happy!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>See ZFS snapshot disk usage</title>
    <id>https://pype.dev/see-zfs-snapshot-disk-usage/</id>
    <updated>2022-05-19T06:05:23Z</updated>
    <published>2022-05-19T06:05:23Z</published>
    <link href="https://pype.dev/see-zfs-snapshot-disk-usage/" rel="alternate" type="text/html"></link>
    <summary type="text">As I was cleaning up my NAS recently I noticed that I ran out of storage even though my disk usage looked pretty low... turns out I was keeping a mega-ton of...</summary>
    <content type="html">&lt;p&gt;As I was cleaning up my NAS recently I noticed that I ran out of storage even&#xA;though my disk usage looked pretty low&amp;hellip; turns out I was keeping a mega-ton of&#xA;ZFS snapshots and due to my own ignorance at the time didn&amp;rsquo;t realize the&#xA;storage cost of this!&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;zfs list-o space tank/home&lt;/code&gt; will show the disk usage of the dataset and snapshots in &lt;code&gt;tank/home&lt;/code&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Remove ZFS Dataset Specific Snapshots</title>
    <id>https://pype.dev/remove-zfs-dataset-specific-snapshots/</id>
    <updated>2022-05-19T05:49:16Z</updated>
    <published>2022-05-19T05:49:16Z</published>
    <link href="https://pype.dev/remove-zfs-dataset-specific-snapshots/" rel="alternate" type="text/html"></link>
    <summary type="text">I started my homelab journey being super naive about ZFS and how to manage the filesystem... that bit me in the butt when transfering a ton of files out of...</summary>
    <content type="html">&lt;p&gt;I started my homelab journey being super naive about ZFS and how to manage the&#xA;filesystem&amp;hellip; that bit me in the butt when transfering a ton of files out of&#xA;folders and into datasets because ZFS is copy on write so I was essentially&#xA;duplicating my storage until I got a hair smarter about removing files after&#xA;they&amp;rsquo;re moved (rsync &amp;ndash;remove-source-file ftw). But I had a ton of snapshots of&#xA;child datasets with a ton of data that I just never will need, so I learned&#xA;&lt;code&gt;zfs list -H -o name -t snapshot tank/dataset1/dataset2&lt;/code&gt; will list just the&#xA;snapshots for dataset2 and if you pipe that into &lt;code&gt;xargs -n1 zfs destroy&lt;/code&gt; then&#xA;you have a way to clear out some snapshots you don&amp;rsquo;t need!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Jellyfin-Media-Players</title>
    <id>https://pype.dev/jellyfin-media-players/</id>
    <updated>2022-04-17T00:00:00Z</updated>
    <published>2022-04-17T00:00:00Z</published>
    <link href="https://pype.dev/jellyfin-media-players/" rel="alternate" type="text/html"></link>
    <summary type="text">I use Jellyfin at home for serving up most of our media - movies and shows etc.</summary>
    <content type="html">&lt;p&gt;I use Jellyfin at home for serving up most of our media - movies and shows etc.&lt;/p&gt;&#xA;&lt;p&gt;My dream is to have a GPU capable of transcoding any and all of our media for smooth playback on any device&amp;hellip;&#xA;Now, I thought I&amp;rsquo;d have that by now with my Nvidia Quadro P400 however I have issues left and right with 4k content.&lt;/p&gt;&#xA;&lt;p&gt;What can I do to still use Jellyfin but get smooth playback?&lt;/p&gt;&#xA;&lt;p&gt;THe first answer is figure out why I suck with GPUs, but pausing that there&amp;rsquo;s shorter solutions -&amp;gt; namely, use a media player that&amp;rsquo;s compatabile with the encoded content!&lt;/p&gt;&#xA;&lt;h2 id=&#34;vlc&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;VLC&lt;/span&gt; &lt;a href=&#34;#vlc&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll keep this one short - VLC is great and if you don&amp;rsquo;t need a netflix like experience, I&amp;rsquo;d recommend just using it to browse your network drives and play whatever you have&lt;/p&gt;&#xA;&lt;h2 id=&#34;jellyfin-web-player&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Jellyfin Web Player&lt;/span&gt; &lt;a href=&#34;#jellyfin-web-player&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This is the reason I&amp;rsquo;m writing this post&amp;hellip; the web player is great but not everything is supported on all devices&lt;/p&gt;&#xA;&lt;h2 id=&#34;jellyfin-mpv-shim&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Jellyfin MPV Shim&lt;/span&gt; &lt;a href=&#34;#jellyfin-mpv-shim&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This cross-platform cast client is my answer now.&#xA;You can find the project &lt;a href=&#34;https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#linux-installation&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The installation instrauctions are super straightforward for Windows, Mac OS, or Linux.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m on Linux and so my install went like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install mpv &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pipx install jellyfin-mpv-shim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pipx inject jellyfin-mpv-shim pystray&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#profit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I used &lt;code&gt;pipx&lt;/code&gt; to install the player as I prefer it for stand alone utilities over pip installing anything globally.&lt;/p&gt;&#xA;&lt;p&gt;Afer that I just start the player at the terminal with &lt;code&gt;jellyfin-mpv-shim&lt;/code&gt;&#xA;Then in the web browser I can cast my content to the player and bypass the web player (and thus solve much of my transcoding issues) trivially!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>self-hosted-media</title>
    <id>https://pype.dev/self-hosted-media/</id>
    <updated>2022-03-24T00:00:00Z</updated>
    <published>2022-03-24T00:00:00Z</published>
    <link href="https://pype.dev/self-hosted-media/" rel="alternate" type="text/html"></link>
    <summary type="text">Self-hosting 1 or several media servers is another common homelab use-case. Getting content for your media servers is up to you, but I&#39;ll show a few ways...</summary>
    <content type="html">&lt;p&gt;Self-hosting 1 or several media servers is another common homelab use-case.&#xA;Getting content for your media servers is up to you, but I&amp;rsquo;ll show a few ways here to get content somewhat easily!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;YouTube Disclaimer at Bottom&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;you-get&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;you-get&lt;/span&gt; &lt;a href=&#34;#you-get&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;you-get&lt;/code&gt; is a nice cli for grabbing media content off the web.&lt;/p&gt;&#xA;&lt;h3 id=&#34;installation&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Installation&lt;/span&gt; &lt;a href=&#34;#installation&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;pip install you-get&lt;/code&gt; or use ad-hoc with &lt;code&gt;pipx run you-get &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;usage&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Usage&lt;/span&gt; &lt;a href=&#34;#usage&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;For example if I wanted to catch up on ancient Chinese military tactics I may go for &lt;code&gt;The Art of War&lt;/code&gt; off the Internet Archive&amp;hellip;&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sandbox  🌱 main 🗑️  ×3🛤️  ×6via 🐍 v3.8.11 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;sandbox&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;  took 15s&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ you-get https://archive.org/details/art_of_war_librivox -i&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Site:       Archive.org&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Title:      The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archive&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type:       MP3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;audio/mpeg&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Size:       3.87 MiB &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4055167&lt;/span&gt; Bytes&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;the &lt;code&gt;-i&lt;/code&gt; is showing me the info of what would be downloaded without the flag (it&amp;rsquo;s like a dry run)&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sandbox  🌱 main 🗑️  ×3🛤️  ×6via 🐍 v3.8.11 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;sandbox&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ you-get https://archive.org/details/art_of_war_librivox&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Site:       Archive.org&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Title:      The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archive&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type:       MP3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;audio/mpeg&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Size:       3.87 MiB &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4055167&lt;/span&gt; Bytes&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Downloading The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archi.mp3 ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 100% &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;  3.9/  3.9MB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; ├████████████████████████████████████████████████████████████┤&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;1/1&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;917&lt;/span&gt; kB/s&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now I can toss that mp3 onto my &lt;code&gt;booksonic&lt;/code&gt; server and study for world domination while I do the dishes!&lt;/p&gt;&#xA;&lt;h2 id=&#34;pytube&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;pytube&lt;/span&gt; &lt;a href=&#34;#pytube&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;pytube&lt;/code&gt; is a python implementation of a &lt;a href=&#34;##YouTube&#34;&gt;youtube downloader &lt;/a&gt; that works at the command line or in python!&lt;/p&gt;&#xA;&lt;h3 id=&#34;installation-1&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Installation&lt;/span&gt; &lt;a href=&#34;#installation-1&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pytube.io/en/latest/&#34;&gt;docs&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;pip install pytube&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;usage-1&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Usage&lt;/span&gt; &lt;a href=&#34;#usage-1&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;pytube&lt;/code&gt; has a lot of functionality, but a quick one would be the &lt;code&gt;--list&lt;/code&gt; so you can see what qualities are available&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sandbox   main ️  ×3️  ×7via  v3.8.11 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;sandbox&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;  took 2m49s&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ pytube https://www.youtube.com/watch&lt;span class=&#34;se&#34;&gt;\?&lt;/span&gt;v&lt;span class=&#34;se&#34;&gt;\=&lt;/span&gt;LDU_Txk06tM  --list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Loading video...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;17&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/3gpp&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4v.20.3&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;18&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.42001E&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;22&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.64001F&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;313&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2160p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;401&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2160p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.12M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;271&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1440p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;400&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1440p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.12M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;137&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1080p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.640028&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;248&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1080p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;399&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1080p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.08M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;136&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d401f&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;247&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;398&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.05M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;135&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;480p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d401f&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;244&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;480p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;397&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;480p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.04M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;134&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d401e&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;243&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;396&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.01M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;133&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;240p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d4015&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;242&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;240p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;395&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;240p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.00M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;160&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d400c&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;278&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;394&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.00M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;139&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;48kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.5&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;140&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;128kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;249&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;50kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;opus&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;250&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;70kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;opus&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Stream: &lt;span class=&#34;nv&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;251&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;160kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;opus&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;pytube &amp;lt;url&amp;gt; --itag &amp;lt;&amp;gt;&lt;/code&gt; will download the specific &lt;code&gt;itag&lt;/code&gt; from the list.&lt;/p&gt;&#xA;&lt;p&gt;Notice that some &lt;code&gt;itags&lt;/code&gt; are videos and others audio - so you can download just the music of a YT video.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;pytube&lt;/code&gt; also works in python&amp;hellip;&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sandbox&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;↪&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v3&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.8.11&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ipython&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;❯&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pytube&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;YouTube&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sandbox&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;↪&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v3&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.8.11&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ipython&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;❯&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;YouTube&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://www.youtube.com/watch?v=LDU_Txk06tM&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;streams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;17&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/3gpp&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4v.20.3&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;18&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.42001E&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;22&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.64001F&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;313&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2160p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;401&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2160p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.12M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;271&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1440p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;400&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1440p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.12M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;137&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1080p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.640028&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;248&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1080p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;399&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1080p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.08M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;136&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d401f&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;247&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;398&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;720p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.05M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;135&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;480p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d401f&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;244&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;480p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;397&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;480p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.04M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;134&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d401e&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;243&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;396&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;360p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.01M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;133&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;240p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d4015&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;242&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;240p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;395&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;240p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.00M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;160&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;avc1.4d400c&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;278&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vp9&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;394&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;144p&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30fps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vcodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;av01.0.00M.08&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;video&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;139&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;48kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.5&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;140&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;128kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mp4a.40.2&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;249&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;50kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;opus&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;250&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;70kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;opus&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;251&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio/webm&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;abr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;160kbps&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;acodec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;opus&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;progressive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;audio&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;youtube-frontends&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;YouTube Frontends&lt;/span&gt; &lt;a href=&#34;#youtube-frontends&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s 2 really good options for self-hosting a YT front-end&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/bbilly1/tubearchivist&#34;&gt;Tube Archivist&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/Tzahi12345/YoutubeDL-Material&#34;&gt;YouTubeDL-Material&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;They have their pros and cons.&#xA;You can also build yourself with the above utilities and use Plex or Jellyfin to serve up videos&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Your self-hosting journey is up to you!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;youtube&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;YouTube&lt;/span&gt; &lt;a href=&#34;#youtube&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Downloading YouTube videos is a bit of a sore topic&amp;hellip; Mainly you don&amp;rsquo;t to hurt creators who rely on YT ad revenue for their livlihood.&lt;/p&gt;&#xA;&lt;p&gt;Then again, maybe you&amp;rsquo;re a vigilante who knows that YT also monetizes videos for their &lt;em&gt;own&lt;/em&gt; gain and that the creators don&amp;rsquo;t see that money either!&lt;/p&gt;&#xA;&lt;p&gt;The solution is pretty easy and is 2-fold&amp;hellip;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Download YT videos&lt;/li&gt;&#xA;&lt;li&gt;Personally support the content creators you follow via paypall, patreon, or whatever else they might have set-up&amp;hellip;. even a buck or two a month is more than they&amp;rsquo;d get from your ad revenue explicitly plus it all goes to them!&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Truenas-And-Wireguard</title>
    <id>https://pype.dev/truenas-and-wireguard/</id>
    <updated>2022-03-23T00:00:00Z</updated>
    <published>2022-03-23T00:00:00Z</published>
    <link href="https://pype.dev/truenas-and-wireguard/" rel="alternate" type="text/html"></link>
    <summary type="text">One of the most common use cases for self-hosting anything is a file share system. I have been a fan of TrueNAS for a while. I currently use TrueNAS Core at...</summary>
    <content type="html">&lt;h2 id=&#34;nas&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;NAS&lt;/span&gt; &lt;a href=&#34;#nas&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;One of the most common use cases for self-hosting anything is a file share system.&#xA;I have been a fan of &lt;a href=&#34;https://www.truenas.com/&#34;&gt;TrueNAS&lt;/a&gt; for a while.&#xA;I currently use TrueNAS Core at home, and plan to consider transitioning to TrueNAS Scale soon.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Blog post forthcoming on that!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;vpn&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;VPN&lt;/span&gt; &lt;a href=&#34;#vpn&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t write a ton about homelabbing yet but one of the first things to set up whether you have a massive homelab or a little raspberry pi would be a self-hosted VPN.&#xA;I have notes on wireguard &lt;a href=&#34;%22/wireguard%22&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I finally have a need to put my TrueNAS box on my wireguard network in order to transfer files to other devices that are outside my LAN.&lt;/p&gt;&#xA;&lt;p&gt;There is a handy tutorial on setting this up via the GUI &lt;a href=&#34;https://www.truenas.com/docs/core/network/wireguard/&#34;&gt;here&lt;/a&gt;.&#xA;They walk you through setting up 2 tunables wireguard. One to enable the the connection and one to setup the network interface.&#xA;Next you create a &lt;code&gt;Post Init&lt;/code&gt; script which will check that the right directories exist and will copy the wireguard config that hasn&amp;rsquo;t been made yet to the proper location and finally starts wireguard.&lt;/p&gt;&#xA;&lt;p&gt;The above is just copy/paste from the tutorial but the final step, although not super tricky, isn&amp;rsquo;t the same for everyone as it depends on your wireguard config and network setup.&lt;/p&gt;&#xA;&lt;p&gt;The final step is for you create the relevant wireguard config (see my post but I just use &lt;code&gt;pivpn -a&lt;/code&gt;) and send that config over to your TrueNAS box!&lt;/p&gt;&#xA;&lt;p&gt;For me this final work flow looked like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh user@vpn-server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pivpn -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;follow prompts&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scp ~/configs/truenas.conf root@&amp;lt;truenas ip&amp;gt;:/root/wg0.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;bug&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Bug?&lt;/span&gt; &lt;a href=&#34;#bug&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The script in the tutorial for starting the wireguard service is straight forward enough however my TrueNAS box didn&amp;rsquo;t get the wireguard interface up and running on reboot.&lt;/p&gt;&#xA;&lt;p&gt;Easy enough solution:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh root@&amp;lt;truenas ip&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/local/etc/rc.d/wireguard start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We can check that the interface is now working with &lt;code&gt;ifconfig&lt;/code&gt; and should see something like the following:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wg0: &lt;span class=&#34;nv&#34;&gt;flags&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; metric &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; mtu &lt;span class=&#34;m&#34;&gt;1420&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;80000&amp;lt;LINKSTATE&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        inet x.x.x.x --&amp;gt; x.x.x.x netmask 0xffffff00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        groups: tun&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        nd6 &lt;span class=&#34;nv&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;101&amp;lt;PERFORMNUD,NO_DAD&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        Opened by PID &lt;span class=&#34;m&#34;&gt;1325&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;gotcha&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Gotcha!&lt;/span&gt; &lt;a href=&#34;#gotcha&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s another thing I had to navigate when setting this up.&lt;/p&gt;&#xA;&lt;p&gt;My &lt;code&gt;pivpn&lt;/code&gt; configuration sets the endpoint for my wireguard clients to &lt;code&gt;paynepride.com:&amp;lt;port forwarded to wireguard server&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;What this means is that when I check the wireguard config for TrueNAS which is on my home network it resolves &lt;code&gt;paynepride.com&lt;/code&gt; to the server I have running my reverse proxy.&#xA;However! My reverse proxy is not responsible for my vpn traffic and so the traffic was just getting dropped - instead I needed to change the wireguard config just for my truenas box to piont to the local address of my vpn server.&#xA;This really threw me for a loop today but is just another reminder that if you have network problems it&amp;rsquo;s probably DNS&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Give her the &amp;lsquo;ol reboot and now if I check &lt;code&gt;wg&lt;/code&gt; I should see some traffic on my wireguard tunnel!&lt;/p&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/truenas-wireguard.png&#34; alt=&#34;TrueNAS Wireguard&#34; title=&#34;TrueNAS and Wireguard&#34; /&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Wireguard</title>
    <id>https://pype.dev/wireguard/</id>
    <updated>2022-03-12T00:00:00Z</updated>
    <published>2022-03-12T00:00:00Z</published>
    <link href="https://pype.dev/wireguard/" rel="alternate" type="text/html"></link>
    <summary type="text">Virtual Private Networks are a big deal, and this shouldn&#39;t be considered anything even close to a guide on using them. Here are just my notes and some setup...</summary>
    <content type="html">&lt;h2 id=&#34;vpn&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;VPN&lt;/span&gt; &lt;a href=&#34;#vpn&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Virtual Private Networks are a big deal, and this shouldn&amp;rsquo;t be considered anything even close to a guide on using them.&#xA;Here are just my notes and some setup for how I use &lt;a href=&#34;https://www.wireguard.com/&#34;&gt;wireguard&lt;/a&gt; at home.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wireguard&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Wireguard&lt;/span&gt; &lt;a href=&#34;#wireguard&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Wireguard is an awesome peer-to-peer VPN tunnel that makes it really easy for me to get into my home network when I&amp;rsquo;m out and about.&#xA;My main reasons for this are 1. I don&amp;rsquo;t trust public wi-fi and 2. I want to use pi-hole for ad blocking when I&amp;rsquo;m not at home&lt;/p&gt;&#xA;&lt;p&gt;Wireguard can be configured as a &amp;ldquo;peer-to-site&amp;rdquo; VPN tunnel as well.&#xA;My vpn setup let&amp;rsquo;s me jump to various machines on my network from anywhere!&lt;/p&gt;&#xA;&lt;p&gt;I use &lt;a href=&#34;https://pivpn.io/&#34;&gt;pivpn&lt;/a&gt; in a VM that&amp;rsquo;s already running &lt;code&gt;pi-hole&lt;/code&gt; to host my wireguard server.&#xA;It&amp;rsquo;s super easy to setup just by following the instructions on the pivpn site.&lt;/p&gt;&#xA;&lt;p&gt;The reason I like it is that I have a nice &lt;code&gt;cli&lt;/code&gt; for managing wireguard configs.&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dumbledore@pihole-vpn:~$ pivpn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;::: Control all PiVPN specific functions!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;::: Usage: pivpn &amp;lt;command&amp;gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;option&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;::: Commands:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::    -a, add              Create a client conf profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::    -c, clients          List any connected clients to the server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::    -d, debug            Start a debugging session &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; having trouble&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::    -l, list             List all clients&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::   -qr, qrcode           Show the qrcode of a client &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; use with the mobile app&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::    -r, remove           Remove a client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::  -off, off              Disable a user&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::   -on, on               Enable a user&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::    -h, &lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;             Show this &lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt; dialog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::    -u, uninstall        Uninstall pivpn from your system!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::   -up, update           Updates PiVPN Scripts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:::   -bk, backup           Backup VPN configs and user profiles&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When I&amp;rsquo;m ready to add a new client to my &lt;code&gt;wg&lt;/code&gt; network, it&amp;rsquo;s as easy as &lt;code&gt;pivpn add&lt;/code&gt; and follow the instructions.&#xA;The easiest part here is that you&amp;rsquo;ll be given a QR code in the terminal that you can just scan with the client (like a smart phone) and you&amp;rsquo;ll have your wireguard config handled by the app (oh right, download the wireguard app) in no time!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Adblock-Coverage</title>
    <id>https://pype.dev/adblock-coverage/</id>
    <updated>2022-03-07T00:00:00Z</updated>
    <published>2022-03-07T00:00:00Z</published>
    <link href="https://pype.dev/adblock-coverage/" rel="alternate" type="text/html"></link>
    <summary type="text">I run pi-hole at home for ad blocking and some internal DNS/DHCP handling.</summary>
    <content type="html">&lt;p&gt;I run pi-hole at home for ad blocking and some internal DNS/DHCP handling.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;pi hole posts on the way&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;One thing I&amp;rsquo;ve never put too much thought in is asking &amp;ldquo;how well am I doing at blocking?&amp;rdquo;&#xA;There&amp;rsquo;s lots of ways to measure that depending on what you care about but I just learned of &lt;a href=&#34;https://d3ward.github.io/toolz/adblock&#34;&gt;adblock tester&lt;/a&gt;.&#xA;It&amp;rsquo;s awesome and gave me a quick glimpse into how my pi-hole is performing on keeping my webpages clean and my DNS history private!&lt;/p&gt;&#xA;&lt;p&gt;Credits to &lt;a href=&#34;https://github.com/d3ward/toolz&#34;&gt;d3ward&lt;/a&gt; for the awesome tool!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Webservers-And-Indexes</title>
    <id>https://pype.dev/webservers-and-indexes/</id>
    <updated>2022-03-06T00:00:00Z</updated>
    <published>2022-03-06T00:00:00Z</published>
    <link href="https://pype.dev/webservers-and-indexes/" rel="alternate" type="text/html"></link>
    <summary type="text">I host a lot of services in my homelab, but they&#39;re mostly dockerized applications so I have never had to care much about how content gets served up. Today I...</summary>
    <content type="html">&lt;p&gt;I host a lot of services in my homelab, but they&amp;rsquo;re mostly dockerized applications so I have never had to care much about how content gets served up.&#xA;Today I had several little concepts click into place regarding webservers, and it was a similar experience to when I started homelabing and didn&amp;rsquo;t know what a &amp;ldquo;server&amp;rdquo; was in the first place.&lt;/p&gt;&#xA;&lt;h1 id=&#34;servers&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Servers&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;A &amp;ldquo;server&amp;rdquo; can have a lot of different meanings but specifically in my world it was a physical server, like my PowerEdge R610 which acts as my main &amp;ldquo;home server&amp;rdquo;.&#xA;But then on my server, I have other servers&amp;hellip; Jellyfin is my main media server - but that&amp;rsquo;s obviously not a hardware thing, that&amp;rsquo;s software.&#xA;This is certainly not a groundbreaking thing but it was a tiny piece to the puzzle that I was missing&amp;hellip; that &amp;ldquo;server&amp;rdquo; is highly contextual.&lt;/p&gt;&#xA;&lt;h1 id=&#34;webservers&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Webservers&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Something that confused the heck out of me when I first started down the road of having a server was what a webserver even was&amp;hellip;&#xA;I always thought the &amp;ldquo;webserver&amp;rdquo; was just &amp;ldquo;a server that hosts a website&amp;rdquo;&amp;hellip; and yes, that&amp;rsquo;s true, but also it wasn&amp;rsquo;t true in how I understood &amp;ldquo;server&amp;rdquo;.&#xA;It turns out that across my 40-odd dockerized services I have at home that I must have about 40-odd web servers running, each docker container is spinning up its own!&lt;/p&gt;&#xA;&lt;p&gt;So something I have wanted to do for a long time is put my theology notes online for my small group to access whenever they might want&amp;hellip; it doesn&amp;rsquo;t need to be fancy or anything.&#xA;My issue was not knowing what to even Google. I tried &amp;ldquo;How to serve up static html&amp;rdquo; but that kind of search is for people who know what a &amp;ldquo;static&amp;rdquo; site is - I am not one of those people.&#xA;I kept running across nginx and apache things, wordpress and other website building tools, etc.&#xA;In fact I only recently learned that JavaScript assets cann still be considered static so I am a complete baby in the web-dev space.&lt;/p&gt;&#xA;&lt;p&gt;What I really wanted was just a simple landing page with a link to each of my &amp;ldquo;posts&amp;rdquo; which are in the form of a single html file each that I can easily export from my tiddlywiki (I have a post about tiddlywiki &lt;a href=&#34;/tiddly-wiki&#34;&gt;here&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;The first win &lt;code&gt;python -m http.server&lt;/code&gt; right in the directory I kept my html files in and that got me what I wanted functionally.&#xA;But then I wanted just a hair more organization&amp;hellip;&#xA;I started looking for a way to dynamically generate an index for a directory of html files but again the verbiage of that Google search just wasn&amp;rsquo;t helping me - I didn&amp;rsquo;t want anything complicated and I knew that what I wanted had to be easy&amp;hellip;&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-index&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The Index&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Luckily I randomly came across a SO that mentioned a Linux utility called &lt;code&gt;tree&lt;/code&gt; which does exactly what I wanted!&lt;/p&gt;&#xA;&lt;p&gt;See my TIL on &lt;code&gt;tree&lt;/code&gt; &lt;a href=&#34;&#39;/tree&#39;&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;So now it goes like this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Take notes on X in my tiddlywiki&lt;/li&gt;&#xA;&lt;li&gt;Export that tiddler to a html file&lt;/li&gt;&#xA;&lt;li&gt;Put that html file into a &lt;code&gt;notes&lt;/code&gt; folder in my github repo for small group notes&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;code&gt;tree&lt;/code&gt; to generate an &lt;code&gt;index.html&lt;/code&gt; of each of those files in the &lt;code&gt;notes&lt;/code&gt; directory&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;code&gt;python -m http.server&lt;/code&gt; to start a web server that lands me at the &lt;code&gt;index.html&lt;/code&gt; and now I can click through to any post!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It&amp;rsquo;s not fancy but it&amp;rsquo;s functional&amp;hellip;&#xA;This site/blog is built with markdown and &lt;a href=&#34;https://www.markata.dev&#34;&gt;markata&lt;/a&gt; and I wanted way more functionality in my tech notes.&#xA;But for this simple use case I learned a ton about &lt;em&gt;how&lt;/em&gt; content gets served up on a webpage and my small group benefits from the easy access as well!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Traefik</title>
    <id>https://pype.dev/traefik/</id>
    <updated>2022-03-06T00:00:00Z</updated>
    <published>2022-03-06T00:00:00Z</published>
    <link href="https://pype.dev/traefik/" rel="alternate" type="text/html"></link>
    <summary type="text">If you don&#39;t know about traefik and you need a reverse-proxy then you might want to check it out. I used to use nginx for my reverse proxy but the config was...</summary>
    <content type="html">&lt;h1 id=&#34;traefik&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Traefik&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;If you don&amp;rsquo;t know about &lt;a href=&#34;https://doc.traefik.io/traefik/&#34;&gt;traefik&lt;/a&gt; and you need a reverse-proxy then you might want to check it out.&#xA;I used to use nginx for my reverse proxy but the config was over my head, and once it was working I was afraid to touch it.&#xA;Traefik brings a lot to the table, my main uses are reverse proxy and ip whitelisting, but it&amp;rsquo;s doing even more under the hood that I don&amp;rsquo;t have a full-grasp of yet.&lt;/p&gt;&#xA;&lt;p&gt;I like Traefik a lot because once I get some basic config up it&amp;rsquo;s incredibly easy to add services into my homelab whether they run on my primary server or not.&#xA;This will not be exhaustive but I&amp;rsquo;ll outline my simple setup process of traefik and how I add services whether they are in docker or not.&lt;/p&gt;&#xA;&lt;h1 id=&#34;docker&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Docker&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;In 2022 I&amp;rsquo;m still a docker fan-boy and I run my traefik instance in a docker container.&#xA;This isn&amp;rsquo;t necessary but I love the portability since my homelab is very dynamic at the moment.&#xA;And even if it wasn&amp;rsquo;t I&amp;rsquo;d still want to keep traefik in docker because deployment and updating are just so flipping easy&lt;/p&gt;&#xA;&lt;p&gt;A simple docker-compose file for traefik might look like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;traefik&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik:v2.4&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;network_mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;docker-data/traefik/traefik.toml:/etc/traefik/traefik.toml:ro&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;docker-data/traefik/config.yml:/etc/traefik/config.yml:ro&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;docker-data/traefik/letsencrypt:/letsencrypt:rw&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;/var/run/docker.sock:/var/run/docker.sock:ro&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# for auto-discovery&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ traefik_environment_variables }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;restart_policy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1g&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;ansible-deployment&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Ansible deployment&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;I plan to have more on my homelab and Ansible on this site eventually&amp;hellip;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I use Ansible to deploy most of my services at home, including traefik. My main homelab repo is &lt;a href=&#34;https://github.com/nicpayne713/ansible-nas&#34;&gt;here&lt;/a&gt; which is a fork of &lt;a href=&#34;https://github.com/davestephens/ansible-nas&#34;&gt;Ansible NAS&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;If you want my stuff then be sure to go to the &lt;code&gt;user/nic&lt;/code&gt; branch on my fork&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;You can see the ansible stuff for traefik &lt;a href=&#34;https://github.com/davestephens/ansible-nas/tree/master/roles/traefik&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;config&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Config&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I use a &lt;code&gt;traefik.toml&lt;/code&gt; as the main config and it looks something like this.&#xA;With ansible a lot of this is done through template variables but this is the general idea.&#xA;This config tells traefik what ports to listen and forward on, and gives the names to be referenced by docker labels (down below).&lt;/p&gt;&#xA;&lt;p&gt;Traefik also has a handy web ui that with this config you can find on port &lt;code&gt;8080&lt;/code&gt;.&#xA;There is a &lt;code&gt;providers&lt;/code&gt; section - which is one of the biggest selling points of traefik for me.&#xA;I have a docker provider configured  and a static file.&lt;/p&gt;&#xA;&lt;p&gt;The docker provider lets traefik auto-discover new services that I deploy and automatically handle the routing!&#xA;The static file lets me easily add non-dockerized service routing, or routing to dockerized services on another host (I think traefik has an easier way to do this automatically but I don&amp;rsquo;t do it often enough to need that kind of automation).&#xA;Then at the bottom is the SSL cert stuff.&#xA;Using Let&amp;rsquo;s Encrypt is pretty easy and I use Cloudflare as my DNS provider&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;address&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:80&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;redirections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;websecure&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;websecure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;address&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:443&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;websecure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;certResolver&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;letsencrypt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;websecure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;domains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;sans&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*.example.com&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;traefik&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;address&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;providersThrottleDuration&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1s&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;exposedbydefault&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;filename&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/etc/traefik/config.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;insecure&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;dashboard&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;level&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;INFO&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;terminatingStatusCode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;certificatesResolvers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;certificatesResolvers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;letsencrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;certificatesResolvers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;letsencrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;acme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;email&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;my_email@example.com&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;storage&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/letsencrypt/acme.json&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;caserver&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://acme-staging-v02.api.letsencrypt.org/directory&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# le staging, not prod&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;certificatesResolvers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;letsencrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;acme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dnsChallenge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;cloudflare&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;providers-file&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Providers.file&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;To my knowledge there isn&amp;rsquo;t much to configure on the docker provider side of things until you deploy a service.&#xA;But the provider config file should get a little screen time here.&lt;/p&gt;&#xA;&lt;p&gt;The file defines a traefik http router for each service you define, in this case just &lt;code&gt;pihole&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here I am adding my pihole instance which is not run inside docker but is inside a VM on another host.&#xA;I want the &lt;code&gt;entryPoints&lt;/code&gt; to be set to &lt;code&gt;websecure&lt;/code&gt; which is configured above in the http redirects.&#xA;I want some middlewares, &lt;code&gt;addprefix-pihole&lt;/code&gt; and &lt;code&gt;default-headers&lt;/code&gt;, which I&amp;rsquo;ll explain below.&#xA;I set letsencrypt as the cert certResolver.&#xA;Finally I name the service &lt;code&gt;pihole&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Then in the &lt;code&gt;services&lt;/code&gt; section I configure where pihole is located by just giving the internal IP for traefik to route to.&#xA;Finally I define my middlewares.&#xA;To get to the pihole homepage you need to use the route &lt;code&gt;/admin&lt;/code&gt; so I want that added automatically when I go to &lt;code&gt;pihole.example.com&lt;/code&gt; so I come to &lt;code&gt;pihole.example.com/admin&lt;/code&gt;.&#xA;And I wanted to restrict access to just my internal network and my wireguard network - this is done with the &lt;code&gt;default-whitelist&lt;/code&gt;.&#xA;The last thing is to configure a chain of middlewares that I called &lt;code&gt;secured&lt;/code&gt; which is just easier for the docker labels later on.&lt;/p&gt;&#xA;&lt;p&gt;With this config in play though, traefik will know about the route &lt;code&gt;pihole.example.com&lt;/code&gt; and handle the ip whitelisting and load balancing for me.&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#region routers &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;routers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pihole&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entryPoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;websecure&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;rule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Host(`pihole.example.com`)&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;middlewares&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# - default-headers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;addprefix-pihole&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;default-whitelist&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;certResolver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;letsencrypt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;pihole&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#region services&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pihole&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;loadBalancer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;servers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://192.168.1.3:80&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;passHostHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#endregion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;middlewares&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addprefix-pihole&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addPrefix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prefix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/admin&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;https-redirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;redirectScheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;scheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;default-headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;frameDeny&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sslRedirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;browserXssFilter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;contentTypeNosniff&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;forceSTSHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;stsIncludeSubdomains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;stsPreload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;stsSeconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;15552000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;customFrameOptionsValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;SAMEORIGIN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;default-whitelist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ipWhiteList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sourceRange&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;10.6.0.0/24&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# wg&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;192.168.1.0/24&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# lan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;172.17.0.0/16&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# docker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;secured&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;middlewares&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;default-whitelist&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;default-headers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;docker-labels&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Docker labels&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Now the real magic is with Docker.&#xA;Here is an example docker-compose file for spinning up a &lt;a href=&#34;https://jellyfin.org/&#34;&gt;jellyfin&lt;/a&gt; server that you want to expose to the world, or at least access at home with &lt;code&gt;jellyfin.example.com&lt;/code&gt; instead of &lt;code&gt;http://192.168.1.N:8096&lt;/code&gt;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;I left some of the ansible variable stuff in here, but the main part to be concerned with is the &lt;code&gt;labels&lt;/code&gt; section&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;We define just a few labels to throw onto this docker container which let&amp;rsquo;s traefik discover it automatically and apply any settings necessary (like my &lt;code&gt;ipWhiteList&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;traefik.enable&lt;/code&gt; is either True or False.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;traefik.http.router.jellyfin.rule&lt;/code&gt; defines an http router called jellyfin and sets the url to &lt;code&gt;jellyfin.example.com&lt;/code&gt; (if example.com was my &lt;code&gt;ansible_nas_domain&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;traefik.http.routers.jellyfin.tls.certresolver&lt;/code&gt; is set to letsencrypt since I use LE for my wildcard certs.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;traefik.http.routers.jellyfin.tls.domains[0].main&lt;/code&gt; will just be &lt;code&gt;example.com&lt;/code&gt; -&amp;gt; and this should remind you of the toml file above&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;traefik.http.routers.jellyfin.tls.domains[0].sans&lt;/code&gt; is set to &lt;code&gt;*.example.com&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;traefik.http.services.jellyfin.loadbalancer.server.port&lt;/code&gt; is set to jellyfin&amp;rsquo;s default http port of 8096, which tells traefik which port to point to for this service.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jellyfin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;linuxserver/jellyfin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_config_directory }}:/config:rw&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_movies_directory }}:/movies:{{ jellyfin_movies_permissions }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_music_directory }}:/music:{{ jellyfin_music_permissions }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_photos_directory }}:/photos:{{ jellyfin_photos_permissions }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_tv_directory }}:/tv:{{ jellyfin_tv_permissions }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_books_directory }}:/books:{{ jellyfin_books_permissions }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_audiobooks_directory }}:/audiobooks:{{ jellyfin_audiobooks_permissions }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_port_http }}:8096&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_port_https }}:8920&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ ansible_nas_timezone }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;PUID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_user_id }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;PGID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_group_id }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;restart_policy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;1g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik.enable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ jellyfin_available_externally }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik.http.routers.jellyfin.rule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Host(`jellyfin.{{ ansible_nas_domain }}`)&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik.http.routers.jellyfin.tls.certresolver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;letsencrypt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik.http.routers.jellyfin.tls.domains[0].main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ ansible_nas_domain }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik.http.routers.jellyfin.tls.domains[0].sans&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*.{{ ansible_nas_domain }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik.http.services.jellyfin.loadbalancer.server.port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8096&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And just like that traefik will automagically find your jellyfin container and route &lt;code&gt;jellyfin.example.com&lt;/code&gt; to it!&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
</feed>