<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Arthur Sommer</title><link>https://arthursommer.com/</link><description>Recent content on Arthur Sommer</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 17 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://arthursommer.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Now</title><link>https://arthursommer.com/now/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://arthursommer.com/now/</guid><description>&lt;p class="lede"&gt;A short status file for August 2026.&lt;/p&gt;&#10;&lt;h2 id="building"&gt;Building&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Publishing this website from the homelab and refining the writing as the projects evolve.&lt;/li&gt;&#10;&lt;li&gt;Hardening a three-layer Caddy design for public, tailnet, and local traffic.&lt;/li&gt;&#10;&lt;li&gt;Maintaining &lt;a href="https://github.com/art12354/caddy-tls-file-pair"&gt;&lt;code&gt;caddy-tls-file-pair&lt;/code&gt;&lt;/a&gt;, a custom certificate loader for Caddy.&lt;/li&gt;&#10;&lt;li&gt;Improving monitoring for backups, power events, reverse proxies, mail, and the small failures that become large failures if nobody notices.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="learning"&gt;Learning&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;How to make self-hosted infrastructure easier to recover, not merely more elaborate.&lt;/li&gt;&#10;&lt;li&gt;Where containers clarify system boundaries and where they hide too much.&lt;/li&gt;&#10;&lt;li&gt;How far useful documentation can be generated from real configuration without publishing private details.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="site-status"&gt;Site status&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Component&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;State&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hugo source&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ready&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Initial writing&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;In progress&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;On-prem origin&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Online&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Public DNS cutover&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Complete&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;This page follows the spirit of a &lt;a href="https://nownownow.com/about"&gt;&lt;code&gt;/now&lt;/code&gt; page&lt;/a&gt;: it changes when my attention changes, without pretending to be a complete activity feed.&lt;/p&gt;</description></item><item><title>One Certificate, Three Caddy Servers</title><link>https://arthursommer.com/log/2026/08/one-certificate-three-caddy-servers/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://arthursommer.com/log/2026/08/one-certificate-three-caddy-servers/</guid><description>&lt;p&gt;My homelab has three reverse-proxy roles. A public edge accepts internet traffic. An internal proxy serves devices connected through Tailscale. A local proxy keeps LAN services usable without taking a detour through the public internet.&lt;/p&gt;&#10;&lt;p&gt;All three answer for names under the same domain, but I did not want all three carrying AWS credentials or independently completing Route 53 DNS challenges.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ACME DNS-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;internet ----------&amp;gt; caddy-external&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; shared certificate storage&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------+-------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; caddy-internal caddy-local&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tailnet LAN&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-awkward-middle-state"&gt;The awkward middle state&lt;/h2&gt;&#10;&lt;p&gt;The public edge could renew a wildcard certificate and place it on shared storage. The other proxies could load the PEM files with Caddy’s normal &lt;code&gt;tls&lt;/code&gt; directive. The trouble was lifecycle: those consumers did not naturally notice when the files changed. A timer could compare certificate serial numbers and reload Caddy, but that introduced more state and another piece of automation whose only job was compensating for the configuration model.&lt;/p&gt;</description></item><item><title>Start a Homelab Without Overthinking It</title><link>https://arthursommer.com/guides/start-a-homelab/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://arthursommer.com/guides/start-a-homelab/</guid><description>&lt;p&gt;You do not need a rack, enterprise servers, or a complicated network to start a homelab. You need a computer you can leave running, a problem you want to solve, and a willingness to document what you change.&lt;/p&gt;&#10;&lt;h2 id="begin-with-one-useful-service"&gt;Begin with one useful service&lt;/h2&gt;&#10;&lt;p&gt;Choose something you will actually use: network-wide DNS filtering, a personal dashboard, a media server, or a private Git forge. A used mini PC is usually a better first server than retired enterprise hardware because it is quiet, efficient, and easy to live with.&lt;/p&gt;</description></item><item><title>Why This Site Is Moving Home</title><link>https://arthursommer.com/log/2026/08/why-this-site-is-moving-home/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://arthursommer.com/log/2026/08/why-this-site-is-moving-home/</guid><description>&lt;p&gt;For years, &lt;code&gt;arthursommer.com&lt;/code&gt; was a small static page sitting behind AWS CloudFront. It worked, in the narrow sense that it continued returning HTML, but it stopped representing me or the work I was doing.&lt;/p&gt;&#10;&lt;p&gt;The replacement is deliberately simple. Hugo turns Markdown into static files. Caddy serves them. The source and deployment process live with the rest of my infrastructure documentation. There is no database, application runtime, tracking script, or client-side framework to maintain.&lt;/p&gt;</description></item><item><title>About</title><link>https://arthursommer.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arthursommer.com/about/</guid><description>&lt;p&gt;I’m Arthur, a computer scientist, infrastructure enthusiast, and longtime builder of things that combine software with the physical world.&lt;/p&gt;&#10;&lt;p&gt;My homelab is where I learn in public. It gives me a place to operate real services, test ideas, automate repetitive work, recover from questionable decisions, and understand the systems I depend on. I care about owning my data, documenting what I learn, and making complicated technology approachable.&lt;/p&gt;&#10;&lt;p&gt;Outside the server rack, my background includes technical theatre, live sound, lighting, and web development. The common thread is systems: understanding how the pieces connect and making the result dependable for the people using it.&lt;/p&gt;</description></item><item><title>Homelab</title><link>https://arthursommer.com/homelab/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arthursommer.com/homelab/</guid><description>&lt;p&gt;The homelab is a hybrid collection of local hardware and carefully selected remote infrastructure. It runs the services I use, provides a realistic environment for experiments, and gives each mistake somewhere educational to happen.&lt;/p&gt;&#10;&lt;h2 id="design-principles"&gt;Design principles&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Own the important data.&lt;/strong&gt; Storage, backups, and recovery plans matter more than dashboards.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Private by default.&lt;/strong&gt; Internal services live behind Tailscale and split DNS unless they genuinely need public access.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Configuration is documentation.&lt;/strong&gt; Important service configuration is captured in Git alongside operational notes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Observe before guessing.&lt;/strong&gt; Metrics, logs, probes, and alerts should explain what a system is doing.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Prefer understandable systems.&lt;/strong&gt; Clever machinery eventually needs maintenance at an inconvenient hour.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="simplified-topology"&gt;Simplified topology&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public internet&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;caddy-external ---- encrypted tailnet ---- caddy-internal&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +--------------------------+------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; services storage monitoring&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The lab uses Incus containers for system-level isolation, Docker Compose where application packaging makes sense, Caddy for public and private routing, Tailscale for the encrypted service network, and Prometheus-compatible monitoring for visibility.&lt;/p&gt;</description></item><item><title>Projects</title><link>https://arthursommer.com/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arthursommer.com/projects/</guid><description>&lt;h2 id="caddy-tls-file-pair-module"&gt;Caddy TLS file-pair module&lt;/h2&gt;&#10;&lt;p&gt;A custom Caddy module for loading an existing certificate and key pair while preserving useful certificate-selection behavior. I built it to support a homelab design where one public Caddy instance handles ACME DNS challenges and internal instances consume the resulting wildcard certificate from shared storage.&lt;/p&gt;&#10;&lt;p&gt;The project grew from a practical constraint: several Caddy instances needed the same certificate, but only the public edge should hold Route 53 credentials or perform renewal.&lt;/p&gt;</description></item><item><title>Uses</title><link>https://arthursommer.com/uses/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arthursommer.com/uses/</guid><description>&lt;p&gt;This is not a shopping list. It is a snapshot of tools that have earned a place in the system by being useful, understandable, or both.&lt;/p&gt;&#10;&lt;h2 id="infrastructure"&gt;Infrastructure&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Tool&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Job&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Incus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;System containers and virtual-machine management&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Docker Compose&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Packaging application stacks that already live in containers&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Caddy&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Public, tailnet, and LAN reverse proxies; automatic HTTPS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tailscale&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Encrypted connectivity between sites, machines, and services&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Bind&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Split DNS for private names on the tailnet&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ceph and ZFS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Storage experiments with very different operational personalities&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="operations"&gt;Operations&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Tool&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Job&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Forgejo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Git hosting, package publishing, and build automation&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Prometheus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Metrics, rules, and the starting point for alerts&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Grafana&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Dashboards when a graph answers the question better than a log&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Promtail&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Shipping journal and application logs&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;NUT&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;UPS state, power-event handling, and coordinated shutdowns&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="working-preferences"&gt;Working preferences&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Plain Markdown for notes and runbooks.&lt;/li&gt;&#10;&lt;li&gt;Configuration beside the incident report that explains why it exists.&lt;/li&gt;&#10;&lt;li&gt;Small purpose-built exporters instead of pretending every useful signal arrives in a standard integration.&lt;/li&gt;&#10;&lt;li&gt;Stable, low-power machines before loud retired enterprise hardware.&lt;/li&gt;&#10;&lt;li&gt;A terminal and Git before a management dashboard that cannot be reproduced.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item></channel></rss>