<?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: devstack-blog</title>
    <description>The latest articles on DEV Community by devstack-blog (@hwidal).</description>
    <link>https://dev.to/hwidal</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%2F4233104%2F9f758bfb-3de1-43e2-b40c-7a52fa68d11c.jpg</url>
      <title>DEV Community: devstack-blog</title>
      <link>https://dev.to/hwidal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hwidal"/>
    <language>en</language>
    <item>
      <title>Hetzner Price Increase 2026: Cheaper VPS Alternatives</title>
      <dc:creator>devstack-blog</dc:creator>
      <pubDate>Sun, 08 Nov 2026 04:53:15 +0000</pubDate>
      <link>https://dev.to/hwidal/hetzner-price-increase-2026-cheaper-vps-alternatives-2p40</link>
      <guid>https://dev.to/hwidal/hetzner-price-increase-2026-cheaper-vps-alternatives-2p40</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://leanstack.pages.dev/posts/hetzner-price-increase-vps-alternatives/" rel="noopener noreferrer"&gt;LeanStack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For years Hetzner was the default answer to "where do I get a cheap VPS?" In 2026 that changed. Hetzner raised prices more than once, citing the jump in memory and SSD costs driven by AI data-center demand, and other European hosts such as OVHcloud and netcup followed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; if your server already runs and its price did not change on your invoice, there is little reason to move: migrating costs time and the alternatives went up too. If you are ordering a new small server, compare before you click. For U.S. users, &lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; is now cheaper than Hetzner's U.S. locations; for lots of RAM on a budget, &lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt;'s KVM plans are worth a look if you accept a 24-month prepay.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;April 1, 2026:&lt;/strong&gt; first price adjustment for cloud and dedicated servers, with higher DRAM and NAND costs given as the reason.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;June 15, 2026:&lt;/strong&gt; a further "standardization and price adjustment" of server products, applying to new orders and rescales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size of the increase:&lt;/strong&gt; this is where reporting disagrees. Some articles quote about 10%, while others show individual small plans going up by 30–50%. The difference comes from which plans you compare, so the only number that matters is the one on your invoice.
## Hetzner's current prices (checked November 8, 2026)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regular Performance cloud servers, monthly, excluding VAT, IPv4 included:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;NVMe&lt;/th&gt;
&lt;th&gt;Traffic&lt;/th&gt;
&lt;th&gt;Germany/Finland&lt;/th&gt;
&lt;th&gt;U.S. (Ashburn, Hillsboro)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPX02&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;20 GB&lt;/td&gt;
&lt;td&gt;20 TB&lt;/td&gt;
&lt;td&gt;€6.49&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPX12&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;20 TB&lt;/td&gt;
&lt;td&gt;€11.99&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPX22&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB&lt;/td&gt;
&lt;td&gt;20 TB&lt;/td&gt;
&lt;td&gt;€19.99&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPX11&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;1 TB&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;€17.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPX21&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB&lt;/td&gt;
&lt;td&gt;2 TB&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;€32.49&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things stand out. First, &lt;strong&gt;U.S. locations cost roughly three times as much&lt;/strong&gt; as the cheapest European plan. Second, the cheaper Cost-Optimized line (from €5.99) was marked "currently not available", and some plans showed as temporarily unavailable to order.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqpe13ks4sanbyos9uy1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqpe13ks4sanbyos9uy1r.png" alt="Hetzner Regular Performance prices in euros: EU plans from €6.49, U.S. plans from €17.99" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you move an existing server?
&lt;/h2&gt;

&lt;p&gt;Probably not, unless your bill went up. Before migrating, check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your latest invoice.&lt;/strong&gt; If the price did not change, the increase does not affect you yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not rescale casually.&lt;/strong&gt; Resizing a server re-prices it at today's rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration cost.&lt;/strong&gt; Moving Postgres, DNS, TLS and deploy scripts takes a weekend for a small app. Saving €2 a month is not worth that; saving €20 might be.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The alternatives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  DigitalOcean: best for U.S. users
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;'s Basic Droplets are priced in dollars with simple monthly billing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Droplet&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;SSD&lt;/th&gt;
&lt;th&gt;Transfer&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;512 MiB&lt;/td&gt;
&lt;td&gt;10 GiB&lt;/td&gt;
&lt;td&gt;500 GiB&lt;/td&gt;
&lt;td&gt;$4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GiB&lt;/td&gt;
&lt;td&gt;25 GiB&lt;/td&gt;
&lt;td&gt;1,000 GiB&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2 GiB&lt;/td&gt;
&lt;td&gt;50 GiB&lt;/td&gt;
&lt;td&gt;2,000 GiB&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The $6 Droplet matches Hetzner's CPX02 on RAM at a similar price, with U.S. data centers. You get far less included traffic than Hetzner's 20 TB, which only matters for bandwidth-heavy apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hostinger VPS: most RAM per dollar, with a catch
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt;'s KVM plans give much more memory for the money, but the advertised price requires paying for 24 months up front, and renewal is higher:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;NVMe&lt;/th&gt;
&lt;th&gt;Bandwidth&lt;/th&gt;
&lt;th&gt;Intro (24-month prepay)&lt;/th&gt;
&lt;th&gt;Renewal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;KVM 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;50 GB&lt;/td&gt;
&lt;td&gt;4 TB&lt;/td&gt;
&lt;td&gt;$6.49/mo&lt;/td&gt;
&lt;td&gt;$11.99/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KVM 2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;100 GB&lt;/td&gt;
&lt;td&gt;8 TB&lt;/td&gt;
&lt;td&gt;$8.79/mo&lt;/td&gt;
&lt;td&gt;$14.99/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your app needs RAM (Node.js plus Postgres plus a cache), KVM 2 at $8.79 is hard to beat for two years. Budget for the renewal price when you plan the third year.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vultr
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://leanstack.pages.dev/go/vultr" rel="noopener noreferrer"&gt;Vultr&lt;/a&gt; is another common Hetzner alternative with many U.S. and Asian locations and hourly billing capped at a monthly price. Its regular Cloud Compute plan with &lt;strong&gt;1 vCPU, 1 GB RAM, 25 GB SSD and 1 TB of transfer is listed at $5 a month&lt;/strong&gt; in most locations, with a 512 MB plan around $2.50 in some regions. A few locations, such as Tokyo, cost slightly more, so check the price for the region you pick at checkout.&lt;/p&gt;

