<?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: MASUD SUHANDI</title>
    <description>The latest articles on DEV Community by MASUD SUHANDI (@masud_suhandi_677020c7dab).</description>
    <link>https://dev.to/masud_suhandi_677020c7dab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3848553%2Ff5a6ad55-b1d6-4c5e-b2f8-6f43ecee4c12.jpg</url>
      <title>DEV Community: MASUD SUHANDI</title>
      <link>https://dev.to/masud_suhandi_677020c7dab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/masud_suhandi_677020c7dab"/>
    <language>en</language>
    <item>
      <title>Production VPS Security Architecture for Node.js &amp; Web3 Backends (WireGuard + auditd + Grafana Alerts)</title>
      <dc:creator>MASUD SUHANDI</dc:creator>
      <pubDate>Wed, 01 Apr 2026 22:21:56 +0000</pubDate>
      <link>https://dev.to/masud_suhandi_677020c7dab/production-vps-security-architecture-for-nodejs-web3-backends-wireguard-auditd-grafana-2e96</link>
      <guid>https://dev.to/masud_suhandi_677020c7dab/production-vps-security-architecture-for-nodejs-web3-backends-wireguard-auditd-grafana-2e96</guid>
      <description>&lt;p&gt;I recently documented my hardened VPS security architecture used for deploying production Node.js and Web3 backend services as a solo operator.&lt;/p&gt;

&lt;p&gt;The goal of this setup was simple:&lt;/p&gt;

&lt;p&gt;reduce attack surface&lt;br&gt;&lt;br&gt;
isolate administrative access&lt;br&gt;&lt;br&gt;
improve monitoring visibility&lt;br&gt;&lt;br&gt;
and keep infrastructure manageable without Kubernetes complexity&lt;/p&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/messut35/secure-nodejs-vps-architecture" rel="noopener noreferrer"&gt;https://github.com/messut35/secure-nodejs-vps-architecture&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;This VPS setup uses a layered security model:&lt;/p&gt;

&lt;p&gt;Internet&lt;br&gt;
↓&lt;br&gt;
Cloudflare (WAF + TLS + origin protection)&lt;br&gt;
↓&lt;br&gt;
Nginx reverse proxy&lt;br&gt;
↓&lt;br&gt;
Node.js services (PM2)&lt;/p&gt;

&lt;p&gt;Administrative access is separated using a private WireGuard access plane:&lt;/p&gt;

&lt;p&gt;Operator device&lt;br&gt;
↓&lt;br&gt;
WireGuard tunnel (10.77.0.0/24)&lt;br&gt;
↓&lt;br&gt;
Grafana / dashboards / internal services&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fclmldj0x8ift8nkcfl0j.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.amazonaws.com%2Fuploads%2Farticles%2Fclmldj0x8ift8nkcfl0j.png" alt=" " width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring Pipeline
&lt;/h2&gt;

&lt;p&gt;Security visibility is implemented using:&lt;/p&gt;

&lt;p&gt;auditd&lt;br&gt;
→ promtail&lt;br&gt;
→ Loki&lt;br&gt;
→ Grafana&lt;br&gt;
→ Telegram alerts&lt;/p&gt;

&lt;p&gt;This allows detecting:&lt;/p&gt;

&lt;p&gt;unexpected binary execution&lt;br&gt;&lt;br&gt;
privilege escalation attempts&lt;br&gt;&lt;br&gt;
configuration tampering&lt;br&gt;&lt;br&gt;
service access anomalies&lt;/p&gt;

&lt;h2&gt;
  
  
  Database Exposure Strategy
&lt;/h2&gt;

&lt;p&gt;Databases are not exposed publicly.&lt;/p&gt;

&lt;p&gt;PostgreSQL and Redis are bound to:&lt;/p&gt;

&lt;p&gt;localhost only&lt;/p&gt;

&lt;p&gt;This prevents lateral movement from external network surfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reverse Proxy Security Role
&lt;/h2&gt;

