<?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: Vpsfordev</title>
    <description>The latest articles on DEV Community by Vpsfordev (@vpsfordev).</description>
    <link>https://dev.to/vpsfordev</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%2F3963036%2F6dd5f64a-a79d-4f47-b644-7815cafb4604.png</url>
      <title>DEV Community: Vpsfordev</title>
      <link>https://dev.to/vpsfordev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vpsfordev"/>
    <language>en</language>
    <item>
      <title>Linode became Akamai Cloud — is it still worth it for Node.js in 2026?</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Mon, 26 Oct 2026 14:02:06 +0000</pubDate>
      <link>https://dev.to/vpsfordev/linode-became-akamai-cloud-is-it-still-worth-it-for-nodejs-in-2026-51j3</link>
      <guid>https://dev.to/vpsfordev/linode-became-akamai-cloud-is-it-still-worth-it-for-nodejs-in-2026-51j3</guid>
      <description>&lt;p&gt;Linode has a 15+ year reputation for being the "boring, reliable" VPS choice. Since the Akamai acquisition in 2022, pricing has crept up and the UI got more enterprise-flavored. For a new Node.js project in 2026, is there still a reason to pick it over Hetzner or DigitalOcean?&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing (2026)
&lt;/h2&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;Storage&lt;/th&gt;
&lt;th&gt;Transfer&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;Nanode 1GB&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;25 GB SSD&lt;/td&gt;
&lt;td&gt;1 TB&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode 2GB&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;50 GB SSD&lt;/td&gt;
&lt;td&gt;2 TB&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode 4GB&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB SSD&lt;/td&gt;
&lt;td&gt;4 TB&lt;/td&gt;
&lt;td&gt;~$18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode 8GB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;160 GB SSD&lt;/td&gt;
&lt;td&gt;5 TB&lt;/td&gt;
&lt;td&gt;$48&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The one number that stands out: transfer allowances. 1–5 TB included vs the 1 TB that's typical everywhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;Standard plans run Intel Xeon with regular SSD — not NVMe. That shows up clearly in disk-bound benchmarks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Linode 4GB&lt;/th&gt;
&lt;th&gt;Hetzner CX22&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Express API (light load)&lt;/td&gt;
&lt;td&gt;11–20ms&lt;/td&gt;
&lt;td&gt;8–15ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk read (sequential)&lt;/td&gt;
&lt;td&gt;~400 MB/s&lt;/td&gt;
&lt;td&gt;~2,000 MB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price/month&lt;/td&gt;
&lt;td&gt;~$18&lt;/td&gt;
&lt;td&gt;~€4.35&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CPU and network are perfectly adequate for a typical Node.js API — most workloads are network-bound, not disk-bound, so this matters less day-to-day than the benchmark gap suggests. NVMe is only available on Linode's premium tiers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Akamai actually brings to the table
&lt;/h2&gt;