&lt;p&gt;For a U.S. audience, that makes Vultr's 1 GB plan the cheapest of the mainstream options here, $1 below DigitalOcean, with less included transfer than Hetzner.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skip the server entirely: Render or Railway
&lt;/h3&gt;

&lt;p&gt;If the price increase is a good moment to stop managing servers, platforms like &lt;a href="https://leanstack.pages.dev/go/render" rel="noopener noreferrer"&gt;Render&lt;/a&gt; (about $13/month for the smallest always-on web service plus Postgres) or &lt;a href="https://leanstack.pages.dev/go/railway" rel="noopener noreferrer"&gt;Railway&lt;/a&gt; (from $5/month, usage-based) remove OS updates and patching. I compare them with real prices in &lt;a href="https://leanstack.pages.dev/posts/cheapest-way-to-host-nodejs-postgres-app/" rel="noopener noreferrer"&gt;Cheapest Way to Host a Node.js + Postgres App in 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Or host from a PC you already own
&lt;/h3&gt;

&lt;p&gt;For side projects, a home PC with Cloudflare Tunnel costs about $3 a month in electricity and domain fees. I ran a production app this way for 12 days before moving it to Google Cloud's free e2-micro VM; &lt;a href="https://leanstack.pages.dev/posts/host-nodejs-postgres-app-from-home-pc-cloudflare-tunnel/" rel="noopener noreferrer"&gt;here is the setup, the outages and the risks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side: about €6–9 a month
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Monthly price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CPX02 (EU)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;€6.49 + VAT&lt;/td&gt;
&lt;td&gt;20 TB traffic; EU only at this price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Basic 1 GiB&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GiB&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;td&gt;U.S. locations, monthly billing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/vultr" rel="noopener noreferrer"&gt;Vultr&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cloud Compute 1 GB&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;1 TB transfer; price varies a little by region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;KVM 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;$6.49&lt;/td&gt;
&lt;td&gt;24-month prepay, renews at $11.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;KVM 2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;$8.79&lt;/td&gt;
&lt;td&gt;24-month prepay, renews at $14.99&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1fr9gwt43kwkb08ycyz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1fr9gwt43kwkb08ycyz2.png" alt="Monthly prices: Vultr $5 for 1 GB, DigitalOcean $6 for 1 GiB, Hostinger KVM 1 $6.49 for 4 GB, Hostinger KVM 2 $8.79 for 8 GB" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How much RAM do you actually need? My own Node.js + PostgreSQL app, a multi-school exam platform, runs on a 1 GB VM using about 520 MB with Postgres tuned down and a 2 GB swap file. So the 1 GB plans above are enough for a small app; pick 2 GB or more only if you add Redis, a search engine or heavier caching.&lt;/p&gt;

&lt;h2&gt;
  
  
  My verdict
&lt;/h2&gt;

&lt;p&gt;Hetzner is still good value in Europe, especially for traffic-heavy apps, but it is no longer the automatic cheapest choice. For a small Node.js app serving U.S. users, a $6 &lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; Droplet is the simplest replacement. If you need memory and can prepay, &lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt; KVM 2 gives 8 GB for under $9 a month for two years. And if your server's price has not changed, keep it: the cheapest migration is the one you do not need.&lt;/p&gt;

