<?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>Homelab on Mohamed Mohamed</title><link>https://mohamed.sirwalterlibrary.ddns.net/tags/homelab/</link><description>Recent content in Homelab on Mohamed Mohamed</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 16 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mohamed.sirwalterlibrary.ddns.net/tags/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Why I Switched from WordPress to Hugo</title><link>https://mohamed.sirwalterlibrary.ddns.net/posts/hello-world/</link><pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate><guid>https://mohamed.sirwalterlibrary.ddns.net/posts/hello-world/</guid><description>WordPress worked until it didn&amp;#39;t. Here&amp;#39;s what I replaced it with and why.</description><content:encoded><![CDATA[<p>After wrestling with WordPress — empty database backups, MySQL containers that
wouldn&rsquo;t start after a restart, and the constant drip of plugin update notifications
— I decided enough was enough.</p>
<h2 id="what-was-wrong-with-wordpress">What was wrong with WordPress</h2>
<p>The immediate trigger was trying to restore a site for a friend.
The backup had two files: a <code>.sql</code> dump and a <code>tar.gz</code> of the WordPress files.
Both were empty shells. The backup script had run successfully every night
against volumes that were never actually populated.</p>
<p>Longer term, every WordPress install I run is a maintenance surface:</p>
<ul>
<li>Core updates (security patches, roughly monthly)</li>
<li>Plugin updates (weekly, some with breaking changes)</li>
<li>Theme updates</li>
<li>MySQL container that needs its own backup strategy</li>
<li>PHP-FPM that can silently break if the container restarts in the wrong order</li>
</ul>
<p>For a personal portfolio site that I might not touch for three months at a time,
that&rsquo;s a lot of overhead.</p>
<h2 id="what-hugo-is">What Hugo is</h2>
<p>Hugo is a static site generator — a single Go binary that takes a folder of
Markdown files and compiles them into plain HTML, CSS, and JavaScript.
The output is a folder. You point nginx at that folder. Done.</p>
<p>No database. No PHP. No runtime of any kind. A static HTML file served by
<code>nginx:alpine</code> uses about 5 MB of RAM at idle, compared to ~250 MB for a
WordPress stack.</p>
<h2 id="the-deployment-pattern">The deployment pattern</h2>
<p>My home server already runs a static nginx container for another site (<code>99-names</code>).
Hugo fits the same pattern exactly:</p>
<div class="highlight"><pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#c6a0f6">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#c6a0f6">mohamed-personal-site</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#c6a0f6">image</span>: nginx:alpine
</span></span><span style="display:flex;"><span>    <span style="color:#c6a0f6">container_name</span>: mohamed-personal-site
</span></span><span style="display:flex;"><span>    <span style="color:#c6a0f6">volumes</span>:
</span></span><span style="display:flex;"><span>      - ./site/public:/usr/share/nginx/html:ro
</span></span><span style="display:flex;"><span>    <span style="color:#c6a0f6">networks</span>:
</span></span><span style="display:flex;"><span>      - npm_net
</span></span></code></pre></div><p>Build with Hugo, output goes to <code>site/public/</code>, Nginx Proxy Manager routes
<code>mohamed.sirwalterlibrary.ddns.net</code> to this container. Identical to what I already knew.</p>
<h2 id="backup-is-now-just-git">Backup is now just git</h2>
<p>The entire site — content, configuration, theme — lives in a git repository.
Backing up means <code>git push</code>. Restoring from scratch means <code>git clone &amp;&amp; hugo</code>.</p>
<p>No more praying that the <code>mysqldump</code> captured something useful.</p>
<h2 id="what-i-gave-up">What I gave up</h2>
<p>The WordPress admin dashboard. For now that&rsquo;s fine — I&rsquo;m the only person
editing this site. If I ever want collaborators, I&rsquo;ll look at
<a href="https://decapcms.org">Decap CMS</a> or <a href="https://pagescms.org">Pages CMS</a>,
both of which layer a web editor on top of a static site without adding a database.</p>
]]></content:encoded></item></channel></rss>