<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>the cabin</title><link>https://blog.thecabin.io/</link><description>Notes from a small home server on the internet.</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 28 Jul 2026 11:00:00 +0300</lastBuildDate><atom:link href="https://blog.thecabin.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Serving a Blog Without Adding a Container</title><link>https://blog.thecabin.io/serving-a-blog-without-a-container/</link><pubDate>Tue, 28 Jul 2026 11:00:00 +0300</pubDate><guid>https://blog.thecabin.io/serving-a-blog-without-a-container/</guid><description>Every service on this server is a Docker container behind Caddy — except the static ones. Why the blog is just a bind mount and a Caddyfile block.</description><content:encoded>&lt;p>Everything on this server follows the same pattern: a Docker container on a
shared &lt;code>proxy&lt;/code> network, a subdomain block in the Caddyfile, a data directory
on the big disk. It would have been easy to give the blog its own nginx
container too.&lt;/p>
&lt;p>But a static site is just files. Caddy is already running, already has a
TLS certificate workflow, and is perfectly happy to serve a directory:&lt;/p>
&lt;pre tabindex="0">&lt;code>blog.thecabin.io {
root * /srv/blog
file_server
log
}
&lt;/code>&lt;/pre>&lt;p>The build output directory is bind-mounted read-only into the Caddy
container. Publishing means regenerating files on the host — Caddy notices
nothing, because nothing about it changed. There is no image to rebuild, no
health check, no restart.&lt;/p>
&lt;p>One less container to babysit. The best service is the one that isn&amp;rsquo;t
running.&lt;/p></content:encoded></item><item><title>Hello, World</title><link>https://blog.thecabin.io/hello-world/</link><pubDate>Tue, 28 Jul 2026 10:00:00 +0300</pubDate><guid>https://blog.thecabin.io/hello-world/</guid><description>This blog now exists. It is plain text, generated by Hugo, and served from a small home server that already hosts a dozen other things.</description><content:encoded>&lt;p>This blog now exists.&lt;/p>
&lt;p>It runs on the same little box in the corner that already serves a landing
page, a stack of small browser games, a music server, and various other
experiments — all behind one Caddy reverse proxy on a residential fiber line.&lt;/p>
&lt;h2 id="how-it-works">How it works&lt;/h2>
&lt;p>The setup is deliberately boring:&lt;/p>
&lt;ul>
&lt;li>Posts are Markdown files in a git repository.&lt;/li>
&lt;li>&lt;a href="https://gohugo.io">Hugo&lt;/a> turns them into static HTML.&lt;/li>
&lt;li>Caddy serves the output directory directly. No containers were added, no
ports were opened, no JavaScript is shipped.&lt;/li>
&lt;/ul>
&lt;p>Publishing a post is: write a file, run &lt;code>hugo&lt;/code>, done. There is no admin
panel, no database, and nothing to update or patch. If the server is on,
the blog is up.&lt;/p>
&lt;h2 id="why">Why&lt;/h2>
&lt;p>Most of what happens on this server gets figured out once and then
forgotten. Writing it down somewhere public forces a bit of rigor, and
occasionally someone else with the same weird problem finds it.&lt;/p>
&lt;p>Expect notes on self-hosting, the games built here, and whatever else
accumulates.&lt;/p></content:encoded></item></channel></rss>