&lt;p&gt;As for me, I skipped all of them for now: my app moved from a home laptop to Google Cloud's free e2-micro, and when it outgrows that I will choose by vCPU count, not RAM, because password hashing during logins is my real bottleneck.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Some links are affiliate links; see the &lt;a href="https://leanstack.pages.dev/disclosure/" rel="noopener noreferrer"&gt;disclosure&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hosting</category>
      <category>vps</category>
      <category>hetzner</category>
      <category>devops</category>
    </item>
    <item>
      <title>Cheapest Way to Host a Node.js + Postgres App in 2026</title>
      <dc:creator>devstack-blog</dc:creator>
      <pubDate>Sun, 08 Nov 2026 04:53:07 +0000</pubDate>
      <link>https://dev.to/hwidal/cheapest-way-to-host-a-nodejs-postgres-app-in-2026-1ee5</link>
      <guid>https://dev.to/hwidal/cheapest-way-to-host-a-nodejs-postgres-app-in-2026-1ee5</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://leanstack.pages.dev/posts/cheapest-way-to-host-nodejs-postgres-app/" rel="noopener noreferrer"&gt;LeanStack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every week someone asks the same question on Reddit: &lt;em&gt;what is the cheapest way to host a Node.js API with a Postgres database that is not a toy?&lt;/em&gt; The honest answer depends on how much downtime and maintenance you can accept, so this guide gives you real 2026 prices for five options and tells you which one fits which situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;About $3/month:&lt;/strong&gt; a PC you already own + Cloudflare Tunnel (you pay only electricity and the domain). Fast, but you are the ops team. I ran my production app this way for 12 days (&lt;a href="https://leanstack.pages.dev/posts/host-nodejs-postgres-app-from-home-pc-cloudflare-tunnel/" rel="noopener noreferrer"&gt;full setup here&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0/month, always on:&lt;/strong&gt; Google Cloud's free e2-micro, if 1 GB of RAM, a shared CPU and a U.S. region are acceptable. My app runs there now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;About $6/month:&lt;/strong&gt; one small VPS running both Node.js and Postgres. The cheapest always-on option if you can do basic Linux admin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;About $13/month:&lt;/strong&gt; Render with a paid web service and database. No servers to manage, predictable bill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$5 and up:&lt;/strong&gt; Railway, billed by usage. Great for small, spiky apps; watch the meter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free database:&lt;/strong&gt; Neon's permanent free Postgres pairs well with any of the above.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;p&gt;Prices checked on November 8, 2026 on each provider's official pricing page. Taxes not included.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpjtibc1xkc9bg577x3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpjtibc1xkc9bg577x3w.png" alt="Monthly cost to keep a Node.js + Postgres app online: Google Cloud e2-micro $0, home PC about $3, DigitalOcean $6, Railway about $6.15, Hostinger $6.49 rising to $11.99 at renewal, Render $13" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;th&gt;Always on?&lt;/th&gt;
&lt;th&gt;You manage&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Home PC + &lt;a href="https://leanstack.pages.dev/go/cloudflare-tunnel" rel="noopener noreferrer"&gt;Cloudflare Tunnel&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;~$3 (electricity + domain)&lt;/td&gt;
&lt;td&gt;Only while your PC and internet are up&lt;/td&gt;
&lt;td&gt;Everything&lt;/td&gt;
&lt;td&gt;Side projects, pilots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud e2-micro (Always Free)&lt;/td&gt;
&lt;td&gt;$0 within free limits&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;OS, Postgres, backups&lt;/td&gt;
&lt;td&gt;Low-traffic apps, U.S. regions only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; Droplet 1 GiB&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;OS, Postgres, backups&lt;/td&gt;
&lt;td&gt;Cheapest reliable always-on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://leanstack.pages.dev/go/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; CPX02 (EU only)&lt;/td&gt;
&lt;td&gt;€6.49 + VAT&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;OS, Postgres, backups&lt;/td&gt;
&lt;td&gt;EU users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt; KVM 1 (4 GB RAM)&lt;/td&gt;
&lt;td&gt;$6.49 intro (24-month prepay), $11.99 renewal&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;OS, Postgres, backups&lt;/td&gt;
&lt;td&gt;Most RAM per dollar up front&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://leanstack.pages.dev/go/render" rel="noopener noreferrer"&gt;Render&lt;/a&gt; web + Postgres&lt;/td&gt;
&lt;td&gt;$7 + $6 = $13&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;td&gt;No-ops, fixed bill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://leanstack.pages.dev/go/railway" rel="noopener noreferrer"&gt;Railway&lt;/a&gt; Hobby&lt;/td&gt;
&lt;td&gt;$5 incl. $5 usage, then metered&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;td&gt;Small or spiky apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://leanstack.pages.dev/go/neon" rel="noopener noreferrer"&gt;Neon&lt;/a&gt; Free (database only)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Scales to zero after 5 min idle&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;td&gt;Free Postgres that does not expire&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where these numbers come from
&lt;/h2&gt;

&lt;p&gt;Prices come from each provider's official pricing page and documentation on November 8, 2026; I did not open a paid account on every platform just to collect invoices. The home-PC and small-VM numbers come from my own production app, a multi-school exam platform built with Node.js, Express and PostgreSQL: it ran for 12 days on a laptop at home, and now runs on a 1 GB cloud VM. Where I estimate a bill, I show the math so you can plug in your own usage.&lt;/p&gt;

&lt;p&gt;There is also one more $0 option that stays always on: Google Cloud's &lt;strong&gt;Always Free e2-micro&lt;/strong&gt; (2 shared vCPUs, 1 GB RAM, 30 GB standard disk, 1 GB of egress per month from North America) in &lt;code&gt;us-west1&lt;/code&gt;, &lt;code&gt;us-central1&lt;/code&gt; or &lt;code&gt;us-east1&lt;/code&gt;. That is where my app runs today; the catches are a weak shared CPU and U.S.-only regions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: A PC you already own + Cloudflare Tunnel (~$3)
&lt;/h2&gt;

&lt;p&gt;If you have a spare PC or laptop, &lt;a href="https://leanstack.pages.dev/go/cloudflare-tunnel" rel="noopener noreferrer"&gt;Cloudflare Tunnel&lt;/a&gt; publishes a local app on your domain without opening router ports, and the tunnel is free. My production exam platform ran this way on a laptop CPU from 2016 and handled 1,000 simulated users with zero errors and p95 around 100 ms. Electricity and the domain came to about $3 a month.&lt;/p&gt;

