<?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: Lyra_TinyStrack</title>
    <description>The latest articles on DEV Community by Lyra_TinyStrack (@dd_aa_abaee26be1a34448721).</description>
    <link>https://dev.to/dd_aa_abaee26be1a34448721</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3847617%2Fbd8861ae-273e-42bf-8322-26f32e6f274b.png</url>
      <title>DEV Community: Lyra_TinyStrack</title>
      <link>https://dev.to/dd_aa_abaee26be1a34448721</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dd_aa_abaee26be1a34448721"/>
    <language>en</language>
    <item>
      <title>I got cryptomined 5 times in 10 days. Here's my story 🧵</title>
      <dc:creator>Lyra_TinyStrack</dc:creator>
      <pubDate>Fri, 10 Apr 2026 18:43:00 +0000</pubDate>
      <link>https://dev.to/dd_aa_abaee26be1a34448721/i-got-cryptomined-5-times-in-10-days-heres-my-story-48ab</link>
      <guid>https://dev.to/dd_aa_abaee26be1a34448721/i-got-cryptomined-5-times-in-10-days-heres-my-story-48ab</guid>
      <description>&lt;h2&gt;
  
  
  I got cryptomined 5 times in 10 days. Here's my story 🧵
&lt;/h2&gt;

&lt;p&gt;It started with my CPU suddenly hitting 100%.&lt;br&gt;
I had no idea what was happening. I asked Claude "why is my CPU maxing out?"&lt;/p&gt;

&lt;h2&gt;
  
  
  That's literally the first time I heard the word "cryptomining."
&lt;/h2&gt;

&lt;p&gt;Ok, easy fix. Just switch to my backup server, right?&lt;br&gt;
Got mined again.&lt;br&gt;
"Ok FINE. I'll just switch hosting providers."&lt;br&gt;
Migrated ALL my products. Took forever. Had to — I needed to keep everything online.&lt;br&gt;
Got mined again.&lt;br&gt;
This was my life for 10 days:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get mined&lt;/li&gt;
&lt;li&gt;Migrate all products to keep them live&lt;/li&gt;
&lt;li&gt;Rebuild the server from scratch&lt;/li&gt;
&lt;li&gt;Feel relieved&lt;/li&gt;
&lt;li&gt;Go to step 1
I did this 5 times. I am not a fast learner apparently. 😅
Finally I started to think maybe the problem isn't the servers.
I scanned my local machine.
Every single .exe file: infected. 🫠
The culprits? A cracked audio plugin. And one time I couldn't install Windows myself so I let a stranger remote into my PC.
Classic.
Fresh Windows install. Fresh servers. Hardened everything.
Ran clean for 2 whole days. I was so proud of myself.
Then I deployed a new project and installed one package.
You already know what happened.
The lowest point:
I woke up at 3am in a panic, jumped out of bed, sat down at my computer, and started frantically pressing keys.
The screen wouldn't turn on.
Because I was still asleep. It was a dream.
I have been dreaming about getting cryptomined for over a week straight.
"My therapist says this is normal. I don't have a therapist."
Anyway. Here's my "never again" checklist.
25 items. Each one is a scar.
🔒 Server hardening:
✅ Dedicated user, root login disabled
✅ Ed25519 key auth, password login off
✅ SSH on a non-standard port
✅ UFW firewall, only necessary ports open
✅ IP whitelist, only my fixed IP can connect
✅ Fail2ban against brute force
✅ Automatic security updates
📦 Deploy pipeline:
✅ npm install --ignore-scripts
✅ Review package.json for suspicious packages
✅ npm audit, fix all vulnerabilities
✅ Check for xmrig/scanner_linux and other malware
✅ npx tsc --noEmit
✅ npm run build
✅ pm2 restart
🗄️ Database:
✅ MySQL bound to 127.0.0.1 only
✅ Separate DB user per product
✅ Passwords hashed with bcrypt
🛡️ App:
✅ JWT auth (jose)
✅ Full HTTPS + wildcard cert
✅ Cloudflare proxy hiding real IP
✅ Docker container isolation
✅ PM2 process management
And yes, I back up to 2 external drives now.
Immediately after every deploy.
Don't @ me
---
Most security guides are written by people who read about attacks.
Mine was written by someone who lived through 5 of them in 10 days.
---
I'm a self-taught solo developer from Inner Mongolia.
Two months ago I didn't know what cryptomining was.
Now I've survived it 5 times and I'm still shipping.
Some days that's enough. 😅&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>How I run 10 SaaS products on $44/month (Nginx + PM2 + 2 VPS)</title>
      <dc:creator>Lyra_TinyStrack</dc:creator>
      <pubDate>Mon, 06 Apr 2026 11:42:58 +0000</pubDate>
      <link>https://dev.to/dd_aa_abaee26be1a34448721/how-i-run-10-saas-products-on-44month-nginx-pm2-2-vps-288l</link>
      <guid>https://dev.to/dd_aa_abaee26be1a34448721/how-i-run-10-saas-products-on-44month-nginx-pm2-2-vps-288l</guid>
      <description>&lt;p&gt;I'm a self-taught developer who shipped 10 SaaS products in 25 days. Here's the exact infrastructure setup that keeps my costs at $44/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2 VPS servers (Hong Kong, ~$17/month total)&lt;/li&gt;
