<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Posts tagged: homelab</title>
  <id>https://pype.dev/tags/homelab/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/atom.xml" rel="self" type="application/atom+xml"></link>
  <author>
    <name>Nic Payne</name>
  </author>
  <generator uri="https://github.com/WaylonWalker/markata-go">markata-go</generator>
  <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="html">&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;&lt;p&gt;Here&amp;rsquo;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;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;A 2-fer&amp;hellip; So I want to host atuin and share shell history across my machines on my tailnet I think&amp;hellip; it&amp;rsquo;s such a nice interface but I barely use it so I&amp;rsquo;m sure the features will improve some aspects of my life. And secondly, this section on using systemd is interesting&amp;hellip; I hadn&amp;rsquo;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&amp;hellip; Saving here for implementing something&amp;hellip; sometime&amp;hellip;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&#xA;&lt;p&gt;This is one of [[ my-thoughts ]]. I picked this up from &lt;a href=&#34;https://waylonwalker.com&#34;&gt;Waylon Walker&lt;/a&gt;(&lt;a href=&#34;https://thoughts.waylonwalker.com&#34;&gt;https://thoughts.waylonwalker.com&lt;/a&gt;). It&amp;rsquo;s a short note that I make about someone else&amp;rsquo;s content online.  Learn more about the process &lt;a href=&#34;/thoughts/&#34; class=&#34;wikilink&#34; data-title=&#34;Thoughts&#34; data-description=&#34;My thoughts are found at my thoughts feed&#34; data-date=&#34;2025-06-09&#34; data-preview=&#34;My thoughts are found at my thoughts feed&#34;&gt;Thoughts&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>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 &lt;a href=&#34;/docker/&#34; class=&#34;glossary-term&#34; title=&#34;docker - container runtime&#34; data-hover-title=&#34;docker&#34;&gt;Docker&lt;/a&gt; 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 &lt;a href=&#34;/docker/&#34; class=&#34;glossary-term&#34; title=&#34;docker - container runtime&#34; data-hover-title=&#34;docker&#34;&gt;docker&lt;/a&gt; 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://raw.githubusercontent.com/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://raw.githubusercontent.com/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 - &lt;a href=&#34;/docker/&#34; class=&#34;glossary-term&#34; title=&#34;docker - container runtime&#34; data-hover-title=&#34;docker&#34;&gt;docker&lt;/a&gt;&#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="html">&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;&lt;p&gt;Here&amp;rsquo;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;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;great post on self-hosting. I think in a lot of similar ways and had a siar journey. There&amp;rsquo;s things I want to accomplish as time goes on, looking for motivation to get a post like this going myself&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&#xA;&lt;p&gt;This is one of [[ my-thoughts ]]. I picked this up from &lt;a href=&#34;https://waylonwalker.com&#34;&gt;Waylon Walker&lt;/a&gt;(&lt;a href=&#34;https://thoughts.waylonwalker.com&#34;&gt;https://thoughts.waylonwalker.com&lt;/a&gt;). It&amp;rsquo;s a short note that I make about someone else&amp;rsquo;s content online.  Learn more about the process &lt;a href=&#34;/thoughts/&#34; class=&#34;wikilink&#34; data-title=&#34;Thoughts&#34; data-description=&#34;My thoughts are found at my thoughts feed&#34; data-date=&#34;2025-06-09&#34; data-preview=&#34;My thoughts are found at my thoughts feed&#34;&gt;Thoughts&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>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="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;I need to backup my personal $HOME to my NAS cause there&amp;rsquo;s a lot in there, and&#xA;mostly my git projects with .env files all over. Plus some &lt;a href=&#34;/docker/&#34; class=&#34;glossary-term&#34; title=&#34;docker - container runtime&#34; data-hover-title=&#34;docker&#34;&gt;docker&lt;/a&gt; data&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-not-zfs&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Why Not ZFS?&lt;/span&gt; &lt;a href=&#34;#why-not-zfs&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;GREAT QUESTION! It&amp;rsquo;s because I struggled getting all the syncoid/sanoid&#xA;requirements installed on my Aurora OS&amp;hellip;. I like the immutable desktop trend,&#xA;but I don&amp;rsquo;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&amp;rsquo;t have ZFS at $HOME&#xA;what&amp;rsquo;s a boy to do?&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;rsync&lt;/code&gt; would probably work fine especially if I &lt;a href=&#34;/rsync-like-a-pro/&#34; class=&#34;wikilink&#34; data-title=&#34;rsync like a pro&#34; data-description=&#34;I am moving a hefty amount of data to a new ZFS pool due to some corruption and I want to avoid using for this just to make sure I don&amp;#39;t propagate any...&#34; data-date=&#34;2024-12-11&#34; data-preview=&#34;I am moving a hefty amount of data to a new ZFS pool due to some corruption and I want to avoid using for this just to make sure I don&amp;#39;t propagate any...&#34;&gt;rsync like a pro&lt;/a&gt; but I figured I could cobble together some other tech and broaden my horizons&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;enter-restic&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Enter restic&lt;/span&gt; &lt;a href=&#34;#enter-restic&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Apparently &lt;a href=&#34;https://restic.net/&#34;&gt;restic&lt;/a&gt; has been around for a while, and you can run it in a container&amp;hellip; awesome that&amp;rsquo;s all I needed to hear&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;how&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;How?&lt;/span&gt; &lt;a href=&#34;#how&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll use a docker compose stack for this&amp;hellip; typically I think running &lt;code&gt;restic&lt;/code&gt;&#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&amp;rsquo;ll have a more full-featured ecosystem.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-value&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The Value&lt;/span&gt; &lt;a href=&#34;#the-value&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;You can find code below and an example repo that more or less is what I use for my desktop backup but that&amp;rsquo;s primarily what I was after&amp;hellip;. backing up the data on my desktop to my NAS in a way that:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;I wouldn&amp;rsquo;t have to &amp;ldquo;remember&amp;rdquo; how I was doing it&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I accomplish this by having good git repo organization and README files that explain my own usage patterns&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Tracked snapshots&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I need some &lt;a href=&#34;/kind/&#34; class=&#34;glossary-term&#34; title=&#34;kind - kubernetes in docker&#34; data-hover-title=&#34;kind&#34;&gt;kind&lt;/a&gt; of snapshotting - &lt;code&gt;zfs&lt;/code&gt; has spoiled me, and turns out &lt;code&gt;restic&lt;/code&gt; has some amount of support for it&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Running in docker would be ideal for now so that I don&amp;rsquo;t need to worry about installing specific binaries across machine while I build out my patterns&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;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 &lt;code&gt;.env&lt;/code&gt; files with relative ease&amp;hellip;&lt;/p&gt;&#xA;&lt;h1 id=&#34;code&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Code&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Check out the &lt;a href=&#34;https://github.com/pypeaday/docker-compose-restic&#34;&gt;Example GH&#xA;Repo&lt;/a&gt; but I&amp;rsquo;ll drop key file&#xA;contents here for a quick read if you&amp;rsquo;re interested in some of the setup&amp;hellip; but&#xA;the blog post mostly ends here&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-files&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The Files&lt;/span&gt; &lt;a href=&#34;#the-files&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;We have a &lt;code&gt;docker-compose.yml&lt;/code&gt; of course&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;backup&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;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;restic/restic: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;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;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;restic_backup&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;hostname&lt;/span&gt;&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;restic-backup-runner&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;&#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;.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;# The location of the backup repository inside the 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;l&#34;&gt;RESTIC_REPOSITORY=/target&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;# The location of the password file inside the 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;l&#34;&gt;RESTIC_PASSWORD_FILE=/password&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;c&#34;&gt;# --- Source and Config Mounts ---&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;${BACKUP_SOURCE}:/source: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;${RESTIC_PASSWORD_FILE}:/password: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;./backup-and-prune.sh:/usr/local/bin/backup-and-prune: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;&#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;# --- Persistent Data Mounts ---&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;./.ssh:/root/.ssh: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;./.cache:/root/.cache: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;&#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;# Set the default entrypoint to our new script. This will be executed when&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;# the container starts, unless overridden.&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;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/local/bin/backup-and-prune&amp;#34;&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;Your &lt;code&gt;.env&lt;/code&gt; file will need to 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;sb&#34;&gt;``&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# HOST related variables&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;c1&#34;&gt;# The source directory to back up (absolute path)&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;BACKUP_SOURCE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/nic&#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;# --- Restic Configuration ---&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;c1&#34;&gt;# The file containing the restic repository password (absolute path on host)&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;HOST_RESTIC_PASSWORD_FILE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/nic/projects/personal/homelab-mono/dataops/docker/.restic-password&#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;# The SSH private key to use for connecting to the NAS (absolute path on host)&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;c1&#34;&gt;# It&amp;#39;s recommended to use a dedicated key for this purpose.&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;SSH_PRIVATE_KEY_FILE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/nic/.skm/ghost/id_rsa&#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;# Container Env Vars&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;c1&#34;&gt;# the container makes the sftp connection using my credentials, but nonetheless the container needs them, so this isn&amp;#39;t envrc stuff&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;c1&#34;&gt;# --- SFTP/SSH Connection Details for the NAS ---&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;SFTP_USER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;nic&#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;SFTP_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ghost&#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;# The path on the NAS where the restic repository will be stored&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;SFTP_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/tank/encrypted/nas/nic-home/&#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;# --- Restic Configuration ---&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;nv&#34;&gt;RESTIC_REPOSITORY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/target&#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;RESTIC_PASSWORD_FILE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And then the backup script that the container will execute is something 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;&lt;span class=&#34;c1&#34;&gt;#!/bin/sh&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;nb&#34;&gt;set&lt;/span&gt; -e &lt;span class=&#34;c1&#34;&gt;# Exit immediately if a command exits with a non-zero status.&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;c1&#34;&gt;# Construct the repository path from environment variables passed by docker-compose&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;REPO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sftp:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SFTP_USER&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SFTP_HOST&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SFTP_PATH&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#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;# 1. Run the backup&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;c1&#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;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--- Starting backup for &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;BACKUP_SOURCE&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; ---&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;restic backup /source --verbose -r &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;REPO&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#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;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--- Backup complete ---&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;c1&#34;&gt;# 2. Clean up old snapshots according to the policy&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;c1&#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;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--- Pruning old snapshots ---&#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;(Policy: keep last 7 daily, 4 weekly, 6 monthly)&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;restic forget &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;    --prune &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;    --keep-daily &lt;span class=&#34;m&#34;&gt;7&lt;/span&gt; &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;    --keep-weekly &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; &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;    --keep-monthly &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; &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;    -r &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;REPO&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#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;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--- Backup and prune process finished successfully ---&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;systemd&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Systemd&lt;/span&gt; &lt;a href=&#34;#systemd&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Finally there&amp;rsquo;s a systemd unit and timer file in there so you can setup a systemd service for the backup&lt;/p&gt;&#xA;&lt;h3 id=&#34;service&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;service&lt;/span&gt; &lt;a href=&#34;#service&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&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;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 Restic backup to NAS using Docker Compose&#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;# We are running this as a user service, so we assume that the system-level&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;c1&#34;&gt;# docker.service is already running.&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;After&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;network-online.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;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;c1&#34;&gt;# Set the working directory to where your docker-compose.yml and .env file are located&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;WorkingDirectory&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/home/user/nas-backup/docker&#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;# The command to execute. We use the full path to docker-compose for reliability.&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;c1&#34;&gt;# You may need to adjust this path if &amp;#39;docker compose&amp;#39; is installed elsewhere.&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;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/bin/docker compose run --rm backup&#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;default.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;timer&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;timer&lt;/span&gt; &lt;a href=&#34;#timer&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&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;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 Restic backup job daily&#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;c1&#34;&gt;# Run daily at 2:00 AM&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;daily&#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;# Or uncomment for a specific time:&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;c1&#34;&gt;# OnCalendar=*-*-* 02:00:00&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;c1&#34;&gt;# Run the backup immediately if the last scheduled run was missed (e.g., if the computer was off)&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;Persistent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#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;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;/code&gt;&lt;/pre&gt;</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="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;Ghost is my primary application server. These are the specs&amp;hellip;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I wrote about some of the specs in &lt;a href=&#34;/homelab-journey-part-1/#current-homelab-setup&#34; class=&#34;wikilink&#34; data-title=&#34;homelab-journey-part-1&#34; data-description=&#34;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....&#34; data-date=&#34;2025-06-05&#34;&gt;homelab-journey-part-1&lt;/a&gt; but here is where I will keep up to date information&lt;/p&gt;&#xA;&lt;/blockquote&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;Why &lt;code&gt;ghost&lt;/code&gt;? I don&amp;rsquo;t know&amp;hellip; I was going for a theme at one point it time, or&#xA;several points rather&amp;hellip; 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 &lt;code&gt;ghost&lt;/code&gt; was&#xA;born, and the backup server is &lt;code&gt;ghost-vault&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cpu&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;CPU&lt;/span&gt; &lt;a href=&#34;#cpu&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I have a &lt;code&gt;AMD Ryzen 7 5700G with Radeon Graphics @ 16x 4.426GHz&lt;/code&gt; in this bad&#xA;boy&amp;hellip; 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&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;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 &lt;a href=&#34;/jellyfin/&#34; class=&#34;wikilink&#34; data-title=&#34;Jellyfin&#34; data-description=&#34;Jellyfin is the media server software I run at home&#34; data-date=&#34;2025-07-11&#34; data-preview=&#34;Jellyfin is the media server software I run at home&#34;&gt;Jellyfin&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;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)&lt;/p&gt;&#xA;&lt;p&gt;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&amp;rsquo;s currently priced at $174, so that&amp;rsquo;s a&#xA;pretty sweet deal if you&amp;rsquo;re on AM4 and looking to upgrade in July of 2025&lt;/p&gt;&#xA;&lt;h2 id=&#34;memory&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Memory&lt;/span&gt; &lt;a href=&#34;#memory&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I maxxed her out at 128 Gee Beez. I snagged that kit of Crucial that&amp;rsquo;s all&#xA;black that we&amp;rsquo;ve all seen on Amazon. I paid aboaut $90 for it, it&amp;rsquo;s currently&#xA;priced way high for some reason, which is unfortunate. It&amp;rsquo;s been totally fine&#xA;for me as far as memory performance goes - in that it&amp;rsquo;s stable and I don&amp;rsquo;t&#xA;think about it&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;boot&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Boot&lt;/span&gt; &lt;a href=&#34;#boot&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I have a 1 TB NVMe in here to boot from. I think it&amp;rsquo;s a Crucial P3&lt;/p&gt;&#xA;&lt;h2 id=&#34;storage&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Storage&lt;/span&gt; &lt;a href=&#34;#storage&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Storage is the interesting bit, it&amp;rsquo;s supposed to be the most rock solid but&#xA;it&amp;rsquo;s also been the most fluid for me from a hardware perspective, and as of my&#xA;most recent case migration I think I&amp;rsquo;m in a good spot..&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The case is a Sagitatius 8-bay NAS Chassis from aliexpress&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I use&#xA;&lt;a href=&#34;https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html&#34;&gt;zfs&lt;/a&gt;&#xA;and recommend you do to&amp;hellip;. but this isn&amp;rsquo;t a post about that&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;p&gt;There is a 4TB drive that serves as frigate&amp;rsquo;s media directory - I wanted a&#xA;dedicated drive due to the write-intensive nature of the NVR.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I backup to an offsite box using syncoid&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;os&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;OS&lt;/span&gt; &lt;a href=&#34;#os&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I am currently running Ubuntu Server 24.04&lt;/p&gt;&#xA;&lt;p&gt;I am eager for Ubuntu to get zfs in their release that contains the zfs data&#xA;corruption with encrypted datasets but I don&amp;rsquo;t expect to see it until 26.04 at&#xA;the earliest &lt;em&gt;fingers crossed&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;kvm&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;KVM&lt;/span&gt; &lt;a href=&#34;#kvm&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I recently purchased a &lt;a href=&#34;https://www.jetkvm.com/&#34;&gt;jetkvm&lt;/a&gt; and it&amp;rsquo;s exactly what&#xA;I need for both my main server and my backup off-site&amp;hellip; An amazingly simple&#xA;and elegant solution to remote KVM.&lt;/p&gt;&#xA;&lt;h2 id=&#34;applications&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Applications&lt;/span&gt; &lt;a href=&#34;#applications&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Currently I use &lt;code&gt;docker compose&lt;/code&gt; to manage practically everything. Stay tuned&#xA;for more about those things&lt;/p&gt;&#xA;&lt;p&gt;I also have a few ansible playbooks for setting up my shell and some utilities&#xA;on my computers, including the server. They&amp;rsquo;re in&#xA;&lt;a href=&#34;https://github.com/pypeaday/ansible-playbooks&#34;&gt;github&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Find more at &lt;a href=&#34;/the-homelab/&#34; class=&#34;wikilink&#34; data-title=&#34;The Homelab&#34; data-description=&#34;This is the landing page for my homelab posts. It isn&amp;#39;t a feed because I will write things here and link out to relevant parts of the homelab.&#34; data-date=&#34;2025-07-11&#34; data-preview=&#34;This is the landing page for my homelab posts. It isn&amp;#39;t a feed because I will write things here and link out to relevant parts of the homelab.&#34;&gt;The Homelab&lt;/a&gt;&lt;/p&gt;&#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="html">&lt;h1 id=&#34;the-lab&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;The Lab&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;This is the landing page for my homelab posts. It isn&amp;rsquo;t a feed because I will&#xA;write things here and link out to relevant parts of the homelab.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll probably have notes about the hardware mostly here.&lt;/p&gt;&#xA;&lt;h2 id=&#34;primary-application-server&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Primary Application Server&lt;/span&gt; &lt;a href=&#34;#primary-application-server&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;My main server is called &lt;a href=&#34;/ghost/&#34; class=&#34;wikilink&#34; data-title=&#34;Ghost&#34; data-description=&#34;Ghost is my primary application server. These are the specs...&#34; data-date=&#34;2025-07-11&#34; data-preview=&#34;Ghost is my primary application server. These are the specs...&#34;&gt;Ghost&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;current-homelab-setup&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Current Homelab Setup&lt;/span&gt; &lt;a href=&#34;#current-homelab-setup&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I copied this our of &lt;a href=&#34;/homelab-journey-part-1/#current-homelab-setup&#34; class=&#34;wikilink&#34; data-title=&#34;homelab-journey-part-1&#34; data-description=&#34;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....&#34; data-date=&#34;2025-06-05&#34;&gt;homelab-journey-part-1&lt;/a&gt; for now to stub out what this page will link to&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;ad-blocking-pi-hole&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Ad blocking | Pi-Hole&lt;/span&gt; &lt;a href=&#34;#ad-blocking-pi-hole&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Hardware: pi-3&lt;/p&gt;&#xA;&lt;p&gt;I have a Raspberry Pi 3 hardwired in that is running pi-hole so that&amp;rsquo;s been a&#xA;part of my infrastructure now for a long time.&lt;/p&gt;&#xA;&lt;h2 id=&#34;router-opnsense&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Router | OPNSense&lt;/span&gt; &lt;a href=&#34;#router-opnsense&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;stats&lt;/p&gt;&#xA;&lt;p&gt;CPU: i5-8700&lt;/p&gt;&#xA;&lt;p&gt;Memory: 8GB of whatever was in the box&lt;/p&gt;&#xA;&lt;p&gt;Storage: 1TB SSD&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;My router is an old Optiplex SFF 5060 I got from Amazon for less than $100.&#xA;So I&amp;rsquo;m running a x86 system for my router with&#xA;OpenSense on it. Just seemed it to be another home lab standard and I&amp;rsquo;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.&lt;/p&gt;&#xA;&lt;h2 id=&#34;networking-vlans&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Networking | VLANs&lt;/span&gt; &lt;a href=&#34;#networking-vlans&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a&#xA;managed switch in there for some VLAN tomfoolery for my cameras and an IOT&#xA;network type of a thing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;networking-vpn-tailscale&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Networking | VPN | Tailscale&lt;/span&gt; &lt;a href=&#34;#networking-vpn-tailscale&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;They&amp;rsquo;re on tailscale as well so my DNS happens over tailscale.&lt;/p&gt;&#xA;&lt;h2 id=&#34;my-desktop&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;My Desktop&lt;/span&gt; &lt;a href=&#34;#my-desktop&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;stats&lt;/p&gt;&#xA;&lt;p&gt;CPU: Ryzen 7 5700X&lt;/p&gt;&#xA;&lt;p&gt;GPU: Nvidia 3090&lt;/p&gt;&#xA;&lt;p&gt;Memory: 64 GB&lt;/p&gt;&#xA;&lt;p&gt;Storage: 4TB SSD + 2 TB HDD for zfs backup&lt;/p&gt;&#xA;&lt;p&gt;OS: Universal Blue Aurora&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;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;&lt;a href=&#34;/docker/&#34; class=&#34;glossary-term&#34; title=&#34;docker - container runtime&#34; data-hover-title=&#34;docker&#34;&gt;docker&lt;/a&gt; containers with compose stacks and portainer for visibility.&lt;/p&gt;&#xA;&lt;h3 id=&#34;applications&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Applications&lt;/span&gt; &lt;a href=&#34;#applications&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Some of the apps I run here are ollama, open-webui, automatic1111&amp;rsquo;s stable diffusion webui, whisper-webui&lt;/p&gt;&#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="html">&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;&lt;p&gt;Here&amp;rsquo;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;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Seems like &lt;a href=&#34;/docker/&#34; class=&#34;glossary-term&#34; title=&#34;docker - container runtime&#34; data-hover-title=&#34;docker&#34;&gt;docker&lt;/a&gt; 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&amp;rsquo;s compute power without paying the penalty of the nvidia runtime or something&amp;hellip; I can&amp;rsquo;t claim to have followed it all but I heard &amp;ldquo;run LLMs in docker directly for a bigger boost&amp;rdquo; and I&amp;rsquo;m in.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&#xA;&lt;p&gt;This is one of [[ my-thoughts ]]. I picked this up from &lt;a href=&#34;https://waylonwalker.com&#34;&gt;Waylon Walker&lt;/a&gt;(&lt;a href=&#34;https://thoughts.waylonwalker.com&#34;&gt;https://thoughts.waylonwalker.com&lt;/a&gt;). It&amp;rsquo;s a short note that I make about someone else&amp;rsquo;s content online.  Learn more about the process &lt;a href=&#34;/thoughts/&#34; class=&#34;wikilink&#34; data-title=&#34;Thoughts&#34; data-description=&#34;My thoughts are found at my thoughts feed&#34; data-date=&#34;2025-06-09&#34; data-preview=&#34;My thoughts are found at my thoughts feed&#34;&gt;Thoughts&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>💭 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="html">&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;&lt;p&gt;Here&amp;rsquo;s my thought on &lt;a href=&#34;https://restic.net/&#34;&gt;restic · Backups done right!&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Welp, I need to be backing up my desktop home directory, specifically a directory of &lt;a href=&#34;/docker/&#34; class=&#34;glossary-term&#34; title=&#34;docker - container runtime&#34; data-hover-title=&#34;docker&#34;&gt;docker&lt;/a&gt; volume data&amp;hellip; I thought duplicati made sense, but that mostly targets cloud-based backends, and rsync is great but I wasn&amp;rsquo;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&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&#xA;&lt;p&gt;This is one of [[ my-thoughts ]]. I picked this up from &lt;a href=&#34;https://waylonwalker.com&#34;&gt;Waylon Walker&lt;/a&gt;(&lt;a href=&#34;https://thoughts.waylonwalker.com&#34;&gt;https://thoughts.waylonwalker.com&lt;/a&gt;). It&amp;rsquo;s a short note that I make about someone else&amp;rsquo;s content online.  Learn more about the process &lt;a href=&#34;/thoughts/&#34; class=&#34;wikilink&#34; data-title=&#34;Thoughts&#34; data-description=&#34;My thoughts are found at my thoughts feed&#34; data-date=&#34;2025-06-09&#34; data-preview=&#34;My thoughts are found at my thoughts feed&#34;&gt;Thoughts&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>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="html">&lt;p&gt;I am trying to use &lt;a href=&#34;/temporal/&#34; class=&#34;wikilink&#34; data-title=&#34;temporal&#34; data-description=&#34;Temporal is a workflow orchestrator that I&amp;#39;m interested in&#34; data-date=&#34;2025-06-24&#34; data-preview=&#34;Temporal is a workflow orchestrator that I&amp;#39;m interested in&#34;&gt;temporal&lt;/a&gt; at home for running automated pipelines. It&amp;rsquo;s&#xA;definitely overkill for my use case but this is America&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;So my first project is a system that takes my &lt;a href=&#34;/thoughts/&#34; class=&#34;wikilink&#34; data-title=&#34;Thoughts&#34; data-description=&#34;My thoughts are found at my thoughts feed&#34; data-date=&#34;2025-06-09&#34; data-preview=&#34;My thoughts are found at my thoughts feed&#34;&gt;Thoughts&lt;/a&gt; and posts them to&#xA;&lt;a href=&#34;/nostr/&#34; class=&#34;wikilink&#34; data-title=&#34;Nostr&#34; data-description=&#34;???+ note &amp;#34;How to start...&amp;#34;&#34; data-date=&#34;2025-07-02&#34; data-preview=&#34;???+ note &amp;#34;How to start...&amp;#34;&#34;&gt;Nostr&lt;/a&gt; as I briefly discussed in &lt;a href=&#34;/testing-a-postiz-change-locally/&#34; class=&#34;wikilink&#34; data-title=&#34;Testing a Postiz Change Locally (IT WORKS!)&#34; data-description=&#34;I am working on a pipeline at home to integrate my blog with social media a little more. One of the things I want to do is automatically post my-thoughts to...&#34; data-date=&#34;2025-07-06&#34; data-preview=&#34;I am working on a pipeline at home to integrate my blog with social media a little more. One of the things I want to do is automatically post my-thoughts to...&#34;&gt;Testing a Postiz Change Locally (IT WORKS!)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I have temporal infrastructure setup in homelab-compose and then&#xA;homelab-temporal should probably be homelab-temporal-pipelines or something,&#xA;but it&amp;rsquo;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&lt;/p&gt;&#xA;&lt;p&gt;NOTE: everything is moving to homelab-mono&lt;/p&gt;&#xA;&lt;h2 id=&#34;issue-01&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Issue 01&lt;/span&gt; &lt;a href=&#34;#issue-01&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I am currently hitting a stupid python issue:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nic in homelab-temporal   main    ×2  ×4  ×7 via   v3.12.8(homelab-temporal)   (dev) 󰒄&#xA;⬢ [devbox] ❯ python -c &amp;quot;from homelab_temporal.postiz.postiz_client import PostizClient&amp;quot;&#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 &amp;quot;/home/nic/projects/personal/homelab-temporal/scripts/postiz/simple_post.py&amp;quot;, line 3, in &amp;lt;module&amp;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;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;very dumb venv problem&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;resolution&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Resolution&lt;/span&gt; &lt;a href=&#34;#resolution&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;need to use &lt;code&gt;python -m&lt;/code&gt; because the script is outside the project root? see &lt;a href=&#34;/2025-07-08-notes/&#34; class=&#34;wikilink&#34; data-title=&#34;2025-07-08 Notes&#34; data-description=&#34;Today I consolidated homelab-social-media-pipelines into homelab-temporal, which is the app repo.&#34; data-date=&#34;2025-07-08&#34; data-preview=&#34;Today I consolidated homelab-social-media-pipelines into homelab-temporal, which is the app repo.&#34;&gt;2025-07-08 Notes&lt;/a&gt; and the chatgpt notes for more on this but it works now&lt;/p&gt;&#xA;&lt;h2 id=&#34;thoughts-order&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Thoughts Order&lt;/span&gt; &lt;a href=&#34;#thoughts-order&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;as of &lt;a href=&#34;/2025-07-11-notes/&#34; class=&#34;wikilink&#34; data-title=&#34;2025-07-11 Notes&#34; data-description=&#34;yesterday 2025-07-10-notes&#34; data-date=&#34;2025-07-11&#34; data-preview=&#34;yesterday 2025-07-10-notes&#34;&gt;2025-07-11 Notes&lt;/a&gt; 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&amp;rsquo;t get too repetitive&lt;/p&gt;&#xA;&lt;h2 id=&#34;todos&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;TODOs&lt;/span&gt; &lt;a href=&#34;#todos&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;[x] - destroy the homelab-social-media-pipelines repo&lt;/p&gt;&#xA;&lt;p&gt;[] - think about how to structure things more&amp;hellip; monorepo in homelab-temporal might be hard to manage with AI tools due to context management&amp;hellip; unsure though&lt;/p&gt;&#xA;&lt;p&gt;[] - create workflow and activities for thoughts to nostr&amp;hellip; revisit diagram to see what you need to build out in the temporal repo&lt;/p&gt;&#xA;&lt;p&gt;[] - do something like this for github stars and then blog posts&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I need to update my templates for nostr og images using this as fodder&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;c&#34;&gt;&amp;lt;!-- HTML Meta Tags --&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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Nostr Design&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&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;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;description&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;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;A comprehensive resource for designers and developers to build successful nostr products&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;/&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;&#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;c&#34;&gt;&amp;lt;!-- Facebook Meta Tags --&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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;property&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;og:url&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://nostrdesign.org&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;property&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;og:type&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;website&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;property&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;og:title&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Nostr Design&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&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;na&#34;&gt;property&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;og:description&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;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;A comprehensive resource for designers and developers to build successful nostr products&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;/&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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&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;na&#34;&gt;property&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;og:image&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;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://nostrdesign.org/img/nostr-cover.jpg&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;/&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;&#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;c&#34;&gt;&amp;lt;!-- Twitter Meta Tags --&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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;twitter:card&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;summary_large_image&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;property&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;twitter:domain&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;nostrdesign.org&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;property&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;twitter:url&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://nostrdesign.org&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;twitter:title&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Nostr Design&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&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;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;twitter:description&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;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;A comprehensive resource for designers and developers to build successful nostr products&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;/&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;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&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;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;twitter:image&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;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://nostrdesign.org/img/nostr-cover.jpg&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;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;dockerizing&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Dockerizing&lt;/span&gt; &lt;a href=&#34;#dockerizing&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I think I wnt to dockerize my workers and workflows&amp;hellip; build them out of the &lt;code&gt;homelab-temporal&lt;/code&gt; repo but then run them in compose stacks&amp;hellip; that can get stitched together better but for now that&amp;rsquo;ll probably be a good target.&#xA;I have things to think about though&amp;hellip; for example the blog builder needs my ssh keys, or an ssh key for a user&amp;hellip; also git is a little mess up anyways&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;temporal &lt;a href=&#34;https://temporal-ui.paynepride.com/namespaces/default/workflows/blog-build-ee488b69-6cdf-4819-bccd-df183cf8ec13/01981101-e48b-712a-96db-328ce720c13c/history&#34;&gt;link&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;temporal&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Temporal&lt;/span&gt; &lt;a href=&#34;#temporal&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I haev temporal workflows and stuff that all seem to work&lt;/p&gt;&#xA;&lt;p&gt;on &lt;a href=&#34;/2025-08-08-notes/&#34; class=&#34;wikilink&#34; data-title=&#34;2025-08-08 Notes&#34; data-description=&#34;yesterday: 2025-08-07-notes&#34; data-date=&#34;2025-08-08&#34; data-preview=&#34;yesterday: 2025-08-07-notes&#34;&gt;2025-08-08 Notes&lt;/a&gt; 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&lt;/p&gt;&#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="html">&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;&lt;p&gt;Here&amp;rsquo;s my thought on &lt;a href=&#34;https://homebox.software/en/&#34;&gt;HomeBox&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I stumbled onto homebox this morning scrolling a newsletter and it looks like something I&amp;rsquo;ve been lightly thinking about for a while. I have wanted a way to track all the things in my house, but I haven&amp;rsquo;t given it enough thought to come up with the specific manner in which to do it. I&amp;rsquo;ve seen other asset trackers but today this one excited me.&#xA;I spun it up at home quick and it looks great - It&amp;rsquo;ll take quite a lot of time to fill it out but here&amp;rsquo;s a few features I love out of the gate:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;the default setup seems very useful - pre-populated locations and tags for cataloging assets reduces the barrier to entry for me&lt;/li&gt;&#xA;&lt;li&gt;it&amp;rsquo;s pretty nice lookin&lt;/li&gt;&#xA;&lt;li&gt;there&amp;rsquo;s a label generator including qr codes that take you to the record in your homebox&amp;hellip; 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&amp;rsquo;s neat to see that similar idea played out in another more useful way!&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&#xA;&lt;p&gt;This is one of [[ my-thoughts ]]. I picked this up from &lt;a href=&#34;https://waylonwalker.com&#34;&gt;Waylon Walker&lt;/a&gt;(&lt;a href=&#34;https://thoughts.waylonwalker.com&#34;&gt;https://thoughts.waylonwalker.com&lt;/a&gt;). It&amp;rsquo;s a short note that I make about someone else&amp;rsquo;s content online.  Learn more about the process &lt;a href=&#34;/thoughts/&#34; class=&#34;wikilink&#34; data-title=&#34;Thoughts&#34; data-description=&#34;My thoughts are found at my thoughts feed&#34; data-date=&#34;2025-06-09&#34; data-preview=&#34;My thoughts are found at my thoughts feed&#34;&gt;Thoughts&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>💭 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="html">&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;&lt;p&gt;Here&amp;rsquo;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;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Came across a blog and article on using a mobile OS to self-host a cluster on old phones&amp;hellip; I happen to keep several old android phones lying around and although I&amp;rsquo;m not presently super interested in figuring out an android/arm based homelab, I am excited for the next coming years when I&amp;rsquo;m sure it&amp;rsquo;ll only get easier, phones will only be more powerful, and perhaps we&amp;rsquo;ll be running full blown CV pipeline in k8s clusters running on Pixel devices!&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;div class=&#34;admonition note&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&#xA;&lt;p&gt;This is one of [[ my-thoughts ]]. I picked this up from &lt;a href=&#34;https://waylonwalker.com&#34;&gt;Waylon Walker&lt;/a&gt;(&lt;a href=&#34;https://thoughts.waylonwalker.com&#34;&gt;https://thoughts.waylonwalker.com&lt;/a&gt;). It&amp;rsquo;s a short note that I make about someone else&amp;rsquo;s content online.  Learn more about the process &lt;a href=&#34;/thoughts/&#34; class=&#34;wikilink&#34; data-title=&#34;Thoughts&#34; data-description=&#34;My thoughts are found at my thoughts feed&#34; data-date=&#34;2025-06-09&#34; data-preview=&#34;My thoughts are found at my thoughts feed&#34;&gt;Thoughts&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>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://raw.githubusercontent.com/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="html">&lt;h1 id=&#34;temporal-networking-woes&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Temporal Networking Woes&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Someday I will potentially write up some stuff about &lt;a href=&#34;/temporal/&#34; class=&#34;wikilink&#34; data-title=&#34;temporal&#34; data-description=&#34;Temporal is a workflow orchestrator that I&amp;#39;m interested in&#34; data-date=&#34;2025-06-24&#34; data-preview=&#34;Temporal is a workflow orchestrator that I&amp;#39;m interested in&#34;&gt;temporal&lt;/a&gt; but for now&#xA;it&amp;rsquo;s a workflow orchestrator that I&amp;rsquo;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&amp;rsquo;t be to others&amp;hellip; so enjoy the problem and if&#xA;you&amp;rsquo;re here from a Google search, I hope it&amp;rsquo;s helpful.&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;p&gt;For most of my apps I slap some &lt;a href=&#34;/traefik/&#34; class=&#34;wikilink&#34; data-title=&#34;Traefik&#34; data-description=&#34;If you don&amp;#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...&#34; data-date=&#34;2022-03-06&#34; data-preview=&#34;If you don&amp;#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...&#34;&gt;Traefik&lt;/a&gt; labels on&#xA;and we&amp;rsquo;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&amp;hellip;. 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.&lt;/p&gt;&#xA;&lt;p&gt;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&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;RuntimeError: Failed client connect: `get_system_info` call error after connection: Status { code: Internal, message: &amp;quot;protocol error: received message with invalid compression flag: 73 (valid flags are 0 and 1) while receiving response with status: 500 Internal Server Error&amp;quot;, metadata: MetadataMap { headers: {&amp;quot;content-type&amp;quot;: &amp;quot;text/plain; charset=utf-8&amp;quot;, &amp;quot;content-length&amp;quot;: &amp;quot;21&amp;quot;, &amp;quot;date&amp;quot;: &amp;quot;Wed, 25 Jun 2025 02:12:44 GMT&amp;quot;} }, source: None }&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Thank God I had &lt;a href=&#34;/kind/&#34; class=&#34;glossary-term&#34; title=&#34;kind - kubernetes in docker&#34; data-hover-title=&#34;kind&#34;&gt;kind&lt;/a&gt; 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&amp;hellip; we had traefik acting as&#xA;a load balancer (as do I at home) and the traefik load balancer was &amp;ldquo;balancing&#xA;traffic using https&amp;rdquo;&amp;hellip; no, I do not really know what I&amp;rsquo;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.&lt;/p&gt;&#xA;&lt;div class=&#34;admonition warning&#34;&gt;&#xA;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&#xA;&lt;p&gt;I can&amp;rsquo;t stress enough how little I know about the difference between https and grpc or why the load balancer cares&amp;hellip; there&amp;rsquo;s clearly something in the networking stack that is extremely relevant here&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;But the fix is NOT hard thankfully, and it&amp;rsquo;s even on &lt;a href=&#34;https://doc.traefik.io/traefik/user-guides/grpc/#traefik-configuration&#34;&gt;traefik&amp;rsquo;s website&lt;/a&gt; - the warning annotation there tells you what you need - which is one more traefik label&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;l&#34;&gt;traefik.http.services.&amp;lt;my-service-name&amp;gt;.loadbalancer.server.scheme=h2c&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;So after setting the loadbalancer.server.scheme to &lt;code&gt;h2c&lt;/code&gt; I could run my worker just fine!&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://raw.githubusercontent.com/pypeaday/images.pype.dev/main/blog-media/20250625021838_4d7104c2.png&#34; alt=&#34;20250625021838_4d7104c2.png&#34;&gt;&#xA;&lt;/figure&gt;&#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://raw.githubusercontent.com/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>
</feed>