&lt;p&gt;The catch is uptime: sleep, Windows Update reboots, power cuts and ISP outages all take your app down, and backups are entirely on you. In 12 days my laptop went to sleep twice and the app was offline for about 12 hours in total. I wrote up the whole setup, the load test and the risks in &lt;a href="https://leanstack.pages.dev/posts/host-nodejs-postgres-app-from-home-pc-cloudflare-tunnel/" rel="noopener noreferrer"&gt;Hosting a Node.js + Postgres App From a Home PC&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: One small VPS for both Node.js and Postgres (~$6)
&lt;/h2&gt;

&lt;p&gt;This is the cheapest option that stays online when your laptop is closed. You rent a small Linux server, install Node.js and PostgreSQL on it, and run your app with a process manager like PM2 or systemd.&lt;/p&gt;

&lt;p&gt;What you get for about $6 a month:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Disk&lt;/th&gt;
&lt;th&gt;Traffic&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Basic Droplet&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GiB&lt;/td&gt;
&lt;td&gt;25 GiB SSD&lt;/td&gt;
&lt;td&gt;1,000 GiB&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CPX02 (Germany/Finland)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;20 GB NVMe&lt;/td&gt;
&lt;td&gt;20 TB&lt;/td&gt;
&lt;td&gt;€6.49 + VAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;KVM 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;50 GB NVMe&lt;/td&gt;
&lt;td&gt;4 TB&lt;/td&gt;
&lt;td&gt;$6.49 intro, $11.99 renewal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Things the price tables do not tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hetzner's US locations cost much more.&lt;/strong&gt; The cheapest cloud plan in Ashburn or Hillsboro was CPX11 at €17.99/month when I checked, versus €6.49 for CPX02 in Europe. If your users are in the U.S., latency to Germany matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hostinger's $6.49 requires paying 24 months up front,&lt;/strong&gt; and the plan renews at $11.99/month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 GB of RAM is tight&lt;/strong&gt; for Node.js plus Postgres. It works for small apps if you lower Postgres memory settings and add a swap file; 2 GB is more comfortable (DigitalOcean's 2 GiB Droplet is $12).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How tight is 1 GB in practice? My app runs on a 1 GB VM (Google Cloud's free e2-micro) with Node.js in cluster mode (2 workers), PostgreSQL 16 and &lt;code&gt;cloudflared&lt;/code&gt;. With Postgres set to &lt;code&gt;shared_buffers = 128MB&lt;/code&gt; and &lt;code&gt;max_connections = 40&lt;/code&gt;, plus a 2 GB swap file, &lt;code&gt;free -m&lt;/code&gt; shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;               total        used        free      shared  buff/cache   available
Mem:             969         519         373          26         239         450
Swap:           2047          32        2015
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About half the RAM is used and swap is barely touched, so 1 GB is enough for a small app if you tune Postgres down. It will not be enough if you add Redis, a search engine or a big in-memory cache.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbmdx3r91ay2uaffl33tx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbmdx3r91ay2uaffl33tx.png" alt="Memory on a 1 GB VM: 519 MB used and 450 MB available with Node.js, PostgreSQL and cloudflared running; 32 MB of a 2 GB swap file in use" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not skip backups on a VPS.&lt;/strong&gt; A cron job running &lt;code&gt;pg_dump&lt;/code&gt; to another machine or cloud storage every night is the minimum. Most providers also sell automatic server snapshots for a small extra fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 3: Render (~$13, fully managed)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://leanstack.pages.dev/go/render" rel="noopener noreferrer"&gt;Render&lt;/a&gt; runs your app from a Git repo and handles TLS, deploys and restarts. The Hobby workspace itself is free; you pay per service:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Render service&lt;/th&gt;
&lt;th&gt;Specs&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web service (free)&lt;/td&gt;
&lt;td&gt;512 MB&lt;/td&gt;
&lt;td&gt;$0, spins down after 15 min idle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web service&lt;/td&gt;
&lt;td&gt;0.5 CPU, 512 MB&lt;/td&gt;
&lt;td&gt;$7/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres (free)&lt;/td&gt;
&lt;td&gt;256 MB, 1 GB storage&lt;/td&gt;
&lt;td&gt;$0, &lt;strong&gt;expires after 30 days&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;0.1 CPU, 256 MB&lt;/td&gt;
&lt;td&gt;$6/month + $0.30 per GB storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So the realistic floor for an always-on app with a database you keep is &lt;strong&gt;$13/month&lt;/strong&gt;. The free tier is fine for demos, but two details bite people:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A free web service &lt;strong&gt;sleeps after 15 minutes without traffic&lt;/strong&gt; and takes about a minute to wake up.&lt;/li&gt;
&lt;li&gt;A free Postgres database &lt;strong&gt;expires 30 days after creation&lt;/strong&gt;. You get a 14-day grace period to upgrade; after that Render deletes it, data included.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Render's docs put the wake-up at about a minute, and community reports go higher for bigger apps. Since February 2026, a free service also stays awake while it receives WebSocket messages, not only HTTP requests. Free services lose any files written to local disk when they spin down, so keep uploads in a database or object storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 4: Railway (from $5, usage-based)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://leanstack.pages.dev/go/railway" rel="noopener noreferrer"&gt;Railway&lt;/a&gt; bills by the second for the resources your services actually use. The Hobby plan costs $5/month and includes $5 of usage. Beyond that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory: about $10 per GB per month&lt;/li&gt;
&lt;li&gt;CPU: about $20 per vCPU per month&lt;/li&gt;
&lt;li&gt;Volume storage (for Postgres data): about $0.15 per GB per month&lt;/li&gt;
&lt;li&gt;Egress: $0.05 per GB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can estimate your bill as &lt;strong&gt;average RAM (GB) × $10 + average CPU (vCPU) × $20 + storage&lt;/strong&gt;. An app and database that together average a few hundred MB of RAM and little CPU can stay close to the $5 included credit. A busy app, or one with a memory leak, will not.&lt;/p&gt;