&lt;p&gt;Nginx acts as a segmentation layer between:&lt;/p&gt;

&lt;p&gt;public APIs&lt;br&gt;
and&lt;br&gt;
private infrastructure services&lt;/p&gt;

&lt;p&gt;Cloudflare origin protection ensures the VPS IP is not directly exposed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Threat Model Considerations
&lt;/h2&gt;

&lt;p&gt;This architecture mitigates common VPS risks:&lt;/p&gt;

&lt;p&gt;SSH brute force attacks&lt;br&gt;&lt;br&gt;
exposed admin dashboards&lt;br&gt;&lt;br&gt;
database exposure risks&lt;br&gt;&lt;br&gt;
reverse proxy misconfiguration&lt;br&gt;&lt;br&gt;
silent privilege escalation attempts  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why this setup?
&lt;/h2&gt;

&lt;p&gt;This architecture is designed for:&lt;/p&gt;

&lt;p&gt;solo operators&lt;br&gt;&lt;br&gt;
self-hosted SaaS builders&lt;br&gt;&lt;br&gt;
Node.js backend developers&lt;br&gt;&lt;br&gt;
Web3 payment infrastructure deployments  &lt;/p&gt;

&lt;p&gt;who want production-level security without introducing orchestration complexity.&lt;/p&gt;

&lt;p&gt;If you're running Node.js services directly on a VPS, I'd be curious how others structure their monitoring and admin-plane isolation strategies.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>node</category>
      <category>web3</category>
      <category>security</category>
    </item>
    <item>
      <title>How to Accept USDC Payments in Node.js Using Web3indo (Stripe-Style Crypto Checkout)</title>
      <dc:creator>MASUD SUHANDI</dc:creator>
      <pubDate>Sun, 29 Mar 2026 02:51:04 +0000</pubDate>
      <link>https://dev.to/masud_suhandi_677020c7dab/how-to-accept-usdc-payments-in-nodejs-using-web3indo-stripe-style-crypto-checkout-3mhn</link>
      <guid>https://dev.to/masud_suhandi_677020c7dab/how-to-accept-usdc-payments-in-nodejs-using-web3indo-stripe-style-crypto-checkout-3mhn</guid>
      <description>&lt;h1&gt;
  
  
  How to Accept USDC Payments in Node.js Using Web3indo (Stripe-Style Crypto Checkout)
&lt;/h1&gt;

&lt;p&gt;Accepting crypto payments in backend applications is still harder than it should be.&lt;/p&gt;

&lt;p&gt;If you try to build it yourself, you usually need to:&lt;/p&gt;

&lt;p&gt;– generate deposit wallets&lt;br&gt;&lt;br&gt;
– monitor blockchain transfers&lt;br&gt;&lt;br&gt;
– confirm ERC-20 events&lt;br&gt;&lt;br&gt;
– manage RPC reliability&lt;br&gt;&lt;br&gt;
– send webhook notifications&lt;br&gt;&lt;br&gt;
– sweep funds safely to treasury wallets  &lt;/p&gt;

&lt;p&gt;This quickly turns into infrastructure work instead of product work.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Web3indo&lt;/strong&gt; — a crypto payment infrastructure API designed for developers.&lt;/p&gt;

&lt;p&gt;This article shows how to accept USDC payments in a Node.js backend using a Stripe-style workflow.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Web3indo does
&lt;/h2&gt;

&lt;p&gt;Web3indo provides:&lt;/p&gt;

&lt;p&gt;– per-invoice deposit addresses&lt;br&gt;&lt;br&gt;
– automatic ERC-20 payment detection&lt;br&gt;&lt;br&gt;
– signed webhook delivery&lt;br&gt;&lt;br&gt;
– automatic treasury sweep&lt;br&gt;&lt;br&gt;
– project-scoped API keys  &lt;/p&gt;

&lt;p&gt;Currently supported:&lt;/p&gt;