&lt;p&gt;Akamai's backbone means genuinely solid peering and low-latency routing across 20+ regions, plus CDN integration if your app needs it. The flip side: pricing has moved up since the acquisition, and the dashboard now carries more enterprise cruft than the old Linode UI did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is actually for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Existing Linode users — no compelling reason to migrate if things already work&lt;/li&gt;
&lt;li&gt;✅ Projects that will burn through transfer quota — the included bandwidth is the best in this comparison&lt;/li&gt;
&lt;li&gt;✅ Teams that value documentation — Linode's Node.js + PM2 + Nginx guide is one of the better ones in the industry&lt;/li&gt;
&lt;li&gt;❌ New projects optimizing purely for price-per-spec — Hetzner wins here&lt;/li&gt;
&lt;li&gt;❌ Disk-intensive workloads on standard (non-premium) tiers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;If you're already on Linode, the Akamai rebrand isn't a reason to leave. If you're starting fresh in 2026 and comparing providers from zero, Hetzner or DigitalOcean are the more obvious defaults — Linode/Akamai earns its spot specifically when transfer allowance or Akamai's CDN integration matters to you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full benchmarks, region list, and Node.js setup steps at &lt;a href="https://vpsfor.dev/posts/linode-akamai-vps-nodejs-review-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>PHP2Shell: if you use aaPanel, apt upgrade won't patch you</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Fri, 23 Oct 2026 14:05:12 +0000</pubDate>
      <link>https://dev.to/vpsfordev/php2shell-if-you-use-aapanel-apt-upgrade-wont-patch-you-52j</link>
      <guid>https://dev.to/vpsfordev/php2shell-if-you-use-aapanel-apt-upgrade-wont-patch-you-52j</guid>
      <description>&lt;p&gt;On 21 October the PHP project shipped emergency releases for &lt;strong&gt;CVE-2026-109618&lt;/strong&gt; and &lt;strong&gt;CVE-2026-109619&lt;/strong&gt; ("PHP2Shell" in the press — PHP itself doesn't use that name). Both allow &lt;strong&gt;unauthenticated remote code execution&lt;/strong&gt; on any PHP that serves web requests: PHP-FPM, &lt;code&gt;mod_php&lt;/code&gt;, &lt;code&gt;php-cgi&lt;/code&gt;, FrankenPHP, LiteSpeed. A proof-of-concept leaked early.&lt;/p&gt;

&lt;p&gt;Fixed versions: &lt;strong&gt;8.5.12, 8.4.27, 8.3.36, 8.2.35&lt;/strong&gt;. PHP 8.1 and older get no official fix.&lt;/p&gt;

&lt;p&gt;Most coverage stops there. Here's the part that bit a server I checked this week.&lt;/p&gt;

&lt;h2&gt;
  
  
  The aaPanel / BaoTa trap
&lt;/h2&gt;

&lt;p&gt;apt on that box showed two PHPs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bt-php81/now 8.1.13 amd64 [installed,local]
php8.1-cli/now 8.1.31-1+ubuntu20.04.1+deb.sury.org+1 amd64 [installed,upgradable to: 8.1.32...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The one actually serving the websites was the panel's:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php-fpm: master process (/www/server/php/81/etc/php-fpm.conf)
PHP 8.1.13 (cli) (built: Dec  1 2022 08:28:57) (NTS)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;aaPanel compiles its own PHP into &lt;code&gt;/www/server/php/&amp;lt;version&amp;gt;/&lt;/code&gt;. apt sees it as a &lt;code&gt;local&lt;/code&gt; package and &lt;strong&gt;&lt;code&gt;apt upgrade&lt;/code&gt; never touches it&lt;/strong&gt;. A December 2022 PHP build, behind public Nginx on 80/443 — and no amount of apt upgrading would have changed that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your server in 2 minutes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Anything serving PHP?&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"php-fpm|php-cgi|apache2|httpd"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt;

&lt;span class="c"&gt;# apt-installed PHP&lt;/span&gt;
apt list &lt;span class="nt"&gt;--installed&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; php

&lt;span class="c"&gt;# Panel-installed PHP (aaPanel/BaoTa)&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;v &lt;span class="k"&gt;in&lt;/span&gt; /www/server/php/&lt;span class="k"&gt;*&lt;/span&gt;/bin/php&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$v&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything below the fixed versions is vulnerable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't need PHP?&lt;/strong&gt; Stop and disable it (&lt;code&gt;sudo systemctl disable --now php8.1-fpm&lt;/code&gt;, or stop it in the panel). Many "Node.js-only" servers still run PHP from an old WordPress, phpMyAdmin, or a panel default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;apt PHP:&lt;/strong&gt; upgrade, then verify the package actually mentions the fix instead of assuming:
&lt;code&gt;apt changelog php8.3-fpm 2&amp;gt;/dev/null | grep -E "CVE-2026-10961[89]"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aaPanel:&lt;/strong&gt; install PHP 8.3/8.4 from the App Store, check &lt;code&gt;/www/server/php/83/bin/php -v&lt;/code&gt; is &lt;strong&gt;≥ 8.3.36 / 8.4.27&lt;/strong&gt;, switch each site, then remove 8.1.&lt;/li&gt;
&lt;li&gt;Snapshot the server first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Patching doesn't remove anything an attacker already dropped, so also look for PHP files modified since 20 Oct and processes running as your web user that aren't PHP-FPM.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full guide — reachability checks, the official temporary mitigations (and why one of them can take down a small VPS), and a compromise checklist: &lt;a href="https://vpsfor.dev/posts/php2shell-vps-check-patch-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>security</category>
      <category>devops</category>
      <category>linux</category>
    </item>
    <item>
      <title>Vultr has 32 regions for Node.js — here's when that actually beats Hetzner</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:37:36 +0000</pubDate>
      <link>https://dev.to/vpsfordev/vultr-has-32-regions-for-nodejs-heres-when-that-actually-beats-hetzner-3ll1</link>
      <guid>https://dev.to/vpsfordev/vultr-has-32-regions-for-nodejs-heres-when-that-actually-beats-hetzner-3ll1</guid>
      <description>&lt;p&gt;Hetzner wins almost every VPS price comparison for Node.js — but only if your users are in Europe or North America. If your API needs to be fast in Tokyo, Seoul, or Johannesburg, Hetzner's 5 regions don't help you. That's where Vultr's 32 datacenters change the calculus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing (2026)
&lt;/h2&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;Storage&lt;/th&gt;
&lt;th&gt;Bandwidth&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;1 vCPU&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;25 GB NVMe&lt;/td&gt;
&lt;td&gt;1 TB&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 vCPU&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;55 GB NVMe&lt;/td&gt;
&lt;td&gt;2 TB&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB NVMe&lt;/td&gt;
&lt;td&gt;3 TB&lt;/td&gt;
&lt;td&gt;$24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 vCPU&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;160 GB NVMe&lt;/td&gt;
&lt;td&gt;4 TB&lt;/td&gt;
&lt;td&gt;$48&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;NVMe on every tier is worth noting — DigitalOcean only gives you that on Premium plans, not Basic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Vultr (AMD HF)&lt;/th&gt;
&lt;th&gt;Hetzner CX22&lt;/th&gt;
&lt;th&gt;DO Basic 4GB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Express API (light load)&lt;/td&gt;
&lt;td&gt;9–16ms&lt;/td&gt;
&lt;td&gt;8–15ms&lt;/td&gt;
&lt;td&gt;10–18ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk read (sequential NVMe)&lt;/td&gt;
&lt;td&gt;~1,500 MB/s&lt;/td&gt;
&lt;td&gt;~2,000 MB/s&lt;/td&gt;
&lt;td&gt;~500 MB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price/month (2 vCPU/4GB)&lt;/td&gt;
&lt;td&gt;$24&lt;/td&gt;
&lt;td&gt;~€4.35&lt;/td&gt;
&lt;td&gt;$24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a region Hetzner and DigitalOcean both cover, Hetzner still wins on price-per-spec. The reason to pick Vultr isn't raw performance — it's reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The region list that matters
&lt;/h2&gt;

&lt;p&gt;32 datacenters including Tokyo, Seoul, Singapore, Mumbai, São Paulo, Mexico City, Johannesburg, and Sydney — on top of the usual US/EU spread. If your API serves APAC or LATAM users, this is one of the few budget providers with dedicated hardware there instead of routing through a single regional hub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is actually for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Apps needing low latency to Asia-Pacific, Africa, or Latin America specifically&lt;/li&gt;
&lt;li&gt;✅ Multi-region deployments — consistent pricing and NVMe across every datacenter&lt;/li&gt;
&lt;li&gt;✅ Short-lived workloads — hourly billing on every plan&lt;/li&gt;
&lt;li&gt;❌ Pure EU/US budget optimization — Hetzner wins on price-per-spec here&lt;/li&gt;
&lt;li&gt;❌ Teams that need first-class support — ticket response is inconsistent compared to DigitalOcean&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;Don't pick Vultr for Europe or North America unless hourly billing specifically matters to you — Hetzner is cheaper for the same specs. Pick it the moment your user base includes APAC, LATAM, or Africa, where it has datacenters competitors simply don't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full region list, benchmarks, and Node.js setup steps at &lt;a href="https://vpsfor.dev/posts/vultr-vps-nodejs-review-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>DigitalOcean costs 30-40% more than Hetzner for Node.js — is the premium worth it?</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Thu, 15 Oct 2026 12:50:28 +0000</pubDate>
      <link>https://dev.to/vpsfordev/digitalocean-costs-30-40-more-than-hetzner-for-nodejs-is-the-premium-worth-it-1i4b</link>
      <guid>https://dev.to/vpsfordev/digitalocean-costs-30-40-more-than-hetzner-for-nodejs-is-the-premium-worth-it-1i4b</guid>
      <description>&lt;p&gt;After benchmarking Hetzner vs DigitalOcean for Node.js, I kept getting the same question: "but what about support and dashboard UX?" Here's what the premium actually buys you, beyond the spec sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing (2026)
&lt;/h2&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;Storage&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;Basic 1GB&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;25 GB SSD&lt;/td&gt;
&lt;td&gt;$6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic 2GB&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;50 GB SSD&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic 4GB&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB SSD&lt;/td&gt;
&lt;td&gt;$24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic 8GB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;160 GB SSD&lt;/td&gt;
&lt;td&gt;$48&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hetzner CX22 (2 vCPU, 4GB) runs ~€4.35/mo. DigitalOcean's equivalent Basic 4GB is $24/mo — roughly 5x. Premium AMD droplets (NVMe, dedicated thread) cost ~2x the Basic tier on top of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the premium actually buys you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live chat support that responds.&lt;/strong&gt; This is the real differentiator — tickets get answered in minutes, not the 24-48h typical of budget providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dashboard that doesn't fight you.&lt;/strong&gt; Droplet creation, snapshots, firewalls — all obvious without reading docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 1-Click Node.js Marketplace image&lt;/strong&gt; that pre-installs Node, PM2, and Nginx — saves roughly 15 minutes on initial setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed databases, load balancers, and S3-compatible Spaces&lt;/strong&gt; in the same dashboard if you need them later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it doesn't buy you
&lt;/h2&gt;

&lt;p&gt;Basic plans use shared Intel CPUs with regular SSD, not NVMe — NVMe only comes on Premium droplets. Disk throughput on Basic was clearly the weak point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;DigitalOcean Basic 4GB&lt;/th&gt;
&lt;th&gt;Hetzner CX22&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Express API (light load, EU)&lt;/td&gt;
&lt;td&gt;10–18ms&lt;/td&gt;
&lt;td&gt;8–15ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk read (sequential)&lt;/td&gt;
&lt;td&gt;~500 MB/s&lt;/td&gt;
&lt;td&gt;~2,000 MB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price/month&lt;/td&gt;
&lt;td&gt;$24&lt;/td&gt;
&lt;td&gt;~€4.35&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Premium AMD droplets close most of that gap, but then you're paying closer to 6-7x Hetzner's price for comparable performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is actually for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ You're new to VPS and don't want to debug SSH/firewall issues solo&lt;/li&gt;
&lt;li&gt;✅ Client work where "who do we call at 2am" needs a real answer&lt;/li&gt;
&lt;li&gt;✅ Short-lived environments — hourly billing is available&lt;/li&gt;
&lt;li&gt;✅ You'll actually use managed databases or load balancers later&lt;/li&gt;
&lt;li&gt;❌ Pure budget optimization — Hetzner or Contabo give more spec per dollar&lt;/li&gt;
&lt;li&gt;❌ Disk-heavy workloads on Basic plans specifically&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;The premium is real, and for client work where support response time matters, I'd pay it again. If you're a solo dev optimizing your own side project's bill, it's genuinely hard to justify over Hetzner on specs alone — the thing you're paying for is the safety net, not the hardware.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full benchmarks, regions, and Node.js setup steps at &lt;a href="https://vpsfor.dev/posts/digitalocean-vps-nodejs-review-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Contabo gives you 8GB RAM for $7/mo — I tested if the catch is real</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Sun, 11 Oct 2026 13:08:19 +0000</pubDate>
      <link>https://dev.to/vpsfordev/contabo-gives-you-8gb-ram-for-7mo-i-tested-if-the-catch-is-real-42cf</link>
      <guid>https://dev.to/vpsfordev/contabo-gives-you-8gb-ram-for-7mo-i-tested-if-the-catch-is-real-42cf</guid>
      <description>&lt;p&gt;Every time Contabo comes up in a VPS thread, someone says "there has to be a catch at that price." 8GB RAM, 6 vCPU, 200GB NVMe for ~$15/mo is roughly half what Hetzner charges for similar specs. Here's what the numbers actually look like once you dig past the spec sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing (2026)
&lt;/h2&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;Storage&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;VPS S&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;100 GB NVMe&lt;/td&gt;
&lt;td&gt;~$7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPS M&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;200 GB NVMe&lt;/td&gt;
&lt;td&gt;~$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPS L&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30 GB&lt;/td&gt;
&lt;td&gt;400 GB NVMe&lt;/td&gt;
&lt;td&gt;~$27&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For comparison, DigitalOcean charges $48/mo for 4 vCPU + 8GB. Contabo's VPS S gives you the same RAM for $7. That's not a typo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the catch actually is
&lt;/h2&gt;

&lt;p&gt;It's not the hardware — NVMe is on every plan, and raw specs are genuinely generous. The catches are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Support is slow.&lt;/strong&gt; 24–48h ticket response time. No live chat. If something breaks at 2am, you're waiting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network is noisier.&lt;/strong&gt; Budget tiers share bandwidth more aggressively than Hetzner or DigitalOcean — expect occasional latency spikes during peak EU hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No hourly billing.&lt;/strong&gt; Monthly only — can't spin up and tear down for quick tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the benchmarks show
&lt;/h2&gt;

&lt;p&gt;Running a simple Express API on the VPS S tier:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Contabo VPS S&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Express API response (EU)&lt;/td&gt;
&lt;td&gt;12–18ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk read (sequential NVMe)&lt;/td&gt;
&lt;td&gt;~1,200 MB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js cold start&lt;/td&gt;
&lt;td&gt;~180ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uptime over the test period&lt;/td&gt;
&lt;td&gt;99.94%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CPU is "good for the price" rather than best-in-class — there's some variance depending on which physical host you land on, which is the usual tradeoff with oversubscribed budget CPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this actually makes sense for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Side projects and bots where RAM headroom matters more than raw speed&lt;/li&gt;
&lt;li&gt;✅ Self-hosted tools (n8n, Grafana, small databases) that want breathing room&lt;/li&gt;
&lt;li&gt;✅ Anyone who doesn't need sub-10ms response times or instant support&lt;/li&gt;
&lt;li&gt;❌ Production apps where a 24h support SLA is a problem&lt;/li&gt;
&lt;li&gt;❌ Latency-sensitive workloads (WebSockets, real-time APIs)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;If you're running Node.js APIs or self-hosted tools and support speed isn't critical, Contabo is genuinely hard to beat on specs-per-dollar. I wouldn't put a client's production app on it without a monitoring + alerting setup you trust, but for personal projects and bots it's been solid.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full benchmark details, region list, and setup steps at &lt;a href="https://vpsfor.dev/posts/contabo-vps-review-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>I set up a Node.js production server on Hetzner CX22 for €4.35/mo — here's exactly what I ran</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Fri, 19 Jun 2026 14:51:18 +0000</pubDate>
      <link>https://dev.to/vpsfordev/i-set-up-a-nodejs-production-server-on-hetzner-cx22-for-eu435mo-heres-exactly-what-i-ran-2gp8</link>
      <guid>https://dev.to/vpsfordev/i-set-up-a-nodejs-production-server-on-hetzner-cx22-for-eu435mo-heres-exactly-what-i-ran-2gp8</guid>
      <description>&lt;p&gt;Most Node.js hosting guides assume you're using DigitalOcean or AWS. I switched to Hetzner CX22 (€4.35/mo, 2 vCPU, 4GB RAM) and it's been running production workloads for months without a single issue.&lt;/p&gt;

&lt;p&gt;Here's the exact setup I use — no fluff, just the commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Hetzner CX22
&lt;/h2&gt;

&lt;p&gt;A 4GB DigitalOcean droplet costs ~$24/month. The Hetzner CX22 with identical specs costs &lt;strong&gt;€4.35/month&lt;/strong&gt;. I ran &lt;a href="https://vpsfor.dev/posts/hetzner-vs-digitalocean-nodejs-benchmarks-2026/" rel="noopener noreferrer"&gt;benchmarks with autocannon&lt;/a&gt; — Hetzner is actually ~3.5% faster. So it's cheaper AND faster. The only trade-off is ticket-only support.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup (in order)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a non-root user immediately
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Login as root (first and only time)&lt;/span&gt;
ssh root@YOUR_SERVER_IP

adduser deploy
usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;deploy
rsync &lt;span class="nt"&gt;--archive&lt;/span&gt; &lt;span class="nt"&gt;--chown&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deploy:deploy ~/.ssh /home/deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never run Node.js as root. This takes 30 seconds and saves you from a class of security issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Firewall on, then forget about it
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ufw &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow OpenSSH
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 80/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 443/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All ports closed except 22, 80, 443. Hetzner servers are fully open by default — this step is not optional.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Node.js via nvm (not apt)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
nvm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--lts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;apt install nodejs&lt;/code&gt; gives you an outdated version. nvm gives you the current LTS without sudo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Swap file before anything else
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fallocate &lt;span class="nt"&gt;-l&lt;/span&gt; 2G /swapfile
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /swapfile
&lt;span class="nb"&gt;sudo &lt;/span&gt;mkswap /swapfile
&lt;span class="nb"&gt;sudo &lt;/span&gt;swapon /swapfile
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'/swapfile none swap sw 0 0'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a 4GB VPS, &lt;code&gt;npm install&lt;/code&gt; during a deploy can spike RAM by 30-50%. Without swap, it OOM-kills your running app mid-deploy. I learned this the hard way.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. PM2 with memory limits
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ecosystem.config.js&lt;/code&gt; for a 2-core server:&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./dist/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// one per core&lt;/span&gt;
    &lt;span class="na"&gt;exec_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cluster&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_memory_restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;350M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;node_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--max-old-space-size=320&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;env_production&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;NODE_ENV&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--max-old-space-size&lt;/code&gt; flag is critical. Without it, V8 can claim up to 1.5GB on a 4GB machine and crash the server. Two workers × 350MB = 700MB max, leaving ~90MB headroom for the OS.&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 ecosystem.config.js &lt;span class="nt"&gt;--env&lt;/span&gt; production
pm2 save
pm2 startup  &lt;span class="c"&gt;# run the command it prints&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Nginx + free SSL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx certbot python3-certbot-nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/etc/nginx/sites-available/my-app&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;yourdomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;'upgrade'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_cache_bypass&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certbot handles HTTPS config and sets up auto-renewal. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Total time
&lt;/h2&gt;

&lt;p&gt;From fresh server to HTTPS Node.js app: &lt;strong&gt;~25 minutes&lt;/strong&gt; the first time, ~10 minutes once you know the commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set up SSH key auth only&lt;/strong&gt; (&lt;code&gt;PasswordAuthentication no&lt;/code&gt; in sshd_config) — I skipped this once and had 2,000 failed login attempts in the logs within an hour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor with &lt;code&gt;pm2 monit&lt;/code&gt;&lt;/strong&gt; before assuming things are fine — one of my workers had a memory leak that only showed up under load&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Full step-by-step guide with exact commands at &lt;a href="https://vpsfor.dev/posts/hetzner-cx22-setup-guide-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How many Node.js apps can you run on a 2-core 1GB VPS with PM2? (The math)</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Wed, 03 Jun 2026 16:06:42 +0000</pubDate>
      <link>https://dev.to/vpsfordev/how-many-nodejs-apps-can-you-run-on-a-2-core-1gb-vps-with-pm2-the-math-ec4</link>
      <guid>https://dev.to/vpsfordev/how-many-nodejs-apps-can-you-run-on-a-2-core-1gb-vps-with-pm2-the-math-ec4</guid>
      <description>&lt;p&gt;Every indie hacker running on a $5 VPS has asked this question. The answer depends entirely on what kind of apps you're running — and most guides skip the actual math.&lt;/p&gt;

&lt;p&gt;Here's the breakdown I wish I had when I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your real available RAM is not 1GB
&lt;/h2&gt;

&lt;p&gt;The OS and PM2 daemon eat RAM before your app runs a single line of code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;RAM Used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 22.04 (minimal)&lt;/td&gt;
&lt;td&gt;~180MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PM2 daemon&lt;/td&gt;
&lt;td&gt;~30MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Available for your apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~790MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So you're working with ~790MB, not 1024MB. Now let's see what fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  App capacity by type
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App Type&lt;/th&gt;
&lt;th&gt;Idle RAM&lt;/th&gt;
&lt;th&gt;Under Load&lt;/th&gt;
&lt;th&gt;Max Apps on 2-core 1GB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simple bot / webhook&lt;/td&gt;
&lt;td&gt;60–90MB&lt;/td&gt;
&lt;td&gt;~120MB&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;6–8 apps&lt;/strong&gt; (fork mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard REST API (Express/Fastify)&lt;/td&gt;
&lt;td&gt;80–120MB&lt;/td&gt;
&lt;td&gt;~200MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2–3 apps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js / Nuxt SSR&lt;/td&gt;
&lt;td&gt;350–500MB&lt;/td&gt;
&lt;td&gt;600MB+&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 app only&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy AI / Discord bot&lt;/td&gt;
&lt;td&gt;600MB+&lt;/td&gt;
&lt;td&gt;OOM risk&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 app + swap&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "under load" column is what actually matters — idle numbers are misleading because Node.js apps spike heavily during deploys, GC cycles, and traffic bursts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option A: One API, full cluster mode (2 workers)
&lt;/h2&gt;

&lt;p&gt;If you have a single Node.js API and want to use both CPU cores:&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="c1"&gt;// ecosystem.config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./dist/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;// exactly 2 workers for a 2-core VPS&lt;/span&gt;
    &lt;span class="na"&gt;exec_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cluster&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_memory_restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;350M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;node_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--max-old-space-size=320&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;env_production&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;NODE_ENV&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 workers × 350MB limit = 700MB max, leaving ~90MB headroom. The &lt;code&gt;--max-old-space-size&lt;/code&gt; flag is critical — without it, V8 can claim up to 1.5GB and OOM-kill your server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option B: Multiple small apps, fork mode
&lt;/h2&gt;

&lt;p&gt;If you're hosting 2–3 separate projects on the same VPS:&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./api/dist/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;exec_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fork&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;max_memory_restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;250M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;node_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--max-old-space-size=200&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="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./worker/dist/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;exec_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fork&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;max_memory_restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;node_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--max-old-space-size=160&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="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two apps × ~200MB = 400MB used, ~390MB free for spikes. Fork mode is better here than cluster — each app runs independently, and a crash in one doesn't affect the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 things I learned the hard way
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Always create a swap file — it's not optional on 1GB&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fallocate &lt;span class="nt"&gt;-l&lt;/span&gt; 2G /swapfile
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /swapfile
mkswap /swapfile
swapon /swapfile
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'/swapfile none swap sw 0 0'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploys temporarily spike RAM usage by 30–50%. Without swap, a &lt;code&gt;npm install&lt;/code&gt; on a busy server will OOM-kill your running app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;max_memory_restart&lt;/code&gt; is a safety net, not a target&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If PM2 is regularly hitting the limit and restarting your app, that's a memory leak — fix the code, don't raise the limit. Use &lt;code&gt;pm2 monit&lt;/code&gt; to watch RSS (resident set size) over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Node.js v20+ saves you ~20% RAM for free&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern V8 engines use pointer compression by default on 64-bit systems, reducing heap object size significantly. If you're still on Node 16/18, upgrading alone might give you room for one more small app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quick decision guide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 production API&lt;/strong&gt; → cluster mode, 2 instances, &lt;code&gt;max_memory_restart: '350M'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 small projects&lt;/strong&gt; → fork mode, 1 instance each, &lt;code&gt;max_memory_restart: '250M'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3+ bots/webhooks&lt;/strong&gt; → fork mode, &lt;code&gt;max_memory_restart: '120M'&lt;/code&gt;, add swap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js SSR&lt;/strong&gt; → 1 app only, upgrade to 2GB RAM if possible&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Full PM2 ecosystem configs for 1GB, 2GB, and 4GB VPS tiers at &lt;a href="https://vpsfor.dev/posts/pm2-vps-optimization-guide-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I benchmarked Hetzner CX22 vs DigitalOcean for Node.js in 2026 — 5 cheaper, 4% slower</title>
      <dc:creator>Vpsfordev</dc:creator>
      <pubDate>Mon, 01 Jun 2026 16:27:02 +0000</pubDate>
      <link>https://dev.to/vpsfordev/i-benchmarked-hetzner-cx22-vs-digitalocean-for-nodejs-in-2026-5x-cheaper-4-slower-1j82</link>
      <guid>https://dev.to/vpsfordev/i-benchmarked-hetzner-cx22-vs-digitalocean-for-nodejs-in-2026-5x-cheaper-4-slower-1j82</guid>
      <description>&lt;p&gt;Most Node.js developers default to DigitalOcean because it's what every tutorial uses. I did too — until I checked the bill.&lt;/p&gt;

&lt;p&gt;A 4GB DigitalOcean Premium droplet costs &lt;strong&gt;$24/month&lt;/strong&gt;. A Hetzner CX22 with the same specs costs &lt;strong&gt;€4.35/month&lt;/strong&gt;. That's a 5× price difference. So I ran the benchmarks to find out what you actually give up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;code&gt;autocannon&lt;/code&gt; — 10 concurrent connections, 60-second sustained load&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; Standard Express.js API returning JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js v25 on Ubuntu 22.04&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiers compared:&lt;/strong&gt; Both at 2 vCPU / 4GB RAM (equivalent specs)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Throughput (requests per second)
&lt;/h3&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;RPS&lt;/th&gt;
&lt;th&gt;Price/mo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner&lt;/td&gt;
&lt;td&gt;CX22 (2 vCPU, 4GB)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,250&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~€4.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;Premium AMD (2 vCPU, 4GB)&lt;/td&gt;
&lt;td&gt;4,100&lt;/td&gt;
&lt;td&gt;~$24.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;Basic (1 vCPU, 2GB)&lt;/td&gt;
&lt;td&gt;2,300&lt;/td&gt;
&lt;td&gt;$6.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hetzner is &lt;strong&gt;~3.5% faster&lt;/strong&gt; than DigitalOcean Premium at the same spec tier. For a 5× price difference, that's not a typo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disk I/O — npm install speed
&lt;/h3&gt;

&lt;p&gt;Installing a real project with 300+ dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hetzner CX22:&lt;/strong&gt; 18.4 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DigitalOcean Premium:&lt;/strong&gt; 21.2 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hetzner uses NVMe over Fabrics (NVMe-oF) which consistently outperformed DO in sequential read/write tests with &lt;code&gt;fio&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bandwidth included
&lt;/h3&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;Included bandwidth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner CX22&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20 TB/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean Premium&lt;/td&gt;
&lt;td&gt;4 TB/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're serving large assets or have high-traffic APIs, this matters a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the price gap is this large
&lt;/h2&gt;

&lt;p&gt;Hetzner is a European DC operator with 30+ years in infrastructure. They don't have a venture-backed marketing budget or a $200M/year developer relations program. What they do have is AMD EPYC Milan/Genoa nodes, NVMe storage, and 20TB of transfer — at a price point that makes no sense until you use it.&lt;/p&gt;

&lt;p&gt;DigitalOcean Premium uses similar EPYC hardware, but you're paying for the platform: managed databases, one-click apps, a polished dashboard, live chat support, and 14+ global regions.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to pick which
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hetzner CX22&lt;/strong&gt; if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're comfortable with SSH, PM2, and Nginx&lt;/li&gt;
&lt;li&gt;Your users are in Europe or North America&lt;/li&gt;
&lt;li&gt;You want maximum Node.js throughput per euro&lt;/li&gt;
&lt;li&gt;You're a solo dev or small team that can handle their own incidents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DigitalOcean&lt;/strong&gt; if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need managed Postgres, Redis, or S3-compatible storage&lt;/li&gt;
&lt;li&gt;Your users are globally distributed (DO has 14+ regions vs Hetzner's 5)&lt;/li&gt;
&lt;li&gt;You need live chat support or hourly billing for ephemeral environments&lt;/li&gt;
&lt;li&gt;You're working with a team that can't deal with Linux emergencies at 2am&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The verdict
&lt;/h2&gt;

&lt;p&gt;For 90% of solo developers and early-stage startups, Hetzner CX22 is the better choice. You get equivalent raw performance for a fraction of the cost. The only real trade-offs are fewer regions and ticket-only support.&lt;/p&gt;

&lt;p&gt;I migrated a Node.js API from DigitalOcean Basic ($12/mo) to Hetzner CX22 (€4.35/mo) and saw slightly better response times with the same PM2 + Nginx setup. The monthly bill dropped by ~$8 for a server that's technically more capable.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full methodology, raw &lt;code&gt;fio&lt;/code&gt; and &lt;code&gt;autocannon&lt;/code&gt; output, and a complete setup guide at &lt;a href="https://vpsfor.dev/posts/hetzner-vs-digitalocean-nodejs-benchmarks-2026/" rel="noopener noreferrer"&gt;vpsfor.dev →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