&lt;li&gt;Nginx reverse proxy&lt;/li&gt;
&lt;li&gt;PM2 process manager&lt;/li&gt;
&lt;li&gt;MySQL (Docker)&lt;/li&gt;
&lt;li&gt;Next.js 15 + TypeScript&lt;/li&gt;
&lt;li&gt;Claude subscription (~$20/month)&lt;/li&gt;
&lt;li&gt;3 domains (~$2.5/month)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One Domain, 8 Products
&lt;/h2&gt;

&lt;p&gt;Instead of buying a domain per product, I use subdomains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;testimonialwall&lt;/span&gt;.&lt;span class="n"&gt;saaslic&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt; → &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="m"&gt;3004&lt;/span&gt;
&lt;span class="n"&gt;mailtrace&lt;/span&gt;.&lt;span class="n"&gt;saaslic&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt; → &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="m"&gt;3001&lt;/span&gt;
&lt;span class="n"&gt;statuspulse&lt;/span&gt;.&lt;span class="n"&gt;saaslic&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt; → &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="m"&gt;3002&lt;/span&gt;
&lt;span class="n"&gt;feedbackbox&lt;/span&gt;.&lt;span class="n"&gt;saaslic&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt; → &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="m"&gt;3003&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nginx routes each subdomain to the right PM2 process. One SSL wildcard cert covers all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  PM2 Config
&lt;/h2&gt;

&lt;p&gt;Each product runs as an independent PM2 process. If one crashes, others keep running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 start npm &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"testimonialwall"&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; start
pm2 start npm &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"mailtrace"&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; start
&lt;span class="c"&gt;# etc.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  MySQL in Docker
&lt;/h2&gt;

&lt;p&gt;One Docker container runs MySQL. Each product gets its own database and user. Isolated, easy to backup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; mysql mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
CREATE DATABASE testimonialwall_db&lt;span class="p"&gt;;&lt;/span&gt;
CREATE USER &lt;span class="s1"&gt;'tw_user'&lt;/span&gt;@&lt;span class="s1"&gt;'localhost'&lt;/span&gt; IDENTIFIED BY &lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
GRANT ALL ON testimonialwall_db.&lt;span class="k"&gt;*&lt;/span&gt; TO &lt;span class="s1"&gt;'tw_user'&lt;/span&gt;@&lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Backup Script
&lt;/h2&gt;

&lt;p&gt;One script backs up all databases + code + SSL certs into a single tar.gz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash ~/scripts/backup.sh
&lt;span class="c"&gt;# Output: backup_2026-04-06.tar.gz (1.5G)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;You don't need Vercel + PlanetScale + Clerk + Resend. A $8/month VPS and some patience gets you further than you think.&lt;/p&gt;

&lt;p&gt;Total cost breakdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2x VPS: $17/month&lt;/li&gt;
&lt;li&gt;Claude: $20/month
&lt;/li&gt;
&lt;li&gt;Domains: $2.5/month&lt;/li&gt;
&lt;li&gt;X Premium: $4/month&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: $43.5/month&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;10 products. All live. All on this setup.&lt;/p&gt;

&lt;p&gt;tinystrack.com&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>startup</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