&lt;p&gt;A worked example using my own app's real footprint: Node.js plus Postgres use about 0.5 GB of RAM together and almost no CPU when idle. On Railway that is roughly 0.5 GB × $10 = $5 for memory, plus perhaps 0.05 vCPU × $20 = $1 for CPU, plus 1 GB of Postgres volume at $0.15. That is &lt;strong&gt;about $6.15 a month&lt;/strong&gt;, or $1.15 above the included $5. An exam with 1,000 students logging in at once would push CPU, and the bill, up for that hour.&lt;/p&gt;

&lt;p&gt;There is also a free plan with $1 of usage per month and a one-time $5 trial credit, which is enough to try it but not to run anything permanent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 5: A free managed database with Neon
&lt;/h2&gt;

&lt;p&gt;If the database is what pushes you onto a paid plan, &lt;a href="https://leanstack.pages.dev/go/neon" rel="noopener noreferrer"&gt;Neon&lt;/a&gt; offers serverless Postgres with a &lt;strong&gt;permanent free plan&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 compute-hours per project per month (autoscaling up to 2 compute units)&lt;/li&gt;
&lt;li&gt;1 GB storage per project (20 GB across up to 100 projects)&lt;/li&gt;
&lt;li&gt;Scales to zero after 5 minutes idle, which adds a short delay on the first query after a pause&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The paid Launch plan has no monthly minimum: $0.106 per compute-hour and $0.35 per GB-month of storage. Neon's own estimate for a small database with intermittent load is about $15/month.&lt;/p&gt;

&lt;p&gt;A common cheap combination: Node.js on Render's free web service or a small VPS, with the database on Neon's free plan. Just remember both the free web service and the free database go to sleep, so the first request after a quiet period is slow.&lt;/p&gt;

