<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Infrastructure on Vitor Pontual | The VeePee Hub</title>
    <link>https://vitorpontual.com/tags/infrastructure/</link>
    <description>Recent content in Infrastructure on Vitor Pontual | The VeePee Hub</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 23 Jun 2026 07:00:00 +0000</lastBuildDate>
    <atom:link href="https://vitorpontual.com/tags/infrastructure/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>VeePeenini, Part 11: What Moving a Live App Taught Me</title>
      <link>https://vitorpontual.com/posts/veepeenini-11-what-moving-a-live-app-taught-me/</link>
      <pubDate>Tue, 23 Jun 2026 07:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-11-what-moving-a-live-app-taught-me/</guid>
      <description>&lt;p&gt;The move worked. The game runs from the second location now, every point and sticker accounted for. A few things stuck with me, including one I got plain lucky on and one that an old decision quietly handled for me.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-downtime-was-the-feature-not-the-failure&#34;&gt;The downtime was the feature, not the failure&lt;/h2&gt;&#xA;&lt;p&gt;The reflex with any cutover is to chase zero downtime. I went the other way on purpose. With two separate databases and no shared storage, that brief &amp;ldquo;front door down&amp;rdquo; window is the only moment I can prove both sides hold exactly the same data. Trying to eliminate it would have traded a visible ninety-second blip for an invisible risk of a lost trade. For a game whose entire value is that the standings are trustworthy, that is a terrible trade. Ugly and certain beat smooth and sorry.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VeePeenini, Part 10: Ninety Seconds of Downtime</title>
      <link>https://vitorpontual.com/posts/veepeenini-10-ninety-seconds-of-downtime/</link>
      <pubDate>Tue, 23 Jun 2026 06:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-10-ninety-seconds-of-downtime/</guid>
      <description>&lt;p&gt;The plan from &lt;a href=&#34;https://vitorpontual.com/posts/veepeenini-9-the-plan-and-all-the-ways-it-was-wrong/&#34;&gt;Part 9&lt;/a&gt; was good. Running it live, while my friends were mid-tournament, is a different feeling. Here is how it actually went, step by step, because the calm version is the one worth remembering.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wait-for-finished-not-for-the-whistle&#34;&gt;Wait for &amp;ldquo;finished,&amp;rdquo; not for the whistle&lt;/h2&gt;&#xA;&lt;p&gt;First I waited for a match to be genuinely done, which is not the same as the final whistle. The app grades a match a minute or two after it ends: it settles every prediction, awards the points, and drops the loot packs. If I had taken my copy of the database in that window, I&amp;rsquo;d have captured a half-graded match and lost the points that landed a moment later.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VeePeenini, Part 9: The Plan, and All the Ways It Was Wrong</title>
      <link>https://vitorpontual.com/posts/veepeenini-9-the-plan-and-all-the-ways-it-was-wrong/</link>
      <pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-9-the-plan-and-all-the-ways-it-was-wrong/</guid>
      <description>&lt;p&gt;On paper the plan was one sentence: copy the database from the old box to the new one, point the front door at the new box, done. Everything that mattered lived in the gap between that sentence and a version I would actually trust with my friends&amp;rsquo; data. Closing that gap is most of what this entry is.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-boring-problems-that-were-actually-the-dangerous-ones&#34;&gt;The boring problems that were actually the dangerous ones&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;The tunnel wasn&amp;rsquo;t only the app&amp;rsquo;s.&lt;/strong&gt; The Cloudflare Tunnel in front of the game also carried a couple of my other personal services. &amp;ldquo;Just move the tunnel to the new box&amp;rdquo; would have quietly knocked those over too. So the call was to give the app its own dedicated tunnel, and at switch time repoint only the app&amp;rsquo;s address to it, leaving everything else untouched.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VeePeenini, Part 8: Moving the Server Without Losing the Game</title>
      <link>https://vitorpontual.com/posts/veepeenini-8-moving-the-server/</link>
      <pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-8-moving-the-server/</guid>
      <description>&lt;p&gt;For a few weeks the app just worked. My friends were opening packs every morning, filling their albums, arguing in the lounge, making predictions before kickoff. The build was behind me and the fun was the point. Then a logistics problem landed on top of all of it: the whole thing runs on a server in my home, and a move was coming that meant shutting that server down and bringing the app back up at a second location.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
