<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Series of posts about my homelab</title>
  <id>https://pype.dev/homelab/atom.xml</id>
  <updated>2026-10-06T21:30:00Z</updated>
  <subtitle>My thoughts and streams of consciousness organized into barely coherent posts about things</subtitle>
  <link href="https://pype.dev/homelab/" rel="alternate" type="text/html"></link>
  <link href="https://pype.dev/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="text">&#xA;&lt;a href=&#34;https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - Docker | Atuin Docs&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server&#34;&gt;Docker | Atuin Docs&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;A 2-fer... So I want to host atuin and share shell history across my machines on my tailnet I think... it&#39;s such a nice interface but I barely use it so I&#39;m sure the features will improve some aspects of my life. And secondly, this section on using systemd is interesting... I hadn&#39;t thought to use systemd to schedule container upgrades - sounds incredibly trivial and probably a widely practiced thing now that I say it out loud... Saving here for implementing something... sometime...&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Homelabbing Realization - Configs and Git</title>
    <id>https://pype.dev/homelabbing-realization-configs-and-git/</id>
    <updated>2025-11-13T05:48:15Z</updated>
    <published>2025-11-13T05:48:15Z</published>
    <link href="https://pype.dev/homelabbing-realization-configs-and-git/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;m back to brainstorming migrations away from Docker Compose to something that solves multi-node networking and secrets but I don&#39;t want to go to k8s... so...</summary>
    <content type="html">&lt;h2 id=&#34;realization&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Realization&lt;/span&gt; &lt;a href=&#34;#realization&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m back to brainstorming migrations away from Docker Compose to something that&#xA;solves multi-node networking and secrets but I don&amp;rsquo;t want to go to k8s&amp;hellip; so my&#xA;options are probably Docker Swarm or Nomad. As I wrestle mentally here I was&#xA;thinking about one of my issues with multi-node setup is that I still keep&#xA;everything out of one git repo, so if something gets managed remotely then I&#xA;get out of sync. Best example is dashy, Due to some constraint of wanting to be&#xA;as close to zero-day deployment-ready as possible, I think I overcomplicate&#xA;some of the simple stuff - like it&amp;rsquo;s ok to just have to put a file on a server&#xA;for a container to start the first time&amp;hellip; That doesn&amp;rsquo;t mean ansible is a&#xA;requirement, in fact lately I&amp;rsquo;ve just leaned into just recipes. But even then,&#xA;I cornered myself into tracking my dashy config in git, so I&amp;rsquo;m hesitant to ever&#xA;update it in the browser cause I&amp;rsquo;ll have to redownload the config, reconcile&#xA;the formatting differences in my repo (there&amp;rsquo;s a reason for this that a linter&#xA;doesn&amp;rsquo;t ssolve&amp;hellip;), etc&amp;hellip;. but in all of my brainstorming I just decided that&#xA;my dashy config doesn&amp;rsquo;t have to live in git&amp;hellip; it can just be on the zfs&#xA;storage, which is backed up, and configured via the app itself&amp;hellip; the config&#xA;can simply be apart of the data and container lifecycle, it doesn&amp;rsquo;t have to be&#xA;apart of the infra lifecycle.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>RepoFlow Robot User</title>
    <id>https://pype.dev/repoflow-robot-user/</id>
    <updated>2025-11-10T09:24:25Z</updated>
    <published>2025-11-10T09:24:25Z</published>
    <link href="https://pype.dev/repoflow-robot-user/" rel="alternate" type="text/html"></link>
    <summary type="text">I&#39;m trying to lean into repoFlow at home, and model some slightly better patterns than open borders to artifacts across all my services. As I&#39;m getting...</summary>
    <content type="html">&lt;p&gt;I&amp;rsquo;m trying to lean into &lt;a href=&#34;https://repoflow.io&#34;&gt;repoFlow&lt;/a&gt; at home, and model some slightly better&#xA;patterns than open borders to artifacts across all my services. As I&amp;rsquo;m getting repoflow&#xA;going I see that I can make users in the console, but then I do have to invite&#xA;users to workspaces with a manually generate invite link.&lt;/p&gt;&#xA;&lt;p&gt;The workspaces an abstraction layer, and in each workspace can be many kinds of&#xA;repositories. For my purposes I&amp;rsquo;ll probably have 2 workspaces, even though 1&#xA;would almost certainly suffice.&lt;/p&gt;&#xA;&lt;p&gt;There doesn&amp;rsquo;t seem to be a way to add a user to a workspace from the admin&#xA;setting so for a while I was pretty confused why I couldn&amp;rsquo;t add my robot user&#xA;to a docker repository in my main workspace&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;After generating the invite link and accepting though then I see in the workspace settings a&#xA;simple click to give the robot user access to all repos (if you want)&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251111122419_580b2ad4.png&#34; alt=&#34;20251111122419_580b2ad4.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251110162252_6c7b2fe9.png&#34; alt=&#34;20251110162252_6c7b2fe9.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;&lt;code&gt;Can manage&lt;/code&gt; allows the user to mutate tags (ie. push &lt;code&gt;latest&lt;/code&gt; docker tags). If&#xA;the user only has &lt;code&gt;Can deploy&lt;/code&gt; then they can only create new artifacts (ie. not&#xA;mutate any tags)&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Proxy Pull Docker Images From Self-Hosted Container Registry Through Self-Hosted Repoflow</title>
    <id>https://pype.dev/proxy-pull-docker-images-from-self-hosted-container-registry-through-self-hosted-repoflow/</id>
    <updated>2025-08-12T06:59:02Z</updated>
    <published>2025-08-12T06:59:02Z</published>
    <link href="https://pype.dev/proxy-pull-docker-images-from-self-hosted-container-registry-through-self-hosted-repoflow/" rel="alternate" type="text/html"></link>
    <summary type="text">This post is a short write-up of an issue I had while exploring Reploflow - a super solid artifactory-esq replacement for the homelab (and enterprise!). I&#39;ve...</summary>
    <content type="html">&lt;p&gt;This post is a short write-up of an issue I had while exploring &lt;a href=&#34;https://repoflow.io&#34;&gt;Reploflow&lt;/a&gt; - a&#xA;super solid artifactory-esq replacement for the homelab (and enterprise!). I&amp;rsquo;ve been playing with&#xA;it and have tried to setup a few artifact repos that I&amp;rsquo;m familiar with - docker&#xA;and pypi.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pypi&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;PyPi&lt;/span&gt; &lt;a href=&#34;#pypi&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t a post about repoflow, but I had an issue with pypi and Tomer was&#xA;EXTREMELY responsive in helping to fix my issue and patch repoflow within a day&#xA;of me reporting the issue via email!&lt;/p&gt;&#xA;&lt;h2 id=&#34;docker&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Docker&lt;/span&gt; &lt;a href=&#34;#docker&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;For docker I have a few options I just wanted to see work - obviously&#xA;proxy pull from Dockerhub for ease, but also in the interim I&amp;rsquo;d like to proxy&#xA;pull from my original container registry to avoid having to update any homelab config just yet.&#xA;Now, obviously I&amp;rsquo;ll have to update all my build pipelines to start using&#xA;repoflow, and my homelab configuration to reference the repoflow docker&#xA;repository rather than my existing registry.&lt;/p&gt;&#xA;&lt;p&gt;But there&amp;rsquo;s something to bear in mind if maintaining that middle registry -&#xA;turns out a there&amp;rsquo;s a default namespace in dockerhub &lt;code&gt;/library/&lt;/code&gt; and repoflow&#xA;expects this standard across any docker registry, so it&amp;rsquo;s pull paths fully&#xA;resolve to an incorrect tag if you don&amp;rsquo;t take this into account in your&#xA;existing infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;TLDR: if you tag an image &lt;code&gt;myregistry/ubuntu:latest&lt;/code&gt; and push it&#xA;then try to pull it back through repoflow then repoflow expects the image to be&#xA;&lt;code&gt;myregistry/library/ubuntu:latest&lt;/code&gt;. I think repoflow should support&#xA;configurating the namespace/org for the images - but in the meantime I can&#xA;go find all my images and update my build scripts to add /library/ to my&#xA;tags&amp;hellip; or while I&amp;rsquo;m doing that I can just push to repoflow directly&amp;hellip; All in&#xA;all, nice little lesson on namespaces in docker repos and third-party tooling.&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 My Ultimate Self-hosting Setup</title>
    <id>https://pype.dev/thoughts-764/</id>
    <updated>2025-07-25T19:56:38Z</updated>
    <published>2025-07-25T19:56:38Z</published>
    <link href="https://pype.dev/thoughts-764/" rel="alternate" type="text/html"></link>
    <summary type="text">great post on self-hosting. I think in a lot of similar ways and had a siar journey. There&#39;s things I want to accomplish</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://codecaptured.com/blog/my-ultimate-self-hosting-setup/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://codecaptured.com/blog/my-ultimate-self-hosting-setup/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - My Ultimate Self-hosting Setup&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://codecaptured.com/blog/my-ultimate-self-hosting-setup/&#34;&gt;My Ultimate Self-hosting Setup&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;great post on self-hosting. I think in a lot of similar ways and had a siar journey. There&#39;s things I want to accomplish as time goes on, looking for motivation to get a post like this going myself&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Using restic to backup my home directory</title>
    <id>https://pype.dev/using-restic-to-backup-my-home-directory/</id>
    <updated>2025-07-16T09:12:26Z</updated>
    <published>2025-07-16T09:12:26Z</published>
    <link href="https://pype.dev/using-restic-to-backup-my-home-directory/" rel="alternate" type="text/html"></link>
    <summary type="text">I need to backup my personal $HOME to my NAS cause there&#39;s a lot in there, and mostly my git projects with .env files all over. Plus some docker data</summary>
    <content type="text">&#xA;# Intro&#xA;&#xA;I need to backup my personal $HOME to my NAS cause there&#39;s a lot in there, and&#xA;mostly my git projects with .env files all over. Plus some docker data&#xA;&#xA;## Why Not ZFS?&#xA;&#xA;GREAT QUESTION! It&#39;s because I struggled getting all the syncoid/sanoid&#xA;requirements installed on my Aurora OS.... I like the immutable desktop trend,&#xA;but I don&#39;t understand rpm-ostree enough to properly get all the lower level&#xA;kernel stuff setup in a way I trust. So because I don&#39;t have ZFS at $HOME&#xA;what&#39;s a boy to do?&#xA;&#xA;`rsync` would probably work fine especially if I [[rsync-like-a-pro]] but I figured I could cobble together some other tech and broaden my horizons...&#xA;&#xA;## Enter restic&#xA;&#xA;Apparently [restic](https://restic.net/) has been around for a while, and you can run it in a container... awesome that&#39;s all I needed to hear...&#xA;&#xA;## How?&#xA;&#xA;I&#39;ll use a docker compose stack for this... typically I think running `restic`&#xA;right on the host is the way to go, but on my desktop I float between my host&#xA;and distroboxes and to keep things as simple as possible, even though less&#xA;efficient, I want to manage everything through containers as my homelab gets&#xA;built out and eventually I&#39;ll have a more full-featured ecosystem.&#xA;&#xA;## The Value&#xA;&#xA;You can find code below and an example repo that more or less is what I use for my desktop backup but that&#39;s primarily what I was after.... backing up the data on my desktop to my NAS in a way that:&#xA;&#xA;1. I wouldn&#39;t have to &#34;remember&#34; how I was doing it&#xA;&#xA;- I accomplish this by having good git repo organization and README files that explain my own usage patterns&#xA;&#xA;2. Tracked snapshots&#xA;&#xA;- I need some kind of snapshotting - `zfs` has spoiled me, and turns out `restic` has some amount of support for it&#xA;&#xA;3. Running in docker would be ideal for now so that I don&#39;t need to worry about installing specific binaries across machine while I build out my patterns&#xA;&#xA;With this setup I get to backup my $HOME to my NAS which contains 1. docker&#xA;volume info for all the AI workloads I run on my desktop and 2. all my&#xA;sensitive info in my git repos is at least backed up in a way that I can&#xA;recover `.env` files with relative ease...&#xA;&#xA;# Code&#xA;&#xA;Check out the [Example GH&#xA;Repo](https://github.com/pypeaday/docker-compose-restic) but I&#39;ll drop key file&#xA;contents here for a quick read if you&#39;re interested in some of the setup... but&#xA;the blog post mostly ends here&#xA;&#xA;## The Files&#xA;&#xA;We have a `docker-compose.yml` of course&#xA;&#xA;```yaml&#xA;services:&#xA;  backup:&#xA;    image: restic/restic:latest&#xA;    network_mode: host&#xA;    container_name: restic_backup&#xA;    hostname: restic-backup-runner&#xA;    env_file:&#xA;      - .env&#xA;    environment:&#xA;      # The location of the backup repository inside the container&#xA;      - RESTIC_REPOSITORY=/target&#xA;      # The location of the password file inside the container&#xA;      - RESTIC_PASSWORD_FILE=/password&#xA;    volumes:&#xA;      # --- Source and Config Mounts ---&#xA;      - &#34;${BACKUP_SOURCE}:/source:ro&#34;&#xA;      - &#34;${RESTIC_PASSWORD_FILE}:/password:ro&#34;&#xA;      - &#34;./backup-and-prune.sh:/usr/local/bin/backup-and-prune:ro&#34;&#xA;&#xA;      # --- Persistent Data Mounts ---&#xA;      - &#34;./.ssh:/root/.ssh:rw&#34;&#xA;      - &#34;./.cache:/root/.cache:rw&#34;&#xA;&#xA;    # Set the default entrypoint to our new script. This will be executed when&#xA;    # the container starts, unless overridden.&#xA;    entrypoint: [&#34;/usr/local/bin/backup-and-prune&#34;]&#xA;```&#xA;&#xA;Your `.env` file will need to look like this&#xA;&#xA;```bash&#xA;``# HOST related variables&#xA;# The source directory to back up (absolute path)&#xA;BACKUP_SOURCE=/home/nic&#xA;&#xA;# --- Restic Configuration ---&#xA;# The file containing the restic repository password (absolute path on host)&#xA;HOST_RESTIC_PASSWORD_FILE=/home/nic/projects/personal/homelab-mono/dataops/docker/.restic-password&#xA;# The SSH private key to use for connecting to the NAS (absolute path on host)&#xA;# It&#39;s recommended to use a dedicated key for this purpose.&#xA;SSH_PRIVATE_KEY_FILE=/home/nic/.skm/ghost/id_rsa&#xA;&#xA;# Container Env Vars&#xA;# the container makes the sftp connection using my credentials, but nonetheless the container needs them, so this isn&#39;t envrc stuff&#xA;&#xA;# --- SFTP/SSH Connection Details for the NAS ---&#xA;SFTP_USER=nic&#xA;SFTP_HOST=ghost&#xA;# The path on the NAS where the restic repository will be stored&#xA;SFTP_PATH=/tank/encrypted/nas/nic-home/&#xA;&#xA;# --- Restic Configuration ---&#xA;&#xA;RESTIC_REPOSITORY=/target&#xA;RESTIC_PASSWORD_FILE=/password&#xA;```&#xA;&#xA;And then the backup script that the container will execute is something like this:&#xA;&#xA;```bash&#xA;&#xA;#!/bin/sh&#xA;set -e # Exit immediately if a command exits with a non-zero status.&#xA;&#xA;# Construct the repository path from environment variables passed by docker-compose&#xA;REPO=&#34;sftp:${SFTP_USER}@${SFTP_HOST}:${SFTP_PATH}&#34;&#xA;&#xA;# 1. Run the backup&#xA;# -----------------&#xA;echo &#34;--- Starting backup for ${BACKUP_SOURCE} ---&#34;&#xA;restic backup /source --verbose -r &#34;${REPO}&#34;&#xA;echo &#34;--- Backup complete ---&#34;&#xA;&#xA;# 2. Clean up old snapshots according to the policy&#xA;# --------------------------------------------------&#xA;echo &#34;--- Pruning old snapshots ---&#xA;(Policy: keep last 7 daily, 4 weekly, 6 monthly)&#34;&#xA;restic forget \&#xA;    --prune \&#xA;    --keep-daily 7 \&#xA;    --keep-weekly 4 \&#xA;    --keep-monthly 6 \&#xA;    -r &#34;${REPO}&#34;&#xA;&#xA;echo &#34;--- Backup and prune process finished successfully ---&#34;&#xA;```&#xA;&#xA;## Systemd&#xA;&#xA;Finally there&#39;s a systemd unit and timer file in there so you can setup a systemd service for the backup&#xA;&#xA;### service&#xA;&#xA;```bash&#xA;&#xA;[Unit]&#xA;Description=Run Restic backup to NAS using Docker Compose&#xA;# We are running this as a user service, so we assume that the system-level&#xA;# docker.service is already running.&#xA;After=network-online.target&#xA;&#xA;[Service]&#xA;Type=oneshot&#xA;# Set the working directory to where your docker-compose.yml and .env file are located&#xA;WorkingDirectory=/home/user/nas-backup/docker&#xA;&#xA;# The command to execute. We use the full path to docker-compose for reliability.&#xA;# You may need to adjust this path if &#39;docker compose&#39; is installed elsewhere.&#xA;ExecStart=/usr/bin/docker compose run --rm backup&#xA;&#xA;[Install]&#xA;WantedBy=default.target&#xA;```&#xA;&#xA;### timer&#xA;&#xA;```bash&#xA;&#xA;[Unit]&#xA;Description=Run Restic backup job daily&#xA;&#xA;[Timer]&#xA;# Run daily at 2:00 AM&#xA;OnCalendar=daily&#xA;# Or uncomment for a specific time:&#xA;# OnCalendar=*-*-* 02:00:00&#xA;&#xA;# Run the backup immediately if the last scheduled run was missed (e.g., if the computer was off)&#xA;Persistent=true&#xA;&#xA;[Install]&#xA;WantedBy=timers.target&#xA;```&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Jellyfin</title>
    <id>https://pype.dev/jellyfin/</id>
    <updated>2025-07-11T20:39:00Z</updated>
    <published>2025-07-11T20:39:00Z</published>
    <link href="https://pype.dev/jellyfin/" rel="alternate" type="text/html"></link>
    <summary type="text">Jellyfin is the media server software I run at home</summary>
    <content type="html">&lt;p&gt;Jellyfin is the media server software I run at home&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Ghost</title>
    <id>https://pype.dev/ghost/</id>
    <updated>2025-07-11T20:23:35Z</updated>
    <published>2025-07-11T20:23:35Z</published>
    <link href="https://pype.dev/ghost/" rel="alternate" type="text/html"></link>
    <summary type="text">Ghost is my primary application server. These are the specs...</summary>
    <content type="text">&#xA;# Intro&#xA;&#xA;Ghost is my primary application server. These are the specs...&#xA;&#xA;&gt; I wrote about some of the specs in [[homelab-journey-part-1#current-homelab-setup]] but here is where I will keep up to date information&#xA;&#xA;## Why&#xA;&#xA;Why `ghost`? I don&#39;t know... I was going for a theme at one point it time, or&#xA;several points rather... and after giving up on the theatrics of a fully&#xA;consistent harry potter naming scheme across all my homelab entities, I decided&#xA;to just come up with some short aliases that were easy to type. So `ghost` was&#xA;born, and the backup server is `ghost-vault`.&#xA;&#xA;## CPU&#xA;&#xA;I have a `AMD Ryzen 7 5700G with Radeon Graphics @ 16x 4.426GHz` in this bad&#xA;boy... why this chip? Well I knew I wanted many cores, and I was previously on&#xA;a Ryzn 5 3600, which was fine but I noticed that as I started to develop with&#xA;containers more that I was going to want to take advnaatage of more cores...&#xA;&#xA;I also was pretty sure that the built-in graphics would be enough for the&#xA;acceleration requirements I had in mind - which was primarily [[jellyfin]].&#xA;&#xA;At this point in time, I think AMD was still beating Intel on most of the&#xA;benchmarks I tended to care about (I was watching channels like Bitwit and LTT&#xA;at the time of building this machine)&#xA;&#xA;So because of the moderate amount of cores and built-in GPU, I paid $229 for it&#xA;according to my Amazon history, and it&#39;s currently priced at $174, so that&#39;s a&#xA;pretty sweet deal if you&#39;re on AM4 and looking to upgrade in July of 2025&#xA;&#xA;## Memory&#xA;&#xA;I maxxed her out at 128 Gee Beez. I snagged that kit of Crucial that&#39;s all&#xA;black that we&#39;ve all seen on Amazon. I paid aboaut $90 for it, it&#39;s currently&#xA;priced way high for some reason, which is unfortunate. It&#39;s been totally fine&#xA;for me as far as memory performance goes - in that it&#39;s stable and I don&#39;t&#xA;think about it...&#xA;&#xA;## Boot&#xA;&#xA;I have a 1 TB NVMe in here to boot from. I think it&#39;s a Crucial P3&#xA;&#xA;## Storage&#xA;&#xA;Storage is the interesting bit, it&#39;s supposed to be the most rock solid but&#xA;it&#39;s also been the most fluid for me from a hardware perspective, and as of my&#xA;most recent case migration I think I&#39;m in a good spot..&#xA;&#xA;&gt; The case is a Sagitatius 8-bay NAS Chassis from aliexpress&#xA;&#xA;I use&#xA;[zfs](https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html)&#xA;and recommend you do to.... but this isn&#39;t a post about that&#xA;&#xA;My primary zpool is a 12TB ZFS Mirror, and I have another 12TB ZFS Mirror as an&#xA;on-prem replica plugged into this same box.&#xA;&#xA;There is a 4TB drive that serves as frigate&#39;s media directory - I wanted a&#xA;dedicated drive due to the write-intensive nature of the NVR.&#xA;&#xA;&gt; I backup to an offsite box using syncoid&#xA;&#xA;## OS&#xA;&#xA;I am currently running Ubuntu Server 24.04&#xA;&#xA;I am eager for Ubuntu to get zfs in their release that contains the zfs data&#xA;corruption with encrypted datasets but I don&#39;t expect to see it until 26.04 at&#xA;the earliest _fingers crossed_.&#xA;&#xA;## KVM&#xA;&#xA;I recently purchased a [jetkvm](https://www.jetkvm.com/) and it&#39;s exactly what&#xA;I need for both my main server and my backup off-site... An amazingly simple&#xA;and elegant solution to remote KVM.&#xA;&#xA;## Applications&#xA;&#xA;Currently I use `docker compose` to manage practically everything. Stay tuned&#xA;for more about those things&#xA;&#xA;I also have a few ansible playbooks for setting up my shell and some utilities&#xA;on my computers, including the server. They&#39;re in&#xA;[github](https://github.com/pypeaday/ansible-playbooks)&#xA;&#xA;Find more at [[the-homelab]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>The Homelab</title>
    <id>https://pype.dev/the-homelab/</id>
    <updated>2025-07-11T20:22:51Z</updated>
    <published>2025-07-11T20:22:51Z</published>
    <link href="https://pype.dev/the-homelab/" rel="alternate" type="text/html"></link>
    <summary type="text">This is the landing page for my homelab posts. It isn&#39;t a feed because I will write things here and link out to relevant parts of the homelab.</summary>
    <content type="text">&#xA;# The Lab&#xA;&#xA;This is the landing page for my homelab posts. It isn&#39;t a feed because I will&#xA;write things here and link out to relevant parts of the homelab.&#xA;&#xA;I&#39;ll probably have notes about the hardware mostly here.&#xA;&#xA;## Primary Application Server&#xA;&#xA;My main server is called [[ghost]]&#xA;&#xA;## Current Homelab Setup&#xA;&#xA;&gt; I copied this our of [[homelab-journey-part-1#current-homelab-setup]] for now to stub out what this page will link to&#xA;&#xA;## Ad blocking | Pi-Hole&#xA;&#xA;Hardware: pi-3&#xA;&#xA;I have a Raspberry Pi 3 hardwired in that is running pi-hole so that&#39;s been a&#xA;part of my infrastructure now for a long time.&#xA;&#xA;## Router | OPNSense&#xA;&#xA;!!! note &#34;stats&#34;&#xA;&#xA;    CPU: i5-8700&#xA;&#xA;    Memory: 8GB of whatever was in the box&#xA;&#xA;    Storage: 1TB SSD&#xA;&#xA;My router is an old Optiplex SFF 5060 I got from Amazon for less than $100.&#xA;So I&#39;m running a x86 system for my router with&#xA;OpenSense on it. Just seemed it to be another home lab standard and I&#39;d like to&#xA;someday bring pi-hole over there or use AdGuard or integrate those two things&#xA;maybe a little bit more completely but right now they are mostly separate.&#xA;&#xA;## Networking | VLANs&#xA;&#xA;There&#39;s a&#xA;managed switch in there for some VLAN tomfoolery for my cameras and an IOT&#xA;network type of a thing.&#xA;&#xA;## Networking | VPN | Tailscale&#xA;&#xA;They&#39;re on tailscale as well so my DNS happens over tailscale.&#xA;&#xA;## My Desktop&#xA;&#xA;!!! note &#34;stats&#34;&#xA;&#xA;    CPU: Ryzen 7 5700X&#xA;&#xA;    GPU: Nvidia 3090&#xA;&#xA;    Memory: 64 GB&#xA;&#xA;    Storage: 4TB SSD + 2 TB HDD for zfs backup&#xA;&#xA;    OS: Universal Blue Aurora&#xA;&#xA;My daily-driver desktop is somewhat apart of my homelab now as I have a 3090 in&#xA;there with 20 GB of VRAM so I can run some heavier LLMs for self-hosted AI&#xA;workloads. Everything in that space runs in a container and then I manage&#xA;docker containers with compose stacks and portainer for visibility.&#xA;&#xA;### Applications&#xA;&#xA;Some of the apps I run here are ollama, open-webui, automatic1111&#39;s stable diffusion webui, whisper-webui&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 Docker Brings Compose to the AI Agent Era | Docker</title>
    <id>https://pype.dev/thoughts-746/</id>
    <updated>2025-07-11T11:49:41Z</updated>
    <published>2025-07-11T11:49:41Z</published>
    <link href="https://pype.dev/thoughts-746/" rel="alternate" type="text/html"></link>
    <summary type="text">Seems like docker is leaning harder into compose - which is great for me as a heavy compose user. I had heard about some</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://www.docker.com/blog/build-ai-agents-with-docker-compose/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://www.docker.com/blog/build-ai-agents-with-docker-compose/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - Docker Brings Compose to the AI Agent Era | Docker&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://www.docker.com/blog/build-ai-agents-with-docker-compose/&#34;&gt;Docker Brings Compose to the AI Agent Era | Docker&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;Seems like docker is leaning harder into compose - which is great for me as a heavy compose user. I had heard about some of the LLM enablements directly through docker desktop - for example taking fuller advantage of the host&#39;s compute power without paying the penalty of the nvidia runtime or something... I can&#39;t claim to have followed it all but I heard &#34;run LLMs in docker directly for a bigger boost&#34; and I&#39;m in.&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 restic · Backups done right!</title>
    <id>https://pype.dev/thoughts-740/</id>
    <updated>2025-07-08T11:53:41Z</updated>
    <published>2025-07-08T11:53:41Z</published>
    <link href="https://pype.dev/thoughts-740/" rel="alternate" type="text/html"></link>
    <summary type="text">Welp, I need to be backing up my desktop home directory, specifically a directory of docker volume data... I thought dup</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://restic.net/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://restic.net/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - restic · Backups done right!&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://restic.net/&#34;&gt;restic · Backups done right!&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;Welp, I need to be backing up my desktop home directory, specifically a directory of docker volume data... I thought duplicati made sense, but that mostly targets cloud-based backends, and rsync is great but I wasn&#39;t sure how i wanted to manage the job. &#xA;Through a little AI chat I learned about restic and am working on a compose stack to run restic in a container to regularly backup my home directory via sftp to my NAS to then be swept up in my NAS backup workflow&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Thoughts To Nostr</title>
    <id>https://pype.dev/thoughts-to-nostr/</id>
    <updated>2025-07-08T08:30:35Z</updated>
    <published>2025-07-08T08:30:35Z</published>
    <link href="https://pype.dev/thoughts-to-nostr/" rel="alternate" type="text/html"></link>
    <summary type="text">I am trying to use temporal at home for running automated pipelines. It&#39;s definitely overkill for my use case but this is America...</summary>
    <content type="text">&#xA;I am trying to use [[temporal]] at home for running automated pipelines. It&#39;s&#xA;definitely overkill for my use case but this is America...&#xA;&#xA;So my first project is a system that takes my [[thoughts]] and posts them to&#xA;[[nostr]] as I briefly discussed in [[testing-a-postiz-change-locally]].&#xA;&#xA;I have temporal infrastructure setup in homelab-compose and then&#xA;homelab-temporal should probably be homelab-temporal-pipelines or something,&#xA;but it&#39;s the app code. I also have a repo homelab-social-media-pipelines -&#xA;which has been consolidated down into homelab-temporal. once that all works I&#xA;can destroy the homelab-social-media-pipelines repo&#xA;&#xA;NOTE: everything is moving to homelab-mono&#xA;&#xA;## Issue 01&#xA;&#xA;I am currently hitting a stupid python issue:&#xA;&#xA;```&#xA;nic in homelab-temporal   main    ×2  ×4  ×7 via   v3.12.8(homelab-temporal)   (dev) 󰒄&#xA;⬢ [devbox] ❯ python -c &#34;from homelab_temporal.postiz.postiz_client import PostizClient&#34;&#xA;(homelab-temporal)&#xA;nic in homelab-temporal   main    ×2  ×4  ×7 via   v3.12.8(homelab-temporal)   (dev) 󰒄&#xA;⬢ [devbox] ❯ python scripts/postiz/simple_post.py&#xA;Traceback (most recent call last):&#xA;  File &#34;/home/nic/projects/personal/homelab-temporal/scripts/postiz/simple_post.py&#34;, line 3, in &lt;module&gt;&#xA;    from homelab_temporal.postiz.postiz_client import PostizClient, process_for_nostr, process_for_x&#xA;ModuleNotFoundError: No module named &#39;homelab_temporal&#39;&#xA;```&#xA;&#xA;very dumb venv problem...&#xA;&#xA;## Resolution&#xA;&#xA;need to use `python -m` because the script is outside the project root? see [[2025-07-08-notes]] and the chatgpt notes for more on this but it works now&#xA;&#xA;## Thoughts Order&#xA;&#xA;as of [[2025-07-11-notes]] I have the thoughts ordering correct - we post the oldest thoughts up to the newest ones. Now I want more intros for the notes so they don&#39;t get too repetitive&#xA;&#xA;## TODOs&#xA;&#xA;[x] - destroy the homelab-social-media-pipelines repo&#xA;&#xA;[] - think about how to structure things more... monorepo in homelab-temporal might be hard to manage with AI tools due to context management... unsure though&#xA;&#xA;[] - create workflow and activities for thoughts to nostr... revisit diagram to see what you need to build out in the temporal repo&#xA;&#xA;[] - do something like this for github stars and then blog posts&#xA;&#xA;---&#xA;&#xA;I need to update my templates for nostr og images using this as fodder&#xA;&#xA;```html&#xA;&lt;!-- HTML Meta Tags --&gt;&#xA;&lt;title&gt;Nostr Design&lt;/title&gt;&#xA;&lt;meta&#xA;  name=&#34;description&#34;&#xA;  content=&#34;A comprehensive resource for designers and developers to build successful nostr products&#34;&#xA;/&gt;&#xA;&#xA;&lt;!-- Facebook Meta Tags --&gt;&#xA;&lt;meta property=&#34;og:url&#34; content=&#34;https://nostrdesign.org&#34; /&gt;&#xA;&lt;meta property=&#34;og:type&#34; content=&#34;website&#34; /&gt;&#xA;&lt;meta property=&#34;og:title&#34; content=&#34;Nostr Design&#34; /&gt;&#xA;&lt;meta&#xA;  property=&#34;og:description&#34;&#xA;  content=&#34;A comprehensive resource for designers and developers to build successful nostr products&#34;&#xA;/&gt;&#xA;&lt;meta&#xA;  property=&#34;og:image&#34;&#xA;  content=&#34;https://nostrdesign.org/img/nostr-cover.jpg&#34;&#xA;/&gt;&#xA;&#xA;&lt;!-- Twitter Meta Tags --&gt;&#xA;&lt;meta name=&#34;twitter:card&#34; content=&#34;summary_large_image&#34; /&gt;&#xA;&lt;meta property=&#34;twitter:domain&#34; content=&#34;nostrdesign.org&#34; /&gt;&#xA;&lt;meta property=&#34;twitter:url&#34; content=&#34;https://nostrdesign.org&#34; /&gt;&#xA;&lt;meta name=&#34;twitter:title&#34; content=&#34;Nostr Design&#34; /&gt;&#xA;&lt;meta&#xA;  name=&#34;twitter:description&#34;&#xA;  content=&#34;A comprehensive resource for designers and developers to build successful nostr products&#34;&#xA;/&gt;&#xA;&lt;meta&#xA;  name=&#34;twitter:image&#34;&#xA;  content=&#34;https://nostrdesign.org/img/nostr-cover.jpg&#34;&#xA;/&gt;&#xA;```&#xA;&#xA;## Dockerizing&#xA;&#xA;I think I wnt to dockerize my workers and workflows... build them out of the `homelab-temporal` repo but then run them in compose stacks... that can get stitched together better but for now that&#39;ll probably be a good target.&#xA;I have things to think about though... for example the blog builder needs my ssh keys, or an ssh key for a user... also git is a little mess up anyways&#xA;&#xA;- temporal [link](https://temporal-ui.paynepride.com/namespaces/default/workflows/blog-build-ee488b69-6cdf-4819-bccd-df183cf8ec13/01981101-e48b-712a-96db-328ce720c13c/history)&#xA;&#xA;## Temporal&#xA;&#xA;I haev temporal workflows and stuff that all seem to work&#xA;&#xA;on [[ 2025-08-08-notes ]] I had issues with my nostr relay being too public, so I shut it down, reconfigured postiz and stuff and got it workign again, more restricted and in-memory database&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 HomeBox</title>
    <id>https://pype.dev/thoughts-737/</id>
    <updated>2025-07-07T10:48:12Z</updated>
    <published>2025-07-07T10:48:12Z</published>
    <link href="https://pype.dev/thoughts-737/" rel="alternate" type="text/html"></link>
    <summary type="text">I stumbled onto homebox this morning scrolling a newsletter and it looks like something I&#39;ve been lightly thinking about</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://homebox.software/en/&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://homebox.software/en/&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - HomeBox&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://homebox.software/en/&#34;&gt;HomeBox&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;I stumbled onto homebox this morning scrolling a newsletter and it looks like something I&#39;ve been lightly thinking about for a while. I have wanted a way to track all the things in my house, but I haven&#39;t given it enough thought to come up with the specific manner in which to do it. I&#39;ve seen other asset trackers but today this one excited me. &#xA;I spun it up at home quick and it looks great - It&#39;ll take quite a lot of time to fill it out but here&#39;s a few features I love out of the gate:&#xA;&#xA;1. the default setup seems very useful - pre-populated locations and tags for cataloging assets reduces the barrier to entry for me&#xA;2. it&#39;s pretty nice lookin&#xA;3. there&#39;s a label generator including qr codes that take you to the record in your homebox... I had an idea for something like this a while ago - qr codes to link to instructions for things around the house (like cleaning the oven or something). So it&#39;s neat to see that similar idea played out in another more useful way!&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>💭 Self-Hosting A Cluster On Old Phones | Hackaday</title>
    <id>https://pype.dev/thoughts-735/</id>
    <updated>2025-07-06T11:30:17Z</updated>
    <published>2025-07-06T11:30:17Z</published>
    <link href="https://pype.dev/thoughts-735/" rel="alternate" type="text/html"></link>
    <summary type="text">Came across a blog and article on using a mobile OS to self-host a cluster on old phones... I happen to keep several old</summary>
    <content type="text">&#xA;&lt;a href=&#34;https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev&#34;&gt;&#xA;    &lt;img&#xA;        src=&#34;https://shots.wayl.one/shot/?url=https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev&amp;height=450&amp;width=800&amp;scaled_width=800&amp;scaled_height=450&amp;selectors=&#34;&#xA;        alt=&#34;shot of post - Self-Hosting A Cluster On Old Phones | Hackaday&#34;&#xA;        height=450&#xA;        width=800&#xA;    &gt;&#xA;&lt;/a&gt;&#xA;&#xA;Here&#39;s my thought on &lt;a href=&#34;https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev&#34;&gt;Self-Hosting A Cluster On Old Phones | Hackaday&lt;/a&gt;&#xA;&#xA;---&#xA;&#xA;Came across a blog and article on using a mobile OS to self-host a cluster on old phones... I happen to keep several old android phones lying around and although I&#39;m not presently super interested in figuring out an android/arm based homelab, I am excited for the next coming years when I&#39;m sure it&#39;ll only get easier, phones will only be more powerful, and perhaps we&#39;ll be running full blown CV pipeline in k8s clusters running on Pixel devices!&#xA;&#xA;---&#xA;&#xA;!!! note&#xA;    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It&#39;s a short note that I make about someone else&#39;s content online.  Learn more about the process [[ thoughts ]]&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Github Star Sorter</title>
    <id>https://pype.dev/github-star-sorter/</id>
    <updated>2025-07-01T08:01:31Z</updated>
    <published>2025-07-01T08:01:31Z</published>
    <link href="https://pype.dev/github-star-sorter/" rel="alternate" type="text/html"></link>
    <summary type="text">I wrote a simple app to sort, tag, and create tickets at home for my github stars... As of right now I have 1.3k stars and no convenient way to view them or...</summary>
    <content type="html">&lt;p&gt;I wrote a simple app to sort, tag, and create tickets at home for my github&#xA;stars&amp;hellip; As of right now I have 1.3k stars and no convenient way to view them&#xA;or remember which ones were ones I actually wanted to do something with. This&#xA;simple UI makes scrolling the stars list easy, updates is easy, and the kicker&#xA;for me is Kanboard integration so I can click a button from the stars UI and&#xA;get a ticket made in my kanboard instance so that the work I want to do is in&#xA;front of me and not hidden by Github&amp;rsquo;s shockingly HORRIBLE UI.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250701125804_c41ec692.png&#34; alt=&#34;20250701125804_c41ec692.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/pypeaday/gh-star-sorter&#34;&gt;GH Link&lt;/a&gt;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>temporal</title>
    <id>https://pype.dev/temporal/</id>
    <updated>2025-06-24T21:21:43Z</updated>
    <published>2025-06-24T21:21:43Z</published>
    <link href="https://pype.dev/temporal/" rel="alternate" type="text/html"></link>
    <summary type="text">Temporal is a workflow orchestrator that I&#39;m interested in</summary>
    <content type="html">&lt;p&gt;&lt;a href=&#34;https://temporal.io/&#34;&gt;Temporal&lt;/a&gt; is a workflow orchestrator that I&amp;rsquo;m interested in&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Traefik and gRPC for Temporal at home</title>
    <id>https://pype.dev/traefik-and-grpc-for-temporal-at-home/</id>
    <updated>2025-06-24T20:55:42Z</updated>
    <published>2025-06-24T20:55:42Z</published>
    <link href="https://pype.dev/traefik-and-grpc-for-temporal-at-home/" rel="alternate" type="text/html"></link>
    <summary type="text">Someday I will potentially write up some stuff about temporal but for now it&#39;s a workflow orchestrator that I&#39;m interested in and I wanted to PoC it in my...</summary>
    <content type="text">&#xA;# Temporal Networking Woes&#xA;&#xA;Someday I will potentially write up some stuff about [[temporal]] but for now&#xA;it&#39;s a workflow orchestrator that I&#39;m interested in and I wanted to PoC it in&#xA;my homelab by replacing a simple cron job to build my blog with a temporal&#xA;workflow and activity. I was IMMEDIATELY thwarted by a networking error that&#xA;feels crazy to me but maybe won&#39;t be to others... so enjoy the problem and if&#xA;you&#39;re here from a Google search, I hope it&#39;s helpful.&#xA;&#xA;Getting started with Temporal I wanted to have the server and associated&#xA;components on my server, but I expected to be running workflows and workers&#xA;on another computer. &#xA;&#xA;For most of my apps I slap some [[traefik]] labels on&#xA;and we&#39;re good to go. But I got a wild set of errors trying to run a worker on&#xA;my desktop and connect it to the temporal server on my server over https.... it&#xA;ended up being because I needed to setup a special protocol in traefik for the&#xA;reverse proxy to appropriately proxy the grpc call.&#xA;&#xA;So I had a normal set of labels on my temporal container, went to run a worker&#xA;and got this nasty work of art&#xA;&#xA;```&#xA;RuntimeError: Failed client connect: `get_system_info` call error after connection: Status { code: Internal, message: &#34;protocol error: received message with invalid compression flag: 73 (valid flags are 0 and 1) while receiving response with status: 500 Internal Server Error&#34;, metadata: MetadataMap { headers: {&#34;content-type&#34;: &#34;text/plain; charset=utf-8&#34;, &#34;content-length&#34;: &#34;21&#34;, &#34;date&#34;: &#34;Wed, 25 Jun 2025 02:12:44 GMT&#34;} }, source: None }&#xA;```&#xA;&#xA;Thank God I had kind of seen this at work one other time in my life, and we&#xA;never fixed the issue there but I knew what it was... we had traefik acting as&#xA;a load balancer (as do I at home) and the traefik load balancer was &#34;balancing&#xA;traffic using https&#34;... no, I do not really know what I&#39;m saying. But what I do&#xA;know is that in order for the Temporal Server and Worker to communicate,&#xA;traefik has to properly route the traffic for gRPC instead of https.&#xA;&#xA;!!! warning &#34;&#34;&#xA;    I can&#39;t stress enough how little I know about the difference between https and grpc or why the load balancer cares... there&#39;s clearly something in the networking stack that is extremely relevant here&#xA;&#xA;But the fix is NOT hard thankfully, and it&#39;s even on [traefik&#39;s website](https://doc.traefik.io/traefik/user-guides/grpc/#traefik-configuration) - the warning annotation there tells you what you need - which is one more traefik label...&#xA;&#xA;```yaml&#xA;traefik.http.services.&lt;my-service-name&gt;.loadbalancer.server.scheme=h2c&#xA;```&#xA;&#xA;So after setting the loadbalancer.server.scheme to `h2c` I could run my worker just fine!&#xA;&#xA;![20250625021838_4d7104c2.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250625021838_4d7104c2.png)&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Nextcloud PHP Opache Memory Consumption</title>
    <id>https://pype.dev/nextcloud-php-opache-memory-consumption/</id>
    <updated>2025-06-23T08:46:20Z</updated>
    <published>2025-06-23T08:46:20Z</published>
    <link href="https://pype.dev/nextcloud-php-opache-memory-consumption/" rel="alternate" type="text/html"></link>
    <summary type="text">Today I was combing through Nextcloud, just taking a gander at the apps, updates, etc.</summary>
    <content type="html">&lt;h1 id=&#34;intro&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Intro&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Today I was combing through Nextcloud, just taking a gander at the apps, updates, etc.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The OPcache buffer is nearly full. To assure that all scripts can be hold in&#xA;cache, it is recommended to apply &amp;ldquo;opcache.memory_consumption&amp;rdquo; to your PHP&#xA;configuration with a value higher than &amp;ldquo;128&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;So I know &lt;em&gt;nothing&lt;/em&gt; about &lt;code&gt;php&lt;/code&gt; and I had no idea where to set this&amp;hellip; Also I&amp;rsquo;m&#xA;running Nextcloud in a container so any updates will be blown away when the&#xA;container is removed (say next time I update Nextcloud)&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;After a little duckduckgoing I came across &lt;a href=&#34;https://www.reddit.com/r/NextCloud/comments/1gpxl5b/need_help_with_php_opcache_module_warning/&#34;&gt;this reddit&#xA;post&lt;/a&gt;&#xA;where a guy had the same issue&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;The long and short of it is that on &lt;em&gt;single instance nextcloud deployments&lt;/em&gt;&#xA;this php memory consumption value can be too low for Nextcloud to keep up with&#xA;the demand&amp;hellip; You can see in the message they just recommend upping the value.&lt;/p&gt;&#xA;&lt;p&gt;So I had to think about how to persist the change and have it take effect now&#xA;ideally without affecting any users too much&amp;hellip; So here&amp;rsquo;s what I did - made the&#xA;change in 2 places:&lt;/p&gt;&#xA;&lt;h2 id=&#34;in-the-container&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;In the container&lt;/span&gt; &lt;a href=&#34;#in-the-container&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I exec&amp;rsquo;d into the container and used this handy &lt;code&gt;sed&lt;/code&gt; command &lt;code&gt;sed -i &#39;s/^opcache\.memory_consumption\s*=\s*128$/opcache.memory_consumption=256/&#39; /usr/local/etc/php/conf.d/opcache-recommended.ini&lt;/code&gt; to update the value in the&#xA;running container - and I guess &lt;code&gt;php&lt;/code&gt; maybe is loaded up dynamically or&#xA;something? but the warning did go away&amp;hellip;.&lt;/p&gt;&#xA;&lt;p&gt;So how to persist this change when the filesystem is blown away when the&#xA;container is updated?&lt;/p&gt;&#xA;&lt;h2 id=&#34;in-the-config&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;In the config&lt;/span&gt; &lt;a href=&#34;#in-the-config&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I set the env var &lt;code&gt;PHP_OPCACHE_MEMORY_CONSUMPTION&lt;/code&gt; in the &lt;code&gt;docker-compose.yml&lt;/code&gt;&#xA;file to 256 and voila&amp;hellip; the change should persist&amp;hellip;&lt;/p&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
  <entry>
    <title>Quit issueing 200s for 500s</title>
    <id>https://pype.dev/quit-issueing-200s-for-500s/</id>
    <updated>2025-06-22T06:55:21Z</updated>
    <published>2025-06-22T06:55:21Z</published>
    <link href="https://pype.dev/quit-issueing-200s-for-500s/" rel="alternate" type="text/html"></link>
    <content type="html">&lt;h1 id=&#34;stop-this-nonsense&#34;&gt;&lt;span class=&#34;heading-wear-glyph&#34;&gt;Stop this nonsense&lt;/span&gt;&lt;/h1&gt;&#xA;&lt;figure&gt;&#xA;&lt;img src=&#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622115500_5bd3bc21.png&#34; alt=&#34;20250622115500_5bd3bc21.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;</content>
    <author>
      <name>Nic Payne</name>
      <uri>https://pype.dev</uri>
    </author>
  </entry>
</feed>