<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Traefik on Luis Sousa Blog</title>
    <link>https://89393b0c.nuvai-blog.pages.dev/tags/traefik/</link>
    <description>Recent content in Traefik on Luis Sousa Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 08 Mar 2026 10:00:00 +0000</lastBuildDate>
    <atom:link href="https://89393b0c.nuvai-blog.pages.dev/tags/traefik/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Fixing &#39;Robots.txt Unreachable&#39; in Google Search Console with Traefik and Docker</title>
      <link>https://89393b0c.nuvai-blog.pages.dev/posts/fixing-robots-txt-unreachable-traefik-docker/</link>
      <pubDate>Sun, 08 Mar 2026 10:00:00 +0000</pubDate>
      <guid>https://89393b0c.nuvai-blog.pages.dev/posts/fixing-robots-txt-unreachable-traefik-docker/</guid>
      <description>&lt;p&gt;We run a travel blog (&lt;a href=&#34;https://joyofexploringtheworld.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;joyofexploringtheworld.com&lt;/a&gt;) on Docker Compose with Traefik v3 and Cloudflare. One morning Google Search Console showed every page blocked from indexing with &amp;ldquo;Failed: Robots.txt unreachable&amp;rdquo;. The site was working fine in a browser, so what was going on?&lt;/p&gt;&#xA;&lt;p&gt;Two separate issues were conspiring to break Googlebot&amp;rsquo;s ability to fetch &lt;code&gt;/robots.txt&lt;/code&gt;. Here&amp;rsquo;s what we found and how we fixed both.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-setup&#34;&gt;&#xA;  The setup&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#the-setup&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Our WordPress service sits on two Docker networks: &lt;code&gt;app-network&lt;/code&gt; (shared with Traefik, Redis, imgproxy) and &lt;code&gt;db-network&lt;/code&gt; (shared with MariaDB). We run two scaled WordPress containers behind Traefik&amp;rsquo;s load balancer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rank Math sitemap not loading with Traefik (and how to fix it)</title>
      <link>https://89393b0c.nuvai-blog.pages.dev/posts/rank-math-sitemap-not-loading-traefik/</link>
      <pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate>
      <guid>https://89393b0c.nuvai-blog.pages.dev/posts/rank-math-sitemap-not-loading-traefik/</guid>
      <description>&lt;p&gt;We run a travel blog (&lt;a href=&#34;https://joyofexploringtheworld.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;joyofexploringtheworld.com&lt;/a&gt;) on a budget VPS with Docker Compose, Cloudflare, and Traefik. When we added Rank Math for SEO, the sitemap worked in the admin but returned 404 on the public URL. Here&amp;rsquo;s what was going on and how we fixed it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;&#xA;  The problem&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#the-problem&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Rank Math generates sitemaps at runtime via &lt;code&gt;index.php?sitemap=1&lt;/code&gt;. On Apache or Nginx with &lt;code&gt;.htaccess&lt;/code&gt;/rewrite rules, the pretty URL &lt;code&gt;/sitemap_index.xml&lt;/code&gt; gets routed to WordPress automatically. With Traefik, that routing doesn&amp;rsquo;t exist by default—Traefik doesn&amp;rsquo;t use &lt;code&gt;.htaccess&lt;/code&gt;, so &lt;code&gt;/sitemap_index.xml&lt;/code&gt; never reaches WordPress and you get a 404.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Our Site Went Down for an Hour (And What We Fixed)</title>
      <link>https://89393b0c.nuvai-blog.pages.dev/posts/why-our-site-went-down-for-an-hour/</link>
      <pubDate>Sat, 07 Mar 2026 10:00:00 +0000</pubDate>
      <guid>https://89393b0c.nuvai-blog.pages.dev/posts/why-our-site-went-down-for-an-hour/</guid>
      <description>&lt;p&gt;We run a travel blog (&lt;a href=&#34;https://joyofexploringtheworld.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;joyofexploringtheworld.com&lt;/a&gt;) that helps people plan itineraries—hosted on a low-cost VPS with Docker Compose and Cloudflare. One small performance tweak took the whole site offline for an hour. Here&amp;rsquo;s what happened and how we fixed it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-went-wrong&#34;&gt;&#xA;  What Went Wrong&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#what-went-wrong&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;We added a Traefik compression middleware to speed up responses. The new config lived in a &lt;strong&gt;separate YAML file&lt;/strong&gt;. Traefik was configured to load only a &lt;strong&gt;single file&lt;/strong&gt; (e.g. &lt;code&gt;real-ip.yaml&lt;/code&gt;), not the whole directory. The router referenced &lt;code&gt;compress@file&lt;/code&gt;, but that file was never loaded. Every request failed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running a WordPress Travel Blog on a Budget VPS: The Full Docker Stack</title>
      <link>https://89393b0c.nuvai-blog.pages.dev/posts/wordpress-docker-compose-production-stack/</link>
      <pubDate>Sat, 07 Mar 2026 09:00:00 +0000</pubDate>
      <guid>https://89393b0c.nuvai-blog.pages.dev/posts/wordpress-docker-compose-production-stack/</guid>
      <description>&lt;p&gt;We run &lt;a href=&#34;https://joyofexploringtheworld.com&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;joyofexploringtheworld.com&lt;/a&gt; — a travel blog — on a single 24 GB VPS using Docker Compose and free-tier Cloudflare. No managed WordPress hosting, no premium plugins, no surprise invoices. Here is the full stack, laid out so you can steal whatever is useful.&lt;/p&gt;&#xA;&lt;h2 id=&#34;architecture-overview&#34;&gt;&#xA;  Architecture overview&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#architecture-overview&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The request path looks like this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Internet&#xA;  -&amp;gt; Cloudflare (CDN / APO / edge SSL)&#xA;    -&amp;gt; Traefik v3 (reverse proxy, TLS termination for origin)&#xA;      -&amp;gt; 2 WordPress containers (round-robin with sticky session cookies)&#xA;        -&amp;gt; MariaDB 11 (single-writer database)&#xA;        -&amp;gt; Redis (persistent object cache)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alongside the main request path we run a handful of supporting services: &lt;strong&gt;imgproxy&lt;/strong&gt; on a dedicated subdomain for on-the-fly image resizing and format conversion, a &lt;strong&gt;wp-cron sidecar&lt;/strong&gt; that hits &lt;code&gt;wp-cron.php&lt;/code&gt; every five minutes so we can disable the default front-end cron, an &lt;strong&gt;automated backup&lt;/strong&gt; container that dumps the database and syncs uploads to Hetzner Storage Box nightly, and the &lt;strong&gt;Datadog agent&lt;/strong&gt; for logs, traces, and container metrics.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