&lt;p&gt;Ethereum (ETH)&lt;br&gt;&lt;br&gt;
USDC&lt;br&gt;&lt;br&gt;
USDT  &lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1 — Create an API key
&lt;/h2&gt;

&lt;p&gt;After creating a project inside the dashboard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://web3indo.com" rel="noopener noreferrer"&gt;https://web3indo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;generate a project-scoped API key.&lt;/p&gt;

&lt;p&gt;Each project gets its own isolated API credentials.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2 — Create an invoice
&lt;/h2&gt;

&lt;p&gt;Example Node.js request:&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;fetch&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.web3indo.com/v1/invoices&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-api-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sepolia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USDC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.01&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response includes:&lt;/p&gt;

&lt;p&gt;– invoice ID&lt;br&gt;&lt;br&gt;
– deposit address&lt;br&gt;&lt;br&gt;
– payment status&lt;br&gt;&lt;br&gt;
– block tracking info  &lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3 — Wait for blockchain confirmation
&lt;/h2&gt;

&lt;p&gt;Web3indo monitors ERC-20 transfer events automatically.&lt;/p&gt;

&lt;p&gt;Invoice status transitions:&lt;/p&gt;

&lt;p&gt;pending → paid&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4 — Receive webhook notification
&lt;/h2&gt;

&lt;p&gt;Example webhook payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invoice.paid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"invoiceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sepolia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USDC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.01"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows your backend to react instantly:&lt;/p&gt;

&lt;p&gt;unlock features&lt;br&gt;&lt;br&gt;
activate subscription&lt;br&gt;&lt;br&gt;
confirm order  &lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Automatic treasury sweep
&lt;/h2&gt;

&lt;p&gt;After payment confirmation:&lt;/p&gt;

&lt;p&gt;funds are automatically transferred to your treasury wallet.&lt;/p&gt;

&lt;p&gt;No manual wallet management required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Supported workflow
&lt;/h2&gt;

&lt;p&gt;Typical integration looks like:&lt;/p&gt;

&lt;p&gt;create project&lt;br&gt;&lt;br&gt;
generate API key&lt;br&gt;&lt;br&gt;
create invoice&lt;br&gt;&lt;br&gt;
wait for payment&lt;br&gt;&lt;br&gt;
receive webhook&lt;br&gt;&lt;br&gt;
funds swept automatically  &lt;/p&gt;




&lt;h2&gt;
  
  
  Example use cases
&lt;/h2&gt;

&lt;p&gt;Web3indo works well for:&lt;/p&gt;

&lt;p&gt;SaaS subscriptions&lt;br&gt;&lt;br&gt;
digital product checkout&lt;br&gt;&lt;br&gt;
developer tools billing&lt;br&gt;&lt;br&gt;
API usage payments&lt;br&gt;&lt;br&gt;
automation platforms  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built Web3indo
&lt;/h2&gt;

&lt;p&gt;Most crypto payment integrations today still require managing wallets manually or running custom blockchain listeners.&lt;/p&gt;

&lt;p&gt;Web3indo abstracts that complexity into a simple developer API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it here
&lt;/h2&gt;

&lt;p&gt;Landing page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://web3indo.com" rel="noopener noreferrer"&gt;https://web3indo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo video:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/Z83AlNK2Gxw" rel="noopener noreferrer"&gt;https://youtu.be/Z83AlNK2Gxw&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Feedback welcome
&lt;/h2&gt;

&lt;p&gt;I’m actively improving Web3indo and would love feedback from other developers building crypto-enabled products.&lt;/p&gt;

&lt;p&gt;Example repo:&lt;br&gt;
&lt;a href="https://github.com/messut35/web3indo-nodejs-example" rel="noopener noreferrer"&gt;https://github.com/messut35/web3indo-nodejs-example&lt;/a&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>node</category>
      <category>ethereum</category>
      <category>api</category>
    </item>
  </channel>
</rss>