&lt;p&gt;How slow is slow? Neon describes its cold starts as subsecond, around 500 ms on average, which is far less painful than Render's one-minute wake-up. Still, set your Postgres client's connection timeout to a few seconds (the &lt;code&gt;pg&lt;/code&gt; default is no timeout, but many ORMs use shorter ones) so the first query after a pause does not fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one should you choose?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Learning, demo or early pilot:&lt;/strong&gt; home PC + Cloudflare Tunnel, or Render free + Neon free. Accept the sleeps and the downtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First paying users, and you know some Linux:&lt;/strong&gt; a $6 VPS (&lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; for U.S. users, &lt;a href="https://leanstack.pages.dev/go/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; for Europe) with nightly &lt;code&gt;pg_dump&lt;/code&gt; backups. Cheapest always-on option by far.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You never want to SSH into a server:&lt;/strong&gt; &lt;a href="https://leanstack.pages.dev/go/render" rel="noopener noreferrer"&gt;Render&lt;/a&gt; at about $13/month for a fixed, predictable bill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small app with uneven traffic:&lt;/strong&gt; &lt;a href="https://leanstack.pages.dev/go/railway" rel="noopener noreferrer"&gt;Railway&lt;/a&gt;, as long as you check the usage graph in the first weeks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database is the expensive part:&lt;/strong&gt; move it to &lt;a href="https://leanstack.pages.dev/go/neon" rel="noopener noreferrer"&gt;Neon&lt;/a&gt;'s free plan first and see if that is enough.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;My own path:&lt;/strong&gt; I started on a home laptop at about $3 a month, then moved to Google Cloud's free e2-micro once sleep-related outages started to matter. When my exams outgrow it, I will pay for a VPS with 2–4 vCPUs rather than a managed platform, because my bottleneck is password hashing, and that needs cores, not convenience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"My free database disappeared."&lt;/strong&gt; Render free Postgres expires after 30 days. Export it with &lt;code&gt;pg_dump&lt;/code&gt; before then or move to a paid plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The first request takes 30–60 seconds."&lt;/strong&gt; That is a sleeping free web service waking up. Pay for an always-on instance, or use a VPS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"My VPS bill went up."&lt;/strong&gt; Many providers repriced in 2026, and intro prices like Hostinger's renew higher. Check the renewal price before you prepay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Out of memory on a 1 GB VPS."&lt;/strong&gt; Lower Postgres &lt;code&gt;shared_buffers&lt;/code&gt; and &lt;code&gt;max_connections&lt;/code&gt;, add a 1–2 GB swap file, or move up to 2 GB RAM.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Some links are affiliate links; see the &lt;a href="https://leanstack.pages.dev/disclosure/" rel="noopener noreferrer"&gt;disclosure&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>postgres</category>
      <category>hosting</category>
      <category>devops</category>
    </item>
    <item>
      <title>Hosting a Node.js + Postgres App From a Home PC (Real Costs)</title>
      <dc:creator>devstack-blog</dc:creator>
      <pubDate>Sun, 08 Nov 2026 04:53:00 +0000</pubDate>
      <link>https://dev.to/hwidal/hosting-a-nodejs-postgres-app-from-a-home-pc-real-costs-14ag</link>
      <guid>https://dev.to/hwidal/hosting-a-nodejs-postgres-app-from-a-home-pc-real-costs-14ag</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://leanstack.pages.dev/posts/host-nodejs-postgres-app-from-home-pc-cloudflare-tunnel/" rel="noopener noreferrer"&gt;LeanStack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hosting a small web app does not have to start with a monthly bill. For 12 days, from October 26 to November 8, 2026, my production app – a multi-school online exam platform built with Node.js, PostgreSQL and Vue – ran on a Windows laptop at home, reachable on its own domain through &lt;a href="https://leanstack.pages.dev/go/cloudflare-tunnel" rel="noopener noreferrer"&gt;Cloudflare Tunnel&lt;/a&gt;. Then I moved it to a free cloud VM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; if your app is small, your users can tolerate the occasional outage, and you are comfortable doing your own backups, a home PC plus Cloudflare Tunnel costs about $3 a month and performs better than you would expect. Once real money or fixed-schedule exams depend on uptime, move to a server that never sleeps.&lt;/p&gt;

&lt;p&gt;This guide shows exactly how my setup worked, the load numbers I measured, what it really cost, the two outages I had, and what I moved to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I ended up hosting at home
&lt;/h2&gt;

&lt;p&gt;I planned to use a free cloud VM, but my sign-up for Oracle Cloud's free tier was rejected. Paid VPS prices also went up across the market in 2026 (Hetzner alone changed prices several times), so I tried the cheapest option I had: the laptop I already owned.&lt;/p&gt;

&lt;p&gt;The app was already running on that laptop for development, with portable Node.js and PostgreSQL. Going live meant installing one more program, &lt;code&gt;cloudflared&lt;/code&gt;, and pointing the domain at it. It took an evening.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What I used&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Dell Inspiron 7460 laptop, Windows 10, Intel Core i7-7500U (2 cores / 4 threads), 8 GB RAM&lt;/td&gt;
&lt;td&gt;Already owned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Portable Node.js 22 and portable PostgreSQL (no Docker, no WSL)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public access&lt;/td&gt;
&lt;td&gt;Cloudflare Tunnel (&lt;code&gt;cloudflared&lt;/code&gt;), domain on Cloudflare DNS&lt;/td&gt;
&lt;td&gt;Free tunnel; a &lt;code&gt;.vn&lt;/code&gt; domain renews at about 470,000 VND (~$18) a year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-tenant subdomains&lt;/td&gt;
&lt;td&gt;Wildcard DNS &lt;code&gt;*.yourdomain&lt;/code&gt; routed through the same tunnel&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Gmail SMTP with an App Password&lt;/td&gt;
&lt;td&gt;Free (daily sending limit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backups&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pg_dump&lt;/code&gt; before every database migration&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73e0acr71q2qvlcs3538.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73e0acr71q2qvlcs3538.png" alt="Diagram: students reach Cloudflare over HTTPS, and cloudflared on the home laptop connects outbound to Cloudflare, then forwards to Node.js and PostgreSQL" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Cloudflare Tunnel works (and why it beats port forwarding)
&lt;/h2&gt;

&lt;p&gt;A tunnel flips the usual model. Instead of opening a port on your router and pointing DNS at your home IP, a small program called &lt;code&gt;cloudflared&lt;/code&gt; runs on your PC and opens an &lt;strong&gt;outbound&lt;/strong&gt; connection to Cloudflare. Visitors hit Cloudflare, and Cloudflare sends the request down that connection to your local app.&lt;/p&gt;

&lt;p&gt;That gives you three things for free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No open ports.&lt;/strong&gt; Your router stays closed; nothing scans your home IP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS handled for you.&lt;/strong&gt; Cloudflare terminates TLS with its own certificate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A stable address.&lt;/strong&gt; It does not matter if your ISP changes your home IP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I created the tunnel in the dashboard (Zero Trust → Networks → Tunnels), copied its token, and installed &lt;code&gt;cloudflared&lt;/code&gt; as a Windows service from an Administrator prompt, so it starts with Windows even before anyone logs in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared.exe service &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;YOUR_TUNNEL_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the tunnel's &lt;strong&gt;Public Hostname&lt;/strong&gt; settings, both &lt;code&gt;yourdomain.com&lt;/code&gt; and &lt;code&gt;*.yourdomain.com&lt;/code&gt; point to &lt;code&gt;http://localhost:3000&lt;/code&gt;. The wildcard is what lets every school get its own subdomain without touching DNS again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making Node.js use the whole CPU
&lt;/h2&gt;

&lt;p&gt;A single Node.js process uses one CPU core. On a 4-thread laptop CPU that leaves most of the machine idle, so the app starts through Node's built-in &lt;code&gt;cluster&lt;/code&gt; module with one worker per CPU thread:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cluster&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:cluster&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;os&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:os&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isPrimary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;availableParallelism&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;exit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// restart a crashed worker&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// the normal Express server&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One catch: each worker has its own in-memory cache. When an admin changes something, the other workers do not know. I solved it with PostgreSQL's built-in &lt;code&gt;LISTEN/NOTIFY&lt;/code&gt;: the worker that writes sends a notification, and every worker clears that cache key. No Redis needed.&lt;/p&gt;

&lt;p&gt;Two more settings mattered behind Cloudflare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turn off gzip in Node.&lt;/strong&gt; Cloudflare already compresses responses, and compressing in Node competes with password hashing for the same thread pool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust the proxy.&lt;/strong&gt; Set Express &lt;code&gt;trust proxy&lt;/code&gt; so rate limits and logs see the visitor's IP, not Cloudflare's.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real load test: 1,000 users on a 2016 laptop CPU
&lt;/h2&gt;

&lt;p&gt;Exams are the worst case for my app: hundreds of students arrive in the same minute, then save answers every few seconds. My load-test script simulates exactly that: each virtual user opens the exam, saves a draft three times, submits, and opens the results and the leaderboard. The database and the load generator ran on the same laptop as the app, so the numbers are on the pessimistic side.&lt;/p&gt;

&lt;p&gt;First run, a single Node.js process, 1,000 users arriving over 30 seconds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1,000 guests taking a password-protected exam&lt;/td&gt;
&lt;td&gt;1,000/1,000 completed, 0 errors. p95: open exam 92 ms, save draft 100 ms, submit 95 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000 students registering, then taking the exam&lt;/td&gt;
&lt;td&gt;1,000/1,000 completed, 0 errors, but median registration took about 9 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The surprise was where the limit sits. It is not the database or Express; it is &lt;strong&gt;password hashing&lt;/strong&gt;. Each &lt;code&gt;scrypt&lt;/code&gt; hash takes around 80–100 ms of CPU on purpose (that is what makes stolen hashes expensive to crack). On two physical cores that caps the machine at roughly 20–25 logins per second, so a burst of 1,000 logins queues up no matter how fast the rest of the app is.&lt;/p&gt;

&lt;p&gt;Switching to cluster mode (4 workers) and replaying 1,000 student logins over 20 seconds showed the trade-off clearly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hashes per worker at once&lt;/th&gt;
&lt;th&gt;Median login&lt;/th&gt;
&lt;th&gt;Median for every other page&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;17 s&lt;/td&gt;
&lt;td&gt;60 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;13 s&lt;/td&gt;
&lt;td&gt;300 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I kept one hash per worker: logins wait a bit longer, but students already in the exam stay fast. The practical fix is operational, not technical: ask students to log in 5–10 minutes before the exam (sessions last 7 days), and if you expect bigger spikes, you need more cores, not a faster database.&lt;/p&gt;

&lt;p&gt;PostgreSQL itself needed only light tuning: I raised &lt;code&gt;shared_buffers&lt;/code&gt; to 512 MB with &lt;code&gt;ALTER SYSTEM&lt;/code&gt; (a restart is required) and pointed the app at &lt;code&gt;127.0.0.1&lt;/code&gt; instead of &lt;code&gt;localhost&lt;/code&gt; to skip a DNS lookup on Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it really costs per month
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hardware&lt;/td&gt;
&lt;td&gt;$0 (already owned)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electricity&lt;/td&gt;
&lt;td&gt;About 11 kWh (a laptop averaging ~15 W × 24 h × 30 days). At Vietnam's household rates from November 2026 (1,901–3,844 VND/kWh plus 10% VAT), that is 23,000–46,000 VND, roughly &lt;strong&gt;$1–2&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet&lt;/td&gt;
&lt;td&gt;$0 extra (existing home plan; I measured about 30 Mbit/s upload, plenty for an API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Tunnel + DNS&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;About &lt;strong&gt;$1.50&lt;/strong&gt; (~$18 a year for a &lt;code&gt;.vn&lt;/code&gt;; a &lt;code&gt;.com&lt;/code&gt; at Cloudflare Registrar is cheaper)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;About $3 a month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For comparison, the cheapest VPS options I checked on November 8, 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Specs&lt;/th&gt;
&lt;th&gt;Price/month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Basic Droplet&lt;/td&gt;
&lt;td&gt;1 vCPU, 1 GiB RAM, 25 GiB SSD&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CPX02 (EU)&lt;/td&gt;
&lt;td&gt;1 vCPU, 1 GB RAM, 20 GB NVMe&lt;/td&gt;
&lt;td&gt;€6.49 (+VAT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leanstack.pages.dev/go/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;KVM 1&lt;/td&gt;
&lt;td&gt;1 vCPU, 4 GB RAM, 50 GB NVMe&lt;/td&gt;
&lt;td&gt;$6.49 intro with 24-month prepay, renews at $11.99&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of those 1-vCPU plans would match the 4 threads of an old laptop CPU for the login-heavy workload above.&lt;/p&gt;

&lt;h2&gt;
  
  
  The risks nobody mentions (and the ones that hit me)
&lt;/h2&gt;

&lt;p&gt;Home hosting is cheap because &lt;strong&gt;you&lt;/strong&gt; are the operations team. These are the risks to plan for:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fth3pqfr6cji20tajl3se.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fth3pqfr6cji20tajl3se.png" alt="Timeline of 12 days in production: online the whole time except two outages caused by the laptop going to sleep, 43 minutes on October 28 and 11 hours 9 minutes on November 7" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sleep, not power cuts, took my app down.&lt;/strong&gt; A laptop battery is a built-in UPS, and &lt;code&gt;cloudflared&lt;/code&gt; ran as a Windows service while the app started from a shortcut in the Startup folder. But the laptop's power plan still allowed sleep, and it went to sleep twice: &lt;strong&gt;43 minutes on the morning of October 28&lt;/strong&gt; and &lt;strong&gt;about 11 hours overnight on November 7&lt;/strong&gt;. That is roughly 12 hours of downtime in 12 days, or about 96% uptime. Set sleep to &lt;em&gt;Never&lt;/em&gt; on both battery and AC on day one (&lt;code&gt;powercfg /change standby-timeout-ac 0&lt;/code&gt; and &lt;code&gt;standby-timeout-dc 0&lt;/code&gt;), and set Windows Update active hours so it does not reboot during exams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup folder is not a service.&lt;/strong&gt; A shortcut in the Startup folder only runs after a user logs in. After an unattended reboot, the tunnel service would come back on its own but the app would not until someone signed in. Use Task Scheduler ("At startup") or a service wrapper instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internet outages.&lt;/strong&gt; Your uptime equals your ISP's uptime. My connection did not drop once in those 12 days, but I had no plan B if it had.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backups are your job.&lt;/strong&gt; I took a &lt;code&gt;pg_dump -Fc&lt;/code&gt; before every migration and kept copies in a separate folder. A dead disk with no off-site copy means lost data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploys without downtime.&lt;/strong&gt; Building the frontend straight into the live folder causes a few seconds of 404s. I build into a new folder and swap it in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terms of service.&lt;/strong&gt; Some residential ISPs forbid running servers, and Cloudflare's terms limit serving large media through the free plan. Check both before you rely on this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security.&lt;/strong&gt; Only the app is published through the tunnel, never Remote Desktop or the database port. If you add an admin tool, protect it with Cloudflare Access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to move to a VPS (or a managed platform)
&lt;/h2&gt;

&lt;p&gt;Stay on the home PC while the app is a side project or an early pilot. Move when any of these become true:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;People pay you, or exams run on a fixed schedule.&lt;/strong&gt; An hour of downtime now costs money or trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You travel or cannot reach the PC quickly&lt;/strong&gt; to wake it up or fix a crash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need more than one machine&lt;/strong&gt;, for example a separate database server.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The simplest next step is a small VPS: copy the same Node + Postgres setup, keep Cloudflare Tunnel (it works the same on Linux), and nothing changes for your users. A &lt;a href="https://leanstack.pages.dev/go/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; Droplet or a &lt;a href="https://leanstack.pages.dev/go/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; server is enough for an app of this size; check the CPU count if logins are your bottleneck like mine.&lt;/p&gt;

&lt;p&gt;If you would rather not manage a server at all, platforms like &lt;a href="https://leanstack.pages.dev/go/railway" rel="noopener noreferrer"&gt;Railway&lt;/a&gt; or &lt;a href="https://leanstack.pages.dev/go/render" rel="noopener noreferrer"&gt;Render&lt;/a&gt; run the app for you, and &lt;a href="https://leanstack.pages.dev/go/neon" rel="noopener noreferrer"&gt;Neon&lt;/a&gt; offers managed Postgres with a free tier. You trade a higher monthly bill for no maintenance. I compare these options with real prices in &lt;a href="https://leanstack.pages.dev/posts/cheapest-way-to-host-nodejs-postgres-app/" rel="noopener noreferrer"&gt;Cheapest Way to Host a Node.js + Postgres App in 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I moved to: Google Cloud's free e2-micro
&lt;/h2&gt;

&lt;p&gt;After the 11-hour outage I moved the app to Google Cloud's &lt;strong&gt;Always Free e2-micro&lt;/strong&gt; VM in Oregon (&lt;code&gt;us-west1&lt;/code&gt;): 2 shared vCPUs, 1 GB RAM and a 30 GB standard persistent disk, all inside the free allowance. Moving took a few hours, one night:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debian 12 with PostgreSQL 16 and Node.js 22, plus a 2 GB swap file because 1 GB of RAM is tight.&lt;/li&gt;
&lt;li&gt;Postgres scaled down for the small machine: &lt;code&gt;shared_buffers = 128MB&lt;/code&gt;, &lt;code&gt;max_connections = 40&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same Cloudflare Tunnel&lt;/strong&gt;, so the VM has no open web ports either. Switching over was: uninstall the tunnel service on the laptop, restore the last &lt;code&gt;pg_dump&lt;/code&gt; on the VM, start the tunnel there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the app, Postgres and &lt;code&gt;cloudflared&lt;/code&gt; running, &lt;code&gt;free -m&lt;/code&gt; on the VM shows &lt;strong&gt;519 MB used of 969 MB&lt;/strong&gt;, with 32 MB of swap in use and 4.8 GB of the 30 GB disk used. The trade-offs: the e2-micro's CPU is shared and much weaker than the laptop for a burst of logins, Oregon is far from my users in Vietnam, and only 1 GB of egress per month is free, so Cloudflare's caching matters. For now, an app that never sleeps beats an app that is fast but sometimes offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  My verdict
&lt;/h2&gt;

&lt;p&gt;For a small Node.js + PostgreSQL app, a home PC with Cloudflare Tunnel is a legitimate way to start, not just a toy: about $3 a month, secure by default, and fast enough for 1,000 simulated students on a laptop CPU from 2016. The trade-off is that uptime and backups are entirely on you. Start here, measure, and move the day an outage would cost more than the server.&lt;/p&gt;

&lt;p&gt;Would I do it again? Yes: 12 days at home showed me my real bottleneck (password hashing, not the database) before I paid for anything. The first thing I would change is disabling sleep on day one; it caused all of my downtime.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Some links are affiliate links; see the &lt;a href="https://leanstack.pages.dev/disclosure/" rel="noopener noreferrer"&gt;disclosure&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>postgres</category>
      <category>cloudflare</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
