<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Varot Pavaritpong</title>
    <description>The latest articles on DEV Community by Varot Pavaritpong (@varotp).</description>
    <link>https://dev.to/varotp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4062135%2F7fdf120e-0629-4477-abb3-889acd2bbfd8.jpg</url>
      <title>DEV Community: Varot Pavaritpong</title>
      <link>https://dev.to/varotp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/varotp"/>
    <language>en</language>
    <item>
      <title>How My Portfolio Site Grew Up</title>
      <dc:creator>Varot Pavaritpong</dc:creator>
      <pubDate>Tue, 04 Aug 2026 09:12:15 +0000</pubDate>
      <link>https://dev.to/varotp/how-my-portfolio-site-grew-up-1m5e</link>
      <guid>https://dev.to/varotp/how-my-portfolio-site-grew-up-1m5e</guid>
      <description>&lt;p&gt;A few more weeks into the MLH Fellowship, my small portfolio site has grown into something much more reliable. 🚀&lt;/p&gt;

&lt;p&gt;At the start of the Production Engineering track, deploying my Flask app meant connecting to a DigitalOcean VPS and keeping it alive inside a tmux session. It worked, but only as long as nothing went wrong.&lt;/p&gt;

&lt;p&gt;Since then, I have rebuilt the deployment process several times.&lt;/p&gt;

&lt;p&gt;🐚 First, I wrote a Bash redeployment script. It handled pulling the latest code, installing dependencies, then restarting the app. This was my first real experience of automating repetitive work.&lt;/p&gt;

&lt;p&gt;⚙️ Next, I replaced tmux with a systemd service. The app could now start automatically when the server booted and restart after a crash.&lt;/p&gt;

&lt;p&gt;🐳 Then, I moved everything into Docker Compose. The Flask app and MariaDB database now run in separate containers, with NGINX and Certbot providing HTTPS.&lt;/p&gt;

&lt;p&gt;I added a database backed Timeline feature with a REST API. I wrote unit tests using an in memory SQLite database, so the tests never touch production data. I set up NGINX rate limiting to protect the public API from abuse.&lt;/p&gt;

&lt;p&gt;The biggest lesson has been that Production Engineering is not one skill. It is the process of moving from “it runs” to “it runs reliably, safely, and consistently without me watching it.”&lt;/p&gt;

&lt;p&gt;It is still the same app, but rebuilding its deployment process taught me far more than getting it right on the first attempt ever could.&lt;/p&gt;

&lt;p&gt;You can see the project here and judge my commit messages for yourself 😅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/VarotP/pe-portfolio" rel="noopener noreferrer"&gt;https://github.com/VarotP/pe-portfolio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you to the MLH Fellowship mentors for helping these ideas finally click. Now on to the second half. ❤️&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>mlhfellowship</category>
      <category>docker</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
